Vue3.0你知道有哪些改进

Vue3都做了哪些改进升级,看这一篇就够了 而在Vue 3中,对Fragments进行了优化,可以直接将其内部的内容合并到父级中,减少了虚拟DOM层级,提高了Diff算法的效率。Vue 3.0 中,编译器会对静态节点进行标记,在更新时可以直接跳过这些静态节点,对于这部分静态内容,Vue 3将其提升为常量,避免了每次渲染都进行比较的开销,减少 DOM 操作,进一步提高了渲染性能。Vue 3.0 中,对于动态删除操作,采用了异步队列的方式进行,能够将多个删除操作合并为一个,减少 DOM 操作,提升性能。 阅读详情

Vue3.0你知道有哪些改进

改进

概括一下有如下改进:

  1. 压缩包体积更小(20Kb => 10Kb)
  2. 数据劫持的方式修改(Object.defineProperty => Proxy)
  3. Virtual DOM 重构,提供diff算法效率
  4. 组件定义方式变更(Options API => Function_Based API)

压缩包体积更小

当前最小化并被压缩的 Vue 运行时大小约为 20kB(2.6.10 版为 22.8kB)。Vue 3.0捆绑包的大小大约会减少一半,即只有10kB!

数据劫持的方式修改(Object.defineProperty => Proxy)

Vue 2.x中使用的Object.defineProperty有以下问题:

  1. 不能监听数组的变化,需要hack技术
  2. 只能监听目标对象一层的变化,需要递归调用Object.defineProperty来实现深入监听
  3. 通过Object.defineProperty来重新定义目标对象,造成了vm.$data的体积膨胀,如果遇到定义大量且层级复杂的场景(如echarts)会操作极大的性能消耗

Virtual DOM 重构,提供diff算法效率

vue的特点是底层为Virtual DOM,上层包含有大量静态信息的模版。为了兼容手写 render function,最大化利用模版静态信息,vue3.0采用了动静结合的解决方案,将vdom的操作颗粒度变小,每次触发更新不再以组件为单位进行遍历,主要更改如下

  • 将模版基于动态节点指令切割为嵌套的区块
  • 每个区块内部的节点结构是固定的
  • 每个区块只需要以一个 Array 追踪自身包含的动态节点

组件定义方式变更(Options API => Function_Based API)

function based API的优势:

  1. 对typescript更加友好,typescript对函数的参数和返回值都非常好,写Function-based API既是javascript又是typescript,不需要任何的类型声明,typescript可以自己做类型推导
  2. vue中的UI组件很少用到继承,一般都是组合,可以用Function-based API
  3. options API中所有配置项都是key-value形式,不利于tree-shaking工具对其进行瘦身

Section 1

认识 Vue3
  • Performance 比 Vue2 runtime 快了2倍
    • 重写了虚拟 dom 的实现
    • 编译模板的优化(运行时编译)
    • update 性能提高 (在编译时给到需要更新的信息,render中_createVNode的传参,把动态的标记为 PROPS)
    • SSR 速度提高
  • Tree Shaking 按需编译代码
  • TS Support
  • Composition Api
  • Customer Render API 自定义渲染器
  • 内置新特性组件
按需编译代码 (从 Vue 中到处函数来用)
用TypeScript 重写
ESlint Vue3.x
extends: [
  'airbnb',
  'plugin:vue/vue3-essential',
  'plugin:vue/vue3-strongly-recommended',
],

VSCode 的 vetur 暂时还不支持 Vue3 或者我哪里配的不对,它总是强行把 Vue2.x 的 lint 给我过一遍,所以就,
settings.json 里:

"vetur.validation.template": false,
Fragment
<template>
  <div>1</div>
  <div>2</div>
</template>
Composition API
  • 更好的逻辑服用与代码组织
  • 更好的类型推导(函数对类型友好)

通过类型来组织代码,Options API,当代码量小的时候很友好,但代码量大时很难维护,反复横跳,一个功能被拆分到很多地方。

Composition API 解决了这个难题。同事也解决 Mixin 带来的副作用。本质是函数。

// 函数组件,从原生命周期抽离出共用的逻辑,本质是函数,容易复用
const sayHello = () => {
  onMounted(() => {
    console.log('hello');
  });
};
export default defineComponent({
  setup() {
    sayHello()
    // 创建响应式对象的方式
    // 3点
    // ref
    // 值类型
    const count = ref(0)
    console.log('count', count);
    // reactive / readonly
    // {} [] 引用类型
    const state = reactive({ time: 0 })
    console.log('state', state);
    const handleClick = () => {
      count.value++
      state.time++
    }
    // 响应式系统 api
    // computed
    const double = computed(() => {
      return count.value * 2
    })
    // 监听double
    watch(double, (value) => {
      console.log('watch double', value);
    })
    return {
      count,
      state,
      double,
      handleClick,
    }
  }
})
Vue Test Utils Next(VTU) 单元测试
测试功能,不是测试细节。主要是为了避免新功能影响旧功能。

一个组件:

  • 输入 -> props / 用户交互
  • 输出 -> dom渲染 / Events(emit)

例子:button.spec.js

TDD:Test-driven development 从使用者角度思考

  1. 先写测试 (根据用户使用的方式 user story)
  2. 写逻辑让测试通过
  3. 重构
TDD模式 重构 Element UI Button
  1. 拆分需要实现的功能
  • 可以显示 slot 的内容
  • 设置 size
  • 设置 type
  • 是否 圆角、plain、disabled、…

例子:button.spec.js

Section 2

  • Custom Render API
  • Vue3 源码
Custom Render API

自定义渲染,用户可自定义渲染目标平台(比如Canvas)

  • createRenderer
  • 接口
    • createElement
    • insert
    • patchProp

例子:自定义渲染到画布(Pixi.js创建)上


Vue3.0中比较重要的改进

1,压缩包体积更小
当前最小化并被压缩的 Vue 运行时大小约为 20kB(2.6.10 版为 22.8kB)。Vue 3.0捆绑包的大小大约会减少一半,即只有10kB!

2,Object.defineProperty -> Proxy

Object.defineProperty是一个相对比较昂贵的操作,因为它直接操作对象的属性,颗粒度比较小。将它替换为es6的Proxy,在目标对象之上架了一层拦截,代理的是对象而不是对象的属性。这样可以将原本对对象属性的操作变为对整个对象的操作,颗粒度变大。

javascript引擎在解析的时候希望对象的结构越稳定越好,如果对象一直在变,可优化性降低,proxy不需要对原始对象做太多操作。

3,Virtual DOM 重构

vdom的本质是一个抽象层,用javascript描述界面渲染成什么样子。react用jsx,没办法检测出可以优化的动态代码,所以做时间分片,vue中足够快的话可以不用时间分片。

传统vdom的性能瓶颈:

虽然 Vue 能够保证触发更新的组件最小化,但在单个组件内部依然需要遍历该组件的整个 vdom 树。
传统 vdom 的性能跟模版大小正相关,跟动态节点的数量无关。在一些组件整个模版内只有少量动态节点的情况下,这些遍历都是性能的浪费。
JSX 和手写的 render function 是完全动态的,过度的灵活性导致运行时可以用于优化的信息不足
那为什么不直接抛弃vdom呢?

高级场景下手写 render function 获得更强的表达力
生成的代码更简洁
兼容2.x
vue的特点是底层为Virtual DOM,上层包含有大量静态信息的模版。为了兼容手写 render function,最大化利用模版静态信息,vue3.0采用了动静结合的解决方案,将vdom的操作颗粒度变小,每次触发更新不再以组件为单位进行遍历,主要更改如下

将模版基于动态节点指令切割为嵌套的区块
每个区块内部的节点结构是固定的
每个区块只需要以一个 Array 追踪自身包含的动态节点
vue3.0将 vdom 更新性能由与模版整体大小相关提升为与动态内容的数量相关

4, 更多编译时优化
Slot 默认编译为函数:父子之间不存在强耦合,提升性能
Monomorphic vnode factory:参数一致化,给它children信息,
Compiler-generated flags for vnode/children types

5,选用Function_based API
为什么撤销 Class API ?

1,更好地支持TypeScript

Props 和其它需要注入到 this 的属性导致类型声明依然存在问题
Decorators 提案的严重不稳定使得依赖它的方案具有重大风险
2,除了类型支持以外 Class API 并不带来任何新的优势

3,vue中的UI组件很少用到继承,一般都是组合,可以用Function-based API

Function_based API示例如下

1,vue3.0将组件的逻辑都写在了函数内部,setup()会取代vue2.x的data()函数,返回一个对象,暴露给模板,而且只在初始化的时候调用一次,因为值可以被跟踪。

2,新的函数api:const count = value(0)

value是一个wrapper,是一个包装对象,会包含数字0,可以用count.value来获取这个值。在函数返回的时候会关心是value wrapper,一旦返回给模版,就不用关心了。

优点:即使count包含的是基本类型,例如数字和字符串,也可以在函数之间来回传递,当用count.value取值的时候会触发依赖,改值的时候会触发更新。

3,计算属性返回的也是这个值的包装。

4,onMounted生命周期函数直接注入。

Function-based API 对比Class-based API有以下优点

1,对typescript更加友好,typescript对函数的参数和返回值都非常好,写Function-based API既是javascript又是typescript,不需要任何的类型声明,typescript可以自己做类型推导。

2,静态的import和export是treeshaking的前提,Function-based API中的方法都是从全局的vue中import进来的。

3,函数内部的变量名和函数名都可以被压缩为单个字母,但是对象和类的属性和方法名默认不被压缩(为了防止引用出错)。

4,更灵活的逻辑复用。

目前如果我们要在组件之间共享一些代码,则有两个可用的选择:mixins 和作用域插槽( scoped slots),但是它们都存在一些缺陷:

1,mixins 的最大缺点在于我们对它实际上添加到组件中的行为一无所知。这不仅使代码变得难以理解,而且还可能导致名称与现有属性和函数发生冲突。

2,通过使用作用域插槽,我们确切地知道可以通过 v-slot 属性访问了哪些属性,因此代码更容易理解。这种方法的缺点是我们只能在模板中访问它,并且只能在组件作用域内使用。

高阶组件在vue中比较少,在react中引入是作为mixins的替代品,但是比mixins更糟糕,高阶组件可以将多个组件进行包装,子组件通过props接收数据,多个高阶组件一起使用,不知道数据来自哪个高阶组件,存在命名空间的冲突。而且高阶组件嵌套得越多,额外的组件实例就越多,造成性能损耗。

下面以一个鼠标位置侦听的案例演示vue3.0中的逻辑复用

以上就是vue3.0中比较重要的改进,我会在后面的文章中结合具体代码详细为大家讲解vue3.0更多新的使用方法。希望大家持续关注,共勉。

vue-pixi:基于Vue3的PIXIJS渲染器 Vue-pixi 基于Vue3的PIXIJS渲染器 立即下载

相关推荐

vue-pixijs:使用vue3.0开发pixijs

vue-pixijs 使用 vue3 的语法来开发 pixijs 实现原理 实现了自定义的 vue Renderer ,渲染使用 pixijs why 需求驱动学习 vue3 + pixijs 以开发小游戏的形式去完善 Renderer 进行中

【前端网页游戏开发】Vue3+PixiJS开发2D闯关打怪游戏,更新内容(打斗)

本次更新内容:怪物攻击,怪物死亡,怪物刷新,自动跟随玩家,靠近玩家时自动攻击,玩家点击键盘J键可以攻击怪物,玩家血量为10,怪物的血量为5,怪物每5秒钟刷新一次,并且大于5只时不再刷新,怪物的伤害为攻击一次减1血量,玩家的伤害为攻击减2血量,当玩家或者怪物死亡时倒地,并且不再移动,玩家死亡游戏结束,弹出提示框,是否回到主界面重新开始游戏,杀死怪物10只后游戏通关,提示是否进入下一关。

m0_61279136的博客 1464

SSL证书验证:VMware Horizon Client的安全隐患与临时解决方案

本文深入分析了VMware Horizon Client中SSL证书验证失败的安全隐患,提供了临时解决方案与长期防御策略。针对自签名证书、证书链断裂等常见问题,文章详细解析了风险成因,并给出分级响应方案,帮助企业平衡安全与效率。通过实战案例和自动化脚本,指导IT管理员构建主动防御体系,有效降低中间人攻击风险。

weixin_29290863的博客 337

vue3有了哪些提升

Vue2 中的一个常用代码复用方式是 mixins 混入,mixins在一些场景下确实能很大的提升代码复用率,但同时也会带来一些副作用,比如依赖关系不清晰,mixins里定义的data和methods等在组件中使用时没有明确的引入和定义,而且可能与组件里定义的有命名冲突,有很大的维护风险。由于 es6 的模块化导入导出是静态可分析的,所以在打包的时候通过解析js代码就能明确知道哪部分代码使用了、哪部分代码没有使用,然后只对使用到的代码进行打包,这样就能实现按需打包的效果。(模块按需加载减少包大小)

weixin_57913339的博客 1029

SAP CO实战:如何用KKA2/CJ88结果分析码搞定项目收入成本匹配(附真实案例)

本文深入解析了SAP CO模块中结果分析码KKA2/CJ88的核心应用,通过真实案例详细阐述了如何在成本波动剧烈的销售型项目中,运用结果分析实现收入与成本的精准匹配。文章重点拆解了不同结果分析方法的适用场景与财务影响,并提供了从配置、操作到问题排查的完整实战指南,帮助财务顾问提升项目财务管理能力。

qsc9012345的博客 606

Error: dependent ‘..\..\..\..\Qt\5.15.2\msvc2019\include\QtWidgets\QMainWindow‘ does not exist.

核心问题:修改 Build 目录为源码子目录后,MSVC 编译报错,本质是变量设置异常,导致 qmake 生成多余回溯路径;临时解决:在 .pro 文件添加;最优解决:将上述配置写入 Qt 的 msvc 对应 qmake.conf 全局文件,一劳永逸;禁止 qmake 计算路径时向上回溯,避免生成异常路径。

mumufan05的专栏 877

用vue3+pixijs复刻童年记忆里的游戏-猎鸭

大厂技术坚持周更精选好文前言本期将用vue3与pixijs复刻出童年在小霸王里面玩的游戏-猎鸭季节,当初玩它需要光线枪才行,非常不好瞄准,每当打中鸭子就非常激动,打不中就会有收到狗子的嘲笑,想想那时候快乐真的很简单。现在,就想办改造了一下,让他不用光线枪用鼠标也能击中它,圆童年一个梦。废话不多说,我们先来康康展示效果怎样吧:“演示地址:http://jsmask....

趣谈前端 1430

C#实战:如何用HslCommunication快速搞定三菱FX5U PLC通讯(附完整代码)

本文详细介绍了如何利用HslCommunication库在C#环境中快速实现与三菱FX5U PLC的通讯。通过实战代码演示,从环境搭建、建立连接、核心数据读写到构建健壮的监控服务,系统讲解了如何高效完成数据采集与交互,大幅提升工业自动化项目的开发效率。

s4t5u6v的博客 1199

Vue3.0你知道有哪些改进?

Vue3采用了Type Script来编写 支持 Composition API Vue3中响应式数据原理改成proxy vdom的对比算法更新,只更新vdom的绑定了动态数据的部分

qq_39280289的博客 325

别再纠结了!车规MCU选M7还是R52?一张图看懂你的车身控制器/域控制器该用谁

本文深入探讨车规MCU选型中Cortex-M7与Cortex-R52的核心差异,提供基于安全等级与实时性需求的选型决策图。通过对比ASIL认证、实时性能及成本效益,帮助工程师在车身控制器/域控制器设计中做出精准选择,避免潜在风险与隐性成本。

weixin_42628688的博客 397

Welch 方法详解:一种经典而实用的功率谱密度估计方法

在信号处理领域,谱分析是用于分析信号频率内容的强大工具。Welch方法是现代谱分析中一种广泛使用的功率谱密度估计技术,由Peter D. Welch在1967年提出。它通过对信号进行分段、加窗和平均化处理,提供了一种平滑且稳定的频谱估计方法。Welch方法通过将信号分成多个重叠的段,每段应用窗函数,然后计算每段的周期图,最后对所有周期图进行平均化,得到平滑的功率谱密度估计。welch_psd函数接收信号x、采样频率fs、每段的样本数N、重叠样本数overlap和窗函数类型window。

DuHz的博客 7034

vue3.0有哪些变化

## ** 发展历程** vue.js1.x-----vue.js2.x 引入了虚拟DOM vue.js2.x问题 1)源码自身的维护性 数据量大后带来的渲染和更新的性能问题 2)兼容性 想舍弃但为了兼容一直保留的鸡肋API ## ## **vue3.0的优化** #### 1)首先是源码优化,vue.js框架本身的优化 目的是让代码更易于开发和维护 源码的优化主要体现在使用monorepo和typescript管理和开发源码,这样做的目标是提升自身代码的可维护性 ![image.pn.

你想要的都有 1366

ShardingSphere 5.3 系列Spring 配置升级指南 | Spring Cloud 47

在 `5.3.0` 版本以前,`ShardingSphere-JDBC` 同时支持 `Java API`、`YAML`、`Spring Boot Starter` 和 `Spring Namespace` 等配置方式。 - 当新增或更新 API 时,需要调整多项配置文件,工作量大 - 社区需要维护多重配置文档和示例 - `Spring Bean` 生命周期管理容易受到项目其他依赖的影响,比如 `PostProcessor` 无法正常执行 - `Spring Boot Starter` 和 `Spring N

gmHappy 2万+

全面总结 Vue 3.0 的新特性

Vue3.0从20年九月发布第一个One Piece版本,到现在一直在更新优化;中文版的官方文档也已经放出;那么作为终端用户的我们来看下Vue3新增了哪些功能和特性。 尤大大在B站直播时分享了Vue3.0的几个亮点: Performance:性能优化 Tree-shaking support:支持摇树优化 Composition API:组合API Fragment,Teleport,Suspense:新增的组件 Better TypeScript suppo

汤玉鹏 2万+

QGis软件 —— 9、QGis - 由点绘制热力图来模拟人流量(绘制点方式、excel导入数据方式)

QGis软件 —— 9、QGis - 由点绘制热力图来模拟人流量(绘制点方式、excel导入数据方式)

1469

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

你应该知道的vue3.0优势对比

后续文章会更新vue3.0相关的组合式api。

总结前端开发中遇到的问题,分享前端知识 884

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Vue 3.0 对数据双向绑定的改进

目录 1、Object.defineProperty 的缺陷 2、Vue 3.0 的数据双向绑定原理 3、之前的问题得到了完美的解决 1、Object.defineProperty 的缺陷 熟悉 Vue 的人都知道,在 vue2.x 之前都是使用 Object.defineProperty() 来实现双向数据双向绑定(数据响应式)的,如果你对此有疑问的话,可以看一下我的这篇博客:深入 Vue 2.x 数据响应式原理。但是这个 Object.defineProperty() 的方法是有挺多缺陷的,下

Yingjieweb 的技术博客 1416

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Vue3.0从入门到一骑绝尘

一、vue3.0介绍 Vue3.0支持大多数的Vue2的特性,Vue3中设计了一套强大的composition组合API代替Vue2中的optionAPI,复用性更强大了,对TypeScript有更好的支持。 二、创建项目 2.1Vue-cli脚手架搭建项目 2.2、vite搭建项目 Vite是一个web开发构建工具,由于其原生ES模块导入方式,可以实现闪电般的模块热更新; npm init @vitejs/app<项目名> ................................

javaScript1997的博客 3655

【Vuejs】1117- 全面总结Vue3.0的新特性

总字数:5,864 | 阅读时间:26分钟 Vue3.0从20年九月发布第一个One Piece版本,到现在一直在更新优化;除了服务端渲染的工作,其他工作已经大部分完成了,中文版的官方文档...

pingan8787 615

vue3.0与vue2.0的区别简记(基于官方文档)

至于选哪一种好:看你自己,选哪种舒服就选哪种(~~)官方也是这么说(狗头保命。。。

start_sea的博客 2526

VUE2.0和VUE3.0的区别

1.默认目录结构的变化 vue-cli2.0与3.0在目录结构方面,有明显的不同 vue-cli3.0移除了配置文件目录,config 和 build 文件夹 同时移除了 static 静态文件夹,新增了 public 文件夹,打开层级目录还会发现, index.html 移动到 public 中 2.配置项 3.0 config文件已经被移除,但是多了.env.production和env.development文件,除了文件位置,实际配置起来和2.0没什么不同 没了config文件,跨域需要配置域名时,

weixin_47208955的博客 4903

学习Vue3.0笔记

Vue3快速上手Vue3简介Vue3相对于Vue2多了些什么?1.性能的提升2.源码改变3.拥抱TS4.新特性(重点)快速上手Vue3工程创建标题 Vue3简介 代号:One Piece(海贼王) Vue3相对于Vue2多了些什么? 1.性能的提升 根据官方文档描述,Vue3性能的提升提升主要包括以下几个方面: 打包大小减少了41%。 初次渲染55%,更新渲染快了133%。 内存减少54%。 2.源码改变 响应式的实现。之前我们知道Vue2的响应式是通过Object.definePropetry()

niepan990810的博客 2515

vue2和vue3在数据响应式的区别,vue3做了哪些优化和改进?

Vue2和Vue3在数据响应式方面的区别,以及Vue3做了哪些优化和改进。我需要先回顾一下Vue2的响应式原理,然后对比Vue3的变化,再总结改进点。

钱端猿的博客 1036

Vue3.0源码解析:Vue3.0的重大变革

从vue.js到vue2.x最大的变革是就是引入了虚拟dom的概念,一路走来vue也算是在艰难中前行,vue3.0正向前端开发者阔步走来。那么vue3.0又将带来哪些重大变革呢? 源码优化 1. 更好的代码管理方式:monorepo 首先,源码的优化体现在代码管理方式上。 Vue.js 2.x 的源码托管在 src 目录,然后依据功能拆分出了 compiler(模板编译的相关代码)、core(与平台无关的通用运行时代码)、platforms(平台专有代码)、server(服务端渲染的相关代码)、sf

lee前端技术站 2027

Vue3.0 响应式实现原理分析

我们知道Vue 2.0是利用Ojbect.defineProperty对对象的已有属性值的读取和修改进行劫持,但是这个API不能监听对象属性的监听和删除,此外为了深度劫持对象的内部属性,必须在初始化的时候对内部属性进行递归调用Ojbect.defineProperty,这就造成了一个性能上的消耗。为了解决这些问题,Vue 3.0利用Proxy重写了响应式逻辑并且优化了相关性能。 使用案例 我们先来个示例看下Vue 3.0的相应式API的写法: changePerson能改变响应式数据person的值,pe

lcl130的专栏 1613

TS + Vue3.0

转载至:Vue3+Ts 快速上手

qq_41256253的博客 2384
上一篇: new Vue 发生了什么
下一篇: 《CLR via C#》第四章《类型基础》
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值