Un DOM virtual es una representación JavaScript ligera del Modelo de Objetos del Documento (DOM) que se utiliza en marcos web declarativos como React , Vue.js y Elm . [ 1 ] Dado que generar un DOM virtual es relativamente rápido, cualquier marco puede volver a renderizarlo tantas veces como sea necesario de forma relativamente económica. El marco puede entonces encontrar las diferencias entre el DOM virtual anterior y el actual (diffing) y solo realiza los cambios necesarios en el DOM real (reconciliación). [ 2 ] [ 3 ] Si bien técnicamente es más lento que usar solo JavaScript puro, el patrón hace que sea mucho más fácil escribir sitios web con mucho contenido dinámico, ya que el marcado está directamente acoplado con el estado.
Técnicas similares incluyen Glimmer de Ember.js y el DOM incremental de Angular . [ 4 ] [ 5 ]
Historia
Históricamente, la API DOM de JavaScript ha sido inconsistente entre navegadores, engorrosa de usar y difícil de escalar para proyectos grandes. Si bien bibliotecas como jQuery buscaban mejorar la consistencia general y la ergonomía de la interacción con HTML, [ 6 ] también eran propensas a código repetitivo que no describía bien la naturaleza de los cambios realizados y desacoplaban la lógica del marcado.
El lanzamiento de AngularJS en 2010 supuso un cambio de paradigma importante en la interacción entre JavaScript y HTML con la idea de la comprobación de cambios . [ 7 ] En lugar de declarar y destruir imperativamente los detectores de eventos y modificar nodos DOM individuales, se realizaba un seguimiento de los cambios en las variables y se invalidaban y volvían a renderizar secciones del DOM cuando cambiaba una variable en su ámbito. Este ciclo de digestión proporcionó un marco para escribir código más declarativo que acoplaba la lógica y el marcado de una manera más lógica.
Si bien AngularJS buscaba brindar una experiencia más declarativa, aún requería que los datos se vincularan explícitamente al DOM y fueran monitoreados por este, y se citaron preocupaciones de rendimiento debido al costoso proceso de verificación de cambios en cientos de variables. [ 8 ] Para aliviar estos problemas, React fue la primera biblioteca importante en adoptar un DOM virtual en 2013, lo que eliminó tanto los cuellos de botella de rendimiento (ya que la comparación y reconciliación del DOM era relativamente barata) como la dificultad de vincular datos (ya que los componentes eran en efecto solo objetos). [ 9 ] Otros beneficios de un DOM virtual incluyeron una seguridad mejorada ya que XSS era prácticamente imposible y una mejor extensibilidad ya que el estado de un componente estaba completamente encapsulado. [ 10 ] Su lanzamiento también coincidió con la llegada de JSX , que acopló aún más HTML y JavaScript con una extensión de sintaxis similar a XML.
Tras el éxito de React, muchos otros frameworks web copiaron la idea general de una representación DOM ideal en memoria, como Vue.js en 2014, que utilizaba un compilador de plantillas en lugar de JSX y tenía una reactividad de grano fino integrada como parte del framework. [ 11 ]
En los últimos tiempos, el DOM virtual ha sido criticado por ser lento debido al tiempo adicional requerido para comparar y reconciliar los nodos DOM. [ 12 ] Esto ha llevado al desarrollo de frameworks sin un DOM virtual, como Svelte , y frameworks que editan el DOM en su lugar, como Angular 2 .
Implementaciones
Reaccionar
React fue pionero en el uso de un DOM virtual para crear componentes de forma declarativa. Los nodos del DOM virtual se construyen utilizando la createElement()función, pero a menudo se transpilan desde JSX para que escribir componentes sea más ergonómico. [ 13 ] En React basado en clases, los nodos del DOM virtual se devuelven desde la render()función, mientras que en los componentes funcionales basados en hooks, el valor de retorno de la función sirve como marcado de la página.
Vue.js
Vue.js utiliza un DOM virtual para manejar los cambios de estado, pero normalmente no se interactúa directamente con él; en su lugar, se utiliza un compilador para transformar las plantillas HTML en nodos del DOM virtual como detalle de implementación. [ 14 ] Si bien Vue admite la escritura de JSX y funciones de renderizado personalizadas, [ 15 ] es más común utilizar el compilador de plantillas ya que de esa manera no se requiere un paso de compilación.
Esbelto
Svelte no tiene un DOM virtual, y su creador, Rich Harris, lo considera una "sobrecarga pura". [ 16 ] En lugar de comparar y conciliar nodos DOM en tiempo de ejecución, Svelte utiliza la reactividad en tiempo de compilación para analizar el marcado y generar código JavaScript que manipula directamente el DOM, lo que aumenta drásticamente el rendimiento. [ 17 ]
Véase también
Referencias
- ↑ "Introducción a Elm" . Programación en Elm . Consultado el 11 de diciembre de 2020 .
- ↑ "DOM virtual e internos – React" . reactjs.org . Consultado el 11 de diciembre de 2020 .
- ↑ "React: El DOM virtual" . Codecademy . Consultado el 11 de diciembre de 2020 .
- ↑ google/incremental-dom , 8 de diciembre de 2020 , consultado el 11 de diciembre de 2020
- ↑ "React Virtual DOM vs Incremental DOM vs Ember's Glimmer: Lucha" . Auth0 - Blog . Consultado el 11 de diciembre de 2020 .
- ↑ openjsf.org, OpenJS Foundation-. "El objeto jQuery | Centro de aprendizaje de jQuery" . Consultado el 11 de noviembre de 2024 .
- ↑ "Crea tu propio AngularJS, parte 1: ámbitos y resumen" . 30 de enero de 2014. Archivado del original el 30 de enero de 2014. Consultado el 11 de noviembre de 2024 .
{{cite web}}: CS1 maint: bot: estado de la URL original desconocido ( enlace ) - ↑ Utley, Tatum. "La muerte de AngularJS y por qué debería importarte" . blog.core10.io . Consultado el 11 de noviembre de 2024 .
- ↑ JSConf (30-10-2013). Pete Hunt: React: Repensando las mejores prácticas -- JSConf EU . Recuperado el 11-11-2024 – vía YouTube.
- ↑ "¿Por qué creamos React? – Blog de React" . legacy.reactjs.org . Consultado el 11 de noviembre de 2024 .
- ↑ "Reactividad en profundidad — Vue.js" . v2.vuejs.org . Consultado el 11 de noviembre de 2024 .
- ↑ Harris, Rich (27-12-2018). "El DOM virtual es pura sobrecarga" . svelte.dev . Recuperado el 11-11-2024 .
- ↑ "Escribiendo marcado con JSX – React" . react.dev . Consultado el 11 de noviembre de 2024 .
- ↑ "Mecanismo de renderizado" . Vue.js .
- ↑ «Funciones de renderizado y JSX» . Vue.js.
- ↑ 27 de diciembre de 2018, Rich Harris Jue (27 de diciembre de 2018). "El DOM virtual es pura sobrecarga" . svelte.dev . Recuperado el 11 de diciembre de 2020 .
{{cite web}}: CS1 maint: nombres numéricos: lista de autores ( enlace ) - ↑ Harris, Rich (22 de abril de 2019). "Svelte 3: Repensando la reactividad" . svelte.dev . Consultado el 11 de noviembre de 2024 .
- Desarrollo web
- Modelos de objetos