предисловие
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, Suspense
Teleport
которыйProtal传送门
Better TypeScript support
-
Custom Renderer API
API
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
, используется в качестве маркера.
PatchFlag
Block
<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
более миниатюрный.
- Имеет больше возможностей, чем
Много раз нам не нужноvue
vue 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
Но потому чтоChrome
Portal
Роднойelement
Чтобы избежать конфликтов имен, вместо этогоTeleport
6.2 <Suspense>
Suspense
- Вложенные асинхронные зависимости можно ожидать во вложенных иерархиях.
- служба поддержки
async setup()
- Поддержка асинхронных компонентов
несмотря на то чтоReact 16
представилSuspense
, но пока это работает не очень хорошо. Как совместить его с асинхронными данными, еще не до конца разработано.
Вью 3<Suspense>
Более легкий:
Только 5% приложений могут заметить разницу в расписании во время выполнения.<Suspense>
Не выполняет ту же обработку планирования, что и React
7. ЛучшеTypeScript
служба поддержки
-
Vue 3
используетсяTypeScript
Написанная библиотека, вы можете воспользоваться советами по автоматическому определению типов. -
JavaScript
а такжеTypeScript
- служба поддержки
TSX
-
class
vue-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
Некоторые изAPI
RFC
Точка зрения.
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-next
by@sodatea
- (вытирать)
CodeMods
Обновление поддержкиVue 2
заявление
9.5 Новые инструменты:vite
(Французский "быстрый")
адрес:github.com/vuejs/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
Предупреждения об устаревании для функций, удаленных в -
LTS1
18 месяцев.
Окончательное предложение:Vue 3
Хотя и хорошо, если ваш проект очень стабилен, и требований к новым функциям не слишком много или стоимость миграции слишком высока, обновляться не рекомендуется.
конец
Потребовалось ночь, чтобы переиграть его повторно, и если есть какие-то ошибки, пожалуйста, простите меня.
Прикрепил:Рендеринг шаблон просмотра адреса инструмента, используемый в прямом эфире:vue-next-template-explorer.netlify.app/
Персональный WeChat учителя-убеждающего:huab119
Вы также можете прийти ко мнеGitHub
Получите исходные файлы всех статей в блоге: