Webpack构建流程
Webpack 的运行流程是一个串行的过程,从启动到结束会依次执行以下流程:
-
初始化参数:从配置文件和 Shell 语句中读取与合并参数,得出最终的参数 -
开始编译:用上一步得到的参数初始化 Compiler 对象,加载所有配置的插件,执行对象的 run 方法开始执行编译 -
确定入口:根据配置中的 entry 找出所有的入口文件 -
编译模块:从入口文件出发,调用所有配置的 Loader 对模块进行翻译,再找出该模块依赖的模块,再递归本步骤直到所有入口依赖的文件都经过了本步骤的处理 -
完成模块编译:在经过第4步使用 Loader 翻译完所有模块后,得到了每个模块被翻译后的最终内容以及它们之间的依赖关系 -
输出资源:根据入口和模块之间的依赖关系,组装成一个个包含多个模块的 Chunk,再把每个 Chunk 转换成一个单独的文件加入到输出列表,这步是可以修改输出内容的最后机会 -
输出完成:在确定好输出内容后,根据配置确定输出的路径和文件名,把文件内容写入到文件系统
在以上过程中,Webpack 会在特定的时间点广播出特定的事件,插件在监听到感兴趣的事件后会执行特定的逻辑,并且插件可以调用 Webpack 提供的 API 改变 Webpack 的运行结果
简单说
-
初始化:启动构建,读取与合并配置参数,加载 Plugin,实例化 Compiler
-
编译:从 Entry 出发,针对每个 Module 串行调用对应的 Loader 去翻译文件的内容,再找到该 Module 依赖的 Module,递归地进行编译处理
-
输出:将编译后的 Module 组合成 Chunk,将 Chunk 转换成文件,输出到文件系统中
以上内容链接:juejin.cn/post/684490…
webepack常用基本配置 entry,output,plugins,module(配置loader)
entry: {
bundle: [
'babel-polyfill',
'./src/index.js',
],
},
output: {
filename: '[name]_[chunkhash].js',
path: path.resolve(__dirname, 'dist/static'),
publicPath: , //给打包的js
},
//暂未完成
优化webpack打包流程,本人工作中常用的
1.happypack
在使用 Webpack 对项目进行构建时,会对大量文件进行解析和处理。当文件数量变多之后,Webpack 构件速度就会变慢。由于运行在 Node.js 之上的 Webpack 是单线程模型的,所以 Webpack 需要处理的任务要一个一个进行操作。
而 Happypack 的作用就是将文件解析任务分解成多个子进程并发执行。子进程处理完任务后再将结果发送给主进程。所以可以大大提升 Webpack 的项目构件速度
2.DLL
使用 DllPlugin 进行分包,使用 DllReferencePlugin(索引链接) 对 manifest.json 引用,让一些基本不会改动的代码先打包成静态资源,避免反复编译浪费时间。
3.Tree shaking
打包过程中检测工程中没有引用过的模块并进行标记,在资源压缩时将它们从最终的bundle中去掉(只能对ES6 Modlue生效) 开发中尽可能使用ES6 Module的模块,提高tree shaking效率
禁用 babel-loader 的模块依赖解析,否则 Webpack 接收到的就都是转换过的 CommonJS 形式的模块,无法进行 tree-shaking
4.sourcemap
mode为development 建议使用devtools:cheap-module-eval-source-map
production 一般不使用,减少打包体积, 如果需要针对线上问题还原压缩后js错误 ,快速定位异常 建议使用 devtools:cheap-module-source-map
5.code splitting
代码分割,例如一个业务文件引入很多第三方模块或者其他业务模块,会被引入的模块打包分割成新的文件 ,这样的该业务文件的修改,只需要重新编译打包修改的文件,不需要整个文件和引入的模块一起重新编译打包
1.同步代码 ,webepack.config.js 中配置
optimization: {
splitChunks: {
chunks: 'all'
}
}
2.异步引入代码 import()
无需做任何配置 ,webpack 会自动做代码分割
6.结合url-loader 对小图片打包转换成base字符串,减少http请求
7.css loader 解析顺序 从后往前. postcss-loader是做css兼容不同版本浏览器处理的