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,<transition>) 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: 

      <template>

           <header>...<header>

          <main v-bind='$attrs'></main>

          <footer>...</footer>

     </template>

  • 由此可以看出来,在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 平台

 Composition API

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

简单使用:

        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 用法已更改;<template v-for>和 非v-for 节点上 key 用法已更改;同一元素上使用 v-if 和v-for 优先级已更改;v-bind='object' 现在排序敏感;v-for 中的 ref 不再注册 ref 数组
  • 组件:只能使用普通函数创建功能组件;functional 属性在单文件组件 (SFC);异步组件现在需要 defineAsyncCompoent 方法来创建
  • 渲染函数:渲染函数 API改变;scopedSlotsproperty已删除,所有插槽都通过 slot 作为函数暴露了;自定义指令 API 已更改与组件生命周期一致;一些转换 class 被重新命名了:v-enter-->v-enter-from,v-leave->v-leave-from;组件 watch 选项和实例方法 $watch 不再支持点分隔字符串路径,请更改计算函数作为参数;在 Vue 2.x 中,应用根容器的 outerHTML 将替换为根组件模版(如果根组件没有模版/渲染选项,则最终编译为模版)。Vue3.x  现在使用应用程序容器的 innerHTML.
  • 其他小改变: destoryed 生命周期选项被重命名为 unmounted; beforeDestory 生命周期选项被重名为 beforeUnmount; [ porp default 工厂函数不再有权访问 this 是上下文;自定义指令 API 已更改为根组件生命周期一致;data 应始终声明为函数;来自 mixin 的data 选项现在可以简单地合并;attribute 强制策略已更改;一些过渡 classs 被重命了; 组件 watch 选项和实例方法,$watch. 不再支持以点分隔的字符串路径,请改用计算属性函数作为参数;<template>没有特殊指令的标记(v-if/else-if/else,v-for 或 v-slot)现在被视为普通元素,并将原生的 <template>元素 ,而不是渲染其内部内容;在 Vue 2.x 中,应用根容器的 outerHTML 将替换为根组件模版(如果根组件没有模版/渲染选项,则最终编译为模版)。 Vue 3.x 现在使用应用容器的 inner HTML ,这意味着容器本身不在被视为模版的一部分了。
  • 移除 API:keyCode 支持作为 v-on 的修饰符,on,off 和过滤 fillter,内联模版 attribute ,$destroy 实例方法。用户不应再手动管理单个 Vue 组件的生命周期。

猜你喜欢

转载自blog.csdn.net/weixin_56263402/article/details/126297728