怎么提高Webpack构建速度

1.使用适当的mode选项

  • 开发模式(development):默认情况下,Webpack以较慢的速度进行构建,以便于开发。如果你不关心生产环境的优化,可以使用这个模式。
  • 生产模式(production):这个模式会启用所有可能的优化,包括代码压缩和体积缩小,但构建速度会更快。
module.exports = {
  mode: 'production',
};

2.优化loader配置

如将loader应用于最少数量的必要模块。而非如下:

module.exports = {
  //...
  module: {
    rules: [
      {
        test: /\.js$/,
        loader: "babel-loader",
      },
    ],
  },
};

通过使用 include 字段,仅将 loader应用在实际需要将其转换的模块:

const path = require("path");
module.exports = {
  //...
  module: {
    rules: [
      {
        test: /\.js$/,
        include: path.resolve(__dirname, "src"),
        loader: "babel-loader",
      },
    ],
  },
};

3.避免不必要的plugin

每个插件都会带来一定的性能开销,因此尽量避免使用不必要的插件。

4.配置模块解析

Webpack 在模块解析时会搜索node_modules目录,这个过程比较耗时。为了减少搜索时间,我们可以使用resolve.alias配置选项来告诉Webpack直接使用特定的路径来查找模块。

  • 合理使用resolve.extensions
  • 优化 resolve.modules
  • 优化resolve.alias

5.通过externals配置来提取常用库

module.exports = {
//告诉webpack哪些模块不需要被打包进bundle中,以某种方式(如CDN)在全局环境中可用。
  externals: {
    'vue': 'Vue',
    'vue-router': 'VueRouter',
    'vuex': 'Vuex',
    'axios': 'axios',
    "CKEDITOR": "window.CKEDITOR"
  },
}

6.使用tree-shaking剔除多余代码

//使用 ES2015 模块语法:确保你的代码使用 import 和 export 语法,而不是 CommonJS 的 require 和 module.exports。
//在 package.json 中设置 "sideEffects": false:这告诉 Webpack 忽略那些没有副作用的文件(如 CSS 文件)。如果你的项目中有副作用(比如某些文件仅用于设置全局变量),则需要显式列出这些文件。
//在 Webpack 配置中启用优化:确保你开启了 optimization.usedExports 和 optimization.minimize。
 
// package.json  
{  
  "name": "your-project",  
  "sideEffects": false,  
  // ... 其他字段  
}
 
// webpack.config.js  
module.exports = {  
  // ... 其他配置  
  optimization: {  
    minimize: true,  
    usedExports: true, // 开启 Tree Shaking  
    sideEffects: true, // 允许 Webpack 根据 package.json 的 sideEffects 字段来剔除未使用的模块  
  },  
  module: {  
    rules: [  
      // ... 其他 loader 配置  
    ],  
  },  
};

7.小即是快(smaller=faster)

减少编译结果的整体大小,以提高构建性能。尽量保持 chunk 体积小。

  • 使用数量更少/体积更小的 library。
  • 在多页面应用程序中使用 SplitChunksPlugin 。
  • 在多页面应用程序中使用 SplitChunksPlugin ,并开启 async 模式。
  • 移除未引用代码。
  • 只编译你当前正在开发的那些代码。
  • 优化资源文件(如图片、字体)

8.使用缓存

可以使用Webpack的缓存功能,将打包结果缓存起来以避免重复构建。可以使用cache-loaderhard-source-webpack-plugin等插件来实现缓存。

9.DLL

DllPlugin 是Webpack 的一个插件,它可以将一些不经常变动的第三方库预先打包好,然后在开发过程中直接使用。这样可以减少每次构建时对这些库的重复打包,提高构建速度。

详细示例见这儿

10.worker池

thread-loader 可以将非常消耗资源的 loader 分流给一个 worker pool。详细内容见这儿

不要使用太多的 worker,因为 Node.js 的 runtime 和 loader 都有启动开销。最小化 worker 和 main process(主进程) 之间的模块传输。进程间通讯(IPC,inter process communication)是非常消耗资源的。

11.合理配置devtool

需要注意的是不同的 devtool 设置,会导致性能差异。

  • eval具有最好的性能,但并不能帮助你转译代码。
  • 如果你能接受稍差一些的map质量,可以使用cheap-source-map变体配置来提高性能
  • 使用eval-source-map变体配置进行增量编译。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳与星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值