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 相关文章推荐
springboot @ConfigurationProperties和@PropertySource的区别
Jun 11 Java/Android
教你用Java Swing实现自助取款机系统
Jun 11 Java/Android
Java实现多线程聊天室
Jun 26 Java/Android
Springboot使用Spring Data JPA实现数据库操作
Jun 30 Java/Android
Spring中bean的生命周期之getSingleton方法
Jun 30 Java/Android
SpringBoot工程下使用OpenFeign的坑及解决
Jul 02 Java/Android
小程序与后端Java接口交互实现HelloWorld入门
Jul 09 Java/Android
SpringBoot实现quartz定时任务可视化管理功能
Aug 30 Java/Android
详解Java七大阻塞队列之SynchronousQueue
Sep 04 Java/Android
Spring Boot项目传参校验的最佳实践指南
Apr 05 Java/Android
Java 中的 Lambda List 转 Map 的多种方法详解
Jul 07 Java/Android
Spring Boot实现文件上传下载
Aug 14 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源代码
2006/10/09 PHP
PHP 采集程序 常用函数
2008/12/18 PHP
PHP中array_merge和array相加的区别分析
2013/06/17 PHP
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
2013/09/28 PHP
PHP中常用的转义函数
2014/02/28 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
jquery 事件执行检测代码
2009/12/09 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
JS实现图片手风琴效果
2020/04/17 Javascript
react中fetch之cors跨域请求的实现方法
2018/03/14 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
如何使用pm2快速将项目部署到远程服务器
2019/03/12 Javascript
使用Node.js实现一个多人游戏服务器引擎
2019/03/13 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
详解NodeJs项目 CentOs linux服务器线上部署
2019/09/16 NodeJs
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
2020/09/21 Javascript
怎样使用Python脚本日志功能
2016/08/14 Python
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
基于python的图片修复程序(实现水印去除)
2018/06/04 Python
解析python的局部变量和全局变量
2019/08/15 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
python实现批处理文件
2020/07/28 Python
Python 如何展开嵌套的序列
2020/08/01 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
波兰购物网站:MALL.PL
2019/05/01 全球购物
《美丽的丹顶鹤》教学反思
2014/04/22 职场文书
我的长生果教学反思
2014/04/28 职场文书
水电工岗位职责
2015/02/14 职场文书
会计稽核岗位职责
2015/04/13 职场文书
商场营业员岗位职责
2015/04/14 职场文书
民事答辩状格式范文
2015/05/21 职场文书