Webpack配置优化
“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情”
webpack版本4.x
1、按需引入@babel/polyfill
- Polyfill是一块代码,用来为旧浏览器提供它没有原生支持的较新的功能。
- 当我们在入口文件中引入@babel/polyfill时,我们会将@babel/polyfill的所有功能全部打包,无论这些功能我们是否需要,这自然会造成增加打包时间和包的体积。最好的方案是仅加载我们需要用到的功能。
- 如何配置:在.babelrc文件中添加如下配置,安装core-js@2依赖
2、减少loader的作用模块
- webpack打包过程中,会使用loader来处理所依赖的模块,但是在我们使用第三方库的时候,那些模块往往是已经处理好的,所以我们无需对有些第三方库进行loader处理。
- 比如我们使用babel-loader来处理js文件时,可以仅对我们自己编写的业务模块进行loader的处理,从而大大减少打包时间。
- 配置方法也非常简单:
3、合理的配置source-map
- Source-map是一种映射关系。当项目运行后,如果出现错误,错误信息只能定位到打包后的文件中错误的位置。如果想查看在源文件中错误的位置,则需要使用映射关系,找到对应的位置。
- 开发环境下devtool配置为cheap-module-eval-source-map
- 生产环境下无需使用source-map,devtool配置为none
4、使用HappyPack插件
- 由于运行在node.js之上的webpack是单线程模型的,所以webpack需要处理的事情需要一件一件的做,不能多件事一起做。
- 我们需要webpack能同一时间处理多个任务,发挥多核cpu电脑的威力,HappyPack能让webpack做到这点,它把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程。
- 如何使用HappyPack?
使用HappyPack插件需要注意两点
- 第一点:由于HappyPack对file-loader、url-loader支持的不太友好,所以不建议对该loader使用。
- 第二点:从测试结果可以看出,在开发环境下HappyPack对打包时间的优化并不明显,主要是因为测试的项目是一个非常简单的demo,用到的第三方模块并不多,所以在一些小型项目中,可以不需要HappyPack插件,在中大型项目中,HappyPack对打包时间的优化是非常可观的
5、对代码进行分割
- 默认情况下,webpack内置代码分割功能,但是默认仅仅为异步代码进行分割,所以我们需要修改默认配置,使webpack可以对同步代码和异步代码都进行分割。
- 如何配置?
- 为什么要进行代码分割?浏览器支持并行加载文件,将代码进行分割有利于提升文件的加载速度。
- 第三方模块一般不会发生变化,打包时第三方模块的文件名一般也不会变化,用户在访问页面时,就可以利用浏览器缓存减少文件的请求,从而提升页面的加载速度。
6、配置TreeShaking
- 配置TreeShaking的目的是为了在打包时删除未使用的代码,从而减少包的体积,达到优化的目的。
- 如何配置TreeShaking?
- 首先,TreeShaking只能删除es6模块的代码,所以在.babelrc文件配置中添加modules:false这行代码,确保compiler没有将ES6模块语法转换为CommonJS模块。
- 当一个模块有多个导出时,使用多个export进行导出,而不是使用export default导出一个对象。
7、使用DllPlugin插件,将react,react-dom,antd,lodash等模块单独打包
- 在项目开发过程中,有些模块一旦使用,就不会再发生变更,每次打包如果都将这些模块重新打包,就会造成时间消耗,理想情况下,将这些模块提前打包好,在对项目打包时,不再打包这些模块,从而提升打包速度,DllPlugin就是用来做这件事的。
- 如何配置?
写在最后
当然,webpack还有许多其他的优化手段:比如:
- 升级node和webpack的版本
- 减少使用不必要的插件和loader
- 使用异步的方式来加载组件
- 使用魔法注释的方式为异步组件添加preload属性来支持预加载
- 抽离组件样式到单独的文件里减少包的体积
Webpack配置优化是一个持续的过程,需要我们不断学习新的优化技巧,持续的降低打包时间和打包体积
转载自:https://juejin.cn/post/7139191220399505422