当我们npm install webpack -g的时候,webpack会在全局注册一个命令,名字为webpack,然后在package.json,写入一下内容,执行npm run build,webpack会检测是否安装webpack-cli,webpack-cli是一个cli工具有提供了一些命令,进行使用。
\
// package.json
"scripts": {
"build": "webpack"
},
\
webpack本质是个函数,函数接受一个webpackConfig和一个callback,并返回一个Compiler对象,compiler内部提供了一个run函数,用来执行我们的webpack,首先webpack会执行getOptions,判断是否含有mode,webpack会根据mode选项来开启一些内置插件优化,没有则会抛出警告,然后获取入口文件,并根据入口文件,递归得到依赖树,开始进行编译。并向外部广播相应的事件,方便插件进行处理。webpack内部有3个对象需要重点关注
\
- Compiler
- Compilation
- Tapable
\
Compiler是webpack函数返回的一个对象,通过一个class实现,内部接收webpackOptions参数
\
Compilation是webpack每次重新构建产生新的资源生成的
\
Tapable是webpack的事件核心
\
| 事件 | 描述 | tapable |
|---|---|---|
| entryOption | 获取入口选项 | SyncHook |
| afterPlugins | 设置初始插件 | SyncBailHook |
| afterResolvers | ||
| environment | ||
| afterEnvironment | ||
| beforeRun | ||
| run | 开始编译 | |
| watchRun | 监听模式下执行 | |
| normalModuleFactory | ||
| contextModuleFactory | ||
| beforeCompile | ||
| compile | 产生一次新的编译,即compilation(webpack每次重新触发编译都会生成) | |
| thisCompilation | ||
| compilation | ||
| make | ||
| afterCompile | ||
| shouldEmit | ||
| needAdditionalPass | ||
| emit | 输出到dist目录之前 | |
| afterEmit | 输出到dist目录之后 | |
| done | 输出完成 | |
| failed | 输出失败 | |
| invalid | 监听模式下,编译无效 | |
| watchClose | 停止监听模式 |