最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 编写一个 webapck plugins

    正文概述 掘金(阿畅_)   2020-12-13   298

    创建插件

    webpack 插件由以下组成:

    • 一个 JavaScript 命名函数。
    • 在插件函数的 prototype 上定义一个 apply 方法。
    • 指定一个绑定到 webpack 自身的事件钩子。
    • 处理 webpack 内部实例的特定数据。
    • 功能完成后调用 webpack 提供的回调。
    // 一个 JavaScript 命名函数。
    function MyWebpackPlugin() {
    
    };
    
    // 在插件函数的 prototype 上定义一个 `apply` 方法。
    MyWebpackPlugin.prototype.apply = function(compiler) {
      // 指定一个挂载到 webpack 自身的事件钩子。
      compiler.plugin('webpacksEventHook', function(compilation /* 处理 webpack 内部实例的特定数据。*/, callback) {
        console.log("This is an example plugin!!!");
    
        // 功能完成后调用 webpack 提供的回调。
        callback();
      });
    };
    

    Compiler 和 Compilation

    • Compiler 和 Compilation 是插件开发中最重要的两个资源

    • Compiler 对象代表了完整的 webpack 环境配置。这个对象在启动 webpack 时被一次性建立,并配置好所有可操作的设置,包括 options,loader 和 plugin。当在 webpack 环境中应用一个插件时,插件将收到此 compiler 对象的引用。可以使用它来访问 webpack 的主环境。

    • compilation 对象代表了一次资源版本构建。当运行 webpack 开发环境中间件时,每当检测到一个文件变化,就会创建一个新的 compilation,从而生成一组新的编译资源。一个 compilation 对象表现了当前的模块资源、编译生成资源、变化的文件、以及被跟踪依赖的状态信息。compilation 对象也提供了很多关键时机的回调,以供插件做自定义处理时选择使用。

    编写一个基础插件

    • 插件是由「具有 apply 方法的 prototype 对象」所实例化出来的。这个 apply 方法在安装插件时,会被 webpack compiler 调用一次。apply 方法可以接收一个 webpack compiler 对象的引用,从而可以在回调函数中访问到 compiler 对象.
    module.exports = class MyPlugin {
      constructor(options) {
        this.options = options
      }
    
      apply(compiler) {
        // 这里会打印在 调用此插件传递的参数
        console.log('options', this.options)
      }
    }
    
    • 安装插件 在 webpack.config 配置 plugins
    const path = require('path')
    const MyPlugin = require('./plugins/plugin-demo')
    
    module.exports = {
      entry: './src/index.js',
      output: {
        path: path.join(__dirname, 'dist'),
        filename: 'main.js'
      },
      mode: 'production',
      plugins: [
        new MyPlugin({
          name: 'webpack'
        })
      ]
    }
    

    编写一个压缩构建资源为 zip 包的插件

    • 安装相关依赖
    npm i jszip webpack-sources 
    
    • 代码
    const JSZip = require('jszip')
    const path = require('path')
    const RawSource = require('webpack-sources').RawSource
    const zip = new JSZip
    module.exports = class ZipPLugin {
      constructor(options) {
        this.options = options
      }
    
      apply(compiler) {
        console.log('compiler', this.options)
        compiler.hooks.emit.tapAsync('ZipPlugin', (compilation, callback) => {
          // 创建一个目录
          const folder = zip.folder(this.options.filename)
    
          for(let filename in compilation.assets) {
            // 获取 source 也就是文件的内容
            const source = compilation.assets[filename].source()
            // 把内容添加到文件中
            folder.file(filename, source)
          }
    
          zip.generateAsync({
            type: 'nodebuffer'
          }).then((content) => {
            // 获取文件路径地址
            const outPutPath = path.join(compilation.options.output.path, this.options.filename + '.zip')
            // 文件路径的绝对定位改成相对定位,
            const outPutRelativePath = path.relative(
              compilation.options.output.path,
              outPutPath
            )
            compilation.assets[outPutRelativePath] = new RawSource(content)
            callback()
          })
        })
      }
    }
    

    github plugins-learn


    起源地下载网 » 编写一个 webapck plugins

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元