一、初始化一个webpack项目

二、src同级目录下新建plugins文件夹

plugin和loader不一样,我们使用的时候,通过new关键字使用,说明plugin是一个类。

  1. 定义一个简单的插件格式
  2. class CopyrightWebpackPlugin {
  3. constructor() {
  4. }
  5. // 当调用插件的时候,会执行apply方法
  6. // 参数compiler可以理解是webpack的实例,可以拿到webpack的配置信息
  7. apply(compiler) {
  8. console.log(compiler)
  9. }
  10. }
  11. module.exports = CopyrightWebpackPlugin
  1. 使用插件
  2. const CopyrightWebpackPlugin = require('./plugins/copyright-webpack-plugin')
  3. plugins: [
  4. new CopyrightWebpackPlugin();
  5. ]
  6. 使用插件

三、插件中接收配置参数

  1. wenpack.config.js
  2. plugins: [
  3. new CopyrightWebpackPlugin({
  4. name: 'dell'
  5. });
  6. ]
  1. copyright-webpack-plugin
  2. class CopyrightWebpackPlugin {
  3. constructor(options) {
  4. console.log(options) // 接收传入的参数
  5. }
  6. // 当调用插件的时候,会执行apply方法
  7. // 参数compiler可以理解是webpack的实例,可以拿到webpack的配置信息
  8. apply(compiler) {
  9. console.log(compiler)
  10. }
  11. }
  12. module.exports = CopyrightWebpackPlugin

四、编写插件

插件有个hook,想要哪个钩子中做事情,就在哪个钩子下写方法

  1. // 想要在打包后,向dir文件夹下再插入一个文件
  2. class CopyrightWebpackPlugin {
  3. constructor(options) {
  4. console.log('==========执行plugin=========')
  5. console.log(options, '====9999')
  6. }
  7. // 当调用插件的时候,会执行apply方法
  8. // 参数compiler可以理解是webpack的实例,可以拿到webpack的配置信息
  9. apply(compiler) {
  10. // console.log(compiler)
  11. compiler.hooks.emit.tapAsync('CopyrightWebpackPlugin', (compilation, cb) => { // compilation:本次配置
  12. // console.log(compilation.assets)
  13. compilation.assets['copyright.txt'] = {
  14. source: function() {
  15. return 'copyright by dell'
  16. },
  17. size: function() {
  18. return 21
  19. }
  20. }
  21. cb()
  22. })
  23. }
  24. }
  25. module.exports = CopyrightWebpackPlugin

image.png
image.png

五、插件和loader的执行顺序

image.png
compler还有很多时刻,有的会在loader之前,有的会在loader之后。
如果不考虑钩子,在constructor里面执行的话,plugin是先于loader执行。

六、同步时刻的处理

  1. class CopyrightWebpackPlugin {
  2. constructor(options) {
  3. console.log('==========执行plugin=========')
  4. console.log(options, '====9999')
  5. }
  6. // 当调用插件的时候,会执行apply方法
  7. // 参数compiler可以理解是webpack的实例,可以拿到webpack的配置信息
  8. apply(compiler) {
  9. // 如果遇到同步的,就要用tap 不能使用tapAsync
  10. // 同步的不需要cb
  11. compiler.hooks.compile.tap('CopyrightWebpackPlugin', (compilation) => {
  12. console.log(compilation)
  13. })
  14. // console.log(compiler)
  15. compiler.hooks.emit.tapAsync('CopyrightWebpackPlugin', (compilation, cb) => { // compilation:本次配置
  16. // console.log(compilation.assets)
  17. console.log('========插件emit时刻========')
  18. compilation.assets['copyright.txt'] = {
  19. source: function() {
  20. return 'copyright by dell'
  21. },
  22. size: function() {
  23. return 21
  24. }
  25. }
  26. cb()
  27. })
  28. }
  29. }
  30. module.exports = CopyrightWebpackPlugin

七、如何调试

  1. package.json
  2. // inspacet:开启node的调试工具
  3. // inspacet-brk:在第一行打上断点
  4. script: {
  5. "debug": "node --inspacet --inspacet-brk node_module/webpack/bin/webpack.js"
  6. }
  1. compiler.hooks.emit.tapAsync('CopyrightWebpackPlugin', (compilation, cb) => { // compilation:本次配置
  2. // console.log(compilation.assets)
  3. debugger
  4. console.log('========插件emit时刻========')
  5. compilation.assets['copyright.txt'] = {
  6. source: function() {
  7. return 'copyright by dell'
  8. },
  9. size: function() {
  10. return 21
  11. }
  12. }
  13. cb()
  14. })