通过 tree shaking 移除无用代码
tree shaking 依赖于ES Module 的静态语法分析,在项目编译时移除无用的代码以减少文件体积。
usedExports
在文件中,我们可能定义了变量但是暂时又没有用到,这样会造成空间的浪费。在 mode 为 production 时,会默认做一些配置,将无用的代码删除。为了看到没有做处理时编译后的文件效果,在 webpack 中做如下配置。
module.exports = {
// 其他配置省略
mode: 'development',
optimization: {
minimize: false,
usedExports: false,
},
};
在这种配置情况下,当存在没有用到的变量时,还是照原样编译到了 js 文件中。

想要移除掉 js 文件中的无用代码,开启 minimize 通过 usedExports 配置
module.exports = {
// 其他配置省略
mode: 'development',
optimization: {
minimize: true,
usedExports: true,
},
};
这样编译后就将没有用到的变量 username 和 foo 函数都移除掉了

sideEffects
这时候仍存在一个问题,如果通过模块化引入另一个js文件,即使没有被使用,useExports 也不会进行 tree shaking。
// index.js
import './format.js';
// format.js
export function timeFormat() {
return '2022-01-01';
}
比如上面这段代码,通过 import 语句引入 format.js,但 format.js 导出的函数没有被使用。

此时仍然对于 import 语句进行了编译,我们希望在引入的文件中也进行 tree shaking,删除无用的代码,这个时候在 package.json 中配置 sideEffects 属性来处理。
// package.json 其他配置省略
{
"sideEffects": false
}
sideEffects 用于告知 webapck 编译器哪些模块有副作用
- 定义为 false,表示所有的模块都不存在副作用,不需要用到的时候直接删除
- 定义为数组,告知有副作用的模块,该模块中有副作用的代码会被保留,没有副作用且没有使用到的代码会被删除。

这样引入的 js 文件没有被使用,进行了 tree shaking,可是 css 资源通过 import 引入也被删除了,也不会编译生成对应的 css 文件,解决方式可以选择在 sideEffects 属性中定义数组,或者处理 css 文件的 loader 中配置(推荐)。
// package.json
{
"sideEffects": [
"**.css"
],
}
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
// 其它配置省略
sideEffects: true,
},
],
},
};
在这种情况下,在 js 文件中引入的 css 文件就不会直接被移除掉

PurgeCss
不过 sideEffects 属性是不会帮助 css 文件内部进行 tree shaking 操作的,比如没有在代码中创建 div 和 h1 标签,但这段 css 代码也没有被移除。
想要在css代码中进行 tree shaking 可借助 purgecss-webpack-plugin。通过 npm install purgecss-webpack-plugin -D 安装后在 package.json 中配置。
// package.json
const PurgecssPlugin = require('purgecss-webpack-plugin');
const glob = require('glob');
const path = require('path');
const dirname = process.cwd();
const resolveApp = (folder) => path.resolve(dirname, folder);
module.exports = {
plugins: [
new PurgecssPlugin({
paths: glob.sync(`${resolveApp('./src')}/**/*`, { noDir: true }),
safelist: function () {
return {
standard: ['html', 'body'],
};
},
}),
],
};
- paths:表示要检测哪些目录下的内容需要被分析
- glob:对某些文件、文件夹通过正则表达式来进行匹配, webpack或其他插件已经安装过
- noddir:表示匹配文件,不匹配文件夹
- safelist:默认情况下,Purgecss会将html、body标签的样式移除掉,如果希望保留,需要在safelist中添加
这样 css 文件内部也会移除掉无用的代码

总结
在项目性能优化时,可以通过 tree shaking 来做以下操作
optimization 中配置 usedExports 为 true,移除 js 无用代码。
( 这也是 mode 为 production 时的默认配置 )package.json 中配置 sideEffects 为 false,css 在 loader 中设置 sideEffects 为 true,对模块进行优化。
使用 PurgeCss 来对 css 文件内部的代码进行 tree shaking。
以上就是关于 tree shaking 的介绍, 更多有关 webpack 的内容可以参考我其它的博文,持续更新中~
通过 tree shaking 移除无用代码的更多相关文章
- 配置Tree Shaking来减少JavaScript的打包体积
译者按: 用Tree Shaking技术来减少JavaScript的Payload大小 原文: Reduce JavaScript Payloads with Tree Shaking 译者: Fun ...
- webpack指南(一)HRM+Tree Shaking
参考:https://www.cnblogs.com/PasserByOne/p/12084323.html https://blog.csdn.net/qq593249106/article/det ...
- Webpack 4教程 - 第七部分 减少打包体积与Tree Shaking
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://wanago.io/2018/08/13/webpack-4-course-part ...
- webpack(6)-模块热替代&tree shaking
模块热替换(hot module replacement 或 HMR) 模块热替换(hot module replacement 或 HMR)是 webpack 提供的最有用的功能之一.它允许在运行时 ...
- 深入浅出的webpack构建工具---tree shaking打包性能优化(十二)
阅读目录 1. 什么是tree-shaking? 2. 在webpack中如何使用 tree-shaking 呢? 3. 使用webpack-deep-scope-plugin 优化 回到顶部 1. ...
- Webpack 中的 Tree Shaking
Tree Shaking Tree shaking 用于描述移除JavaScript上下文中的未引用代码(dead-code). 为了更方便地理解tree shaking,我们可以将应用程序想象成一棵 ...
- Webpack 4 Tree Shaking 终极优化指南
几个月前,我的任务是将我们组的 Vue.js 项目构建配置升级到 Webpack 4.我们的主要目标之一是利用 tree-shaking 的优势,即 Webpack 去掉了实际上并没有使用的代码来减少 ...
- webpack使用tree shaking的问题。及关于UglifyJs不支持ES6的解决方案。
webpack: plugins:[ new webpack.optimize.UglifyJsPlugin({ compress:{warning:true} }) ] 是的,一些dead code ...
- Angular2+typescript+webpack2(支持aot, tree shaking, lazy loading)
概述 Angular2官方推荐的应该是使用systemjs加载, 但是当我使用到它的tree shaking的时候,发现如果使用systemjs+rollup,只能打包成一个文件,然后lazy loa ...
- webpack4 系列教程(九): CSS Tree Shaking
教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步原文地址 有空就来看看个人技术小站, 我一直都在 0. 课程介绍和资料 本次课程的代码目录(如下图所示): >>> ...
随机推荐
- 搭建一个简易框架 3秒创建一个WebApi接口
前端ajax请求数据,传递的参数都是一个json字符串,经过多次解析发现其实都是一个DataSet {"selectA1":[{"Name":"156 ...
- Python3.10动态修改Windows系统(win10/win11)本地IP地址(静态IP)
一般情况下,局域网里的终端比如本地服务器设置静态IP的好处是可以有效减少网络连接时间,原因是过程中省略了每次联网后从DHCP服务器获取IP地址的流程,缺点是容易引发IP地址的冲突,当然,还有操作层面的 ...
- HTML中meta标签的那些属性
<meta> 标签是 HTML 中用于描述网页元信息的元素.它位于 <head> 部分,不会显示在页面内容中,但对于浏览器.搜索引擎等具有重要作用.主要作用有:定义文档的字符编 ...
- 2022-12-31:以下go语言代码输出什么?A:1 1;B:-1 1;C:-1 -1;D:编译错误。 package main import “fmt“ func main() { a
2022-12-31:以下go语言代码输出什么?A:1 1:B:-1 1:C:-1 -1:D:编译错误. package main import "fmt" func main() ...
- 2022-07-22:以下go语言代码输出什么?A:1;B:1.5;C:编译错误;D:1.49。 package main import “fmt“ func main() { var i
2022-07-22:以下go语言代码输出什么?A:1:B:1.5:C:编译错误:D:1.49. package main import "fmt" func main() { v ...
- Netty实战(一)
目录 第一章 Java网络编程 1.1 Java NIO 1.2 选择器 第二章 Netty是什么 2.1 Netty简介 2.2 Netty的特性 2.2.1 设计 2.2.2 易于使用 2.2.3 ...
- weex 开发APP 多行文本溢出处理
weex中文字溢出不能使用常规的overflow:hidden 如: .text { overflow: hidden; text-overflow: ellipsis; white-space: n ...
- CSharp初体验
入门 初来乍到了解一门新的语言,它可能和熟悉的c/c++有不小差别,整体上需要首先了解下语法文件的整体结构.例如,源文件整体结构如何. 乍看CSharp源文件(compile unit)的结构,官网主 ...
- Go语言如何判断两个对象是否相等
1. 引言 在编程中,判断两个对象是否相等是一项常见的任务,同时判断对象是否相等在很多情况下都非常重要,例如: 单元测试:编写单元测试时,经常需要验证函数的输出是否符合预期,这涉及到比较对象是否相等. ...
- shell工具和脚本
Shell脚本 shell 脚本是一种更加复杂度的工具. 大多数shell都有自己的一套脚本语言,包括变量.控制流和自己的语法.shell脚本 与其他脚本语言不同之处在于,shell 脚本针对 she ...