tree shaking 依赖于ES Module 的静态语法分析,在项目编译时移除无用的代码以减少文件体积。

usedExports

在文件中,我们可能定义了变量但是暂时又没有用到,这样会造成空间的浪费。在 modeproduction 时,会默认做一些配置,将无用的代码删除。为了看到没有做处理时编译后的文件效果,在 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 操作的,比如没有在代码中创建 divh1 标签,但这段 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 移除无用代码的更多相关文章

  1. 配置Tree Shaking来减少JavaScript的打包体积

    译者按: 用Tree Shaking技术来减少JavaScript的Payload大小 原文: Reduce JavaScript Payloads with Tree Shaking 译者: Fun ...

  2. webpack指南(一)HRM+Tree Shaking

    参考:https://www.cnblogs.com/PasserByOne/p/12084323.html https://blog.csdn.net/qq593249106/article/det ...

  3. Webpack 4教程 - 第七部分 减少打包体积与Tree Shaking

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://wanago.io/2018/08/13/webpack-4-course-part ...

  4. webpack(6)-模块热替代&tree shaking

    模块热替换(hot module replacement 或 HMR) 模块热替换(hot module replacement 或 HMR)是 webpack 提供的最有用的功能之一.它允许在运行时 ...

  5. 深入浅出的webpack构建工具---tree shaking打包性能优化(十二)

    阅读目录 1. 什么是tree-shaking? 2. 在webpack中如何使用 tree-shaking 呢? 3. 使用webpack-deep-scope-plugin 优化 回到顶部 1. ...

  6. Webpack 中的 Tree Shaking

    Tree Shaking Tree shaking 用于描述移除JavaScript上下文中的未引用代码(dead-code). 为了更方便地理解tree shaking,我们可以将应用程序想象成一棵 ...

  7. Webpack 4 Tree Shaking 终极优化指南

    几个月前,我的任务是将我们组的 Vue.js 项目构建配置升级到 Webpack 4.我们的主要目标之一是利用 tree-shaking 的优势,即 Webpack 去掉了实际上并没有使用的代码来减少 ...

  8. webpack使用tree shaking的问题。及关于UglifyJs不支持ES6的解决方案。

    webpack: plugins:[ new webpack.optimize.UglifyJsPlugin({ compress:{warning:true} }) ] 是的,一些dead code ...

  9. Angular2+typescript+webpack2(支持aot, tree shaking, lazy loading)

    概述 Angular2官方推荐的应该是使用systemjs加载, 但是当我使用到它的tree shaking的时候,发现如果使用systemjs+rollup,只能打包成一个文件,然后lazy loa ...

  10. webpack4 系列教程(九): CSS Tree Shaking

    教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步原文地址 有空就来看看个人技术小站, 我一直都在 0. 课程介绍和资料 本次课程的代码目录(如下图所示): >>> ...

随机推荐

  1. 搭建一个简易框架 3秒创建一个WebApi接口

    前端ajax请求数据,传递的参数都是一个json字符串,经过多次解析发现其实都是一个DataSet {"selectA1":[{"Name":"156 ...

  2. Python3.10动态修改Windows系统(win10/win11)本地IP地址(静态IP)

    一般情况下,局域网里的终端比如本地服务器设置静态IP的好处是可以有效减少网络连接时间,原因是过程中省略了每次联网后从DHCP服务器获取IP地址的流程,缺点是容易引发IP地址的冲突,当然,还有操作层面的 ...

  3. HTML中meta标签的那些属性

    <meta> 标签是 HTML 中用于描述网页元信息的元素.它位于 <head> 部分,不会显示在页面内容中,但对于浏览器.搜索引擎等具有重要作用.主要作用有:定义文档的字符编 ...

  4. 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() ...

  5. 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 ...

  6. Netty实战(一)

    目录 第一章 Java网络编程 1.1 Java NIO 1.2 选择器 第二章 Netty是什么 2.1 Netty简介 2.2 Netty的特性 2.2.1 设计 2.2.2 易于使用 2.2.3 ...

  7. weex 开发APP 多行文本溢出处理

    weex中文字溢出不能使用常规的overflow:hidden 如: .text { overflow: hidden; text-overflow: ellipsis; white-space: n ...

  8. CSharp初体验

    入门 初来乍到了解一门新的语言,它可能和熟悉的c/c++有不小差别,整体上需要首先了解下语法文件的整体结构.例如,源文件整体结构如何. 乍看CSharp源文件(compile unit)的结构,官网主 ...

  9. Go语言如何判断两个对象是否相等

    1. 引言 在编程中,判断两个对象是否相等是一项常见的任务,同时判断对象是否相等在很多情况下都非常重要,例如: 单元测试:编写单元测试时,经常需要验证函数的输出是否符合预期,这涉及到比较对象是否相等. ...

  10. shell工具和脚本

    Shell脚本 shell 脚本是一种更加复杂度的工具. 大多数shell都有自己的一套脚本语言,包括变量.控制流和自己的语法.shell脚本 与其他脚本语言不同之处在于,shell 脚本针对 she ...