大厂喜欢问的TreeShaking到底是啥?好在哪呢?五分钟弄懂!

开发 前端
Tree Shaking中文含义是摇树,在webpack中指的是打包时把无用的代码摇掉,以优化打包结果。而webpack5已经自带了这个功能了,当打包环境为production时,默认开启tree-shaking功能。

背景

大家平时在查 webpack构建体积优化 ,可能都会查到 tree-shaking 这个东西,很多人看到这个东西,就会把它背下来,用来应付以后面试官可能会问到的情况。

但是,又有多少人去真的了解一下 tree-shaking 呢?自己去实践一下看 tree-shaking 到底起了哪些作用?对于我们的打包体积的优化又有多少呢?

有啥用?

Tree Shaking中文含义是摇树,在webpack中指的是打包时把无用的代码摇掉,以优化打包结果。

而webpack5已经自带了这个功能了,当打包环境为production时,默认开启tree-shaking功能。

实践

前置准备

准备两个文件main.js、util.js

  • util.js
function a () {
  console.log('a')
}
function b () {
  console.log('b')
}
export default {
  a, b
}
  • main.js
import a from './util'

// 使用a变量,调用文件里面的a函数,不使用b函数
console.log(a.a())
console.log('hello world')

// 不可能执行的代码
if (false) {
  console.log('haha')
}

// 定义了但是没用的变量
const m = 1

打包

前面说了webpack5在环境production下打包的话,默认开启tree-shaking,那我们运行npm run build进行一下打包,看看打包后的代码长啥样:

(()=>{"use strict";
const o=function(){console.log("a")};
console.log(o())
console.log("hello world")}
)();

结论:可以看到打包后,把b函数、不可能执行的代码、定义未用的变量通通都剔除了,这在一个项目中,能减少很多的代码量,进而减少打包后的文件体积。

sideEffects

副作用

先来讲讲一个东西——副作用,是什么东西呢?副作用指的是:除了导出成员之外所做的事情,我举个例子,下面的a.js是没副作用的,b.js是有副作用的:

  • a.js
function console () {
  console.log('console')
}
export default {
  console
}
  • b.js
function console () {
  console.log('console')
}

// 这个就是副作用,会影响全局的数组
Array.prototype.func = () => {}

export default {
  console
}

有无副作用的判断,可以决定tree-shaking的优化程度,举个例子:

  • 我现在引入a.js但是我不用他的console函数,那么在优化阶段我完全可以不打包a.js这个文件。
  • 我现在引入b.js但是我不用他的console函数,但是我不可以不打包b.js这个文件,因为他有副作用,不能不打包。

sideEffects的使用

sideEffects可以在package.json中设置:

// 所有文件都有副作用,全都不可 tree-shaking
{
 "sideEffects": true
}
// 没有文件有副作用,全都可以 tree-shaking
{
 "sideEffects": false
}
// 只有这些文件有副作用,
// 所有其他文件都可以 tree-shaking,
// 但会保留这些文件
{
 "sideEffects": [
  "./src/file1.js",
  "./src/file2.js"
 ]
}

优化体积

当我把sideEffects设置成true之后,整个打包体积增加了100k,说明默认的false还是有用的。

责任编辑:武晓燕 来源: 前端之神
相关推荐

2019-11-04 11:30:51

区块链技术智能

2021-06-06 13:08:22

C#特性Attribute

2021-05-17 20:13:50

数仓操作型数据库

2022-02-22 13:20:57

RSA算法加密

2022-04-10 19:26:07

TypeScript类型语法

2013-05-29 10:17:56

Hadoop分布式文件系统

2024-02-07 12:35:00

React并发模式concurrent

2020-04-03 18:46:27

IPv6互联网IPv4

2020-05-26 10:42:31

数据库读写分离数据库架构

2021-12-16 15:11:59

Facebook天秤币加密货币

2022-09-06 21:38:45

数字人数字孪生

2022-03-29 09:18:55

区块链

2009-11-16 10:53:30

Oracle Hint

2021-05-11 07:30:58

JNIJavaAPI

2022-05-04 08:38:32

Netty网络框架

2021-01-28 17:41:32

Github网站Pull Reques

2021-12-26 00:01:51

Log4Shell漏洞服务器

2016-03-03 17:42:10

DockerDCOS

2018-01-23 11:42:50

程序员编程代码

2019-08-09 10:33:36

开发技能代码
点赞
收藏

51CTO技术栈公众号