# webpack 优化配置之 Tree-shaking
webpack
中支持 tree-shaking
,在生产模式下会将未引用代码(dead-code
)剔除掉,不参与代码打包。
tree-shaking
不是指 webpack
中的某一个配置选项,而是一组功能搭配使用后的优化效果,这组功能会在 production
模式下自动启用,下面介绍 tree-shaking
在其他模式下怎么一步一步地开启。
以这个项目为例:
// src/component.js
export const Button = () => {
return document.createElement('button')
// 无用代码
console.log('dead-code')
}
// 无用代码,没有被导入
export const Link = () => {
return document.createElement('a')
}
// 无用代码,没有被导入
export const Heading = level => {
return document.createElement('h' + level)
}
// src/index.js
import { Button } from './components'
// 这里只导入了 Button 函数
document.body.appendChild(Button())
直接使用 none
模式执行打包命令 yarn webpack
,可以看到打包结果中这些没用到的成员 Link
和 Heading
依然被打包导出了。
设置 webpack
配置文件的 optimization
属性,这个属性是集中配置 webpack
中的优化功能的。首先配置 optimization
的 usedExports
功能,表示只导出被外部使用了的成员。
optimization: {
// 模块只导出被使用的成员
usedExports: true,
}
重新打包后可以发现,没有被外部引用的成员 Link
和 Heading
就没有被导出了。
接下来就可以开启代码压缩功能,去掉无用的代码被压缩有用的代码。配置 optimization
中的 minimize
属性,开启压缩功能。
optimization: {
// 模块只导出被使用的成员
usedExports: true,
// 压缩输出结果
minimize: true
}
重新打包发现,没用到的代码全被移除掉了。
还可以使用 concatenateModules
属性继续优化输出。普通打包结果是将每一个模块单独放到一个函数当中,如果我们的模块很多,就会出现很多这样的模块函数。开启 concatenateModules
功能可以尽可能地将所有模块合并输出到一个函数中。
配置:
optimization: {
// 模块只导出被使用的成员
usedExports: true,
// 尽可能合并所有模块到一个函数中
concatenateModules: true,
// 压缩输出结果
minimize: true
}
打包后:
// dist/bundle.js
(()=>{"use strict";document.body.appendChild(document.createElement("button"))})();
总结:optimization
对象中的 usedExports
负责标记【枯树叶】,minimize
负责【摇掉】它们,concatenateModules
能合并所有模块到一个函数中。