Tree-shaking到底有啥用?简简单单地说一下!

涡旋
• 阅读 2661

前言

大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心

背景

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

但是,又有多少人去真的了解一下 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 还是有用的。。

Tree-shaking到底有啥用?简简单单地说一下!

结语

我是林三心,一个热心的前端菜鸟程序员。如果你上进,喜欢前端,想学习前端,那咱们可以交朋友,一起摸鱼哈哈,摸鱼群,加我请备注【思否】

Tree-shaking到底有啥用?简简单单地说一下!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
涡旋
涡旋
Lv1
万竹扫天青欲雨,一峰受月白成霜。
文章
4
粉丝
0
获赞
0