Webpack - 自定义 plugin
插件向第三方开发者提供了 webpack 引擎中完整的能力。使用阶段式的构建回调,开发者可以引入他们自己的行为到 webpack 构建流程中。
webpack在编译过程中,会触发一系列 Tapable 钩子事件,注册相应的钩子,在 webpack 构建过程中触发钩子执行自定义的任务,就形成了我们自己的 plugin。
背景
插件组成
- 一个 JavaScript 命名函数
- 在插件函数原型上定义一个
apply
方法 - 注册一个 webpack 自身的事件钩子
- 处理 webpack 内部实例的特定数据
- 功能完成后调用 webpack 提供的回调
执行流程
- 合并命令行参数与配置文件,解析得到参数对象
- 参数对象传给 webpack 得到
Compiler
对象 - 执行
Compiler
的run
方法,生成Compilation
对象 - 触发
Compiler
的make
方法分析入口文件,调用compilation
的buildModule
方法创建主模块对象 - 生成入口文件AST,加载依赖模块
- 模块分析完成后,执行
Compilation
的seal
方法 - 最后执行
Compilation.emitAssets()
输出文件
Compiler 与 Compilation
- Compiler:完整的 webpack 配置环境。这个对象在启动 webpack 时被一次性创建,并配置好所有可操作的设置,包括 options、loader、plugin。当在 webpack 环境中应用一个插件时,插件可通过compiler 对象引用来访问 webpack 主环境。
- Compilation:一次资源版本的构建。开发环境每当检测到问价变化,就会创建新的 compilation。
示例
参考官网,实现一个简单的插件:生成.md
文件展示构建生成的文件列表。github 仓库file-list-plugin.js
:
|
|
webpack.config.js
:
|
|