Exportar a Web Components

Svelte tiene la capacidad de exportar un proyecto usando WebComponents, algo que puede venir bien si lo que queremos fabricar es una biblioteca de componentes reusables, porque se pueden usar con otros frameworks. Sin embargo, es necesario entender las restricciones que tiene usar Web Components, y también comprender de qué modo se debe configurar el proyecto de Svelte para poder usar Web Components.

Este curso ha sido marcado como anticuado y no está siendo revisado de forma activa. Es posible que la información pueda estar desactualizada o que los enlaces se hayan roto.

Cuando trabajamos con Svelte, una de las funcionalidades más interesantes que podemos aprovechar es la capacidad de exportar nuestros componentes como web components o custom elements. Esto nos permite crear componentes reutilizables que pueden integrarse en cualquier proyecto web, sin importar si está construido con React, Angular, o incluso sin ningún framework. La clave está en que los web components son un estándar agnóstico, soportado directamente por los navegadores modernos.

Sin embargo, antes de lanzarnos a usar esta funcionalidad, es importante entender algunas limitaciones y consideraciones que pueden afectar nuestro desarrollo. Por ejemplo, dado que los web components se basan en APIs del navegador, si visitamos nuestra aplicación desde un navegador que no soporte estas APIs, el componente no funcionará correctamente. Para solventar esto, podríamos necesitar incluir polyfills que añadan soporte en navegadores antiguos.

Otra limitación relevante es que actualmente no es posible integrar web components con server-side rendering en SvelteKit de forma sencilla. Esto significa que si nuestro proyecto depende de renderizado en el servidor, usar web components puede complicar las cosas o requerir soluciones manuales.

Además, cuando usamos custom elements, el ciclo de vida y la forma en que se cargan los componentes cambia. Por ejemplo, el componente puede renderizarse antes de que todas sus propiedades estén completamente evaluadas, por lo que debemos asegurarnos de que los valores por defecto sean seguros y eviten errores. Un caso típico es cuando una propiedad es un objeto y no se inicializa; intentar acceder a sus propiedades sin un valor inicial puede provocar fallos.

Un aspecto muy importante a tener en cuenta es la gestión de estilos. Al generar custom elements con Svelte, los estilos CSS se encapsulan dentro del shadow DOM del componente. Esto significa que el CSS se incluye directamente dentro del componente y no se hereda desde estilos globales o externos. Por un lado, esto es beneficioso para crear componentes independientes y reutilizables, pero por otro, puede causar que perdamos estilos globales o personalizados que esperábamos aplicar.

Para crear un custom element en Svelte, debemos modificar la configuración del compilador. En el archivo bit.config.js, dentro de la función que configura Svelte, añadimos la propiedad compilerOptions con el atributo customElement establecido en true. Esto indica a Svelte que genere web components en lugar de componentes Svelte tradicionales.

// Ejemplo simplificado de configuración en bit.config.js
export default {
  // ...
  svelte: {
    compilerOptions: {
      customElement: true
    }
  }
};

Al hacer esto, el componente se compilará como un custom element, pero para que el navegador lo reconozca, debemos asignarle un nombre válido. Esto se hace usando la directiva especial de Svelte svelte:options con la propiedad tag, donde indicamos el nombre de la etiqueta personalizada. Es importante que este nombre siga la convención de web components: debe contener al menos dos palabras separadas por un guion, por ejemplo, svelte-counter.

<script>
  export let count = 0;
</script>

<svelte:options tag="svelte-counter" />

<button on:click={() => count++}>
  Count: {count}
</button>

Si no seguimos esta convención, el navegador no registrará el custom element y veremos errores.

Cuando importamos y usamos estos custom elements en nuestra aplicación, veremos que el CSS está encapsulado en el shadow DOM, lo que puede hacer que algunos estilos no se apliquen como esperábamos. Por ejemplo, si tenemos estilos globales o usamos selectores como :root, estos no funcionarán dentro del shadow DOM. En su lugar, debemos usar el selector :host para aplicar estilos al propio custom element.

:host {
  font-family: Arial, sans-serif;
  color: salmon;
}

Esto asegura que los estilos se apliquen correctamente dentro del shadow DOM.

Otro detalle a considerar es que si nuestro componente importa otros componentes, sus estilos no se concatenarán automáticamente. Cada custom element mantiene su propio shadow DOM con sus estilos, por lo que debemos gestionar cuidadosamente la inclusión de estilos en cada componente para evitar perder personalización.

Finalmente, una ventaja clara de usar custom elements generados con Svelte es que podemos publicar estos componentes en NPM y que cualquier proyecto web pueda usarlos sin importar la tecnología que emplee. Nadie necesita saber que el componente está hecho con Svelte; simplemente lo usan como una etiqueta HTML más.

En resumen, exportar componentes Svelte como web components nos abre la puerta a una gran reutilización y compatibilidad, pero requiere que pensemos desde el principio en la gestión de estilos, la inicialización segura de propiedades y las limitaciones de compatibilidad con navegadores y renderizado en servidor. Así, podremos aprovechar al máximo esta poderosa funcionalidad para crear componentes modulares y portables.

Lista de reproducción
  1. 1
    ¿Qué es Svelte?
    9 minutos
  2. 2
    ¿Cómo crear un proyecto de Svelte?
    7 minutos
  3. 3
    Creando nuestro primer componente
    7 minutos
  4. 4
    Datos dinámicos y props
    7 minutos
  5. 5
    Anidando componentes
    7 minutos
  6. 6
    Capturando eventos
    7 minutos
  7. 7
    Eventos y reactividad
    8 minutos
  8. 8
    Atributos condicionales e IF
    9 minutos
  9. 9
    Bucles
    11 minutos
  10. 10
    Bloques await
    7 minutos
  11. 11
    Bind
    8 minutos
  12. 12
    bind:this
    6 minutos
  13. 13
    ¿Para qué nos sirve un evento personalizado?
    6 minutos
  14. 14
    createEventDispatcher
    6 minutos
  15. 15
    Eventos con detalles
    7 minutos
  16. 16
    Reenviando eventos
    6 minutos
  17. 17
    Ejemplo de eventos (primera parte)
    12 minutos
  18. 18
    Ejemplo de eventos (y segunda parte)
    16 minutos
  19. 19
    Modificadores de eventos
    6 minutos
  20. 20
    Fundamentos del CSS con Svelte
    9 minutos
  21. 21
    Clases condicionales
    7 minutos
  22. 22
    Estilos en línea y variables CSS
    8 minutos
  23. 23
    Estilos globales
    6 minutos
  24. 24
    Importar hojas de estilo externas
    5 minutos
  25. 25
    Reactividad experta con el operador $
    8 minutos
  26. 26
    Slots (parte 1 de 2)
    5 minutos
  27. 27
    Slots (parte 2 de 2)
    7 minutos
  28. 28
    Directivas svelte:window, svelte:head, svelte:body
    4 minutos
  29. 29
    Actualizar de Rollbar a Vite 3
    11 minutos
  30. 30
    Exportar a Web Components
    10 minutos
  31. 31
    Integrar TypeScript, SCSS, PostCSS...
    8 minutos
  32. 32
    Hasta aquí (por ahora)
    3 minutos
  33. 33
    Lo que se viene con Svelte 5
    13 minutos