在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
摘要:
Vue3新版本的理念成型于 2018 年末,当时的 Vue 2 已经有两岁半了。比起通用软件的生命周期来这好像也没那么久,Vue3在2020年正式推出,在源码和API都有较大变化,性能得到了显著的提升,比Vue2.x快1.2~2倍。 其中,一些比较重要的优点有: diff算法的优化: 下面我们就来具体说说vue3 的优点: 优点1:diff算法的优化vue2中的虚拟dom是全量的对比(每个节点不论写死的还是动态的都会一层一层比较,这就浪费了大部分事件在对比静态节点上) vue3新增了静态标记( 例如:下面的模板包含一个div,div内包含三个段落,其中前两个段落是静态固定不变的,而第三个段落的内容绑定的 <div> <p>云驻共创</p> <p>如何评价 vue3</p> <p>{{msg}}</p> </div> 当视图更新时,只对动态节点部分进行diff运算,减少了资源的损耗。 优点2:hoistStatic 静态提升vue2无论元素是否参与更新,每次都会重新创建然后再渲染。vue3对于不参与更新的元素,会做静态提升,只会被创建一次,在渲染时直接复用即可。例如:下面我们利用 <div> <div>共创1</div> <div>共创2</div> <div>{{name}}</div> </div> 静态提升之前 export function render(...) { return ( _openBlock(), _createBlock('div', null, [ _createVNode('div', null, '共创1'), _createVNode('div', null, '共创2'), _createVNode( 'div', null, _toDisplayString(_ctx.name), 1 /* TEXT */ ), ]) ) } 静态提升之后 const _hoisted_1 = /*#__PURE__*/ _createVNode( 'div', null, '共创1', -1 /* HOISTED */ ) const _hoisted_2 = /*#__PURE__*/ _createVNode( 'div', null, '共创2', -1 /* HOISTED */ ) export function render(...) { return ( _openBlock(), _createBlock('div', null, [ _hoisted_1, _hoisted_2, _createVNode( 'div', null, _toDisplayString(_ctx.name), 1 /* TEXT */ ), ]) ) } 从以上代码中我们可以看出 优点3:cacheHandlers 事件侦听器缓存vue2.x中,绑定事件每次触发都要重新生成全新的 默认情况下 例如:下面我们同样是通过 <div> <div @click="todo">做点有趣的事</div> </div> 该段 export function render(...) { return (_openBlock(),_createBlock('div', null, [ _createVNode('div',{ onClick: _ctx.todo}, '做点有趣的事', 8 /* PROPS */, ['onClick']), ]) ) } 当我们开启事件监听器缓存后: export function render(...) { return (_openBlock(),_createBlock('div', null, [ _createVNode('div',{ onClick: //开启监听后 _cache[1] || (_cache[1] = (...args) =>_ctx.todo(...args)), },'做点有趣的事'), ]) ) } 我们可以对比开启事件监听缓存前后的代码,转换之后的代码, 大家可能还看不懂, 但是不要紧,我们只需要观察有没有静态标记即可,在Vue3的diff算法中, 只有有静态标记的才会进行比较, 才会进行追踪。 优点4:ssr渲染Vue2 中也是有 SSR 渲染的,但是 Vue3 中的 SSR 渲染相对于 Vue2 来说,性能方面也有对应的提升。 当存在大量静态内容时,这些内容会被当作纯字符串推进一个 当静态内容大到一个量级的时候,会用 优点5:更好的Ts支持vue2不适合使用ts,原因在于 在vue2结合ts的具体实践中,要用 在vue3中,量身打造了 import { defineComponent, ref } from 'vue' const Component = defineComponent({ props: { success: { type: String }, student: { type: Object as PropType<Student>, required: true } }, setup() { const year = ref(2020) const month = ref<string | number>('9') month.value = 9 // OK const result = year.value.split('') } 优点6:Compostion API: 组合API/注入API传统的网页是 在vue2的组件内使用的是 而在vue3中,使用 import useCounter from './counter' import useTodo from './todos' setup(){ let { val, todos, addTodo } = useTodo() let {count,add} = useCounter() return { val, todos, addTodo, count,add, } 优点7:更先进的组件vue2是不允许这样写的,组件必须有一个跟节点,现在可以这样写,vue将为我们创建一个虚拟的 <template> <div>华为云享专家</div> <div>全栈领域博主</div> </template> 在 优点8:自定义渲染APIvue2.x项目架构对于weex(移动端跨平台方案)和 vue2: import Vue from 'vue' import App from './App.vue' new Vue({ => h(App)}).$mount('#app') vue3: const { createApp } from 'vue' import App from "./src/App" createApp(App).mount(('#app') vue官方实现的 import { createApp } from "./runtime-render"; import App from "./src/App"; // 根组件 createApp(App).mount('#app'); 使用自定义渲染API,如 优点9:按需编译,体积比vue2.x更小框架的大小也会影响其性能。这是 Web 应用程序的唯一关注点,因为需要即时下载资源,在浏览器解析必要的JavaScript 之前该应用程序是不可交互的。对于单页应用程序尤其如此。尽管 Vue 一直是相对轻量级的(Vue 2 的运行时大小压缩为 23 KB)。 在 Vue 3 中,通过将大多数全局 API 和内部帮助程序移至 ES 模块导出来,实现了这一目标。这使现代的打包工具可以静态分析模块依赖性并删除未使用的导出相关的代码。模板编译器还会生成友好的 框架的某些部分永远不会 优点10:支持多根节点组件Vue3 一个模板不再限制有多个根节点,(多个根节点上的 在 Vue 3 中,组件现在正式支持多根节点组件,即片段! 在 2.x 中,不支持多根组件,当用户意外创建多根组件时会发出警告,因此,为了修复此错误,许多组件被包装在一个中。如下 <template> <div> <header>...</header> <main>...</main> <footer>...</footer> </div> </template> 在 3.x 中,组件现在可以有多个根节点!但是,这确实要求开发者明确定义属性应该分布在哪里。 <template> <header>...</header> <main v-bind="$attrs">...</main> <footer>...</footer> </template> 总结:
到此这篇关于vue3 对比 vue2 有什么优点的文章就介绍到这了,更多相关vue3 对比 vue2 的优点内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论