内容
- webpack 打包流程( 插件 )
- webpack 中的插件是如何工作的
- 动手写写插件
前置分析
找一找插件与webpack 之间的关系
- npx webpack
- 最终它会找到 node_modules/webpack/lib/webpack.js
分析webpack.js
- 在 else 逻辑当中核心就是调用 create 然后返回 compiler
- 在 if 当中也是调用 create 返回 compiler
- 在 create 方法中最终也会执行 createCompiler 来返回一个 compiler 实例
- 在 createCompiler 当中执行 new Compiler 获取一个实例,同时还做了很多其它的事件( xxxx )
- 回到 webpack.js 当中,它会调用许多钩子身上的 call 来触发当时的 tap 操作()
- 除此之外还遍历了 plugins 当中的所有插件( 插件的挂载, 在 compiler 被创建之后就都挂载了 )
- 后续无论使用 call 还是 apply ,都是将 compiler 实例与插件关联起来
- webpack 当中的插件就是一个类,而且它有一个 apply 方法,并且当前方法会接收一个 compiler 实例对象
javascript
// this 就是将来 new Compiler() 得到的实例对象
// this 的身上有一个 hooks 属性
// hooks 的值又是一个键值对,其中键名就是我们自定义的钩子名( )
// 钩子名所对应的值就是当前钩子的类型( tapable-->生成不同类型的钩子 )插件的使用
- 在我们没有自定义插件或者去使用 webpack 默认预留的钩子时,它有自己的一套成功打包的流程
- 后续我们发现,可以基于它的规则参数到整个 webpack 打包过程中
javascript
// 如果想要实现插件的对应的功能,首先需要执行在什么时候执行插的钩子
// module 是一个文件也是一个模块
// 从入口文件出发,它和它依赖的模块会组成一个代码块( chunk ), chunk.name
// 一般来说,一个chunk 会生成一个 asset ,也就是我们所谓的资源
compiler.hooks.compilation.tap('ListPlugin', (compilation) => {
compilation.hooks.chunkAssets.tap('abc', (chunk, filename) => {
console.log(chunk, '>>>>>', filename)
})
})