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异步之call future
Jun 14 Java/Android
Java各种比较对象的方式的对比总结
Jun 20 Java/Android
如何解决springcloud feign 首次调用100%失败的问题
Jun 23 Java/Android
Java中常用解析工具jackson及fastjson的使用
Jun 28 Java/Android
详细了解MVC+proxy
Jul 09 Java/Android
Spring Boot 排除某个类加载注入IOC的操作
Aug 02 Java/Android
idea以任意顺序debug多线程程序的具体用法
Aug 30 Java/Android
logback 实现给变量指定默认值
Aug 30 Java/Android
Spring中的使用@Async异步调用方法
Nov 01 Java/Android
剑指Offer之Java算法习题精讲二叉树的构造和遍历
Mar 21 Java/Android
SpringCloud项目如何解决log4j2漏洞
Apr 10 Java/Android
Android自定义双向滑动控件
Apr 19 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获取网站域名和地址的代码
2008/08/17 PHP
LotusPhp笔记之:Logger组件的使用方法
2013/05/06 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
Thinkphp5.0 框架Model模型简单用法分析
2019/10/11 PHP
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
js打造数组转json函数
2015/01/14 Javascript
JavaScript按值删除数组元素的方法
2015/04/24 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
Node解决简单重复问题系列之Excel内容的获取
2018/01/02 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
JS正则表达式常见用法实例详解
2018/06/19 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
在Python中处理字符串之ljust()方法的使用简介
2015/05/19 Python
python中正则表达式的使用方法
2018/02/25 Python
python中正则表达式与模式匹配
2019/05/07 Python
python lxml中etree的简单应用
2019/05/10 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
python实现同一局域网下传输图片
2020/03/20 Python
django执行原始查询sql,并返回Dict字典例子
2020/04/01 Python
教育实习生的自我评价分享
2013/11/21 职场文书
清洁工表扬信
2014/01/08 职场文书
养生餐厅创业计划书范文
2014/03/26 职场文书
初中班主任评语
2014/04/24 职场文书
会计工作总结范文2014
2014/12/23 职场文书
党建工作汇报材料
2014/12/24 职场文书
清明节寄语2015
2015/03/23 职场文书
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android
Python编写冷笑话生成器
2022/04/20 Python