Vue 3 ser谩 m谩s r谩pido

Captura de pantalla-1
Uno de los eventos m谩s llamativos en el mundo de Frontend este a帽o fue la publicaci贸n del pr贸ximo repositorio de Vue , parte de la funcionalidad de la tercera versi贸n de VueJS. Este art铆culo proporciona una descripci贸n general de las nuevas caracter铆sticas asesinas de VueJS. En el momento de la publicaci贸n del art铆culo, el repositorio estaba en estado Pre-Alpha . Los planes de lanzamiento se pueden ver en Roadmap

Antecedentes


En febrero de 2018, Evan You, el creador de Vue.js, comparti贸 sus planes para la versi贸n 3 del popular marco:

  • Divida la funcionalidad en paquetes para aislar el alcance
  • TypeScript aparece en la base de c贸digo
  • Vue 3 ser谩 compatible con versiones anteriores de la segunda versi贸n (es decir, no romper谩 el c贸digo anterior)
  • Los observadores en la versi贸n 3.0 se basan en Proxy, lo que aumentar谩 la velocidad de representaci贸n y eliminar谩 una serie de restricciones impuestas por Object.defineProperty
  • Podr谩 debutar con los nuevos ganchos renderTracked y renderTriggered
  • Gracias a la introducci贸n de la sacudida del 谩rbol (excluyendo las directivas no utilizadas de la compilaci贸n), el tama帽o del marco ser谩 inferior a 10 kb en forma comprimida
  • Optimizaci贸n de tragamonedas
  • El rendimiento en vue 3 mejorar谩 100%

Las caracter铆sticas como los componentes integrados y los asistentes de tiempo de ejecuci贸n de directivas (modelo v) ahora se importan a pedido y se pueden sacudir en 谩rbol.
Evan tu
El compilador rastrear谩 la existencia de directivas y las incluir谩 en la compilaci贸n en la etapa de compilaci贸n.

En el proceso de trabajar en Vue 3, Evan se neg贸 a reescribir componentes en clases y en su lugar implement贸 una API funcional.

Dado que la nueva versi贸n utilizar谩 proxies que no son compatibles con IE, Evan planea crear una compilaci贸n separada para IE11. En total, 4 fases prometen:

  1. Alpha Phase - etapa de finalizaci贸n del compilador y ssr-rendering
  2. Fase Beta: etapa de finalizaci贸n de las bibliotecas principales (Vue Router, Vuex, Vue CLI, Vue DevTools)
  3. Fase RC - Etapa de prelanzamiento que incluye Vue 2.0
  4. IE11 build
  5. Lanzamiento final

Evan ha planeado un lanzamiento final para 2019, pero el proyecto a煤n est谩 en etapa pre-alfa.

Vue 3 ser谩 m谩s r谩pido


Gracias a una serie de innovaciones, Vue 3 ser谩 2 veces m谩s r谩pido que la versi贸n anterior.

Observaci贸n basada en proxy y reactividad


Una de las principales innovaciones fue el cambio en el mecanismo para monitorear objetos de getters y setters de Object.defineProperty a Proxy. Ahora Vue puede rastrear la eliminaci贸n y la adici贸n de propiedades de objetos reactivos sin usar Vue.set y Vue.delete. 隆La innovaci贸n aument贸 la velocidad de renderizado y scripting y redujo el consumo de memoria en 2 veces! Puede comparar el rendimiento de Vue 2 y Vue 3 descargando el repositorio de Ilya Klimov

Comparaci贸n de rendimiento de Vue 2 (izquierda) y Vue 3 (etapa pre-alfa, derecha)
Captura de pantalla-1

Gracias a los proxies, la reactividad no se perder谩 al cambiar las manipulaciones de objetos que no se rastrean en Vue 2. Ahora Vue no recorre recursivamente las propiedades de un objeto para calcular los cambios.

Lo que se hace de las promesas:

  • Los descendientes y los padres se vuelven a dibujar independientemente
  • El tama帽o del Vue 3 disminuy贸 de 20 kb a 10 kb en forma comprimida
  • TypeScript agregado

Otras optimizaciones:

  • Vue 3 recordar谩 contenido est谩tico y parchear谩 solo datos din谩micos
  • Los accesorios est谩ticos aumentan el alcance
  • Para facilitar el desarrollo, el c贸digo Vue 3 se divide en paquetes modulares.
  • El paquete runtime-core se hace multiplataforma
  • En lugar de clases, Evan agreg贸 una funci贸n de configuraci贸n y ganchos que hacen que el c贸digo sea limpio, organizado y reutilizable *
  • Corte de tiempo *. La ejecuci贸n del c贸digo JS se corta en pedazos sin bloquear la interacci贸n del usuario con la aplicaci贸n

Los asteriscos indican la API experimental .
Actualizaci贸n: m谩s tarde, Evan decidi贸 abandonar el tiempo.

Inspirado por el HOC, Reacta Evan implement贸 funciones de configuraci贸n con l贸gica reutilizable y ganchos personalizados. A diferencia de los mixins, los ganchos de ciclo de vida no se sobrescriben entre s铆.

Parche VDom mejorado


Joystick de contenido est谩tico

Captura de pantalla-2

El contenido est谩tico se mueve fuera del parche VDom al compilar la plantilla. Vue se inspir贸 en Svelte para hacer esto:

 <div>Hello, {{name}}</div> 

Aqu铆, se pasan el objeto y el contexto modificados . Si se modifica contiene una variable reactiva, se actualiza en contexto.

 p(changed, ctx) { if(changed.name) { set_data(t1, ctx.name); } } 

En la implementaci贸n anterior, el compilador de Vue pas贸 por todos los nodos, incluidos los est谩ticos:

 function render(){ const children = []; for(let i = 0; i < 5; i++) { children.push(h('p', { class: 'text' }, i === 2 ? this.message : 'Lorem upsum')) } return h('div', { id: 'content' }, children) } 

Nueva estrategia de compilaci贸n de plantillas


En la nueva versi贸n, la plantilla se divide en bloques:

Selecci贸n-002

  • La plantilla se divide en bloques.
  • La estructura de los nodos dentro de cada bloque es completamente est谩tica.
  • Para rastrear valores din谩micos en un bloque, solo se requiere 1 matriz plana, donde se colocan

Con la nueva estrategia, el rendimiento depende directamente de la cantidad de contenido din谩mico en lugar del tama帽o de la plantilla.

Vue 3 se adaptar谩 mejor a grandes proyectos


Los proyectos grandes enfrentan los siguientes problemas cuando usan Vue:

  1. No es compatible con TypeScript
  2. Componentes masivos y dif铆ciles de soportar
  3. Falta de un patr贸n simple para reutilizar el c贸digo

Inicialmente, se plane贸 agregar clases para admitir TS. Pero el equipo de Vue tuvo problemas:


El equipo de Evan solicit贸 ayuda de los expertos de TC39 y descubri贸 que una implementaci贸n similar podr铆a entrar en conflicto con los complementos que mezclan varios accesorios y atributos en el contexto Vue.

Potencialmente, estos problemas podr铆an ser resueltos por los decoradores, pero todav铆a est谩n en desarrollo.

API de composici贸n


El equipo de Vue se inspir贸 en los ganchos React y decidi贸 crear una API similar. Es opcional y est谩 en desarrollo y discusi贸n, por lo que algunos nombres pueden cambiar.
El concepto principal de este cambio es organizar el c贸digo del componente de manera m谩s l贸gica, dividi茅ndolo en bloques sem谩nticos. Puede leer m谩s sobre la composici贸n API en la documentaci贸n .

Un ejemplo de uso de Vue 3. Un componente se divide en funciones l贸gicas, dentro de las cuales puede usar reactividad y ganchos de ciclo de vida.

Importe los nuevos ganchos de la API de composici贸n:

 import { reactive, computed, onMounted } from '@vue/composition-api'; export default { setup() { const { state } = countAnimal("rabbit") const { getType, anotherState } = anotherCount() return { state, getType, anotherState } } } 

La funci贸n countAnimal tiene propiedades reactivas count, animal y el m茅todo de incremento . Con un contador extra帽o, el nombre del animal cambia. El contador comienza cuando se monta el componente.

 function countAnimal(name) { const state = reactive({ count: 0, animal: computed(() => state.count % 2 ? name : 'bear') }) function increment() { setTimeout(() => { state.count++; increment() }, 1000) } onMounted(() => { increment() }) return { state } } 

Creamos otra funci贸n anotherCount , que tambi茅n contiene el m茅todo de incremento y estado con el contador y el nombre del animal. El m茅todo getType pasa el nombre del animal de la plantilla.

 function anotherCount() { const anotherState = reactive({ count: 0, animal: 'fox' }) function getType(name) { return name == 'bear' ? 'slow' : 'fast' } function increment() { setTimeout(() => { anotherState.count+=10; increment() }, 1000) } onMounted(() => { increment() }) return { getType, anotherState } } 

La plantilla muestra 2 contadores y 2 nombres de animales. El tipo de carrera var铆a seg煤n el nombre del animal.

 <template> <div> <div>Count {{state.animal}}: {{ state.count }}</div> <div>{{state.animal}} runs {{getType(state.animal)}}</div> <div>Another: Count {{anotherState.animal}}: {{ anotherState.count }}</div> </div> </template> 

Se utilizan nuevos ganchos dentro de la configuraci贸n sin romper la antigua API. Tenga en cuenta que onMounted se refiere a un enlace de ciclo de vida de un solo componente.

Esta API tiene varias ventajas:

  • Los ganchos de ciclo de vida no se rozan entre s铆
  • Fuente clara de propiedades
  • No se crean instancias de componentes adicionales

Conclusi贸n


Los cambios m谩s importantes en Vue 3 se enumeran arriba. La mayor铆a de las mejoras estar谩n ocultas bajo el cap贸 del c贸digo generado por el compilador.

Grandes mejoras:

  • El c贸digo generado es 贸ptimo para el compilador JS
  • Paquete generado m谩s f谩cil
  • Los componentes padre / hijo se vuelven a dibujar gracias al algoritmo de parche mejorado

Vue se ha establecido como uno de los marcos m谩s r谩pidos y 贸ptimos. La nueva versi贸n ser谩 a煤n m谩s r谩pida y f谩cil. Vue 3 es ideal para la web m贸vil y orientada al rendimiento actual. Los comentarios sobre cambios futuros se pueden dejar en el RFC oficial (solicitud de comentarios).
PD: Gracias por corregir errores tipogr谩ficos.

Source: https://habr.com/ru/post/477228/


All Articles