1. 程式人生 > 其它 >Webpack系列——如何編寫一個 Plugin

Webpack系列——如何編寫一個 Plugin

webpack.config.js

const path = require('path')
const CopyrightWebpackPlugin = require('./plugins/copyright-webpack-plugin')

module.exports = {
  mode: 'development',
  entry: {
    main: './src/index.js'
  },
  plugins: [
      new CopyrightWebpackPlugin({
      name: 'pluginParams'
    })
  ]
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js'
  }
}

根目錄建立 plugins 資料夾,在資料夾中建立一個 copyright-webpack-plugin.js 檔案

注: loader 是一個函式(function), plugin 是一個 類(class)

copyright-webpack-plugin.js

class CopyrightWebpackPlugin {
  constructor(options) {
    console.log('外掛被使用了, 傳入的引數為:', options)
  }
  // 引數 compiler 是 webpack 的一個例項
  // compiler 存放著所有配置內容,包括所有打包的相關內容
  // compiler.hooks 定義了打包過程中的時刻值(鉤子)
  // emit 時刻:將打包的資源輸出到 輸出目錄(dist) 前,是一個非同步的時刻值
  apply(compiler) {
    // compile 時刻是同步的時刻
    // 同步的時刻的引數中, 第二個方法引數只傳一個 compilation 引數
    compiler.hooks.compile.tap('CopyrightWebpackPlugin', (compilation) => {
    console.log('compiler')
  })
   // compilation 存放著這一次打包的內容
  compiler.hooks.emit.tapAsync('CopyrightWebpackPlugin', (compilation, callback) => {
  // 打包生成的內容存放在compilation.assets
  // console.log(compilation.assets)
  // 打包輸出前新增一個 copyright.txt 檔案
  compilation.assets['copyright.txt'] = {
  source: function() {
    return 'copyright output by plugin'
  }
  size: function() {
    return 26
  }
};
  // 使用 tapAsyns 時 最後一定要呼叫一下 callback
  callback()
  })
  }
}

module.exports = CopyrightWebpackPlugin;
對於 compilation 中擁有哪些屬性,可以通過 node 額度除錯工具檢視

在 package.json 中

第一個引數 --inspect 表示開啟 Node 除錯工具,--inspect-brk在執行 webpack.js 進行除錯時,在 webpack 執行時的第一行上打上斷點


{
  // ...
  "script": {
  "debug": "node --inspect --inspect-brk node_modules/webpack/bin/webpack.js"
}
}
class CopyrightWebpackPlugin {
  constructor(options) {
  console.log('外掛被使用了, 傳入的引數為:', options)
}
  apply(compiler) {
    compiler.hooks.compile.tap('CopyrightWebpackPlugin', (compilation) => {
    console.log('compiler')
})
compiler.hooks.emit.tapAsync('CopyrightWebpackPlugin', (compilation, callback) => {
  debugger;
  compilation.assets['copyright.txt'] = {
  source: function() {
  return 'copyright output by plugin'
}
size: function() {
return 26
}
};
callback()
})
}
}

module.exports = CopyrightWebpackPlugin;
執行 npm run debbug 後可開啟瀏覽器控制檯,在 Node 除錯工具中進行除錯

此時可滑鼠移動到 需要檢視的變數或方法中的變數進行檢視,或者在右側的 watch 中新增需要監測的變數檢視。

搜尋

複製