webpack

编写一个 webpack plugins

2020-12-12  本文已影响0人  阿畅_

创建插件

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

编写一个基础插件

module.exports = class MyPlugin {
  constructor(options) {
    this.options = options
  }

  apply(compiler) {
    // 这里会打印在 调用此插件传递的参数
    console.log('options', this.options)
  }
}
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

上一篇 下一篇

猜你喜欢

热点阅读