vue 2.x 与vue 3.x

Vue 3 介绍:

  • 关于 vue 3 的重构背景,看看尤大怎么说;Vue 的新版本理念成型于 2018年末,当时Vue 2的代码库都已经两岁半了,比起通用软件的生命周期来这好像也没有那么久,但在这段时期,前端世界已经今非昔比了。在我们更新(和重写)Vue 的主要版本时,主要考虑两点因素:首先:是新的 JavaScript 语言特性在主流浏览器中的受支持水平;其次是在当前代码库中随时间推移而逐渐暴露出来的一些设计和结构问题;简要就是:利用新的语言特性(es6),解决架构问题

那vue 3有哪些变化呢?

  • Make it faster
  • Make it smaller
  • Make it more maintainable
  • Make it easier to target native
  • Make your life easier
  • 从上面可以看出,我们可以概览 vue3 新特性如下:
  • 速度更快;体积减少;更易维护;更接近原生;更易使用

速度更快:

  • Rewritten virtual dom implementation
  • Compiler-informed fast paths
  • More efficient component initialization
  • 1.3-2x better update performance
  • 2-3x faster SSR
  • 从上面可以看出速度更快的原因:vue 3重写了 虚拟DOM实现;编译模版的优化;更高效的组件初始化;update 性能提高1.3-2.x;SSR 速度提高了2-3倍;

体积更小:

  • Tree-shaking -Most optional features(e.g.v-model,) are now tree-shakable
  • Bare-bone HelloWorld size:13.5kb;11.75kb with onle Composition API support
  • All runtime features included:22.5kb;More features included:22.5kb
  • 从上面可以看出体积更小的原因:通过 webpack 的 tree-shaking 功能,可以将无用模块“剪辑”,仅打包需要的能够 tree-shaking,有两大好处:对开发人员,能够对 vue. 实现更多其他的功能,而不必担心整体体积过大;对使用者,打包出来的包体积变小了; Vue 可以开发出更多其他的功能,而不必担忧 vue 打包出来的整体体积过多。

更易维护:

  • Compostion API :Usable alongside existing Options API;
  • Flexible logic compositon and reuse;
  • Reactivity module can be used as a standalone library
  • 从上面看更容易维护的原因:可与现有的 Options API 一起使用;灵活的逻辑组合和复用;Vue 3 模块可以和其他框架搭配使用

更好的 Typescript 支持:

  • Better TypeScript Support:Codebase written in TS w/ auto-generated type definitions;
  • API is the same in JS and TS:In fact,code will also be largely the same
  • TSX support
  • Class component is still supported (vue-class-component@next is currently in alpha)
  • 从上面可以看出来:vue 3是基于 typescrpt 编写的,可以享受到自动的类型定义提示。

编译器重写:

  • Compiler Rewrite :Pluggable architectrue;
  • Parser w/ location info (source maps!)
  • Serve as infrastructure for more robust IDE support

更接近原生:

  • Custom Renderer API ;import {createRenderer } from '@vue/runtime-core' ;const {render} =createRenderer({nodeOps,patchData});
  • 从上面可以看出来:更接近原生,可以自定义渲染API

更易使用:

  • Exposed reactivity API;import{observavle,effect} from 'vue';const state=observable({count:0}) ;efftct(()=>{console.log(`count is:${state.count}`});state.count++;
  • 从上面可以看出来,更容易使用,响应式 API 暴露出来。
  • Easily identify:why a compoent is re-rendering ;const Comp ={render(props){return h('div',props.count)},renderTriggered(event){debugger}}
  • 从上面可以看出来,更容易使用,轻松识别组件重新渲染的原因

Vue3 新增特性:

  • vue 3 中需要关注的一些新功能包括:framents ;Teleport;createRenderer;composition Api;

framents: 

     

  • 由此可以看出来,在vue 3 中,组件现在支持多个根节点,这样子不用每个组件包一个结点了,减少dom数量 ,浏览器渲染的就快了

Teleport:

   Teleport 是一种能够将我们的模板移动到 DOM 中 Vue app 之外的其他位置的技术,就有点像哆啦A梦的“任意门”。在 vue 2 中,像 modals,toast 等这样的元素,如果我们嵌套在 Vue 的某个组件内部,那么处理嵌套组件的定位,z-index 和样式就会变得很困难,通过 Teleport,我们可以在组件的逻辑位置写模版代码,然后在 vue 应用范围之外渲染它。

createRenderer:

  •         关于 createRenderer ,我们了解下基本的用法:
  •         improt {createRenderer} from "@vue/runtime-core";
  •        const {render,createApp}=createRenderer({ patchProp,insert,remove,createElement})            export {render,createApp};export *from '@vue/runtime-core'
  • 通过 createRender 我们能够构建自定义渲染器,我们能够将 vue  的开发模型扩展到其他平台,我们可以将其生成在 canvas 画布上,步骤:template-->App对象中render()-调用render()函数后----------->Vnode虚拟节点-------调用了canvas api-----> 真实的canvas 元素 --调用了 canvas api ----->canvas 平台

vue 2.x 与vue 3.x_第1张图片

 Composition API

  •  compostion API 也就是组合API,通过这种形式,我们能够更加容易维护我们的代码,将相同功能的变量进行一个集中式的管理。
  •                          vue 2.x 与vue 3.x_第2张图片
  • 关于 composition API 的使用,这里以下图展开
  • vue 2.x 与vue 3.x_第3张图片

简单使用:

        export default{

                const count=ref(0);

                const double=computed(()=>{count.value*2});

                 function increment(){

                        count.value++

                }

               onMounted(()=>{console.log("component mounted")})

                 return { count,double,increment}

     } 

 非兼容变更

  • Global API :全局 Vue API 已更改为使用应用程序实例,全局和内部 API 已经被重构为可 tree-shakable;
  • 模板指令:组件上 v-model 用法已更改;