Webpack 性能优化面试笔记
减少 Webpack 打包后的文件体积
按需加载
component: () => import(/* webpackChunkName: "home" */ '../pages/home/Home'),
减少体积
开发环境下,我们依然对代码的体积有一定的要求,更小的体积可以让加载速度更快,开发效率更高,当然配置也相对简单。
// webpack.dev.js 开发环境webpack配置 module.exports = { devServer: { contentBase: path.join(__dirname, 'dist'), port: 9000, compress: true, // 代码压缩 }, }
独立css 文件
以单入口文件而论,通常我们会将页面的所有静态资源都打包成一个JS 文件,这已经实现了1.2 中的优化部分,将代码合并成一个静态资源,减少了HTTP 请求。
webpack4.0 中提供了抽离css文件的插件,mini-css-extract-plugin
,只需要简单的配置便可以将css文件分离开来。
压缩js, html, css 文件
要想优化构建后的体积,不断减少静态资源文件的大小,我们希望webpack帮助我们尽可能压缩文件的体积。对于js 脚本文件而言,webpack4.0 在mode 为‘production’时,默认会启动代码的压缩。除此之外,我们需要手动对html和css 进行压缩。
针对html 的压缩,只需要对html-webpack-plugin进行相关配置。
minify: { // 压缩 HTML 的配置 collapseWhitespace: true, removeComments: true, useShortDoctype: true }
合并压缩图片
处理完前端的三大块js,html,css后, 接下来优化能想到的是处理图片。前面提到,提升性能的一个重要的条件是降低http请求数,而应用中经常会有大大小小的图片需要处理,对应用中的小图标来说,css sprite 是首选,将各种图标集合成一张大的图片可以很好的减少网络请求数。而对于需要独立开的图片,且大小在合理范围内时,我们可以将图片转换成 base64位编码,内嵌到css 中,同样可以减少请求。
构建速度优化
说完如何减少项目构建后的大小后,接下来简单的谈一下如何提高构建的速度。实际上webpack的 构建速度,只需要简单的修改配置便能大幅提高速度。常见的设置如下。
babel-loader构建时间过长
限定加载器作用范围
由于babel-loader需要将语法进行转换,所耗费的时间较长,所以第一步需要限定babel-loader 作用的范围,让babel-loader 的搜索和转换准确的定位到指定模块。大幅提高构建速度。
// webpack.base.js module.exports = { module:{ rules: [ { test: /\.js$/, include: [resolve('src')],// 限定范围 use: { loader: 'babel-loader', }, },] } }
缓存加载器执行结果
正因为babel-loader在解析转换上耗时太长,所以我们希望能缓存每次执行的结果。webpack的loader中刚好有 cacheDirectory 的选项,默认为false 开启后将使用缓存的执行结果,打包速度明显提升。
// webpack.base.js module.exports = { module: { rules: [ { test: /\.js$/, include: [resolve('src')], use: { loader: 'babel-loader?cacheDirectory', }, },] } }
resolve 解析优化
webpack 的resolve 做相关的配置后,也可以让项目的构建速度加快。具体看下文的配置:
- 当项目中出现 import ‘react’ 既不是绝对路径也不是相对路径时,指定好搜索的路径,可以不用过多的查询
- 尽可能少的使用 resolve.alias 来设置路径别名,因为会影响到tree shaking 的优化
- 后缀自动补全尽可能的少。减少路径查询的工作
- 当使用的第三方库过大,并且不包含import require define 的调用。可以使用noParse让库不被loaders 解析
// webpack.base.js module.exports = { resolve: { modules: [ path.resolve(__dirname, 'node_modules'), ], extensions: [".js"], // 避免新增默认文件,编码时使用详细的文件路径,代码会更容易解读,也有益于提高构建速度 mainFiles: ['index'], }, module: { noParse: function(content){ return /jquery/.test(content) } } }