参考:https://juejin.cn/post/6888936770692448270#heading-8
    什么是plugin?

    plugin是在打包过程中某些具体时刻上做一些操作的工具。目的在于解决 loader 无法实现的其他事,它直接作用于 webpack,扩展了它的功能。

    例如:

    • html-webpack-plugin -> 在打包之后自动生成一个html文件
    • clean-webpack-plugin -> 在打包之前清空dist目录

    插件是一个类(loader是一个function)

    1. class CopyrightWebpackPlugin {
    2. // new时候执行构造函数
    3. constructor(options) {
    4. console.log('插件被使用了')
    5. }
    6. // compiler是一个webpack实例
    7. apply(compiler) {
    8. // 异步钩子
    9. compiler.hooks.emit.tapAsync('CopyrightWebpackPlugin', (compilation, cb) => {
    10. compilation.assets['copyright.txt'] = {
    11. source: function() {
    12. return 'copyright by tuziqi'
    13. }
    14. }
    15. cb()
    16. })
    17. // 同步钩子
    18. compiler.hooks.compile.tap('CopyrightWebpackPlugin', (compilation) => {
    19. })
    20. }
    21. }
    22. module.exports = CopyrightWebpackPlugin

    compiler.hooks包含webpack在打包过程中生命周期的一些钩子函数
    image.png
    这些钩子有同步的和异步的,同步的使用tap方法,异步的用tapAsync方法需要多传一个cb参数,在异步操作的最后需要执行cb函数。