предисловие
Vue.js 3.0 Beta
RFCs
Vue.js 3.0 Beta
Весь прогресс и документация будут обновляться в новомRFCsДокументацию можно посмотреть.
2. Шесть основных моментов
-
Performance: больше производительности, чемVue 2.0мощный. -
Tree shaking support: Можно "обрезать" бесполезные модули и упаковать только то, что нужно. -
Composition API: комбинацияAPI -
Fragment, Teleport, SuspenseTeleportкоторыйProtal传送门 Better TypeScript support-
Custom Renderer APIAPI
3. Performance
- переписанный виртуальный
DomРеализация (и для обеспечения совместимости, от рендеринга требуния шаблона). - Оптимизация скомпилированного шаблона.
- Более эффективная инициализация компонентов.
-
updateПроизводительность повышается в 1,3~2 раза. -
SSRСкорость увеличивается в 2-3 раза.
Ниже приведено сравнение производительности
Пункт 1: Оптимизация скомпилированных шаблонов
Предположим, вы хотите компилировать следующий код
<div>
<span/>
<span>{{ msg }}</span>
</div>
будет компилироваться так:
import { createVNode as _createVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createBlock as _createBlock } from "vue"
export function render(_ctx, _cache) {
return (_openBlock(), _createBlock("div", null, [
_createVNode("span", null, "static"),
_createVNode("span", null, _toDisplayString(_ctx.msg), 1 /* TEXT */)
]))
}
// Check the console for the AST
Обратите внимание на второй_createVNode"1" в конце:
Vue генерирует во время выполненияnumber(больше 0) значениеPatchFlag, используется в качестве маркера.
PatchFlagBlock
<div>
<span>static</span>
<span :id="hello" class="bar">{{ msg }} </span>
</div>
import { createVNode as _createVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createBlock as _createBlock } from "vue"
export function render(_ctx, _cache) {
return (_openBlock(), _createBlock("div", null, [
_createVNode("span", null, "static"),
_createVNode("span", {
id: _ctx.hello,
class: "bar"
}, _toDisplayString(_ctx.msg), 9 /* TEXT, PROPS */, ["id"])
]))
}
PatchFlagстал9 /* TEXT, PROPS */, ["id"]
говорит нам, что не толькоTEXTизменение, иPROPSизменить (идентификатор)
Он выскочилvirtual domУзкое место в производительности, но при этом сохранена возможность рукописного ввода.renderгибкость.
равно: обаreactгибкость с гарантиями производительности на основе шаблонов.
Ключ 2: Кэш монитора событий:cacheHandlers
<div>
<span @click="onClick">
{{msg}}
</span>
</div>
закрытиеcacheHandlersназад:
import { toDisplayString as _toDisplayString, createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from "vue"
export function render(_ctx, _cache) {
return (_openBlock(), _createBlock("div", null, [
_createVNode("span", { onClick: _ctx.onClick }, _toDisplayString(_ctx.msg), 9 /* TEXT, PROPS */, ["onClick"])
]))
}
onClickбудет считатьсяPROPS
включиcacheHandlersназад:
import { toDisplayString as _toDisplayString, createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from "vue"
export function render(_ctx, _cache) {
return (_openBlock(), _createBlock("div", null, [
_createVNode("span", {
onClick: _cache[1] || (_cache[1] = $event => (_ctx.onClick($event)))
}, _toDisplayString(_ctx.msg), 1 /* TEXT */)
]))
}
cache[1]ReactсерединаuseCallbackавтоматизация.
И поддерживает рукописные встроенные функции:
<div>
<span @click="()=>foo()">
{{msg}}
</span>
</div>
Пополнить:PatchFlagsопределение перечисления
И по запросуTsОпределение перечисления, мы можем видеть, что следующие флаги трассировки определены соответственно:
export const enum PatchFlags {
TEXT = 1,// 表示具有动态textContent的元素
CLASS = 1 << 1, // 表示有动态Class的元素
STYLE = 1 << 2, // 表示动态样式(静态如style="color: red",也会提升至动态)
PROPS = 1 << 3, // 表示具有非类/样式动态道具的元素。
FULL_PROPS = 1 << 4, // 表示带有动态键的道具的元素,与上面三种相斥
HYDRATE_EVENTS = 1 << 5, // 表示带有事件监听器的元素
STABLE_FRAGMENT = 1 << 6, // 表示其子顺序不变的片段(没懂)。
KEYED_FRAGMENT = 1 << 7, // 表示带有键控或部分键控子元素的片段。
UNKEYED_FRAGMENT = 1 << 8, // 表示带有无key绑定的片段
NEED_PATCH = 1 << 9, // 表示只需要非属性补丁的元素,例如ref或hooks
DYNAMIC_SLOTS = 1 << 10, // 表示具有动态插槽的元素
// 特殊 FLAGS -------------------------------------------------------------
HOISTED = -1, // 特殊标志是负整数表示永远不会用作diff,只需检查 patchFlag === FLAG.
BAIL = -2 // 一个特殊的标志,指代差异算法(没懂)
}
Если интересно, можете посмотреть исходный код:packages/shared/src/patchFlags.ts
4. Tree shaking support
- Вы можете «обрезать» бесполезные модули и упаковать только то, что вам нужно (например,
v-model,<transition>, он не будет упакован, если он не используется). - простой"
HelloWorld” размер всего: 13.5kb- 11,75кб, только
Composition API.
- 11,75кб, только
- Включая полную функциональность среды выполнения: 22,5 КБ
- Имеет больше возможностей, чем
Vue 2более миниатюрный.
- Имеет больше возможностей, чем
Много раз нам не нужноvuevue 2
5. Composition API
React Hooks
-
Options APIиспользовать вместе - Гибкая логическая комбинация и повторное использование
-
vue 3адаптивные модули можно использовать с другими фреймворками
смешать (mixin) больше не будет использоваться в качестве рекомендации,Composition APIЭто может обеспечить более гибкое и отсутствие побочных эффектов повторного использования кода.
Кому интересно, могут посмотреть:composition-api.vuejs.org/#summary
Composition APIсодержит шесть основныхAPI
Вы можете проверить это здесь:композиция-API.v UE JS.org/API.HTML#color…
Ps: Другие функции являются общими инструментами, вы можете сначала их игнорировать.
6. Fragment
FragmentПереводится как «фрагмент».
- Больше не ограничивается одним корневым узлом в шаблоне
-
renderФункция также может возвращать массив, аналогично реализацииReact.Fragmentsфункция. - '
Just works'
6.1 <Teleport>
- ранее известный как
<Portal>, переводится как портал. - Более подробной информацией поделится @Linusborg
<Teleport>Оригинал является цельюReact Portal
Но потому чтоChromePortalРоднойelementЧтобы избежать конфликтов имен, вместо этогоTeleport
6.2 <Suspense>
Suspense
- Вложенные асинхронные зависимости можно ожидать во вложенных иерархиях.
- служба поддержки
async setup() - Поддержка асинхронных компонентов
несмотря на то чтоReact 16представилSuspense, но пока это работает не очень хорошо. Как совместить его с асинхронными данными, еще не до конца разработано.
Вью 3<Suspense>Более легкий:
Только 5% приложений могут заметить разницу в расписании во время выполнения.<Suspense>Не выполняет ту же обработку планирования, что и React
7. ЛучшеTypeScriptслужба поддержки
-
Vue 3используетсяTypeScriptНаписанная библиотека, вы можете воспользоваться советами по автоматическому определению типов. -
JavaScriptа такжеTypeScript - служба поддержки
TSX -
classvue-class-component@next, модуль все еще находится в стадии альфа-тестирования.
а такжеVue 3 + TypeScriptПлагины находятся в разработке, с проверкой типов, автодополнением и т.д. Прогресс обнадеживает.
8. Custom Renderer API: API пользовательского рендерера
- В процессе
NativeScript Vueинтегрированный - Пользователи могут попробовать
WebGLПользовательский рендерер, используйте с обычными приложениями Vue (Vugel).
значит можно пройтиvue,Domпрограммноwebglпрограммирование. Заинтересованные могут посмотреть здесь:Getting started vugel
9. Оставшаяся работа
9.1 Docs & Migration Guides
- Новая документация, написанная
@NataliaTepluhina, @sdras, @bencodezen & @phananБыть ответственным за -
@sdrasВыполнение автоматического обновления инструмента миграции -
@sodateaИсследования уже началисьCodeMods
9.2 Router
- следующее поколение
Router:vue-router@nextужеalpha@posva
Некоторые изAPIRFCТочка зрения.
9.3 Vuex
- следующее поколение
Vuex:,vuex@next(а такжеVue 3 compatтот же API), уже вalphaсцена, спасибо@KiaKing. - Команда экспериментирует для следующей итерации
Vuex APIупрощение
В настоящее время совместим сVue 3В основном, в основном нетAPIМеняй, не паникуй.
9.4 CLI
-
CLIПлагин:vue-cli-plugin-vue-nextby@sodatea - (вытирать)
CodeModsОбновление поддержкиVue 2заявление
9.5 Новые инструменты:vite(Французский "быстрый")
простойhttpсервер, не нуженwebpackСкомпилируйте и упакуйте, как требуетсяVueфайл, отправленный непосредственно обратно на рендеринг, и поддерживает горячее обновление (очень быстрое)
9.6 vue-test-utils
- следующее поколение
test-utils:test-utils@next- by
@lmiller1990, @dobromir-hristov, @afontcu & @JessicaSachs
- by
9.7 DevTools
- Первые прототипы были сделаны @Akryum, когда мы доберемся до
betaбудет полностью интегрирован.
Сейчас нужно больше усилий, чтобы стать лучше.
9.8 IDE Support (Vetur)
-
@znckВ настоящее время экспериментирую с проверкой типов для шаблонов. -
@octrefбудет в маеVue 3провестиVeturинтегрированный
9.9 Nuxt
В настоящее времяNuxtРабота по интеграции также ведется, и внутренняя команда уже работает. Еще нужно время
10. Vue 2.xЕсть еще версия 2.7
- Будет последняя минорная версия (2.7)
- от
Vue 3Улучшения совместимости Backport (без нарушения совместимости) - добавить в
Vue 3Предупреждения об устаревании для функций, удаленных в -
LTS118 месяцев.
Окончательное предложение:Vue 3Хотя и хорошо, если ваш проект очень стабилен, и требований к новым функциям не слишком много или стоимость миграции слишком высока, обновляться не рекомендуется.
конец
Потребовалось ночь, чтобы переиграть его повторно, и если есть какие-то ошибки, пожалуйста, простите меня.
Прикрепил:Рендеринг шаблон просмотра адреса инструмента, используемый в прямом эфире:vue-next-template-explorer.netlify.app/
Персональный WeChat учителя-убеждающего:huab119
Вы также можете прийти ко мнеGitHubПолучите исходные файлы всех статей в блоге:
Руководство по убеждению:一起玩耍呀。 ~