Vue3.0 Оптимизация производительности и новые функции в анализе глубины

Vue.js
Vue3.0 Оптимизация производительности и новые функции в анализе глубины

В последнее время Vue Author You Yuxi поделился шестью основными моментами Vue 3.0 в своем выступлении на станции B:

  • представление
  • Поддержка встряхивания дерева
  • Composition API
  • Фрагмент, Телепорт, Саспенс
  • Улучшенная поддержка ТС
  • Пользовательский API рендеринга

Оптимизация производительности VDOM при компиляции

PatchFlag

Сначала взгляните на следующий случай: в шаблоне есть три тега P, из которых динамической является только часть TEXT последнего тега P.

В предыдущем VDOM, если значение msg изменилось, все элементы во всем шаблоне должны были быть перерисованы. Но в Vue3.0 при компиляции этого шаблона компилятор добавит в конец динамического тега/* Text*/ПатчФлаг. Только узлы с patchFlag считаются динамическими элементами и будут изменены атрибутами отслеживания. А PatchFlag идентифицирует типы динамических атрибутов.Например, ТЕКСТ здесь означает, что динамическим является только текст в узле.

Узлы в каждом блоке, даже если они глубокие, напрямую привязаны к блочному слою и могут напрямую переходить к динамическим узлам, не переходя слой за слоем.

Он обладает как гибкостью VDOM, так и гарантией производительности.

продвижение статического узла hoistStatic

При использовании Heaststatic все статические узлы должны быть подняты из метода Render. Это означает, что они начнутся только тогда, когда приложение будет создано один раз, а затем с каждым рендерингом постоянно повторно используется.

Есть отличные оптимизации для памяти в больших приложениях.

Кэш прослушивателя событий cacheHandler

Обычно при привязке события:

<div>
  <p @click="handleClick">静态代码</p>
</div>

Шаблон будет скомпилирован как

export function render(_ctx, _cache) {
  return (_openBlock(), _createBlock("div", null, [
    _createVNode("p", { onClick: _ctx.handleClick }, "静态代码", 8 /* PROPS */, ["onClick"])
  ]))
}

Куда каждое событие будет попадать из глобального контекста. И при открытии cacheHandler

export function render(_ctx, _cache) {
  return (_openBlock(), _createBlock("div", null, [
    _createVNode("p", {
      onClick: _cache[1] || (_cache[1] = ($event, ...args) => (_ctx.handleClick($event, ...args)))
    }, "静态代码")
  ]))
}

Редактор динамически создает встроенную функцию для вас, выпивать встроенные встроенные функции внутри последних на текущем обработчике компонента. После редактирования встроенной функции будет кэшироваться. Если каждый раз, когда вы повторно рендеринг обработчика событий не изменились, но он не будет получать обработчики событий использовать обработку событий кэша. Этот узел можно рассматривать как статический узел. Эта оптимизация заключается в том, что, когда большая роль в его компонентах охвата перед каждым повторным рендерингом приведет к повторной визуализации компонента, после прохождения через обработчик кэша не приведет к рендурирующему компоненту.

Рендеринг SSR на стороне сервера

Когда SSR включен, если в нашем шаблоне есть статические теги, эти статические теги будут напрямую преобразованы в текст.

Динамическая привязка по-прежнему встроена в отдельную строку. Эта производительность определенно намного выше, чем преобразование React в VDOM для HTML.

Статический узел StaticNode

Только что упомянул, что статические узлы в SSR будут преобразованы в простые строки. На стороне клиента, когда статические узлы достаточно вложены друг в друга, компилятор VUE также преобразует VDOM в простой строковый HTML. А именно StaticNode.

Благодаря этим операциям мы видим, что он может быть более чем в два раза быстрее, чем vue2, а объем памяти может быть более чем в два раза меньше.

Tree Shaking

因为ES6模块是静态引用的,所以我们可以在编译时正确的判断到底加载了哪些代码。对代码全局做一个分析,找到那些没用被用到的模块、函数、变量,并把这些去掉。

При использовании пакета (веб-пакета и т. д.) TreeShaking добавляется по умолчанию. Модули, которые не используются в Vue 3.0, могут быть удалены TreeShake без упаковки в скомпилированный файл. Vue3 упаковал 13,5 КБ, когда был только один HelloWorld. 22,5 КБ со всеми загруженными компонентами

Composition API

По мере роста компонентов Vue код внутри компонента становится все труднее понимать и поддерживать. Некоторые из этих многоразовых кодов трудно извлечь. В то же время в Vue2.0 также отсутствует поддержка TS. В Vue2 логические понятия (функции) управляются в компонентах, но функции и компоненты не находятся во взаимно-однозначных отношениях. Функция может использоваться несколькими компонентами, а компонент может иметь несколько функций. В Vue функция может зависеть от нескольких параметров (компонентов, свойств, данных, вычисляемых, методов и методов жизненного цикла).

Предоставляет настраиваемые методы в Composition API. В качестве примера возьмем компонент с функцией поиска и функцией сортировки:

<script>
export default {
    setup() {
    
    }
}

function useSearch() {
    return { 
    ...useSearch(), 
    ...useSorting()
    }
}

function useSorting() {
    
}

</script>

Повторное использование кода в Vue2

Mixin

Есть несколько способов повторного использования кода в Vue2, один из которых — Mixins.

  • Миксины могут выполнять организационные функции
  • склонен к конфликтам
  • Трудно объяснить зависимость
  • Код нелегко использовать повторно

Миксин Фабрика

  • Может быть легко использован повторно
  • явные зависимости
  • слабое пространство имен
  • Неявные добавления свойств

Scoped Slots

  • Миксин решает проблему
  • Увеличение иерархических отношений усложнило понимание
  • много информации о конфигурации
  • меньшая гибкость
  • плохая работа

Основной API

  • reactive
  • ref
  • computed
  • readonly
  • watchEffect
  • watch
  • Lifecycle Hooks

Fragments

В Vue3 больше не требуется, чтобы корневой узел шаблона имел только один узел. Возвращаемый узел и функция рендеринга могут быть простым текстом, массивами или отдельными узлами. Если это массив, он будет автоматически преобразован во фрагменты.

Teleport

Реантремный портал React. Вы можете сделать какой-то адаптивный дизайн. Если ширина экрана относительно широкая, добавьте определенные элементы и удалите их после сужества экрана.

Suspense

Дождитесь вложенных асинхронных зависимостей. Прежде чем отображать вложенное дерево компонентов на страницу, отобразите его в памяти и запишите все компоненты, имеющие асинхронные зависимости. Только после разрешения всех асинхронных зависимостей вся книга будет отображена в DOM. Когда ваш компонент имеет асинхронную функцию настройки, этот компонент можно рассматривать как асинхронный компонент, и только после того, как компонент будет разрешен, будет визуализировано все дерево.

  • async setup()
  • Async Component

Typescript

Исходный код Vue3 переписан с использованием TS, но это не значит, что проект vue3 также должен использовать TS. Но Vue3 будет иметь лучшую поддержку TS.

  • Поддержка TSX
  • Поддержка компонентов класса
  • Код будет больше

использованная литература