当前位置: 首页 > news >正文

Vue 3.0中Treeshaking特性(详细解析)

在这里插入图片描述


文章目录

  • 一、是什么
  • 二、如何做
    • Vue2 项目
    • Vue3 项目
  • 三、作用
  • 参考文献


一、是什么

Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术,专业术语叫 Dead code elimination

简单来讲,就是在保持代码运行结果不变的前提下,去除无用的代码

如果把代码打包比作制作蛋糕,传统的方式是把鸡蛋(带壳)全部丢进去搅拌,然后放入烤箱,最后把(没有用的)蛋壳全部挑选并剔除出去

treeshaking则是一开始就把有用的蛋白蛋黄(import)放入搅拌,最后直接作出蛋糕

也就是说 ,tree shaking 其实是找出使用的代码

Vue2中,无论我们使用什么功能,它们最终都会出现在生产代码中。主要原因是Vue实例在项目中是单例的,捆绑程序无法检测到该对象的哪些属性在代码中被使用到

import Vue from 'vue'Vue.nextTick(() => {})

Vue3源码引入tree shaking特性,将全局 API 进行分块。如果您不使用其某些功能,它们将不会包含在您的基础包中

import { nextTick, observable } from 'vue'nextTick(() => {})

二、如何做

Tree shaking是基于ES6模板语法(importexports),主要是借助ES6模块的静态编译思想,在编译时就能确定模块的依赖关系,以及输入和输出的变量

Tree shaking无非就是做了两件事:

  • 编译阶段利用ES6 Module判断哪些模块已经加载
  • 判断那些模块和变量未被使用或者引用,进而删除对应代码

下面就来举个例子:

通过脚手架vue-cli安装Vue2Vue3项目

vue create vue-demo

Vue2 项目

组件中使用data属性

<script>export default {data: () => ({count: 1,}),};
</script>

对项目进行打包,体积如下图
在这里插入图片描述
为组件设置其他属性(compted、watch

export default {data: () => ({question:"", count: 1,}),computed: {double: function () {return this.count * 2;},},watch: {question: function (newQuestion, oldQuestion) {this.answer = 'xxxx'}
};

再一次打包,发现打包出来的体积并没有变化
在这里插入图片描述

Vue3 项目

组件中简单使用

import { reactive, defineComponent } from "vue";
export default defineComponent({setup() {const state = reactive({count: 1,});return {state,};},
});

将项目进行打包
加粗样式
在组件中引入computedwatch

import { reactive, defineComponent, computed, watch } from "vue";
export default defineComponent({setup() {const state = reactive({count: 1,});const double = computed(() => {return state.count * 2;});watch(() => state.count,(count, preCount) => {console.log(count);console.log(preCount);});return {state,double,};},
});

再次对项目进行打包,可以看到在引入computerwatch之后,项目整体体积变大了
在这里插入图片描述


三、作用

通过Tree shakingVue3给我们带来的好处是:

  • 减少程序体积(更小)
  • 减少程序执行时间(更快)
  • 便于将来对程序架构进行优化(更友好)

参考文献

  • https://segmentfault.com/a/1190000038962700

希望本文能够对您有所帮助!如果您有任何问题或建议,请随时在评论区留言联系 章挨踢(章IT)
谢谢阅读!

相关文章:

  • 06 BGP 基础报文状态
  • Dubbo源码解析第一期:如何使用Netty4构建RPC
  • 某马头条——day11+day12
  • CPA学习:会计政策变更和会计估计变更的划分原则
  • Vulnhub靶机:FunBox10
  • Vue内嵌套层级过深,el-input改变值视图无响应
  • 代码随想录二刷——链表day3
  • 深度学习(5)---自注意力机制
  • 响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-11 HTML5 表单验证
  • Python技术栈 —— 一种超时LRU的实现方式
  • 深入了解Figure的结构与层次
  • C++ Qt day2
  • 华硕ASUS K43SD笔记本安装win7X64(ventoy为入口以支撑一盘多系统);友善之臂mini2440开发板学习
  • Qt文件操作
  • 华为AC+FIT AP组网配置
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • css属性的继承、初识值、计算值、当前值、应用值
  • Effective Java 笔记(一)
  • ES6系统学习----从Apollo Client看解构赋值
  • ESLint简单操作
  • EventListener原理
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • java8 Stream Pipelines 浅析
  • Java到底能干嘛?
  • Koa2 之文件上传下载
  • maven工程打包jar以及java jar命令的classpath使用
  • PHP的Ev教程三(Periodic watcher)
  • Python_网络编程
  • Quartz初级教程
  • Redash本地开发环境搭建
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 从0到1:PostCSS 插件开发最佳实践
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 开源SQL-on-Hadoop系统一览
  • 七牛云假注销小指南
  • 浅谈web中前端模板引擎的使用
  • 软件开发学习的5大技巧,你知道吗?
  • 设计模式 开闭原则
  • 使用parted解决大于2T的磁盘分区
  • 首页查询功能的一次实现过程
  • 新版博客前端前瞻
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • MyCAT水平分库
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​Linux·i2c驱动架构​
  • ​secrets --- 生成管理密码的安全随机数​
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (1)Android开发优化---------UI优化
  • (zt)最盛行的警世狂言(爆笑)
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (超详细)语音信号处理之特征提取
  • (南京观海微电子)——COF介绍