1. 程式人生 > 實用技巧 >vue3.0學習筆記(一)

vue3.0學習筆記(一)

vue3效能優於vue2.x,主要原因有以下四點:

一、diff演算法優化:

  • vue2.x的虛擬DMO是進行全量比較。
  • vue3新增了靜態標記(PatchFlag)。

在於上次虛擬節點進行比較的時候,只比較帶有靜態標記的節點,減少了比較的次數。

使用vue3建立工具檢視一下建立結構

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (_openBlock(), _createBlock("div", null, [
    _createVNode("p", null, "我是段落"),
    _createVNode(
"p", null, _toDisplayString(_ctx.msg), 1 /* TEXT */) ])) }

可以看到對於需要改變的內容的地方添加了一個1,這個1就是靜態標記,每次內容更新也只會比較帶有靜態標記的地方。

二、靜態提升

  • vue2.x無論元素是否參與更新,每次都會重新創新,然後渲染
  • vue3中對於不參與更新的元素會做靜態提升,只會建立一次,在渲染的時候複用即可
<div>
  <p>Hello World!</p>
  <p>{{msg}}</p>  
</div>

以上節點

使用靜態提升之前:

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (_openBlock(), _createBlock("div", null, [
    _createVNode("p", null, "Hello World!"),
    _createVNode("p", null, _toDisplayString(_ctx.msg), 1 /* TEXT */)
  ]))
}

使用靜態提升之後:

const _hoisted_1 = /*#__PURE__*/_createVNode("p", null
, "Hello World!", -1 /* HOISTED */) export function render(_ctx, _cache, $props, $setup, $data, $options) { return (_openBlock(), _createBlock("div", null, [ _hoisted_1, _createVNode("p", null, _toDisplayString(_ctx.msg), 1 /* TEXT */) ])) }

可以看到使用靜態提升之前的程式碼,是每次渲染的時候都會去重新建立;使用靜態之後的程式碼,只有第一次建立,然後直接複用。把不需要參與更新的元素放在外面只建立一次。

三、事件監聽快取

預設情況下,會為事件新增一個靜態標記,所以每次都會去監聽事件的變化,但是因為是同一個函式,所以沒有必要去監聽變化,直接快取複用即可

<div>
  <button @click="click">點選事件</button>
</div>

以上節點

使用事件監聽快取之前:

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (_openBlock(), _createBlock("div", null, [
    _createVNode("button", { onClick: _ctx.click }, "點選事件", 8 /* PROPS */, ["onClick"])
  ]))
}

8就是靜態標記,因此每次更新DOM,都會追蹤這個方法進行對比。

使用事件監聽快取之後:

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (_openBlock(), _createBlock("div", null, [
    _createVNode("button", {
      onClick: _cache[1] || (_cache[1] = (...args) => (_ctx.click && _ctx.click(...args)))
    }, "點選事件")
  ]))
}

使用事件監聽快取之後的程式碼靜態標記就已經被去掉了,這樣就不會去進行對比。

四、SSR渲染

先使用新的工具建立一個vue3的專案,也就是vite。

  • 安裝Vite------npm i -g create-vite-app
  • 利用Vite建立vue3專案------ceate-vite-app projectName

Vite是Vue作者開發的一款試圖取代webpack的工具

實現原理是利用es6的import傳送請求去載入檔案的特性,攔截這些請求,做一些預編譯,省去webpack冗長的打包時間。

SSR渲染利於搜尋引擎,解決白屏問題,因為正常情況下在index.html檔案中只有一個簡單的標籤,沒有內容,不利於爬蟲搜尋