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输出Hello World完美过程解析
Jun 13 Java/Android
ConstraintValidator类如何实现自定义注解校验前端传参
Jun 18 Java/Android
Java多条件判断场景中规则执行器的设计
Jun 26 Java/Android
mybatis 获取无数据的字段不显示的问题
Jul 15 Java/Android
Java比较两个对象中全部属性值是否相等的方法
Aug 07 Java/Android
Spring Security使用单点登录的权限功能
Apr 03 Java/Android
Java字符缓冲流BufferedWriter
Apr 09 Java/Android
零基础学java之带返回值的方法的定义和调用
Apr 10 Java/Android
Android Studio实现简易进制转换计算器
May 20 Java/Android
Spring IOC容器Bean的作用域及生命周期实例
May 30 Java/Android
Android开发EditText禁止输入监听及InputFilter字符过滤
Jun 10 Java/Android
JDK8中String的intern()方法实例详细解读
Sep 23 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 5.0 Pear安装方法
2006/12/06 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
php基于curl实现的股票信息查询类实例
2016/11/11 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
Angularjs根据json文件动态生成路由状态的实现方法
2017/04/17 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
[01:03:03]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
理解Python中的类与实例
2015/04/27 Python
Django实现跨域的2种方法
2019/07/31 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
Python drop方法删除列之inplace参数实例
2020/06/27 Python
linux系统下pip升级报错的解决方法
2021/01/31 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
销售自我评价
2013/10/22 职场文书
学生宿舍管理制度
2014/01/30 职场文书
争论的故事教学反思
2014/02/06 职场文书
户外亲子活动策划方案
2014/02/07 职场文书
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
党员公开承诺书
2014/03/25 职场文书
同学聚会通知短信
2015/04/20 职场文书
python实现高效的遗传算法
2021/04/07 Python
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL
Centos环境下Postgresql 安装配置及环境变量配置技巧
2021/05/18 PostgreSQL
Java8中Stream的一些神操作
2021/11/02 Java/Android