关于webpack的性能优化

144 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情

目的和方案

  • 关于方案: 多页面打包通用方案;打包公共库方案;自定义plugin
  • 优化的目的
  1. 优化开发体验
  2. 优化输出质量

优化构建速度

影响webpack构建速度的原因有两个:一个是loader和plugin方面的构建过程,一个就是压缩,把这两个东西优化起来,可以减少很多发布的时间,比如优化构建过程,可以从减少查找过程、多线程、提前编译和Cache多个角度来优化

优化loader查找范围

  1. test include exclude三个配置项来缩小loader的处理范围
  2. 推荐使用include
//string
include: path.resolve(__dirname, "./src"),
//array
include: [
    path.resolve(__dirname, 'app/styles'),
    path.resolve(__dirname, 'vendor/styles')
]

注意:exclude的优先级要优于includetest,所以当三者配置有冲突时,exclude会优先于其他两个配置

优化resolve.modules配置

resolve.modules用于配置webpack去那些目录下寻找第三方模块,默认是node_modules,寻找第三方模块,默认是在当前目录下的node_modules里面去找,如果没有找到会去上一级目录查找,如果再没有找到则取../../node_modules查找以此类推,和Nodejs的模块寻找机制很像。

module.exports={
    resolve:{
        modules: [path.resolve(__dirname, "./node_modules")]
    }
}

如果我们的第三方模块都安装在项目的根目录下,就可以直接指明这个路径

优化resolve.alias配置

resolve.alias配置通过别名来将原导入路径映射成一个新的导入路径。 比如引入react库,一般存在两套代码

  1. cjs采用commonJS规范的js模块化代码
  2. umd已经打包好的完整代码,没有采用模块化,可以直接执行
  alias: {
    "@": path.join(__dirname, "./pages"),
    react: path.resolve(
    __dirname,
    "./node_modules/react/umd/react.production.min.js"
    ),
    "react-dom": path.resolve(
    __dirname,
    "./node_modules/react-dom/umd/react-dom.production.min.js"
    )
   }

默认情况下,webpack会从入口文件./node_modules/bin/react/index开始递归解析和处理依赖的文件,我们可以指定文件,避免耗时处理

resolve: {
    alias: {
        "@assets": path.resolve(__dirname, "../src/images/"),
    },
},

//html-css中使⽤
.sprite3 {
    background: url("~@assets/s3.png");
}

优化resolve.extensions的配置

resolve.extensions在导入语句没到文件后缀时,webpack会自动带上后缀后,取尝试查找文件是否存在

默认值:

extensions:['.js','.json','.jsx','.ts']
  • 后缀尝试列表尽量的小
  • 导入语句尽量带上后缀

多线程的优化

由于运行在Nodejs之上的webpack是单线程模型,所以webpack需要处理的事情需要一件一件的做,不能多件事情一起做

我们需要webpack能同一时间处理多个任务,发挥多核CPU电脑的能力

thread-loader的优化

它是针对loader进行优化的,它会将loader放置在一个worker池里运行,以达到多线程构建的目的,再使用的时候,需要将其放置在其他的loader之前,上代码!!

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        include: path.resolve('src'),
        use: [
          'thread-loader'
        ]
      }
    ]
  }
};

参考资料

webpack之揭示内部原理