← 返回目录

第 8 卷

第 8 / 26 卷日期:

DLL 文件引入 HTML 4

5module.exports = { 6plugins: [

7new webpack.DllReferencePlugin({ 8manifest: path.resolve(__dirname, 'dll/vendors.manifest.json') // 引用

DLL manifest 文件,告知 Webpack 复用 DLL 模块 9}),

10new AddAssetHtmlPlugin({ 11filepath: path.resolve(__dirname, 'dll/vendors.dll.js'), // 将 DLL 文件引

入 HTML

12outputPath: 'dll', // DLL文件输出路径
13publicPath: 'dll' // DLL文件的公共路径
14}),
15new HtmlWebpackPlugin({ template: './public/index.html' })
16]
17 }
  1. 其他辅助优化(提升缓存效率)

• 排除无需处理的文件:通过 exclude 配置排除 node_modules、 dist 等目录,避免

Webpack 解析不必要的文件。

• 使用 thread-loader 开启多线程构建:将耗时的 loader 任务(如 Babel 转译、Sass 转译)分配到

多个线程并行执行,配合缓存使用可进一步提升速度:

Code block

1module.exports = { 2module: {

3rules: [ 4{

5test: /\.js$/, 6exclude: /node_modules/,

7use: [

8'thread-loader', //开启多线程,需置于耗时loader之前
9{
10loader: 'babel-loader',
11options: { cacheDirectory: true }
12}
13]
14}

• 禁用生产环境相关优化(开发环境):开发环境无需启用代码压缩( TerserPlugin)、CSS 提

取( MiniCssExtractPlugin)等耗时优化,使用 style-loader 注入 CSS 即可。

补充总结

  1. loader 与 plugin 核心区别:loader 负责模块转换,plugin 负责流程扩展;前者作用于编译阶段的

单个模块,后者作用于全构建生命周期。

  1. Webpack 处理 CSS/Sass 核心:依赖 css-loader/sass-loader 转译模块,开发环境用 style-

loader 注入,生产环境用 MiniCssExtractPlugin 提取。

  1. HMR 原理:基于 WebSocket 通信,监听文件变化生成增量更新资源,客户端加载后通过运行时替

换模块,实现无刷新更新。

  1. 代码分割实现方式:入口分割、动态导入(按需加载)、splitChunks 自动提取公共代码,核心目

标是减少首屏加载体积。

  1. Webpack 缓存优化核心:启用 filesystem 模块缓存、loader 缓存,预编译第三方依赖

(DllPlugin),减少重复编译开销。

十一、Tree Shaking是什么,以及如何在Webpack中使用?

Tree Shaking(树摇)是前端工程化中用于删除项目中未被使用的代码(死代码)的优化技术,核心目标是减小打包后 bundle 的体积。其名称形象地比喻为“摇晃树木,抖落枯萎的叶子(未使用代

码)”,仅保留被引用的有效代码。Tree Shaking 仅支持 ES 模块(ES Module,即 import/export),不支持 CommonJS 模块( require/module.exports)。

  1. Tree Shaking 的核心原理

• 依赖静态分析:ES 模块的导入导出是静态的(导入导出语句只能在模块顶层,且不能动态判

断),Webpack 可在打包时通过静态分析,确定哪些模块、哪些导出内容被实际引用。

  • 标记未使用代码:Webpack 会标记出未被引用的导出内容(即死代码)。

• 删除死代码:在代码压缩阶段(如 TerserPlugin),将标记的死代码删除,最终生成精简的

bundle。

  1. 在Webpack中使用Tree Shaking的条件与配置

使用 Tree Shaking 需满足两个核心条件,再配合简单配置即可生效:

(1)核心前提条件

• 代码必须使用 ES 模块( import/export):避免使用 CommonJS 模块( require 是动态

• 指定 mode: 'production':Webpack 在生产环境下会自动启用 Tree Shaking(内置

(2)基础配置(无需额外配置,满足前提即可生效)

Code block

1module.exports = {

2mode: 'production', //自动启用Tree Shaking
3entry: './src/index.js',
4output: {
5filename: '[name].[contenthash].js',
6path: path.resolve(__dirname, 'dist'),
7clean: true
8}
9}

(3)增强Tree Shaking效果的额外配置

如需更精准地控制 Tree Shaking(如标记某些模块不被树摇),可添加以下配置:

• 优化 usedExports(标记未使用导出):显式标记未被使用的导出,增强 TerserPlugin 的删除效

果(生产环境默认启用,可手动强调):

Code block

1module.exports = { 2optimization: {

3usedExports: true, //标记未被使用的导出内容
4}
5 }

• 通过 package.json 配置 sideEffects(排除有副作用的模块):

“副作用”指模块执行时除了导出内容外,还会对外部环境产生影响(如修改全局变量、引入 CSS 样式、执行 polyfill 等)。Tree Shaking 会默认保留有副作用的模块,避免误删关键代码。通过

sideEffects 可明确告知 Webpack 哪些模块无副作用,可安全树摇:

Code block

1// package.json 2{

3"sideEffects": [ 4"*.css", // CSS 文件有副作用(注入样式),不被树摇

全站分卷索引 · 26 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷
  14. 14第 14 卷
  15. 15第 15 卷
  16. 16第 16 卷
  17. 17第 17 卷
  18. 18第 18 卷
  19. 19第 19 卷
  20. 20第 20 卷
  21. 21第 21 卷
  22. 22第 22 卷
  23. 23第 23 卷
  24. 24第 24 卷
  25. 25第 25 卷
  26. 26第 26 卷