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 相关文章推荐
Spring Data JPA使用JPQL与原生SQL进行查询的操作
Jun 15 Java/Android
SpringAop日志找不到方法的处理
Jun 21 Java/Android
分析ZooKeeper分布式锁的实现
Jun 30 Java/Android
关于springboot 配置date字段返回时间戳的问题
Jul 25 Java/Android
Java中CyclicBarrier和CountDownLatch的用法与区别
Aug 23 Java/Android
java后台调用接口及处理跨域问题的解决
Mar 24 Java/Android
Java GUI编程菜单组件实例详解
Apr 07 Java/Android
Java字符缓冲流BufferedWriter
Apr 09 Java/Android
详细介绍Java中的CyclicBarrier
Apr 13 Java/Android
Android开发 使用文件储存的方式保存QQ密码
Apr 24 Java/Android
Android开发手册自定义Switch开关按钮控件
Jun 10 Java/Android
SpringBoot深入分析讲解监听器模式下
Jul 15 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
Mysql的常用命令
2006/10/09 PHP
用PHP实现小型站点广告管理(修正版)
2006/10/09 PHP
用PHP和ACCESS写聊天室(三)
2006/10/09 PHP
php在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
php天翼开放平台短信发送接口实现方法
2014/12/22 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
Bootstrap 粘页脚效果
2016/03/28 Javascript
vue实现全选、反选功能
2020/11/17 Javascript
Vue计算属性的使用
2017/08/04 Javascript
React Native 集成jpush-react-native的示例代码
2017/08/16 Javascript
如何编写一个d.ts文件的步骤详解
2018/04/13 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
谈谈React中的Render Props模式
2018/12/06 Javascript
vuex 中插件的编写案例解析
2019/06/10 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
2019/11/06 Javascript
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
Python内置函数reversed()用法分析
2018/03/20 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
Python字符串的一些操作方法总结
2019/06/10 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
const和static readonly区别
2013/05/20 面试题
网络维护中文求职信
2014/01/03 职场文书
大学生村官事迹材料
2014/01/21 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
班级光棍节联谊会策划书
2014/10/10 职场文书
公司搬迁通知
2015/04/20 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书
小学四年级作文之写景
2019/08/23 职场文书
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python
在Java中Collection的一些常用方法总结
2021/06/13 Java/Android