tree shaking对打包体积优化及作用


Posted in Java/Android onJuly 07, 2022

背景

大家平时在查 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还是有用的。。

以上就是tree shaking对打包体积优化及作用的详细内容,更多关于tree shaking打包体积优化的资料请关注三水点靠木其它相关文章!


Tags in this post...

Java/Android 相关文章推荐
Java循环队列与非循环队列的区别总结
Jun 22 Java/Android
Feign调用传输文件异常的解决
Jun 24 Java/Android
spring cloud gateway中如何读取请求参数
Jul 15 Java/Android
Java spring定时任务详解
Oct 05 Java/Android
Java 实战项目之家居购物商城系统详解流程
Nov 11 Java/Android
JavaCV实现照片马赛克效果
Jan 22 Java/Android
Java实现学生管理系统(IO版)
Feb 24 Java/Android
SpringCloud Feign请求头删除修改的操作代码
Mar 20 Java/Android
Java 写一个简单的图书管理系统
Apr 26 Java/Android
Java 轮询锁使用时遇到问题
May 11 Java/Android
springboot为异步任务规划自定义线程池的实现
Jun 14 Java/Android
Android学习之BottomSheetDialog组件的使用
Jun 21 Java/Android
MyBatis在注解上使用动态SQL方式(@select使用if)
Jul 07 #Java/Android
一文了解Java动态代理的原理及实现
Jul 07 #Java/Android
Java实现字符串转为驼峰格式的方法详解
Jul 07 #Java/Android
Spring中bean集合注入的方法详解
java中如何截取字符串最后一位
Jul 07 #Java/Android
Java 中的 Lambda List 转 Map 的多种方法详解
Jul 07 #Java/Android
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
Jul 07 #Java/Android
You might like
php面向对象全攻略 (十二) 抽象方法和抽象类
2009/09/30 PHP
PHP实现的购物车类实例
2015/06/17 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
2018/03/15 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
Javascript 各浏览器的 Javascript 效率对比
2008/01/23 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
理解JAVASCRIPT中hasOwnProperty()的作用
2013/06/05 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
js实现消灭星星(web简易版)
2020/03/24 Javascript
[01:11:15]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
tensorflow输出权重值和偏差的方法
2018/02/10 Python
django 修改server端口号的方法
2018/05/14 Python
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
深入flask之异步非堵塞实现代码示例
2018/07/31 Python
python 构造三维全零数组的方法
2018/11/12 Python
Django model update的多种用法介绍
2020/03/28 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
.NET常见笔试题集
2012/12/01 面试题
出生医学证明样本
2014/01/17 职场文书
大学生创业策划书
2014/02/02 职场文书
大学生自我评价范文分享
2014/02/21 职场文书
环境建设实施方案
2014/03/14 职场文书
卖车协议书
2014/04/21 职场文书
医院领导班子整改方案
2014/10/01 职场文书
个人总结格式范文
2015/03/09 职场文书
创业计划书之面包店
2019/09/17 职场文书
Python list列表删除元素的4种方法
2021/11/01 Python
php实例化对象的实例方法
2021/11/17 PHP
python blinker 信号库
2022/05/04 Python