vue3-效率的提升

客户端渲染效率比vue2提升了1.3~2倍

SSR渲染效率比vue2提升了2~3倍

1. vue3的效率提升主要表现在哪些方面?

静态提升

编译器会把模板编译成render函数,在编译时会发现哪些是静态节点。

1. 静态节点

  • 元素节点
  • 没有绑定动态内容
    下面的静态节点会被提升
<h1>Hello worldh1>
// vue2 的静态节点
render(){
 // 1. 每次运行都会重新渲染这个节点。
  createVNode("h1", null, "Hello World")
  // ...
}

// vue3 的静态节点
const hoisted = createVNode("h1", null, "Hello World") // 1. 此节点只会被创建一次
function render(){
  // 2. 直接使用 hoisted 即可
}

2. 静态属性会被提升

<div class="user">
  {{user.name}}
div>
const hoisted = { class: "user" }

function render(){
  createVNode("div", hoisted, user.name)
  // ...
}

预字符串化

<div class="menu-bar-container">
  <div class="logo">
    <h1>logoh1>
  div>
  <ul class="nav">
    <li><a href="">menua>li>
    <li><a href="">menua>li>
    <li><a href="">menua>li>
    <li><a href="">menua>li>
    <li><a href="">menua>li>
  ul>
  <div class="user">
    <span>{{ user.name }}span> //只有这个是动态元素
  div>
div>

当编译器遇到大量连续的静态内容,会直接将其编译为一个普通字符串节点

const _hoisted_2 = _createStaticVNode("

logo

"
)

vue3-效率的提升_第1张图片

vue3-效率的提升_第2张图片

缓存事件处理函数

<button @click="count++">plusbutton>
// vue2
render(ctx){
  return createVNode("button", {
    onClick: function($event){
      ctx.count++;
    }
  })
}

// vue3
render(ctx, _cache){
  return createVNode("button", {
    onClick: cache[0] || (cache[0] = ($event) => (ctx.count++))
  })
}

Block Tree

vue2在对比新旧树的时候,并不知道哪些节点是静态的,哪些是动态的,因此只能一层一层比较,这就浪费了大部分时间在比对静态节点上

<form>
  <div>
    <label>账号:label>
    <input v-model="user.loginId" />
  div>
  <div>
    <label>密码:label>
    <input v-model="user.loginPwd" />
  div>
form>

vue3-效率的提升_第3张图片

vue3-效率的提升_第4张图片

PatchFlag

vue2在对比每一个节点时,并不知道这个节点哪些相关信息会发生变化,因此只能将所有信息依次比对

<div class="user" data-id="1" title="user name">
  {{user.name}}
div>

vue3-效率的提升_第5张图片

你可能感兴趣的:(vue3,前端,vue.js)