Webpack 构建优化:构建速度

1. 面试题

Q: 如果 Webpack 构建太慢,你会从哪些方面进行优化?

2. 核心解答

构建优化的目标是:缩短从启动到打包完成的时间

(1) 多线程/多进程

利用 CPU 多核优势,并行处理昂贵的任务 (Transpiling/Minifying)。

  • Loader: 使用 thread-loader 将高消耗的 loader (如 babel-loader, ts-loader) 放到 Worker 线程池中运行。
  • Minifier: TerserPluginparallel: true (默认已开启)。

(2) 利用缓存

避免重复编译没有变化的文件。

  • Filesystem Cache (webpack 5): 在配置文件中开启 cache: { type: 'filesystem' }。这是 v5 最强特性,直接将编译结果缓存到磁盘,下次启动秒开。
  • Babel Cache: babel-loader?cacheDirectory=true
  • HardSourceWebpackPlugin: (webpack 4 专用,v5 已不再需要)。

(3) 缩小搜索范围

减少 Webpack 查找、解析模块的开销。

  • Include/Exclude: 在 Loader 配置中明确 include: path.resolve('src')必须 exclude node_modules
  • Resolve.alias: 给常用目录配置别名,缩短查找路径。
  • Resolve.modules: 指定第三方库目录 (node_modules),避免层层向上查找。
  • Resolve.extensions: 减少后缀列表,将高频后缀 (.js, .jsx) 放在前面。

(4) 提前构建

  • DLL (Dynamic Link Library): (已过时) 将 React, Vue 等库单独打包成 DLL 文件,构建时直接引用。在 Webpack 4+ 之后性能提升不明显且配置繁琐,不再推荐
  • Externals: 将公共库 (CDN 引入) 从 bundle 中排除,不再参与构建,直接在 index.html 中 script 引入。

(5) 升级 Webpack 版本

  • Webpack 5: 带来了持久化缓存 (Persistent Caching) 和更好的 Tree Shaking 算法。直接升级往往是提升最大的方案。

3. 面试加分项

Q: 为什么 DLL 被通过了?

因为 Webpack 4 优化了打包性能 (Better Hashing, Scope Hoisting),加上 HardSourceWebpackPlugin 或 v5 的 FileSystem Cache 已经足够快了。DLL 带来的收益微乎其微,反而增加了配置复杂度。

4. 总结

  • Parallel: Thread-loader.
  • Cache: Filesystem (v5), Babel-loader.
  • Scope: Exclude node_modules.
  • Upgrade: Use Webpack 5.