Vue3.0都有哪些新特性及优化点

Vue3的新特性:

Vue3主要有以下几个方面的改动及提升:

更快、更小、更易于维护

更快

在性能方面的提升,以及在源码层面的改动,主要包括:重构虚拟DOM、事件缓存、基于Proxy的响应式对象。

1. 重构虚拟DOM

Vue3重写了虚拟DOM的实现方法,使得初始渲染/更新可以提速达100%。

优化内容:

  • 1.1 标记静态内容,并区分动态内容(静态提升)。
  • 1.2 更新时只diff动态的部分。

2. 事件缓存

Vue3中,提供了事件缓存对象cacheHandlers, 当cacheHandlers开启时,@click绑定的事件会被标记为静态节点,被放入cacheHandlers中,这样在视图更新时也不会追踪,当事件再次触发时,就无须重新生产函数,直接调用缓存的事件回调方法,在事件处理方面提升了Vue的性能。

3. 基于Proxy的响应式对象

在Vue2.0中,使用Object.defineProperty()实现响应式对象,对于一些复杂的对象,需要循环递归地给每个属性增加getter/setter监听器,性能开销较大。Vue3.0中,内部利用ES6的Proxy API实现响应式对象,可以自动监听对象中所有属性的变化,性能开销较小。

Object.defineProperty的实现方式:

javascript 复制代码
let obj = {
    _name: 'John'
}
Object.defineProperty(obj, 'name', {
    get: function() {
        return this._name
    },
    set: function(value) {
        console.log('name is changed to:', value)
        this._name = value
    }
})

ES6的proxy实现方式:

javascript 复制代码
onst user = {
    name: 'summer'
}
const proxy = new Proxy(user, {
    get(target, property, receiver) {
        onTrack()
        return Reflect.get(...arguments)
    },
    set(target, property, value, receiver) {
        onTrigger()
        return Reflect.set(...arguments)
    }
})

源码中Proxy的使用:

更小

Vue3.0的压缩后代码大小为20k左右,相比Vue2.0的压缩后代码大小244k,减少了91%。

使用Tree Shaking的原理是引入了ES6的模块静态分析,在编译时正确判断到底加载了什么代码,但是要注意import和export是ES6原生的,而不是通过Babel或Webpack转化的。

更易于维护

Vue3.0的源码结构更加清晰,模块化程度更高,代码的可读性、可维护性也更好。Vue3采用TypeScript来重写,;源代码目录结构遵循Monorepo。

  • 1.1 源码从Flow改成了TypeScript来编写,TypeScript引入了很多新的特性,例如类型检测、接口等
  • 1.2 Monorepo是一种管理代码的方式,核心观点是所有的项目在一个代码仓库中,但是代码分割到一个个小的模块中,而不是在src这个目录中。

组合式API

Vue2.0选项式API开发

javascript 复制代码
export default {
    name: 'test',
    components: {},
    props: {},
    data: {
        return {}
    },
    watch: {},
    mounted() {},
    methods: {}
}

Vue3.0组合式API开发

javascript 复制代码
export default {
    name: 'test',
    props: {
        name: String
    },
    components: {},
    setup(props, ctx) {
        console.log(props.name)
        const data = reactive({})
        onMounted() {},
        const myMethod = () => {}
        return {
            data,
            myMethod
        }
    },
}

Vite

使用vite初始化项目,要求node版本要大于等于18.3.0

javascript 复制代码
npm create vue@latest

Vite在开发环境下基于浏览器原生的ES6 Modules开发,在生产环境下基于Rollup打包。

特性:

  • 1.1 快速冷启动
  • 1.2 模块热更新
  • 1.3 真正的按需编译

常用的ES6新特性哪些?

  • 1.1 变量的声明:let、const
  • 1.2 箭头函数
  • 1.3 模板字符串
  • 1.4 解构赋值
  • 1.5 对象的扩展
  • 1.6 Set和Map数据结构
  • 1.7 Promise对象
  • 1.8 Class类
  • 1.9 模块化
相关推荐
Bs_MoneyMagnet11 分钟前
基于springboot+vue的会议室预约管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
Bs_MoneyMagnet27 分钟前
基于springboot+vue的茶铺管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
志尊宝2 小时前
Vue3 零基础每日笔记(018):按键与鼠标修饰符——回车搜索、Ctrl+S 保存这样写
javascript·vue.js·笔记
志尊宝3 小时前
Vue3 零基础每日笔记(021):class 与 style 动态绑定——对象、数组、三元表达式写法汇总
前端·vue.js·笔记·前端框架·html5
夏幻灵3 小时前
Vue / React 列表渲染中的 key:为什么没有 key,Checkbox 可能“对号跑错”?
前端·javascript·vue.js
Bs_MoneyMagnet4 小时前
基于springboot+vue的旅游行程分享与推荐小程序的设计与实现 源码+文档
java·vue.js·spring boot·后端·微信小程序·毕业设计·计算机毕业设计
岁岁种桃花儿4 小时前
Vue组件第六篇:Vue单文件组件
开发语言·前端·javascript·vue.js
毕业设计70316 小时前
(免费领源码) 基于微信小程序的预制菜商城的设计与实现25172-java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
vue.js·python·mysql·微信小程序·pycharm·微信开发者工具·推荐算法
xifangge202516 小时前
AGENTS.md 怎么写?涵盖 Java、Python、Vue、Go 的 8 套开箱即用模板
java·vue.js·python