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)
        }
    }
}

  

posted on 2020-09-24 10:00  老实憨厚的脖子  阅读(400)  评论(0编辑  收藏  举报

导航