一、vue3.0 突出亮点:
1、Performance : 性能比vue2.x 快1.2~2倍
2、Tree shaking support : 按需编译 体积比Vue2.x 更小
3、Composition APi: 组合API
4、Better TypeScript support : 更好的ts 支持
5、Custom Renderer API : 暴露了自定义渲染API
6、Fragment、Teleport ,Suspense: 更先进的组件
二、Vue 3.0是如何变快的
1、diff 方法优化:
vue2 中的 虚拟dom 是全量更新
vue3 中新增了静态节点PatchFlag 与上次虚拟节点进行对比的时候只对比带有patch flag 的节点 并且通过flag 的信息 当前节点 要对比的具体内容
2、静态提升 hoistStatic
vue2中 元素无论是否参与更新都会重新创建,然后渲染
https://vue-next-template-explorer.netlify.app/
<div>
<p>1</p>
<p>2</p>
<p>3</p>
<p>{{msg}}</p>
</div>
import { createVNode as _createVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createBlock as _createBlock } from "vue"
export function render(_ctx, _cache, $props, $setup, $data, $options) {
return (_openBlock(), _createBlock("div", null, [
_createVNode("p", null, "1"),
_createVNode("p", null, "2"),
_createVNode("p", null, "3"),
_createVNode("p", null, _toDisplayString(_ctx.msg), 1 /* TEXT */)
]))
}
vue3中 不参与更新的元素 会进行 静态提升,只创建一次,在渲染的时候直接复用即可
<div>
<p>1</p>
<p>2</p>
<p>3</p>
<p>{{msg}}</p>
</div>
import { createVNode as _createVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createBlock as _createBlock } from "vue"
const _hoisted_1 = /*#__PURE__*/_createVNode("p", null, "1", -1 /* HOISTED */)
const _hoisted_2 = /*#__PURE__*/_createVNode("p", null, "2", -1 /* HOISTED */)
const _hoisted_3 = /*#__PURE__*/_createVNode("p", null, "3", -1 /* HOISTED */)
export function render(_ctx, _cache, $props, $setup, $data, $options) {
return (_openBlock(), _createBlock("div", null, [
_hoisted_1,
_hoisted_2,
_hoisted_3,
_createVNode("p", null, _toDisplayString(_ctx.msg), 1 /* TEXT */)
]))
}
3、cacheHandlers 事件监听缓存
默认情况下click 事件会被视为动态绑定 所以每次都会追踪变化进行渲染
但是因为同一个函数而言,不需要追踪变化直接缓存起来复用即可
<div>
<p>1</p>
<p>2</p>
<p @clcik="clcikMe">3</p>
</div>
//cacheHandlers之前
// _createVNode("p", { onClcik: _ctx.clcikMe }, "3", 40 /* PROPS, HYDRATE_EVENTS */, ["onClcik"])
])) 这个3 就是追踪的类别
export function render(_ctx, _cache, $props, $setup, $data, $options) {
return (_openBlock(), _createBlock("div", null, [
_createVNode("p", null, "1"),
_createVNode("p", null, "2"),
_createVNode("p", { onClcik: _ctx.clcikMe }, "3", 40 /* PROPS, HYDRATE_EVENTS */, ["onClcik"])
]))
}
//cacheHandlers之后
export function render(_ctx, _cache, $props, $setup, $data, $options) {
return (_openBlock(), _createBlock("div", null, [
_createVNode("p", null, "1"),
_createVNode("p", null, "2"),
_createVNode("p", {
onClcik: _cache[1] || (_cache[1] = (...args) => (_ctx.clcikMe && _ctx.clcikMe(...args)))
}, "3", 32 /* HYDRATE_EVENTS */)
]))
}
4、ssr渲染:
当有大量的静态内容的时候 这些内容会被当作纯字符串 推进到buffer 里即使存在动态的绑定,会通过模板差值嵌入进去,这样会比通过对比虚拟dom 渲染快
当静态内容大到一定量级的时候 会用_createStaticVNode 方法在客户端去生成一个static node 这些静态node 会被直接innerHtml ,就不需要创建对象,然后根据对象渲染