<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alex Tomás</title>
    <description>The latest articles on DEV Community by Alex Tomás (@alextomas80).</description>
    <link>https://dev.to/alextomas80</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F577326%2F3c9c7347-f031-4cba-a042-dbf7bd405de1.jpeg</url>
      <title>DEV Community: Alex Tomás</title>
      <link>https://dev.to/alextomas80</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alextomas80"/>
    <language>en</language>
    <item>
      <title>Cómo personalizar tu perfil GitHub con un archivo README</title>
      <dc:creator>Alex Tomás</dc:creator>
      <pubDate>Thu, 18 Feb 2021 09:43:14 +0000</pubDate>
      <link>https://dev.to/alextomas80/como-personalizar-tu-perfil-github-con-un-archivo-readme-5754</link>
      <guid>https://dev.to/alextomas80/como-personalizar-tu-perfil-github-con-un-archivo-readme-5754</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; lanzó recientemente una función que permite a los usuarios crear un archivo &lt;strong&gt;README&lt;/strong&gt; a nivel de perfil para mostrarlo de manera destacada en tu perfil de GitHub sustituyendo a la pantalla tradicional con tus repositorios.&lt;/p&gt;

&lt;p&gt;En este artículo te explicaré cómo acceder a esta nueva función. También compartiré algunos perfiles curiosos de GitHub que he visto en otros usuarios que te podrán dar ideas para generar tu propio perfil personalizado 😜.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pasos para crear tu perfil personalizado en GitHub
&lt;/h2&gt;

&lt;p&gt;¿Has probado alguna vez a crear un repositorio en GitHub con tu mismo nombre de usuario? Por ejemplo, mi usuario en GitHub es &lt;a href="https://github.com/alextomas80" rel="noopener noreferrer"&gt;alextomas80&lt;/a&gt;, entonces, para mostrarte ésta nueva funcionalidad voy a crearme un nuevo repositorio que se llame así: &lt;code&gt;alextomas80&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Crear nuevo repositorio
&lt;/h3&gt;

&lt;p&gt;Primero debemos acceder a la url para crear nuevo repositorio, desde &lt;a href="https://github.com/new" rel="noopener noreferrer"&gt;aquí&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Luego rellenamos el campo &lt;code&gt;Repository name&lt;/code&gt;, quedando así:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-readme-github-perfil%2Falex_tomas_com_2021-02-18-09-23-27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-readme-github-perfil%2Falex_tomas_com_2021-02-18-09-23-27.png" alt="Nuevo repositorio GitHub para nuestro perfil con README"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Eh! ¡Espera! ¿Qué es eso? Te habrás dado cuenta del aviso que te ha aparecido, ¿no?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You found a secret! &lt;code&gt;alextomas80/alextomas80&lt;/code&gt; is a ✨special ✨ repository that you can use to add a README.md to your GitHub profile. Make sure it’s public and initialize it with a README to get started.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;¡Premio! GitHub ya te informa de esa nueva funcionalidad especial que te comentaba. Ahora sólo tenemos que editar nuestro README.md.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ver nuestro perfil personalizado con README.md
&lt;/h3&gt;

&lt;p&gt;Si has dejado activada la opción &lt;code&gt;Add a README file&lt;/code&gt; ya tendrás tu propio fichero, que únicamente tendremos que editar. En el caso de que no lo hayas activado, tendrás que crear el fichero. Fácil.&lt;/p&gt;

&lt;p&gt;Una vez creado el nuevo &lt;em&gt;repo especial&lt;/em&gt; te redireccionará a su url, en mi caso me lleva a &lt;a href="https://github.com/alextomas80/alextomas80" rel="noopener noreferrer"&gt;https://github.com/alextomas80/alextomas80&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-09-30-00.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-09-30-00.png" alt="Nuevo repositorio especial en Github para mi perfil README"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aquí vemos varias cosas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Nuestro README.md de ejemplo auto generado al crear el repo.&lt;/li&gt;
&lt;li&gt;Un aviso indicándonos, una vez más, que es un repo especial (&lt;em&gt;alextomas80/alextomas80 is a special repository. Its README.md will appear on your public profile! Send feedback&lt;/em&gt;) dónde nos invita a editar nuestro README o bien mirar como ha quedado nuestro perfil.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Antes de crear el repositorio especial mi perfil se veía de la siguiente manera:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-09-32-34.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-09-32-34.png" alt="Perfil por defecto de GitHub"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez creado el repo especial se ve de la siguiente manera:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-09-33-21.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-09-33-21.png" alt="Perfil personalizado en GitHub con README.md"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como verás, el contenido del fichero README.md del repo especial lo inserta automáticamente arriba del todo, en mi caso, de momento no es gran cosa ya que hemos usado el README.md por defecto que nos ha generado Github, pero bueno, ¡es un comienzo! 😀&lt;/p&gt;

&lt;h3&gt;
  
  
  Modificar README.md para darle forma a nuestro perfil
&lt;/h3&gt;

&lt;p&gt;Vale, vamos a darle un poco de vida a nuestro repositorio y le pondremos un poco de información. Accede a tu repo especial y &lt;em&gt;editamos el README.md&lt;/em&gt;. Recuerda que es un fichero .md por lo tanto todo lo que soporte la &lt;strong&gt;sintaxis Markdown&lt;/strong&gt; podrás insertar en él.&lt;/p&gt;

&lt;p&gt;Así se ve nuestro README.md por defecto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-09-37-16.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-09-37-16.png" alt="Editar README.md por defecto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y ahora lo vamos a editar un poco a nuestro gusto. El mío de momento lo voy a dejar de la siguiente forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-10-16-40.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-10-16-40.png" alt="README.md modificado"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Guardamos el README.md creando un commit desde la propia web de Github:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-10-17-53.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-10-17-53.png" alt="Guardamos el README.md creando un commit"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Recuerda que te puedes clonar el repo en tu equipo y trabajar de forma local como seguramente habrás hecho muchas veces. En mi caso, para el ejemplo, lo he hecho todo desde la web.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Y podemos ver por fin el resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-10-19-01.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-10-19-01.png" alt="Perfil personalizado en Github de Alex Tomás"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejemplos de otros usuarios con perfiles personalizados
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Miguel Ángel Durán
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/midudev" rel="noopener noreferrer"&gt;https://github.com/midudev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Software Engineer Full Stack&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-10-21-51.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-10-21-51.png" alt="Miguel Ángel Durán Github"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Monica Powell
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/M0nica" rel="noopener noreferrer"&gt;https://github.com/M0nica&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Building tech to elevate people. Founder of React Ladies a community for React JS developers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-10-20-47.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-10-20-47.png" alt="Monica Powell Github"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Kautuk Kundan
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/kautukkundan" rel="noopener noreferrer"&gt;https://github.com/kautukkundan&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I build interesting things || Data Engineer • Indie Developer&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-10-24-24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-10-24-24.png" alt="Kautuk Kundan Github"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tanner Linsley
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/tannerlinsley" rel="noopener noreferrer"&gt;https://github.com/tannerlinsley&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Co-Founder, Open source fanatic, React Junkie, Javascripter&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-10-26-11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fcrear-perfil-github-con-readme%2Falex_tomas_com_2021-02-18-10-26-11.png" alt="Tanner Linsley Github"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;¿Ya tienes tu perfil personalizado en Github? ¿No? ¿A qué esperas? Si eres creativo/a verás como no dejas indiferente a nadie. 😉&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Si te gusta mi contenido&lt;/strong&gt;, puedes "invitarme" a un café ☕️ para apoyarme. 👇🏻&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/alextomas#checkoutModal" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fimg%2Fko-fi.png" alt="¿Me invitas a un café?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y esto es todo. Espero que te pueda servir 😉&lt;/p&gt;

</description>
      <category>github</category>
      <category>readme</category>
      <category>markdown</category>
      <category>customize</category>
    </item>
    <item>
      <title>Crear un componente en Svelte y publicarlo en NPM</title>
      <dc:creator>Alex Tomás</dc:creator>
      <pubDate>Mon, 15 Feb 2021 17:08:01 +0000</pubDate>
      <link>https://dev.to/alextomas80/crear-un-componente-en-svelte-y-publicarlo-en-npm-1797</link>
      <guid>https://dev.to/alextomas80/crear-un-componente-en-svelte-y-publicarlo-en-npm-1797</guid>
      <description>&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;A lo largo de los años me he encontrado en proyectos que tienen diferentes áreas dentro de ese mismo proyecto (web, app, panel de administración...) y se tiene que mantener el aspecto de ciertos componentes en todas las partes de la aplicación.&lt;/p&gt;

&lt;p&gt;Un &lt;code&gt;ejemplo sencillo&lt;/code&gt; sería el típico &lt;em&gt;botón con el color corporativo&lt;/em&gt;. Resulta que ese botón lo quieres utilizar en diferentes proyectos de ese mismo cliente, y el botón va a ser siempre IGUAL. ¿Qué hacemos?&lt;/p&gt;

&lt;p&gt;Pues aquí tenemos tres opciones, a mi modo de ver:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Crear el botón las X veces&lt;/strong&gt; que nos haga falta para los diferentes proyectos. *Esto está "bien" pero... ¿y si se cambia, por ejemplo, el borde del botón (border-radius)? Lo tendrías que cambiar en todos los botones que te hayas creado en los diferentes proyectos. Ñeeee, bueno 💩 *&lt;/li&gt;
&lt;li&gt;Si tu proyecto va a usar siempre la &lt;strong&gt;misma tecnología&lt;/strong&gt;, por ejemplo &lt;a href="https://svelte.dev/"&gt;Svelte&lt;/a&gt;, podrías crearte un componente, publicarlo en un package de &lt;a href="https://www.npmjs.com/"&gt;NPM&lt;/a&gt; y re-utilizarlo allá donde te haga falta. &lt;em&gt;Es lo que veremos en este artículo&lt;/em&gt; 🚀&lt;/li&gt;
&lt;li&gt;Pero... ¿si ese mismo proyecto lo vas a &lt;strong&gt;usar con diferentes frameworks&lt;/strong&gt;? por ejemplo, lo quieres usar en React, Svelte y otro en Vue. ¿Qué hacemos?. &lt;em&gt;La respuesta es webcomponents&lt;/em&gt;. Te dejo aquí un artículo que escribí hace unos días para &lt;a href="https://alextomas.com/blog/crear-webcomponents-con-stenciljs"&gt;crear webcomponents con StencilJS&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Entonces, ahora vamos a ir a la segunda opción y haremos lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nos crearemos un componente botón con &lt;strong&gt;Svelte&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Lo probaremos &lt;strong&gt;localmente&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Lo publicaremos en un package de &lt;strong&gt;NPM&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Lo probaremos de nuevo &lt;strong&gt;instalando la dependencia&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Qué vamos a necesitar?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Tener cuenta en &lt;a href="https://www.npmjs.com/"&gt;NPM&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Tener Node y NPM instalados en tu equipo.&lt;/li&gt;
&lt;li&gt;Ganas de experimentar 🙃&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ¿Qué componente haremos?
&lt;/h2&gt;

&lt;p&gt;Posiblemente tengas cientos de paquetes en NPM de botones. La idea no es reinventar la rueda, sino conocer el flujo de la creación de un componente y la publicación del paquete. Más adelante te animo que intentes crearte un componente que te solucione A TÍ algún problema concreto. Eso te ayudará a aprender y entender todos los conceptos.&lt;/p&gt;

&lt;p&gt;Para nuestro ejemplo crearé un componente que se llamará &lt;code&gt;&amp;lt;At-Button /&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Iniciamos el proyecto
&lt;/h2&gt;

&lt;p&gt;Bien, lo primero que necesitaremos es una carpeta vacía para iniciar nuestro ¡pequeño gran proyecto!. Desde la consola, por ejemplo, creamos una carpeta y accedemos a la misma, en mi ejemplo la llamaré &lt;code&gt;svelte-custom-button&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;svelte-custom-button
&lt;span class="nb"&gt;cd &lt;/span&gt;svelte-custom-button
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora iniciamos nuestro &lt;code&gt;package.json&lt;/code&gt;. No es necesario que lo escribas a mano, con el siguiente comando lo hará casi todo por tí:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto va a crear un archivo &lt;code&gt;package.json&lt;/code&gt; y nos rellenará la información sobre el paquete, como el nombre, autor, descripción, las dependencias que utiliza, la versión etc...&lt;/p&gt;

&lt;p&gt;Tendrás la siguiente respuesta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
Wrote to /RUTA_DE_TU_PROYECTO/svelte-custom-button/package.json:
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"name"&lt;/span&gt;: &lt;span class="s2"&gt;"svelte-custom-button"&lt;/span&gt;,
  &lt;span class="s2"&gt;"version"&lt;/span&gt;: &lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;,
  &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;""&lt;/span&gt;,
  &lt;span class="s2"&gt;"main"&lt;/span&gt;: &lt;span class="s2"&gt;"index.js"&lt;/span&gt;,
  &lt;span class="s2"&gt;"scripts"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"test"&lt;/span&gt;: &lt;span class="s2"&gt;"echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Error: no test specified&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; &amp;amp;&amp;amp; exit 1"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="s2"&gt;"keywords"&lt;/span&gt;: &lt;span class="o"&gt;[]&lt;/span&gt;,
  &lt;span class="s2"&gt;"author"&lt;/span&gt;: &lt;span class="s2"&gt;"alextomas80 &amp;lt;XXXXXXXXXXX@gmail.com&amp;gt;"&lt;/span&gt;,
  &lt;span class="s2"&gt;"license"&lt;/span&gt;: &lt;span class="s2"&gt;"MIT"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;En mi caso author ya está completo porque estoy logeado en npm con mi usuario &lt;code&gt;alextomas80&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Puedes rellenar o modificar los campos como el &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, &lt;code&gt;keywords&lt;/code&gt;, &lt;code&gt;author&lt;/code&gt; y &lt;code&gt;license&lt;/code&gt; conforme consideres.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: En el name he añadido mi usuario de npm, en mi caso &lt;code&gt;@alextomas80&lt;/code&gt;, añade el tuyo ahí.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;El siguiente paso será la instalación de dependencias que usará nuestro paquete.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; rollup rollup-plugin-node-resolve rollup-plugin-svelte svelte
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nuestro &lt;code&gt;package.json&lt;/code&gt; debe de estar de la siguiente forma (yo he cambiado la descripción y keywords):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@alextomas80/svelte-custom-button"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ejemplo básico de creación de componente Svelte y paquete en NPM"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Error: no test specified&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; &amp;amp;&amp;amp; exit 1"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"svelte"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"ejemplo"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"alextomas80 &amp;lt;XXXXXXXXXXX@gmail.com&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"license"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MIT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"devDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rollup"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.39.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rollup-plugin-node-resolve"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^5.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rollup-plugin-svelte"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^7.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"svelte"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.32.3"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Creación del componente
&lt;/h2&gt;

&lt;p&gt;Vamos a necesitar una carpeta que se llamará &lt;code&gt;src&lt;/code&gt; en la raíz del directorio, y dentro un archivo &lt;code&gt;index.js&lt;/code&gt;. En ella contendremos el punto de inicio de nuestro proyecto y el componente de ejemplo.&lt;/p&gt;

&lt;p&gt;Nuestro &lt;code&gt;src/index.js&lt;/code&gt; quedará de la siguiente forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/index.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;AtButton&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./AtButton.svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;AtButton&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y como te habrás imaginado, ahora debemos de crear nuestro componente &lt;code&gt;AtButton.svelte&lt;/code&gt;, quedando de momento algo así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- src/AtButton.svelte --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;Botón de ejemplo&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto es un fichero de Svelte como seguramente conoces. Puedes importar librerías u otros elementos sin problemas. Así como poner estilos y demás (ahora luego lo veremos).&lt;/p&gt;

&lt;h2&gt;
  
  
  package.json
&lt;/h2&gt;

&lt;p&gt;Tenemos que hacer unos pequeños cambios al &lt;code&gt;package.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dist/index.js"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dist/index.mjs"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"svelte"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/index.js"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rollup -c"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rollup -c -w"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;En &lt;code&gt;main&lt;/code&gt; vamos a establecer el output después de correr el script &lt;strong&gt;build&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;En &lt;code&gt;module&lt;/code&gt; vamos a definir lo mismo pero como salida un archivo .mjs, para que Node distinga entre módulos creados con CommonJS y ES6.&lt;/li&gt;
&lt;li&gt;En &lt;code&gt;svelte&lt;/code&gt;, vamos a definir la ruta de nuestro archivo index.js creado anteriormente.&lt;/li&gt;
&lt;li&gt;Y por último definimos los &lt;code&gt;scripts&lt;/code&gt; como para crear el build o correr en desarrollo.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: la carpeta &lt;code&gt;dist&lt;/code&gt; que hasbrás visto que apunta en &lt;code&gt;main&lt;/code&gt; y &lt;code&gt;module&lt;/code&gt; se generará automáticamente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;El package.json debería quedar así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@alextomas80/svelte-custom-button"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ejemplo básico de creación de componente Svelte y paquete en NPM"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dist/index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dist/index.mjs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"svelte"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rollup -c"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rollup -c -w"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"svelte"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"ejemplo"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"alextomas80 &amp;lt;XXXXXXXXXXX@gmail.com&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"license"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MIT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"devDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rollup"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.39.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rollup-plugin-node-resolve"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^5.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rollup-plugin-svelte"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^7.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"svelte"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.32.3"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Creamos el fichero rollup.config.js
&lt;/h2&gt;

&lt;p&gt;Si has trabajado con Svelte en alguna otra ocasión, conocerás este archivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;svelte&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rollup-plugin-svelte&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rollup-plugin-node-resolve&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pkg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./package.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;src/AtButton.svelte&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;es&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;umd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;svelte&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ¿Cómo puedo probar mi componente localmente?
&lt;/h2&gt;

&lt;p&gt;Antes de publicar el componente en el paquete de NPM, lo suyo sería probarlo para ver como queda y si estamos satisfechos con el resultado. Entonces, vamos a probarlo en un proyecto nuevo de Svelte. Para ello, nos crearemos un nuevo componente de Svelte, yo en mi caso me voy a crear un proyecto llamado &lt;code&gt;svelte-playground&lt;/code&gt; ejecutando el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx degit sveltejs/template svelte-playground
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego accedemos al proyecto e instalamos las dependencias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;svelte-playground
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bien. Ya tenemos lo siguiente:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Un proyecto (&lt;code&gt;svelte-custom-button&lt;/code&gt;) con nuestro componente, listo para ser probado.&lt;/li&gt;
&lt;li&gt;Un proyecto Svelte (&lt;code&gt;svelte-playground&lt;/code&gt;) para probar el componente que enviaremos a NPM.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Primero, accedemos al proyecto del componente &lt;code&gt;svelte-custom-button&lt;/code&gt; y ejecutamos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;link&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y recibirás una respuesta similar a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm WARN svelte-custom-button@1.0.0 No repository field.

audited 17 packages &lt;span class="k"&gt;in &lt;/span&gt;0.711s

3 packages are looking &lt;span class="k"&gt;for &lt;/span&gt;funding
  run &lt;span class="sb"&gt;`&lt;/span&gt;npm fund&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;details

found 0 vulnerabilities
/usr/local/lib/node_modules/svelte-custom-button -&amp;gt; /RUTA_DE_TU_PROYECTO/svelte-custom-button
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y luego, en el proyecto &lt;code&gt;svelte-playground&lt;/code&gt; ejecutaremos &lt;code&gt;npm link /la-ruta/de/tu-paquete&lt;/code&gt;, en mi caso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;link&lt;/span&gt; /RUTA_DE_TU_PROYECTO/svelte-custom-button
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto podremos probar localmente nuestro paquete. ¡Perfecto! ¡Y en tiempo real!&lt;/p&gt;

&lt;h4&gt;
  
  
  Usar componente localmente
&lt;/h4&gt;

&lt;p&gt;Accede a tu proyecto &lt;code&gt;svelte-playground&lt;/code&gt; y corre el proyecto con el comando &lt;code&gt;npm run dev&lt;/code&gt;, con lo que verás la pantalla generada por Svelte en &lt;a href="http://localhost:5000/:"&gt;http://localhost:5000/:&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6g-SIRK6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/crear-componente-svelte-publicar-npm-package/alex_tomas_com_2021-02-15-17-07-14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6g-SIRK6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/crear-componente-svelte-publicar-npm-package/alex_tomas_com_2021-02-15-17-07-14.png" alt="Pantalla de inicio de Svelte"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y ahora editaremos nuestro fichero &lt;code&gt;src/App.svelte&lt;/code&gt; dejándolo así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// Importamos nuestro componente Botón&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;AtButton&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@alextomas80/svelte-custom-button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello {name}!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
        Visit the &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://svelte.dev/tutorial"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Svelte tutorial&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt; to learn
        how to build Svelte apps.
    &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Usamos el componente --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;AtButton&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;main&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;240px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ff3e00&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;text-transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;uppercase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;640px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nt"&gt;main&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡Y entonces tendremos nuestro botón! Quedando así:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9qSpihDh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/crear-componente-svelte-publicar-npm-package/alex_tomas_com_2021-02-15-17-10-49.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9qSpihDh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/crear-componente-svelte-publicar-npm-package/alex_tomas_com_2021-02-15-17-10-49.png" alt="Usando nuestro componente Svelte localmente"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bueno, no es un gran componente, pero por lo menos ya lo vemos.&lt;/p&gt;

&lt;h4&gt;
  
  
  Editar componente localmente a tiempo real
&lt;/h4&gt;

&lt;p&gt;Vamos a darle estilo a nuestro botón. Volvemos al proyecto &lt;code&gt;svelte-custom-button&lt;/code&gt; y dejaremos nuestro componente de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;// Le enviaremos al botón la propiedad `title`, en caso de no recibirla le ponemos valor por defecto&lt;/span&gt;
    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Botón&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"boton"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{title}&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;/* Aplicamos unos pocos estilos al botón */&lt;/span&gt;
    &lt;span class="nc"&gt;.boton&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;coral&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.3s&lt;/span&gt; &lt;span class="n"&gt;ease&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nc"&gt;.boton&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;darkorange&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si accedes de nuevo a &lt;a href="http://localhost:5000/"&gt;http://localhost:5000/&lt;/a&gt; deberías ver los cambios reflejados &lt;strong&gt;automáticamente&lt;/strong&gt;. El botón debería quedarte así:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xLEayi_1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/crear-componente-svelte-publicar-npm-package/alex_tomas_com_2021-02-15-17-19-03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xLEayi_1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/crear-componente-svelte-publicar-npm-package/alex_tomas_com_2021-02-15-17-19-03.png" alt="Botón con estilos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y si ahora le pasamos la propiedad &lt;code&gt;title&lt;/code&gt; a nuestro &lt;code&gt;&amp;lt;AtButton /&amp;gt;&lt;/code&gt; podemos personalizar el título del mismo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;AtButton&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Enviar formulario"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quedando:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FdR2XEMR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/crear-componente-svelte-publicar-npm-package/alex_tomas_com_2021-02-15-17-20-25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FdR2XEMR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/crear-componente-svelte-publicar-npm-package/alex_tomas_com_2021-02-15-17-20-25.png" alt="Botón con estilos y la propiedad title"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Publicar el paquete en NPM
&lt;/h2&gt;

&lt;p&gt;¡Perfecto! Ya tenemos nuestro componente, nos gusta y ahora lo queremos publicar en un paquete en NPM para usarlo en futuros proyectos. Bien, es muy fácil.&lt;/p&gt;

&lt;p&gt;Deberás estar logeado en npm. Si no lo sabes si lo estás ejecuta: &lt;code&gt;npm whoami&lt;/code&gt; (en mi caso me responde alextomas80, que es mi usuario de npm). Doy por hecho que tienes cuenta en NPM! 😂&lt;/p&gt;

&lt;p&gt;Si no estás logeado: &lt;code&gt;npm login&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Es recomendable haber creado en el directorio raíz el archivo README.md con la información de nuestro paquete. Así otros usuarios podrán conocer la información de uso, propiedades, configuraciones etc etc...&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm publish &lt;span class="nt"&gt;--access&lt;/span&gt; public
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y si todo va bien deberías obtener lo siguiente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qi3BvuSd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/crear-componente-svelte-publicar-npm-package/alex_tomas_com_2021-02-15-17-27-33.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qi3BvuSd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/crear-componente-svelte-publicar-npm-package/alex_tomas_com_2021-02-15-17-27-33.png" alt="Publicación de paquete en NPM con éxito"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora si tu perfil de npm (&lt;a href="https://www.npmjs.com/settings/alextomas80/packages"&gt;https://www.npmjs.com/settings/alextomas80/packages&lt;/a&gt;) verás que te aparecerá tu paquete. En el caso de que no lo haga, a veces tarda unos minutos en aparecer, puedes buscarlo directamente en el buscador, en mi caso buscaría &lt;code&gt;@alextomas80/svelte-custom-button&lt;/code&gt; que será el nombre del paquete.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nRe77CTe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/crear-componente-svelte-publicar-npm-package/alex_tomas_com_2021-02-15-17-29-25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nRe77CTe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/crear-componente-svelte-publicar-npm-package/alex_tomas_com_2021-02-15-17-29-25.png" alt="Paquete publicado en NPM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cómo puedo probar mi componente desde NPM?
&lt;/h2&gt;

&lt;p&gt;¡Muy fácil! Esto lo habrás hecho cientos de veces, bueno, igual alguna menos 😌 Accede a la información del paquete, en nuestro ejemplo: &lt;a href="https://www.npmjs.com/package/@alextomas80/svelte-custom-button"&gt;https://www.npmjs.com/package/@alextomas80/svelte-custom-button&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahí nos indica como hacer la instalación a través de NPM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i @alextomas80/svelte-custom-button
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y el uso es igual que el de antes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;AtButton&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@alextomas80/svelte-custom-button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;AtButton&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Acceder al panel"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;main&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;240px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quedando de nuevo nuestro botón como lo teníamos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8wZrX7TC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/crear-componente-svelte-publicar-npm-package/alex_tomas_com_2021-02-15-17-33-00.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8wZrX7TC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/crear-componente-svelte-publicar-npm-package/alex_tomas_com_2021-02-15-17-33-00.png" alt="Probando nuestro componente desde npm"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: Si no te sigue refrescando el componente desde el paquete local tendrás que hacer unlink. Accede al directorio del proyecto &lt;code&gt;svelte-custom-button&lt;/code&gt; y ejecuta &lt;code&gt;npm unlink&lt;/code&gt; y lo mismo en el proyecto Svelte &lt;code&gt;svelte-playground&lt;/code&gt; ejecutando &lt;code&gt;npm unlink /RUTA_DE_TU_PROYECTO/svelte-custom-button&lt;/code&gt;. Yo por lo menos tuve que hacerlo porque me seguía refrescando los cambios locales y no veía el componente de NPM 🙈&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Repo de ejemplo: &lt;a href="https://github.com/alextomas80/svelte-component-package-npm"&gt;https://github.com/alextomas80/svelte-component-package-npm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/alextomas#checkoutModal"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AZppq5zF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/img/ko-fi.png" alt="¿Me invitas a un café?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y esto es todo. Espero que te pueda servir 😉&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>npm</category>
      <category>package</category>
      <category>node</category>
    </item>
    <item>
      <title>El operador SPREAD en JavaScript</title>
      <dc:creator>Alex Tomás</dc:creator>
      <pubDate>Mon, 15 Feb 2021 11:24:43 +0000</pubDate>
      <link>https://dev.to/alextomas80/el-operador-spread-en-javascript-12hc</link>
      <guid>https://dev.to/alextomas80/el-operador-spread-en-javascript-12hc</guid>
      <description>&lt;h2&gt;
  
  
  Spread Operator, ¿qué es?
&lt;/h2&gt;

&lt;p&gt;El &lt;strong&gt;spread operator&lt;/strong&gt; que incorpora ECMAScript 6 en JavaScript es un operador que simplifica la recogida de valores en una estructura de datos. Su representa con tres puntos: &lt;code&gt;...&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;La definición que nos da MDN es: "Spread syntax allows an iterable such as an array expression or string to be expanded in places where zero or more arguments (for function calls) or elements (for array literals) are expected, or an object expression to be expanded in places where zero or more key-value pairs (for object literals) are expected."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lo que quiere decir que este operador distribuye los elementos dentro de un iterable (cadena de texto, array o cualquier cosa que se pueda recorrer) dentro de un receptor. ¿Sigue sonando a chino verdad? Vamos a verlo con &lt;strong&gt;ejemplos de uso&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  Copiar un array
&lt;/h3&gt;

&lt;p&gt;Podemos utilizar el operador spread para copiar arrays:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;animales&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;perro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;caballo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gato&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;oso&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jirafa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;animales&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Resultado -&amp;gt; 'perro', 'caballo', 'gato', 'oso', 'jirafa'&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;copiaDeAnimales&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;animales&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;copiaDeAnimales&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Resultado -&amp;gt; 'perro', 'caballo', 'gato', 'oso', 'jirafa'&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Copiar un array y añadirle elementos
&lt;/h3&gt;

&lt;p&gt;Podemos hacer copias de arrays y además añadir elementos al array, tanto al principio como al final de éste.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;poblaciones&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Benicasim&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Castellón&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alcocebre&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;poblaciones&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Resultado -&amp;gt; ["Benicasim", "Castellón", "Alcocebre"]&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;nuevasPoblaciones&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Oropesa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;poblaciones&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nuevasPoblaciones&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Resultado -&amp;gt; ["Oropesa", "Benicasim", "Castellón", "Alcocebre"]&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;masPoblacionesNuevas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;poblaciones&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Madrid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;masPoblacionesNuevas&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Resultado -&amp;gt; ["Benicasim", "Castellón", "Alcocebre", "Madrid"]&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Concatenar arrays
&lt;/h3&gt;

&lt;p&gt;De una forma sencilla, podemos concatenar arrays (esto lo vimos en el artículo &lt;a href="https://alextomas.com/blog/dos-formas-unir-objetos-javascript" rel="noopener noreferrer"&gt;Dos formas de unir objetos en JavaScript&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;peces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;emperador&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;salmón&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;insectos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hormiga&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mosquito&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;([...&lt;/span&gt;&lt;span class="nx"&gt;peces&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;insectos&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="c1"&gt;// Resultado -&amp;gt; ["emperador", "salmón", "hormiga", "mosquito"]&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Esto también funciona con arrays de diferentes tipos de datos, por ejemplo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;numeros&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;meses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;enero&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;febrero&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;marzo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;([...&lt;/span&gt;&lt;span class="nx"&gt;numeros&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;meses&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="c1"&gt;// Resultado -&amp;gt; [1, 2, 3, "enero", "febrero", "marzo"]&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Funciones
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;algunosNumeros&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;88&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addNumeros&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;addNumeros&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;algunosNumeros&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Resultado -&amp;gt; 156&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Copiar objetos
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;apellido&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tomás&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;copiaDeUsuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;copiaDeUsuario&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Resultado&lt;/span&gt;
&lt;span class="c1"&gt;// Object {&lt;/span&gt;
&lt;span class="c1"&gt;//   apellido: "Tomás",&lt;/span&gt;
&lt;span class="c1"&gt;//   edad: 40,&lt;/span&gt;
&lt;span class="c1"&gt;//   nombre: "Alex"&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Concatenar y añadir nuevas propiedades a un objeto
&lt;/h3&gt;

&lt;p&gt;Tal como se puede hacer con los arrays, pasa con los objetos:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;coche&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;marca&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Peugeot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;modelo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;207&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;caracteristicas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Azul&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;115&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;automovil&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;coche&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;caracteristicas&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;automovil&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Resultado&lt;/span&gt;
&lt;span class="c1"&gt;// Object {&lt;/span&gt;
&lt;span class="c1"&gt;//   color: "Azul",&lt;/span&gt;
&lt;span class="c1"&gt;//   cv: "115",&lt;/span&gt;
&lt;span class="c1"&gt;//   marca: "Peugeot",&lt;/span&gt;
&lt;span class="c1"&gt;//   modelo: "207"&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;extras&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;automovil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aacc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;extras&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Resultado&lt;/span&gt;
&lt;span class="c1"&gt;// Object {&lt;/span&gt;
&lt;span class="c1"&gt;//   aacc: true,&lt;/span&gt;
&lt;span class="c1"&gt;//   color: "Azul",&lt;/span&gt;
&lt;span class="c1"&gt;//   cv: "115",&lt;/span&gt;
&lt;span class="c1"&gt;//   marca: "Peugeot",&lt;/span&gt;
&lt;span class="c1"&gt;//   modelo: "207"&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Puedes ver el código funcionando en &lt;a href="https://codepen.io/alextomas80/pen/bGBqwvy" rel="noopener noreferrer"&gt;este Codepen&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/alextomas#checkoutModal" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fimg%2Fko-fi.png" alt="¿Me invitas a un café?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y esto es todo. Espero que te pueda servir 😉&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tips</category>
      <category>spread</category>
      <category>operator</category>
    </item>
    <item>
      <title>¿Cómo manejar los estilos CSS y SCSS en una aplicación Svelte?</title>
      <dc:creator>Alex Tomás</dc:creator>
      <pubDate>Mon, 15 Feb 2021 10:46:33 +0000</pubDate>
      <link>https://dev.to/alextomas80/como-manejar-los-estilos-css-y-scss-en-una-aplicacion-svelte-ih5</link>
      <guid>https://dev.to/alextomas80/como-manejar-los-estilos-css-y-scss-en-una-aplicacion-svelte-ih5</guid>
      <description>&lt;h2&gt;
  
  
  ¿Cómo añadir estilos en Svelte?
&lt;/h2&gt;

&lt;p&gt;Una vez más, Svelte sorprende por su sencillez. Al igual que pasa con el código HTML. Recuerda que un archivo Svelte hasta ahora habíamos visto dos bloques, el &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; y el propio &lt;code&gt;html&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="cm"&gt;/* Código JS aquí */&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Aquí irá tu fantástico HTML 😉&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora entra en escena el &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="cm"&gt;/* Código JS aquí */&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Aquí irá tu fantástico HTML 😉&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Comic Sans MS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;cursive&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Es importante destacar que &lt;strong&gt;estas reglas tienen como alcance el componente&lt;/strong&gt;. Es decir, no cambiaría los estilos de los párrafos &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; en ninguna otra parte de la aplicación.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Entonces, si tenemos otro componente hijo, con un párrafo, por ejemplo tenemos el siguiente componente llamado &lt;code&gt;Hijo.svelte&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Hijo.svelte --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Esto es un componente hijo&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y el código anterior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Hijo&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Hijo.svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Aquí irá tu fantástico HTML 😉&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Hijo&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Comic Sans MS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;cursive&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El resultado sería la línea &lt;code&gt;Aquí irá tu fantástico HTML 😉&lt;/code&gt; de color &lt;strong&gt;verde&lt;/strong&gt; pero &lt;em&gt;no afectaría al párrafo del componente hijo&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estilos globales
&lt;/h2&gt;

&lt;p&gt;Vale. Este concepto espero haya quedado claro. Los estilos de un componente sólo tienen alcance dentro de sí mismo, no afecta al resto. Pero... ¿y si quiero estilos globales de CSS en toda mi aplicación?&lt;/p&gt;

&lt;p&gt;A fin de no repetir código CSS en todos los componentes, es &lt;strong&gt;muy recomendable&lt;/strong&gt; usar estilos globales para mantener una armonía general. Por ejemplo, tener todos los enlaces de un mismo color.&lt;/p&gt;

&lt;p&gt;En Svelte esto también es muy sencillo. Nos creamos un archivo CSS en nuestra carpeta &lt;code&gt;src&lt;/code&gt; (por ejemplo estilo.css) y lo importamos en nuestro &lt;code&gt;App.svelte&lt;/code&gt; de la siguiente forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- App.svelte --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./estilo.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Mi párrafo de ejemplo con un &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;enlace&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* src/estilo.css */&lt;/span&gt;

&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De esta forma tan sencilla tendrías estilos globales para toda tu aplicación y no necesitarías definir el color de los enlaces en cada componente 😜&lt;/p&gt;

&lt;h2&gt;
  
  
  Usar preprocesadores de CSS
&lt;/h2&gt;

&lt;p&gt;Pero... ¡que es un preprocesador?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Los preprocesadores CSS son herramientas para los desarrolladores de sitios web que traducen un código de hojas de estilo no estándar (SASS/SCSS/LESS...) a un código CSS estándar, entendible por los navegadores.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vamos a ver &lt;strong&gt;como usar SCSS con Svelte&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es SCSS?
&lt;/h2&gt;

&lt;p&gt;SCSS es un procesador CSS. Así de fácil. Es un con CSS vitaminado 🚀&lt;/p&gt;

&lt;h3&gt;
  
  
  Ventajas de SCSS
&lt;/h3&gt;

&lt;p&gt;El uso de SCSS tiene, a mi modo de ver, ciertas ventajas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Reduce el tiempo para crear y mantener el CSS.&lt;/li&gt;
&lt;li&gt;  Permite tener una organización modular de los estilos (vital para proyectos grandes).&lt;/li&gt;
&lt;li&gt;  Proporciona estructuras avanzadas, como variables, listas, funciones y estructuras de control.&lt;/li&gt;
&lt;li&gt;  Permite generar distintos tipos de salida, comprimida, normal o minimizada, trabajando tanto en desarrollo como en producción, además se hace una forma muy fácil.&lt;/li&gt;
&lt;li&gt;  Comunidad muy importante de usuarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desventajas de utilizar SASS
&lt;/h3&gt;

&lt;p&gt;Pero no todo es bonito, SASS tiene algunas desventajas (pero nada alarmantes):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Hay que aprender a utilizar una nueva herramienta, lo que para algunos supone una desventaja.&lt;/li&gt;
&lt;li&gt;  Hay un tiempo de consumo en el proceso de generación o compilación del CSS, sobre todo si es el archivo SCSS es muy grande. No es mucho tiempo, pero sí que existe esa pequeña demora.&lt;/li&gt;
&lt;li&gt;  Tiene una sintaxis más compleja que CSS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Instalar dependencias
&lt;/h3&gt;

&lt;p&gt;Necesitamos instalar un par de dependencias, nada complicado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;svelte-preprocess node-sass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y hacer un par de cambios en nuestro &lt;code&gt;rollup.config.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// importamos la librería&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;preprocess&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;svelte-preprocess&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/* ... */&lt;/span&gt;

&lt;span class="c1"&gt;// ... y añadimos el "preprocess" como un plugin:&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/* ... */&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nf"&gt;svelte&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="cm"&gt;/* ... */&lt;/span&gt;
      &lt;span class="na"&gt;preprocess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;preprocess&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="cm"&gt;/* ... */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Guardamos cambios y hacemos la prueba de antes, pero con SCSS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- App.svelte --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./estilo.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Mi párrafo de ejemplo con un &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;enlace&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* src/estilo.scss */&lt;/span&gt;

&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nota la diferencia entre CSS y SCSS del ejemplo anterior y este 😌 Esto es sólo una pincelada de SCSS, pero te invito a que revises la &lt;a href="https://sass-lang.com/" rel="noopener noreferrer"&gt;documentación oficial de SASS&lt;/a&gt; y te enamorarás y no podrás dejar de usar preprocesadores.&lt;/p&gt;

&lt;p&gt;Tienes más artículos del &lt;strong&gt;curso de Svelte&lt;/strong&gt; 👉🏻 &lt;a href="http://alextomas.com/blog/curso-de-svelte" rel="noopener noreferrer"&gt;aquí&lt;/a&gt; 👈🏻.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/alextomas#checkoutModal" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fimg%2Fko-fi.png" alt="¿Me invitas a un café?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y esto es todo. Espero que te pueda servir 😉&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>css</category>
      <category>scss</category>
      <category>estilos</category>
    </item>
    <item>
      <title>Svelte, nuevo chico en la oficina</title>
      <dc:creator>Alex Tomás</dc:creator>
      <pubDate>Mon, 15 Feb 2021 10:44:23 +0000</pubDate>
      <link>https://dev.to/alextomas80/svelte-nuevo-chico-en-la-oficina-1alk</link>
      <guid>https://dev.to/alextomas80/svelte-nuevo-chico-en-la-oficina-1alk</guid>
      <description>&lt;h2&gt;
  
  
  ¿Qué es Svelte?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Svelte&lt;/strong&gt; es un framework para JavaScript, similar a otros frameworks como pueden ser Vue, React o Angular. Sin embargo, a diferencia de estos frameworks populares que necesitan incluir su propia lógica con tu aplicación, en Svelte no se incluye nada (o casi nada) adicional, dejando el código final producido de tu aplicación mucho más ligero.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ventajas&lt;/em&gt; de Svelte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Más rápido que otros frameworks&lt;/li&gt;
&lt;li&gt;  Simplicidad de código&lt;/li&gt;
&lt;li&gt;  Curva de aprendizaje muy baja&lt;/li&gt;
&lt;li&gt;  Reactividad&lt;/li&gt;
&lt;li&gt;  Menor tamaño de la app generada&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hola Mundo con Svelte 🌍
&lt;/h2&gt;

&lt;p&gt;Svelte utiliza el principio de SFC (Single File Component), lo que significa que el HTML, JS y CSS va todo en un mismo archivo. Esto lo ha popularizado mucho Vue y, en Svelte, podemos ver que es incluso un poco más sencillo.&lt;/p&gt;

&lt;p&gt;Así pues... ¿cómo escribiríamos un Hola Mundo con este framework? ¡Fácil!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;World&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello {name}!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con este ejemplo tan básico ya se pueden ver las primeras diferencias si lo comparamos, por ejemplo, con React. Fíjate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;World&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Hello&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Diferencias:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  No se importa la libraría &lt;em&gt;svelte&lt;/em&gt;. Al ser compilado, Svelte lo hará por nosotros.&lt;/li&gt;
&lt;li&gt;  Más declarativo al no tener que indicarle que queremos exportar ese componente ni el marcado que queremos renderizar.&lt;/li&gt;
&lt;li&gt;  Separación de conceptos. El marcado y el comportamiento e inicialización de datos están separados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Queda &lt;strong&gt;más limpio con Svelte&lt;/strong&gt;, ¿verdad?&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Quieres añadirle estilos? 🎨
&lt;/h2&gt;

&lt;p&gt;Muy fácil. Recuerda que es SFC. Entonces le añades los estilos que necesites:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ff0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;text-transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;uppercase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por lo que el ejemplo completo sería:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;World&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello {name}!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ff0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;text-transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;uppercase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Este artículo es sólo la punta del iceberg de lo que es capaz de hacer Svelte. Te recomiendo que visites la &lt;a href="https://svelte.dev/"&gt;web oficial&lt;/a&gt; porque, sin duda, dará más de que hablar.&lt;/p&gt;

&lt;p&gt;Por cierto, ésta web se ha hecho con Svelte 🤪. Escribiré como la hice, que además, el blog está hecho con documentos &lt;em&gt;Markdown&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>javascript</category>
      <category>framework</category>
    </item>
    <item>
      <title>Cómo eliminar todas las carpetas node_modules y liberar espacio</title>
      <dc:creator>Alex Tomás</dc:creator>
      <pubDate>Mon, 15 Feb 2021 10:42:45 +0000</pubDate>
      <link>https://dev.to/alextomas80/como-eliminar-todas-las-carpetas-nodemodules-y-liberar-espacio-2i65</link>
      <guid>https://dev.to/alextomas80/como-eliminar-todas-las-carpetas-nodemodules-y-liberar-espacio-2i65</guid>
      <description>&lt;p&gt;Si tienes un equipo con poca memoria, bien porque sea un SSD con poca capacidad o lo que sea, cada GB puede ser oro. Si a eso le sumas que tienes en tu ordenador muchos proyectos con sus respectivas carpetas &lt;code&gt;node_modules&lt;/code&gt;, puede que tengas varios GB ocupados y no eres consciente.&lt;/p&gt;

&lt;p&gt;Algunos proyectos puede que no tengan muchas dependencias y bueno, ocupen unos pocos megas, pero hay otros, coomo en mi caso, que puede que ocupen ¡varios cientos de megas! 😭&lt;/p&gt;

&lt;p&gt;Así pues, puedes liberar mucha memoria de tu ordenador eliminando esas carpetas, sobre todo de proyectos que no tengas que trabajar día a día.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cuánto ocupan los directorios node_modules?
&lt;/h2&gt;

&lt;p&gt;En mi caso, tengo todos los proyectos en la carpeta &lt;code&gt;Proyectos&lt;/code&gt; dentro de mi usuario. Así que vamos a ver el comando que buscará en todos los proyectos las carpetas &lt;code&gt;node_modules&lt;/code&gt; dentro de &lt;code&gt;~/Proyectos&lt;/code&gt; y me dirá el tamaño que ocupa cada una y el total.&lt;/p&gt;

&lt;p&gt;Si tienes Mac/Linux usa el siguiente comando:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Proyectos
find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"node_modules"&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; d &lt;span class="nt"&gt;-prune&lt;/span&gt; | xargs &lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-chs&lt;/span&gt;

&lt;span class="c"&gt;# Ejemplo de output:&lt;/span&gt;
&lt;span class="c"&gt;# 255M  ./StencilJS/test-with-react/node_modules&lt;/span&gt;
&lt;span class="c"&gt;#  15M  ./StencilJS/custom-components-stencil/node_modules&lt;/span&gt;
&lt;span class="c"&gt;# 191M  ./StencilJS/test-with-vue/node_modules&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Estos son algunos directorios de ejemplo para mi caso. Como verás sólo dos de ellos me ocupan más de 400 megas, y ya te digo yo que tengo más de uno y de dos proyectos así. En total, según el comando de antes, &lt;strong&gt;tengo 8,8GB ocupados sólo de carpetas node_modules&lt;/strong&gt; 🤬😭 Vaya locura....&lt;/p&gt;

&lt;p&gt;Si tienes &lt;strong&gt;Windows&lt;/strong&gt;, usa este comando:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;cd &lt;/span&gt;Proyectos
FOR /d /r &lt;span class="nb"&gt;.&lt;/span&gt; %d &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;node_modules&lt;span class="o"&gt;)&lt;/span&gt; DO @IF EXIST &lt;span class="s2"&gt;"%d"&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; %d&lt;span class="s2"&gt;"


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Borrar definitivamente las carpetas node_modules
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTA:&lt;/strong&gt;, cuando eliminas la carpeta &lt;code&gt;node_modules&lt;/code&gt; de un proyecto tendrás que volver a hacer un &lt;code&gt;npm install&lt;/code&gt; cuando quieras trabajar de nuevo en él. No es un mal mayor, vaya.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Perfecto, ¿te ha pasado como a mí? ¿tienes varios gigas ocupados y quieres/necesitas recuperar ese espacio? Bien, es muy sencillo y tienes dos opciones.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Entrar en cada proyecto y hacer un &lt;code&gt;rm -Rf node_modules&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Usar el siguiente comando para eliminar todas las carpetas &lt;code&gt;node_modules&lt;/code&gt; del directorio en el que te encuentres, en mi caso &lt;code&gt;~/Proyectos&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Proyectos
find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s1"&gt;'node_modules'&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; d &lt;span class="nt"&gt;-prune&lt;/span&gt; &lt;span class="nt"&gt;-print&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; &lt;span class="s1"&gt;'{}'&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Si tienes &lt;strong&gt;Windows&lt;/strong&gt;, puedes utilizar el siguiente comando.&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;Proyectos&lt;br&gt;
FOR /d /r &lt;span class="nb"&gt;.&lt;/span&gt; %d &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;node_modules&lt;span class="o"&gt;)&lt;/span&gt; DO @IF EXIST &lt;span class="s2"&gt;"%d"&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; &lt;span class="s2"&gt;"%d"&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Recuerda&lt;br&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Asegúrate de qué quieres eliminar antes de ejecutar el comando.&lt;/li&gt;
&lt;li&gt;  Sé cuidadoso/a, el proceso es "irreversible".&lt;/li&gt;
&lt;li&gt;  Recuerda que tendrás que hacer &lt;code&gt;npm install&lt;/code&gt; en el proyecto que quieras volver a trabajar.&lt;/li&gt;
&lt;li&gt;  ¡Disfruta del espacio libre! 🎉&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;¡Eso es todo! Ahora &lt;strong&gt;ya tengo 8,8 gigas de espacio libre&lt;/strong&gt; de nuevo. Aprovecha y haces una limpieza de proyectos, que tal vez sean pruebas o bien ya no necesites, y liberas un poco de espacio.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Artículo original: &lt;a href="https://alextomas.com/blog/buscar-borrar-todos-node-modules" rel="noopener noreferrer"&gt;Cómo eliminar todas las carpetas node_modules y liberar espacio&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/alextomas#checkoutModal" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fimg%2Fko-fi.png" alt="¿Me invitas a un café?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y esto es todo. Espero que te pueda servir 😉&lt;/p&gt;

</description>
      <category>nodemodules</category>
      <category>espacio</category>
      <category>liberar</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Crear WebComponents con StencilJS y reutilizarlos en diferentes proyectos</title>
      <dc:creator>Alex Tomás</dc:creator>
      <pubDate>Mon, 15 Feb 2021 10:40:40 +0000</pubDate>
      <link>https://dev.to/alextomas80/crear-webcomponents-con-stenciljs-y-reutilizarlos-en-diferentes-proyectos-49m8</link>
      <guid>https://dev.to/alextomas80/crear-webcomponents-con-stenciljs-y-reutilizarlos-en-diferentes-proyectos-49m8</guid>
      <description>&lt;p&gt;Me ha pasado en varias ocasiones la necesidad de re-utilizar un componente en varios proyectos. ¿La solución? Copiar-pegar el componente y llevármelo al proyecto que lo necesite, y tal vez, ajustar alguna cosa para que funcione. ¿Te suena?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Artículo original: &lt;a href="https://alextomas.com/blog/crear-webcomponents-con-stenciljs" rel="noopener noreferrer"&gt;Crear WebComponents con StencilJS y reutilizarlos en diferentes proyectos&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tal vez esto te funciona cuando el componente en cuestión, por ejemplo un botón, te lo llevas de un proyecto React a otro proyecto React, pero... ¿qué haces si un proyecto es de React, otro de Angular u otro de Vue? Tocaría re-hacer ese botón para cada proyecto. Es decir, estarás haciendo tres veces la misma funcionalidad. No suena bien, ¿no? 💩&lt;/p&gt;

&lt;p&gt;Bueno, si te sientes identificado/a con ésta situación, me alegro de no ser el único.&lt;/p&gt;

&lt;p&gt;¿Qué tal te suena si hacemos ese mismo botón una sóla vez y lo aprovechamos para nuestros proyectos? Venga, vamos a ello.&lt;/p&gt;

&lt;h2&gt;
  
  
  Índice de contenidos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Introducción&lt;/li&gt;
&lt;li&gt;  ¿Qué es StencilJS?&lt;/li&gt;
&lt;li&gt;  Crear un proyecto con StencilJS&lt;/li&gt;
&lt;li&gt;  Creación de un componente botón reusable con StencilJS&lt;/li&gt;
&lt;li&gt;  Añadir estilos CSS a un webcomponent&lt;/li&gt;
&lt;li&gt;  ¿Cómo ver un webcompoent creado con Stencil?&lt;/li&gt;
&lt;li&gt;  Generando la distribución&lt;/li&gt;
&lt;li&gt;  Distribuir nuestro webcomponent en un package de Github&lt;/li&gt;
&lt;li&gt;  Integración en un proyecto con React&lt;/li&gt;
&lt;li&gt;  Integración en un proyecto con Vue&lt;/li&gt;
&lt;li&gt;  Conclusiones&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Introducción
&lt;/h3&gt;

&lt;p&gt;En este artículo vamos a ver con un ejemplo práctico cómo implementar un componente con StencilJS (el botón comentado anteriormente), lo publicaremos como un &lt;code&gt;package&lt;/code&gt; en Github y luego lo integraremos en nuestras aplicaciones, haremos una prueba de integración en Vue y otro en React. ¿Suena bien? ¡Al lío!&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es StencilJS?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://stenciljs.com/" rel="noopener noreferrer"&gt;StencilJS&lt;/a&gt; es una herramienta de los creadores de &lt;a href="https://ionicframework.com/" rel="noopener noreferrer"&gt;Ionic&lt;/a&gt;, que definen como «El generador mágico de web components reusables». Es decir, StencilJS permite crear de forma sencilla y sin grandes esfuerzos web components nativos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Crear un proyecto con StencilJS
&lt;/h3&gt;

&lt;p&gt;Lo primero que haremos, como es obvio, crear el proyecto, muy fácil:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init stencil
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lo que automáticamente nos preguntará que tipo de proyecto es:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Ftipo_de_proyecto.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Ftipo_de_proyecto.jpg" alt="Tipo de proyecto Stencil"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nos salen tres opciones de tipos de proyecto. Vamos a seleccionar la opción &lt;code&gt;component&lt;/code&gt; ya que lo que queremos crear es una colección de componentes. Como nombre del proyecto pondremos &lt;code&gt;custom-components-stencil&lt;/code&gt; (por ejemplo):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fconfirmacion_inicio_proyecto_stencil.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fconfirmacion_inicio_proyecto_stencil.jpg" alt="Confirmación de la instalación del proyecto con Stencil"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perfecto, ya hemos creado nuestro primer proyecto con Stencil 🚀, ahora abrimos el proyecto con nuestro IDE favorito y empezamos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;custom-components-stencil
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Finstalar_dependencias_stencil.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Finstalar_dependencias_stencil.jpg" alt="Instalación de dependencias y ejecutamos el proyecto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bien, una vez arrancado el proyecto nos dirá la URL en la que está funcionando nuestro ejemplo, en mi caso en &lt;code&gt;http://localhost:3333/&lt;/code&gt; donde veremos un ejemplo básico que nos ofrece por defecto StencilJS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creación de un componente botón reusable con StencilJS
&lt;/h3&gt;

&lt;p&gt;Llegados a este punto tenemos ya instalado nuestro primer proyecto StencilJS. Ahora vamos a crear nuestro primer webcomponent de tipo botón reusable.&lt;/p&gt;

&lt;p&gt;Lo primero, nos fijaremos en el archivo &lt;code&gt;src/index.html&lt;/code&gt; donde veremos que Stencil ya nos ofrece un ejemplo de uso de un componente llamado &lt;code&gt;my-component&lt;/code&gt;, pégale un vistazo a la carpeta &lt;code&gt;src/components/my-component&lt;/code&gt; que es donde está definido. Básicamente es un div que recibe tres props (first, middle, last) y los pinta por pantalla.&lt;/p&gt;

&lt;p&gt;Bien, vamos a crear nuestro componente. Seguiremos los siguientes pasos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creamos a carpeta dentro de &lt;code&gt;src&lt;/code&gt; que llamaremos &lt;code&gt;at-button&lt;/code&gt; (at es de Alex Tomás 😜)&lt;/li&gt;
&lt;li&gt;Dentro de &lt;code&gt;src/components/at-button&lt;/code&gt; creamos un archivo con &lt;strong&gt;formato .tsx&lt;/strong&gt; que llamaremos &lt;code&gt;at-button.tsx&lt;/code&gt; ya añadimos lo siguiente:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Prop&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@stencil/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;at-button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;styleUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;at-button.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ATButton&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Prop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bueno, bueno, esto son muchas cosas, pero que no cunda el pánico. Veamos cuales son las partes del componente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Decorador &lt;code&gt;@Component&lt;/code&gt; es donde especificamos el nombre del componente y su fichero de estilos.&lt;/li&gt;
&lt;li&gt;  La &lt;code&gt;@Prop&lt;/code&gt; &lt;em&gt;text&lt;/em&gt; va a ser la propiedad que le enviaremos al componente. Estas propiedades por defecto son inmutables desde dentro del componente. Para hacerlas mutables hay que anotarlas con &lt;code&gt;@Prop({ mutable: true })&lt;/code&gt;, pero no va a ser el caso.&lt;/li&gt;
&lt;li&gt;  El método &lt;code&gt;render&lt;/code&gt;, que devuelve la descripción necesaria para pintar el componente. Cómo verás usamos &lt;strong&gt;sintaxis JSX&lt;/strong&gt;. Si no conoces JSX pásate por este enlace de la documentación de React que explica &lt;a href="https://es.reactjs.org/docs/introducing-jsx.html" rel="noopener noreferrer"&gt;qué es JSX&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Recuerda crear el fichero de estilos en &lt;code&gt;src/components/at-button/at-button.css&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Añadir estilos CSS a un webcomponent
&lt;/h3&gt;

&lt;p&gt;Muy sencillo. Al añadir en el decorador &lt;code&gt;@Component&lt;/code&gt; el nombre del archivo CSS, añadimos las clases que queramos. En nuestro caso le hemos añadido la clase &lt;code&gt;button&lt;/code&gt; a nuestro botón. Por lo tanto, le añadimos un estilo básico (recuerda que estamos aprendiendo la funcionalidad de los webcomponentes, no en la estética 🙃):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;teal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;9px&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.28&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;30px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.button&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;146&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;146&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vale, perfecto. ¿En qué punto estamos?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hemos iniciado el proyecto con Stencil.&lt;/li&gt;
&lt;li&gt;Tenemos un webcomponent creado que se llama &lt;code&gt;at-button&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Le hemos dado estilos css.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;¿Y ahora como lo puedo ver?&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo ver un webcompoent creado con Stencil?
&lt;/h3&gt;

&lt;p&gt;Recuerda, que al principio del artículo, al crear el proyecto teníamos el comando &lt;code&gt;npm run start&lt;/code&gt; o &lt;code&gt;npm start&lt;/code&gt; para ver el proyecto en nuestro navegador. Vale, pero antes vamos a editar el fichero &lt;code&gt;src/index.html&lt;/code&gt; y lo dejaremos de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;dir=&lt;/span&gt;&lt;span class="s"&gt;"ltr"&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt;
            &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt;
            &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=5.0"&lt;/span&gt;
        &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Stencil Component Starter&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;script
            &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;
            &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/build/custom-components-stencil.esm.js"&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;nomodule&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/build/custom-components-stencil.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;at-button&lt;/span&gt; &lt;span class="na"&gt;text=&lt;/span&gt;&lt;span class="s"&gt;"¡Hola mundo!"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/at-button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si vamos a nuestro localhost que nos indica Stencil al arrancar el proyecto deberíamos ver nuestro botón:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fhola_mundo_button_stencil.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fhola_mundo_button_stencil.jpg" alt="Webcomponent Hola Mundo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Generando la distribución
&lt;/h3&gt;

&lt;p&gt;¡Ya tienes tu primer webcomponent creado con StencilJS! ¿Y hora como lo vamos a usar en otros proyectos? Lo primero que tenemos que hacer, es compilar todo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lo que te debe generar la carpeta &lt;code&gt;dist&lt;/code&gt; y &lt;code&gt;loader&lt;/code&gt;. Perfecto, vamos a crear nuestro &lt;code&gt;package&lt;/code&gt;en Github.&lt;/p&gt;

&lt;h3&gt;
  
  
  Distribuir nuestro webcomponent en un package de Github
&lt;/h3&gt;

&lt;p&gt;Lo primero que necesitaremos será tener creado un repositorio, si no lo tienes creado, hazlo (no voy a detenerme en como crear un repo y en subir los cambios en él ya que no es el objeto de este artículo 😌).&lt;/p&gt;

&lt;p&gt;En mi caso el proyecto estará público en la siguiente URL: &lt;a href="https://github.com/alextomas80/stencil-webcomponents" rel="noopener noreferrer"&gt;https://github.com/alextomas80/stencil-webcomponents&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perfecto. Ya tengo mi proyecto compilado y subido a Github. Ahora vamos a crear nuestro package.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generar token en Github para crear un package
&lt;/h3&gt;

&lt;p&gt;Aquí vien un poco de magia. Lo primero que necesitamos es un archivo llamado &lt;code&gt;.npmrc&lt;/code&gt; donde añadiremos lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//npm.pkg.github.com/:_authToken=TU_TOKEN
registry=https://npm.pkg.github.com/USUARIO
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En mi caso será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//npm.pkg.github.com/:_authToken=d7a031caf35....🤫
registry=https://npm.pkg.github.com/alextomas80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para crear un token para publicar un package en tu repositorio necesitarás acceder en Github a Settings &amp;gt; Developer settings &amp;gt; Personal access tokens&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fcrear_token_personal_github.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fcrear_token_personal_github.jpg" alt="Crear un token personal en Github"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y necesitaremos hacer un cambio en nuestro &lt;code&gt;package.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"custom-components-stencil"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lo cambiaremos por nuestro usuario y nombre que le hayas puesto a tu repositorio, en mi caso quedaría de la siguiente forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@alextomas80/stencil-webcomponents"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bien, tenemos todo listo, ahora sí, para enviar nuestro package a Github 🤞🏻&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm publish &lt;span class="nt"&gt;--access&lt;/span&gt; public
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y deberíamos de obtener una respuesta similar a ésta:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fsubir_package_github.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fsubir_package_github.jpg" alt="Package subido a Github"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Sí! ¡Ahora sí! Tienes tu package creado con éxito. ¿Cómo comprobarlo? Accede a la URL de tu repositorio terminado en &lt;code&gt;packages&lt;/code&gt;: &lt;a href="https://github.com/alextomas80/stencil-webcomponents/packages" rel="noopener noreferrer"&gt;https://github.com/alextomas80/stencil-webcomponents/packages&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Flistado_de_packages_github.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Flistado_de_packages_github.jpg" alt="Package subido a Github"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Integración en un proyecto con React
&lt;/h3&gt;

&lt;p&gt;Es hora de ver que todo esto ha servido para algo y funciona. Vamos a utilizar nuestro webcomponent &lt;code&gt;at-button&lt;/code&gt; en un proyecto que vamos a crear con react de una forma rápida. No me voy a entretener mucho con esto:&lt;/p&gt;

&lt;p&gt;Creamos nuestro proyecto de ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-react-app test-with-react
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arrancamos el proyecto y veremos la pantalla de bienvenida típica de React:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fbienvenido_react.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fbienvenido_react.jpg" alt="Pantalla inicio de React"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora instalemos nuestro package con nuestro webcomponent. Si volvemos a Github y consultamos nuestro package veremos que nos indica como podemos instalarlo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Finstalar_package.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Finstalar_package.jpg" alt="Package subido a Github"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Así que usaremos NPM para ello:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @alextomas80/stencil-webcomponents@0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bien. Ahora vamos a usarlo. Para ello vamos a pegar un vistazo a la &lt;a href="https://stenciljs.com/docs/react" rel="noopener noreferrer"&gt;documentación de Stencil para la integración con React&lt;/a&gt;, es muy sencillo, yo te lo resumo:&lt;/p&gt;

&lt;p&gt;Abrimos el archivo &lt;code&gt;src/index.js&lt;/code&gt; y lo dejamos de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./index.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./App&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Importamos nuestro package que hemos creado en los anteriores pasos&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;applyPolyfills&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;defineCustomElements&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@alextomas80/stencil-webcomponents/loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="nf"&gt;applyPolyfills&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;defineCustomElements&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y ahora sí, por fin, vamos a usar y ver nuestro at-button. Abrímos el archivo &lt;code&gt;src/App.js&lt;/code&gt; y añadimos nuestro botón de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;at-button&lt;/span&gt; &lt;span class="na"&gt;text=&lt;/span&gt;&lt;span class="s"&gt;"Mi WebComponent en React"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con lo que veremos, por fín, nuestro botón de la siguiente manera y estilo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fwebcomponent_en_react.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fwebcomponent_en_react.jpg" alt="Usando webcomponent personalizado en React"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Bien! Como verás tiene el mismo estilo que le dimos al componente cuando lo creamos con Stencil. Y además le podemos pasar la propiedad &lt;code&gt;text&lt;/code&gt; para definir el texto que tendrá el botón. Una maravilla. Pero... ¿no habíamos dicho que el fin de este artículo es el de crear un componente y usarlo en React y Vue?&lt;/p&gt;

&lt;h3&gt;
  
  
  Integración en un proyecto con Vue
&lt;/h3&gt;

&lt;p&gt;Creamos nuestro proyecto de ejemplo Vue:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vue create test-with-vue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seleccionamos las opciones que nos pide (versión de Vue, etc etc, no me voy a entretener en esta parte). Arrancamos el proyecto y veremos la pantalla de bienvenida típica de Vue:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fbienvenido_vue.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fbienvenido_vue.jpg" alt="Bienvenido a VUe"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y vamos a hacer exactamente lo mismo que con ejemplo de React. Vamos a instalar nuestro package con NPM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @alextomas80/stencil-webcomponents@0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos a pegar un vistazo de nuevo a la &lt;a href="https://stenciljs.com/docs/vue" rel="noopener noreferrer"&gt;documentación de Stencil para la integración con Vue&lt;/a&gt;, también es muy fácil y muy similar a React:&lt;/p&gt;

&lt;p&gt;Abrimos el archivo &lt;code&gt;src/main.js&lt;/code&gt; y lo dejamos de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createApp&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./App.vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Importamos nuestro package que hemos creado en los anteriores pasos&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;applyPolyfills&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;defineCustomElements&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@alextomas80/stencil-webcomponents/loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;applyPolyfills&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;defineCustomElements&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;createApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;mount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y ya podemos usarlo. Para ello vamos al archivo del ejemplo &lt;code&gt;src/App.vue&lt;/code&gt; y añadimos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;at-button&lt;/span&gt; &lt;span class="na"&gt;text=&lt;/span&gt;&lt;span class="s"&gt;"Mi WebComponent en Vue"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fwebcomponent_en_vue.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fblog%2Fwebcomponents-stenciljs%2Fwebcomponent_en_vue.jpg" alt="Usando webcomponent personalizado en Vue"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Y ahí tenemos de nuevo exactamente el mismo botón!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fgifs%2Fmagic.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fgifs%2Fmagic.gif" alt="WebComponents - Pura magia"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Con este sencillo ejemplo has podido ver y probar el potencial que nos ofrece Stencil y las posibilidades que nos brinda. Podemos crear componentes rápidamente y completamente reutilizables en cualquier tipo de aplicación ya sea de una u otra tecnología, o incluso sin que tengan uns framework JavaScript por detrás como hemos hecho.&lt;/p&gt;

&lt;p&gt;Así pues, si lo que quieres es tener tu libraría de componentes, compartirla con diferentes proyectos y además trabajar en ellos diferentes compañeros de equipo... te recomiendo totalmente su uso.&lt;/p&gt;

&lt;p&gt;Y esto es todo. Espero que te pueda servir 😉&lt;/p&gt;

</description>
      <category>webcomponents</category>
      <category>stenciljs</category>
      <category>react</category>
      <category>vue</category>
    </item>
    <item>
      <title>Desestructuración de objetos en JavaScript</title>
      <dc:creator>Alex Tomás</dc:creator>
      <pubDate>Sun, 14 Feb 2021 19:23:22 +0000</pubDate>
      <link>https://dev.to/alextomas80/desestructuracion-de-objetos-en-javascript-lpn</link>
      <guid>https://dev.to/alextomas80/desestructuracion-de-objetos-en-javascript-lpn</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Artículo original en &lt;a href="https://alextomas.com/blog/desestructurar-en-javascript" rel="noopener noreferrer"&gt;Desestructuración de objetos en JavaScript&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ¿Qué es la desestructuración en JavaScript?
&lt;/h2&gt;

&lt;p&gt;La &lt;strong&gt;desestructuración&lt;/strong&gt; es una característica muy conveniente al desarrollar con &lt;a href="https://alextomas.com/blog/category/javascript" rel="noopener noreferrer"&gt;JavaScript&lt;/a&gt;, es una expresión que nos &lt;em&gt;permite desempaquetar valores de arrays u objetos en grupos de variables&lt;/em&gt;, permitiéndonos &lt;code&gt;simplificar y crear código más legible&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Desestructuración de objetos
&lt;/h3&gt;

&lt;p&gt;La sintaxis básica sería:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;variable1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;variable2&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;variable1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;...,&lt;/span&gt; &lt;span class="na"&gt;variable2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Supongamos que tenemos el siguiente ejemplo de un objeto en JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;apellidos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tomás&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://alextomas.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antiguamente, para obtener la una propiedad del objeto &lt;code&gt;usuario&lt;/code&gt; haríamos algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Resultado -&amp;gt; Alex&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eso no está mal, pero podemos dejarlo más limpio con la &lt;strong&gt;desestructuración&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;apellidos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tomás&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://alextomas.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;apellidos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;apellidos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Resultado -&amp;gt; 123 Alex Tomás https://alextomas.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las propiedades &lt;code&gt;usuario.id&lt;/code&gt;, &lt;code&gt;usuario.nombre&lt;/code&gt;, &lt;code&gt;usuario.apellidos&lt;/code&gt; y &lt;code&gt;usuario.url&lt;/code&gt;, se asignan a las variables correspondientes, &lt;strong&gt;sin importar su orden&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Si quieres &lt;strong&gt;cambiar el nombre de las variables&lt;/strong&gt; cuando las asignas mediante desestructuración, también puedes hacerlo de la siguiente forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;moto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;tipo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Race&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;modelo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Yamaha MT09&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;matriculacion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2018&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;tipo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;modelo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;matriculacion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;year&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;moto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;year&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Resultado -&amp;gt; "Race" "Yamaha MT09" 2018&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Así de sencillo.&lt;/p&gt;

&lt;h4&gt;
  
  
  Valores por defecto
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;television&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;pulgadas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fabricante&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LG&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;pulgadas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fabricante&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;smart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;television&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pulgadas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fabricante&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;smart&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Resultado -&amp;gt; 52 "LG" true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  El resto
&lt;/h4&gt;

&lt;p&gt;En caso que el objeto tenga más propiedades que el número de variables que requerimos crear, podemos guardar el resto de la información en un último parámetro utilizando tres puntos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;mascota&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;raza&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;perro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Max&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;8.5&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;raza&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;rest&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mascota&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raza&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Resultado:&lt;/span&gt;

&lt;span class="c1"&gt;// "perro"&lt;/span&gt;
&lt;span class="c1"&gt;// Object {&lt;/span&gt;
&lt;span class="c1"&gt;//   edad: 8.5,&lt;/span&gt;
&lt;span class="c1"&gt;//   nombre: "Max"&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Desestructuración anidada
&lt;/h4&gt;

&lt;p&gt;Puedes tener el caso de que un objeto está compuesto de otros objetos y matrices, así que también podemos usar patrones más complejos del lado izquierdo para extraer partes más profundas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;automovil&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;tipo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;coche&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;marca&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Peugeot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;caracteristicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;115&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;carburante&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;diesel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;marca&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;caracteristicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;cv&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;automovil&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;marca&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Resultado -&amp;gt; "Peugeot" 115&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puedes ver el código funcionando en &lt;a href="https://codepen.io/alextomas80/pen/eYBgqBJ" rel="noopener noreferrer"&gt;este Codepen&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/alextomas#checkoutModal" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Falextomas.com%2Fimg%2Fko-fi.png" alt="¿Me invitas a un café?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y esto es todo. Espero que te pueda servir 😉&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>desestructuracion</category>
      <category>objetos</category>
      <category>destructuring</category>
    </item>
    <item>
      <title>Dos formas de unir objetos en JavaScript</title>
      <dc:creator>Alex Tomás</dc:creator>
      <pubDate>Sun, 14 Feb 2021 18:12:04 +0000</pubDate>
      <link>https://dev.to/alextomas80/dos-formas-de-unir-objetos-en-javascript-1p87</link>
      <guid>https://dev.to/alextomas80/dos-formas-de-unir-objetos-en-javascript-1p87</guid>
      <description>&lt;p&gt;Aquí tienes dos formas de unir objectos fácilmente en JavaScript. Olvidate de complicarte la vida con librerías como lodash. Una tarea tan sencilla como esta se soluciona fácilmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;animales&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;hamster&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🐹&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;koala&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🐨&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;leon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🦁&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;perro&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🐶&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;insectos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;mosca&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🪰&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;abeja&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🐝&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;mosquito&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🦟&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;hormiga&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🐜&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;animales&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;nombres&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resultado2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;({},&lt;/span&gt; &lt;span class="nx"&gt;animales&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;nombres&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El resultado para ambos objectos &lt;code&gt;resultado&lt;/code&gt; y &lt;code&gt;resultado2&lt;/code&gt; sería el mismo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;Object&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;abeja&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🐝&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;hamster&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🐹&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;hormiga&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🐜&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;koala&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🐨&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;leon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🦁&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;mosca&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🪰&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;mosquito&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🦟&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;perro&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🐶&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puedes ver el codigo funcionando en &lt;a href="https://codepen.io/alextomas80/pen/gOLgNjX"&gt;este Codepen&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Artículo original en &lt;a href="https://alextomas.com/blog/dos-formas-unir-objetos-javascript"&gt;Dos formas de unir objetos en JavaScript&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Y esto es todo. Espero que te pueda servir 😉&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tips</category>
      <category>objectos</category>
    </item>
    <item>
      <title>Cómo generar un sitemap dinámico para tu web app con Sapper (Svelte)
</title>
      <dc:creator>Alex Tomás</dc:creator>
      <pubDate>Sun, 14 Feb 2021 17:40:34 +0000</pubDate>
      <link>https://dev.to/alextomas80/como-generar-un-sitemap-dinamico-para-tu-web-app-con-sapper-svelte-2bdj</link>
      <guid>https://dev.to/alextomas80/como-generar-un-sitemap-dinamico-para-tu-web-app-con-sapper-svelte-2bdj</guid>
      <description>&lt;h2&gt;
  
  
  ¿Qué son los sitemaps?
&lt;/h2&gt;

&lt;p&gt;Un sitemap es un anglicismo que significa «Mapa del sitio», es decir, un archivo o una url que contiene todas y cada una de las páginas de una web. En este artículo te voy a explicar porqué es tan importante generar uno, cómo debes crearlo correctamente y diferentes maneras de crear uno.&lt;/p&gt;

&lt;p&gt;Según la definición de Google:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Los sitemaps son archivos en los que se proporciona información sobre las páginas, los vídeos y otros archivos de un sitio web, así como sobre las relaciones que hay entre ellos. Los buscadores, como Google, leen estos archivos para rastrear los sitios web de forma más eficaz. Los sitemaps informan a Google de qué archivos de un sitio web son importantes según el webmaster y, además, incluyen datos importantes sobre ellos; por ejemplo, en el caso de las páginas, pueden indicar cuándo se actualizaron por última vez, cada cuánto se modifican y si tienen versiones en otros idiomas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Con un sitemap, además, vas a poder mantener actualizada la lista de enlaces que tiene la web y pasarsela a Google para que la rastree. Es un método muy sencillo y recomendable que tu página web tenga un sitemap.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cómo generar un sitemap con Sapper?
&lt;/h2&gt;

&lt;p&gt;Sapper es un framework hecho con Svelte ya preparado con un enrutamiento flexible basado en sistemas de archivos y SSR. Tal vez conozcas NuxtJS con Vue... pues lo mismo, pero para Svelte 😜&lt;/p&gt;

&lt;h3&gt;
  
  
  Estructura de un sitemap
&lt;/h3&gt;

&lt;p&gt;Los sitemap se rigen mediante unos protocolos marcados por &lt;a href="//sitemaps.org"&gt;sitemaps.org&lt;/a&gt;, es decir, tienen una estructura concreta. Según estas directrices, un sitemap puede configurarse de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;urlset&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.sitemaps.org/schemas/sitemap/0.9"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-25&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;priority&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/priority&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com/blog&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-19&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;priority&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/priority&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/urlset&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro de cada etiqueta  encontramos cuatro etiquetas de información diferentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;&amp;lt;loc&amp;gt;&lt;/code&gt;: URL de la página. Es una etiqueta de uso &lt;strong&gt;obligatorio&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;&amp;lt;lastmod&amp;gt;&lt;/code&gt;: Indica la fecha de la última modificación textual o de programación en dicha url. Su uso no es &lt;strong&gt;obligatorio&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;&amp;lt;changefreq&amp;gt;&lt;/code&gt; (opcional): Esta etiqueta indica la frecuencia en la que se realizan modificaciones textuales o de código en esa url.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;&amp;lt;priority&amp;gt;&lt;/code&gt; (opcional): Indica en un rago de 0 a 1 la importancia que el webmaster atribuye a esa url en concreto respecto a la web en su conjunto.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Generar un sitemap de forma manual
&lt;/h3&gt;

&lt;p&gt;La forma más sencilla de &lt;strong&gt;generar un sitemap en Sapper&lt;/strong&gt; es haciéndolo de forma manual:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creas un fichero llamado sitemap.xml en la carpeta &lt;code&gt;static&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Escribes el listado de todos los links que quieras añadir con la siguiente estructura:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;urlset&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.sitemaps.org/schemas/sitemap/0.9"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-25&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;priority&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/priority&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com/blog&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-19&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;priority&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/priority&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/urlset&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto está bien si no te quieres complicar demasiado o bien tu página es estática y va a tener muy pocos enlaces. Pero... ¿y si tienes un blog que va a tener cientos de entradas? Este ha sido mi caso, mi blog tiene entradas dinámicas (&lt;a href="https://alextomas.com/blog/blog-svelte-sapper-markdown"&gt;aquí explico cómo generar un blog con Sapper y Markdown&lt;/a&gt;, pégale un vistazo).&lt;/p&gt;

&lt;p&gt;Resulta que mantener un sitemap actualizado era un fastidio, además que podía equivocarme al escribir alguna ruta, por lo que podría pasarle a Google información errónea y demás. ¿Solución?&lt;/p&gt;

&lt;h3&gt;
  
  
  Generar un sitemap de forma dinámica
&lt;/h3&gt;

&lt;p&gt;Es una forma un poco más elaborada para &lt;strong&gt;generar un sitemap en Sapper&lt;/strong&gt; pero tampoco es nada de otro mundo. Sigue los siguientes pasos y verás que no tienes problemas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creas un fichero en &lt;code&gt;src/routes/sitemap.xml.js&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;El código para la generación dinámica del sitemap es el siguiente:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Importo el listado de posts y los guardo en la variables 'posts'&lt;/span&gt;
&lt;span class="c1"&gt;// En el artículo mencionado antes explico su uso&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./blog/_posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// Librería para darle formato a las fechas&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;moment&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;moment&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;feed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&amp;gt;
    &amp;lt;url&amp;gt;
        &amp;lt;loc&amp;gt;https://alextomas.com&amp;lt;/loc&amp;gt;
        &amp;lt;lastmod&amp;gt;2021-01-25&amp;lt;/lastmod&amp;gt;
    &amp;lt;/url&amp;gt;
    &amp;lt;url&amp;gt;
        &amp;lt;loc&amp;gt;https://alextomas.com/work-experience&amp;lt;/loc&amp;gt;
        &amp;lt;lastmod&amp;gt;2021-01-19&amp;lt;/lastmod&amp;gt;
    &amp;lt;/url&amp;gt;
    &amp;lt;url&amp;gt;
        &amp;lt;loc&amp;gt;https://alextomas.com/blog&amp;lt;/loc&amp;gt;
        &amp;lt;lastmod&amp;gt;2021-01-19&amp;lt;/lastmod&amp;gt;
    &amp;lt;/url&amp;gt;
    &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;mountSchemaUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt; &amp;lt;/urlset
&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;writeHead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/rss+xml&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;mountSchemaUrl&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`
&amp;lt;url&amp;gt;
    &amp;lt;loc&amp;gt;https://alextomas.com/blog/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/loc&amp;gt;
    &amp;lt;lastmod&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;moment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YYYY-MM-DD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/lastmod&amp;gt;
&amp;lt;/url&amp;gt;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Es muy sencillo de entender:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Primero incluyo las páginas estáticas. En mi caso es la home, experiencia laboral y el blog. Que no van a cambiar de ruta nunca.&lt;/li&gt;
&lt;li&gt;Luego, recorro el array de posts y llamo a la función &lt;code&gt;mountSchemaUrl&lt;/code&gt; que me devuelve la estructura necesaria para cada enlace del post.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ¿Cómo puedo ver el sitemap generado?
&lt;/h3&gt;

&lt;p&gt;Si estás en modo desarrollo (&lt;code&gt;npm run dev&lt;/code&gt;) puedes acceder a la ruta &lt;code&gt;http://localhost:3000/sitemap.xml&lt;/code&gt; y automáticamente verás tu estupendo sitemap.xml, algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;urlset&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.sitemaps.org/schemas/sitemap/0.9"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-25&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com/work-experience&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-19&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com/blog&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-19&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com/blog/generar-sitemap-sapper-svelte&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-27&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com/blog/deplegar-sapper-netlify&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-25&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com/blog/estilos-con-svelte&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-24&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com/blog/como-cambiar-ubicacion-nombre-capturas-mac&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-24&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com/blog/atributos-dinamicos-en-svelte&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-22&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com/blog/manejo-de-datos-con-svelte&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-21&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com/blog/curso-de-svelte&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-20&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com/blog/blog-svelte-sapper-markdown&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-18&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com/blog/diferentes-cuentas-y-misma-clave-ssh-en-bitbucket&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-05&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;loc&amp;gt;&lt;/span&gt;https://alextomas.com/blog/que-es-svelte&lt;span class="nt"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;2021-01-04&lt;span class="nt"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/urlset&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡Enhorabuena, ya tienes tu sitemap dinámico en tu aplicación web con Sapper! 🚀&lt;/p&gt;

&lt;h4&gt;
  
  
  Problema al hacer export (deploy)
&lt;/h4&gt;

&lt;p&gt;Cuando hagas el deploy y hagas un &lt;code&gt;npm run export&lt;/code&gt; para generar las rutas seguramente tengas el mismo problema que tuve yo: La ruta al &lt;a href="https://alextomas.com/sitemap.xml"&gt;sitemap&lt;/a&gt; no me funcionaba, me daba un 404.&lt;/p&gt;

&lt;h4&gt;
  
  
  Solución:
&lt;/h4&gt;

&lt;p&gt;En mi caso, añadiendo un enlace al sitemap en el footer fue suficiente. Al compilar, Sapper encuentra el enlace y genera el archivo sitemap.xml accesible. No se porqué pero sin el enlace me daba el error. 😭&lt;/p&gt;

&lt;h2&gt;
  
  
  Enviar tu sitemap directamente a Google
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Para enviar tu sitemap a Google, primero deberás &lt;a href="https://search.google.com/search-console"&gt;verificar tu sitio con el Google Search Console&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para enviar tu sitemap:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Selecciona tu sitio web en la consola de Google Search.&lt;/li&gt;
&lt;li&gt;Haz clic en Sitemaps en el menú a la izquierda.&lt;/li&gt;
&lt;li&gt;En el campo &lt;code&gt;Añadir un sitemap&lt;/code&gt;, escribe la url de tu sitemap.xml (en mi casi &lt;a href="https://alextomas.com/sitemap.xml"&gt;https://alextomas.com/sitemap.xml&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Haz clic en &lt;code&gt;Enviar&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xFT8ThLs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/enviar_sitemap_google.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xFT8ThLs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/enviar_sitemap_google.jpg" alt="Enviar sitemap a Google desde Search Console"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Artículo original en &lt;a href="https://alextomas.com/blog/generar-sitemap-sapper-svelte"&gt;Cómo generar un sitemap dinámico para tu web app con Sapper (Svelte)&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Y esto es todo. Espero que te pueda servir 😉&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>sitemap</category>
      <category>sapper</category>
    </item>
    <item>
      <title>Cómo desplegar una aplicación Sapper en Netlify</title>
      <dc:creator>Alex Tomás</dc:creator>
      <pubDate>Sun, 14 Feb 2021 17:36:37 +0000</pubDate>
      <link>https://dev.to/alextomas80/como-desplegar-una-aplicacion-sapper-en-netlify-350p</link>
      <guid>https://dev.to/alextomas80/como-desplegar-una-aplicacion-sapper-en-netlify-350p</guid>
      <description>&lt;p&gt;En este artículo, vamos a ver qué es Sapper, cómo crear una aplicación simple y finalmente implementarla en Netlify. ¡Al lío! 🤓&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Artículo original en &lt;a href="https://alextomas.com/blog/deplegar-sapper-netlify"&gt;Cómo desplegar una aplicación Sapper en Netlify&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ¿Qué es Sapper?
&lt;/h2&gt;

&lt;p&gt;Ya hice una breve referencia a lo que era Sapper en el artículo dónde hablamos de &lt;a href="https://alextomas.com/blog/blog-svelte-sapper-markdown"&gt;crear un blog con sapper y markdown&lt;/a&gt;, pégale un vistazo.&lt;/p&gt;

&lt;p&gt;Sapper es un framework hecho con Svelte ya preparado con un enrutamiento flexible basado en sistemas de archivos y SSR. Tal vez conozcas NuxtJS con Vue… pues lo mismo, pero para Svelte 😜&lt;/p&gt;

&lt;p&gt;Así que si eres un desarrollador de Svelte y quieres crear una aplicación renderizada del lado del servidor rápida y robusta en Svelte, la podrás crear fácilmente con Sapper. Al igual que para la creación de aplicaciones representación del lado del servidor en &lt;strong&gt;React&lt;/strong&gt; tenemos un framework muy popular llamado &lt;strong&gt;Next.JS&lt;/strong&gt; .&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A diferencia de las aplicaciones de una sola página (SPA), Sapper no compromete el SEO, mejora carga inicial de la aplicación.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ¿Qué es Netlify?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.netlify.com/"&gt;Netlify&lt;/a&gt; es una plataforma de alojamiento web de próxima generación que proporciona todo lo que necesita para crear sitios web rápidos y modernos como CI / CI, funciones sin servidor, etc...&lt;/p&gt;

&lt;p&gt;Beneficios de usar de Netlify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Puede crear una cuenta gratuita para sus proyectos.&lt;/li&gt;
&lt;li&gt;  Precios muy bajos con muchas características.&lt;/li&gt;
&lt;li&gt;  Proporciona certificados SSL gratuitos y cuenta con administraciones de DNS integradas.&lt;/li&gt;
&lt;li&gt;  Si quieres almacenar datos, Netlify también tiene un &lt;a href="https://www.netlifycms.org/"&gt;CMS Netlify&lt;/a&gt; .&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Cómo crear una aplicación en Sapper?
&lt;/h2&gt;

&lt;p&gt;Necesitarás tener lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Última versión estable de Node JS y NPM.&lt;/li&gt;
&lt;li&gt;  Conocimiento básico de HTML, CSS y JavaScript&lt;/li&gt;
&lt;li&gt;  El conocimiento de Svelte es una ventaja adicional&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La forma más fácil de crear una aplicación Sapper es &lt;a href="https://github.com/sveltejs/sapper-template"&gt;clonando el repositorio&lt;/a&gt; con &lt;strong&gt;degit&lt;/strong&gt;. Usando esta plantilla podemos crear la aplicación Sapper con dos de los paquetes de módulos más populares, que son, &lt;a href="https://rollupjs.org/"&gt;rollup.js&lt;/a&gt; y &lt;a href="https://webpack.js.org/"&gt;Webpack&lt;/a&gt; . Puedes elegir cualquiera de los dos, con el que te sientas más cómodo.&lt;/p&gt;

&lt;p&gt;Usando Rollup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx degit &lt;span class="s2"&gt;"sveltejs/sapper-template#rollup"&lt;/span&gt; saper-netlify-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usando Webpack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx degit &lt;span class="s2"&gt;"sveltejs/sapper-template#webpack"&lt;/span&gt; saper-netlify-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez termine accede al directorio generado e instala las dependencias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;saper-netlify-app
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5AY4AScw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/dependencias_instaladas_sapper.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5AY4AScw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/dependencias_instaladas_sapper.jpg" alt="Dependencias de Sapper instaladas"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Y eso es todo! Ya podemos ver nuestra aplicación Sapper con el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y aquí tenemos nuestra primera aplicación hecha con Sapper:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xFKgFMtb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/sapper_ejemplo_primera_instalacion.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xFKgFMtb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/sapper_ejemplo_primera_instalacion.jpg" alt="Dependencias de Sapper instaladas"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si le echamos un vistazo al &lt;code&gt;package.json&lt;/code&gt; en &lt;code&gt;scripts&lt;/code&gt; veremos los siguientes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sapper dev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sapper build --legacy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sapper export --legacy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node __sapper__/build"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;dev&lt;/code&gt;: para iniciar la aplicación en modo de desarrollo&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;build&lt;/code&gt;: compila la aplicación en modo de producción&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;export&lt;/code&gt;: exportar la versión estática de la aplicación (usaremos este comando para implementar la aplicación)&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;start&lt;/code&gt;: inicia la aplicación que has creado en modo de producción&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bien. Ya tenemos nuestra aplicación Sapper y sabemos como arrancarla, verla y generar los archivos estáticos para lanzarla a producción.&lt;/p&gt;

&lt;h1&gt;
  
  
  Git: Bitbucket, Gitlab...
&lt;/h1&gt;

&lt;p&gt;Ahora vamos a crearnos nuestro repositorio para tener el código en él (puedes elegir la plataforma que quieras como Gitlab o Bitbucket). Esto daría para otro artículo, por lo que debes de estar familiarizado con el tema de crear un repositorio y hacer commits.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git init
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Mi primer commit"&lt;/span&gt;
git remote add origin &amp;lt;your repo address&amp;gt;
git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡Perfecto! Hasta ahora hemos hecho lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Hemos creado con éxito una aplicación Sapper básica.&lt;/li&gt;
&lt;li&gt;  Hemos introducido el código fuente en Git.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementar la aplicación Sapper en Netlify
&lt;/h2&gt;

&lt;p&gt;Llega el momento de implementar nuestra aplicación Sapper en Netlify. Si todavía no eres usuario de Netlify, créate una &lt;a href="https://app.netlify.com/signup"&gt;cuenta gratuita en Netlify&lt;/a&gt;, es fácil y rápido.&lt;/p&gt;

&lt;p&gt;Una vez que hayas iniciado sesión, serás redirigido a (&lt;a href="https://app.netlify.com/)%5Bhttps://app.netlify.com/%5D"&gt;https://app.netlify.com/)[https://app.netlify.com/]&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Crear nuevo sitio desde Git
&lt;/h3&gt;

&lt;p&gt;Para empezar a crear nuestro nuevo sitio deberemos hacer click sobre &lt;code&gt;New site from Git&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DdhsjdX1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/new_site_from_git.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DdhsjdX1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/new_site_from_git.jpg" alt="Crear nuevo sitio desde Git en Netlify"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El siguiente paso seré elegir la plataforma Git en la que tienes tu repositorio (GitHub, GitLab o Bitbucket), en nuestro caso será Bitbucket (si es la primera vez que haces este paso te pedirá que autorices tu cuenta con Netlify):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NIub_Lq2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/select_git_platform.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NIub_Lq2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/select_git_platform.jpg" alt="Crear nuevo sitio desde Git en Netlify"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y nos pedirá con qué repositorio queremos conectar nuestra app. En nuestro caso, para el ejemplo, será &lt;code&gt;ejemplo-de-uso-sapper&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S77AL_36--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/seleccionar_repo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S77AL_36--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/seleccionar_repo.jpg" alt="Seleccionamos repositorio para CI en Netlify"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este es el último paso de configuración, pero vamos a detenernos un poco en ver qué es cada cosa, porque es importante:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0w-dEFSJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/configuracion_ci_sapper_netlify.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0w-dEFSJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/configuracion_ci_sapper_netlify.jpg" alt="Seleccionamos repositorio para CI en Netlify"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;Branch to deploy&lt;/code&gt;: rama que se desplegará con el CI de Netlify. Esto quiere decir que cuando hagas un commit a la rama &lt;code&gt;master&lt;/code&gt;(en este caso de ejemplo) Netlify iniciará una compilación de tu aplicación Sapper para hacer el despliegue.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;Build command&lt;/code&gt;: cuando Netlify detecte un commit en la rama que hayas configurado como &lt;code&gt;Branch to deploy&lt;/code&gt; ejecutará este comando.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;Publish directory&lt;/code&gt;: directorio que se desplegará en tu aplicación.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En nuestro caso, queremos desplegar nuestra aplicación Sapper, y como vimos antes, para generar los archivos necesarios usaremos &lt;code&gt;npm run export&lt;/code&gt;. Entonces, la configuración en Netlify debería quedar así:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x1L1FG0d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/configuracion_sapper_comando_deploy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x1L1FG0d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://alextomas.com/blog/configuracion_sapper_comando_deploy.jpg" alt="Configuración CI para Sapper en Netlify"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Ya está todo! El último paso es clickar en &lt;code&gt;Deploy site&lt;/code&gt;. Esto te generará tu aplicación y lanzará tu primer &lt;code&gt;deploy&lt;/code&gt; de la misma.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusiones de usar Netlify
&lt;/h1&gt;

&lt;p&gt;Netlify me ha sorprendido por su sencillez de uso y las funcionalidades que te dan de forma gratuita. Es increíblemente sencillo crear una aplicación y desplegarla en una URL que ellos te facilitan (luego lo puedes conectar a tu dominio). Sin duda, recomiendo 100% el uso de Netlify si no quieres gastarte ni un euro y tener las útlimas tecnologías.&lt;/p&gt;

&lt;h1&gt;
  
  
  Código de ejemplo y demo
&lt;/h1&gt;

&lt;p&gt;Demo: &lt;a href="https://determined-thompson-ceb618.netlify.app/"&gt;https://determined-thompson-ceb618.netlify.app/&lt;/a&gt;&lt;br&gt;
Repo: &lt;a href="https://bitbucket.org/_alextomas_/ejemplo-de-uso-sapper/src/master/"&gt;https://bitbucket.org/_alextomas_/ejemplo-de-uso-sapper/src/master/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y esto es todo. Espero que te pueda servir 😉&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>netlify</category>
      <category>sapper</category>
      <category>deploy</category>
    </item>
    <item>
      <title>Cómo crear un blog con Sapper (Svelte) y Markdown</title>
      <dc:creator>Alex Tomás</dc:creator>
      <pubDate>Sun, 14 Feb 2021 17:32:05 +0000</pubDate>
      <link>https://dev.to/alextomas80/como-crear-un-blog-con-sapper-svelte-y-markdown-29f8</link>
      <guid>https://dev.to/alextomas80/como-crear-un-blog-con-sapper-svelte-y-markdown-29f8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Artículo original en &lt;a href="https://alextomas.com/blog/blog-svelte-sapper-markdown"&gt;Cómo crear un blog con Sapper (Svelte) y Markdown&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ¿Qué es Sapper?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://sapper.svelte.dev/"&gt;Sapper&lt;/a&gt; es un framework hecho con Svelte ya preparado con un enrutamiento flexible basado en sistemas de archivos y SSR. Tal vez conozcas NuxtJS con Vue... pues lo mismo, pero para Svelte 😜&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué hacer un blog con markdown?
&lt;/h2&gt;

&lt;p&gt;Bueno, esta decisión fue más por aprender que por otra cosa. Puede ser una buena opción para toda persona que no tenga un hosting, o no quiera tenerlo por el motivo que sea. También me gusto el hecho de usar Markdown, texto plano de siempre con un marcado claro y sencillo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vamos a empezar
&lt;/h2&gt;

&lt;p&gt;No te llevará más de 10 minutos. Debo decir que no me voy a detener en maquetaciones ni nada de los posts, ni del listado de posts. Sólo me voy a centrar en la lógica para obtener el listado de posts (*.md), mostrarlos y ver el detalle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalar Sapper y arrancar el proyecto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx degit &lt;span class="s2"&gt;"sveltejs/sapper-template#rollup"&lt;/span&gt; NOMBRE_DE_TU_APP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El proceso no debe llevarte mucho tiempo, apenas unos segundos. Ya que no instala las dependencias. Una vez termine, deberás acceder a la carpeta del proyecto e instalar las depenciencias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;NOMBRE_DE_TU_APP
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev &amp;amp; open http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con todo esto debería abrirse el navegador y ver la plantilla de ejemplo de Sapper. Verás que ya viene un menú con 3 enlaces en la cabecera totalmente funcionales.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="http://localhost:3000/"&gt;http://localhost:3000/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://localhost:3000/about"&gt;http://localhost:3000/about&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="http://localhost:3000/blog"&gt;http://localhost:3000/blog&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;¡Perfecto! Seguimos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contenido
&lt;/h3&gt;

&lt;p&gt;La carpeta donde irá nuestro contenido será dentro de &lt;code&gt;src/contents&lt;/code&gt;. Y pondremos un archivo de ejemplo con la siguiente estructura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
date: 2021-01-18
summary: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ultricies congue erat, ut tempor felis euismod imperdiet.
title: "¡Hola Alex Tomás!"
---

Este es mi primer documento con formato Markdown. Lo guardamos con el nombre que quieras, por ejemplo `primera-prueba.md`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Plugins
&lt;/h3&gt;

&lt;p&gt;Podríamos cargar los archivos .md usando algo como fs.readFile() en tiempo de compilación, pero hay una forma más fácil usando &lt;code&gt;import&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para ello vamos a utilizar el plugin &lt;code&gt;@jackfranklin/rollup-plugin-markdown&lt;/code&gt;. ¡Es magia pura!&lt;/p&gt;

&lt;p&gt;El plugin hace posible lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import post1 from 'posts/example1.md'
import post2 from 'posts/example2.md'
// ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si tuvieramos que hacer esto uno por uno... llegaría un momento que nos volveríamos locos. 😅 Es más fácil que "algo" nos importe todos los archivos *.md de nuestra carpeta. Eso exactamente hace el plugin &lt;code&gt;rollup-plugin-glob&lt;/code&gt; 🚀&lt;/p&gt;

&lt;p&gt;Entonces, vamos a añadir los siguientes paquetes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i -D @jackfranklin/rollup-plugin-markdown rollup-plugin-glob
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y tenemos que hacer una pequeña modificación en nuestro &lt;code&gt;rollup.config.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Importamos los paquetes
import markdown from '@jackfranklin/rollup-plugin-markdown'
import glob from 'rollup-plugin-glob'

// Recuerda que rollup crea multiples builds, así que fíjate de
// añadir los dos plugins tanto en `server` como en `client`
export {
  client: {
    plugins: [
      markdown(),
      glob(),
      ...
    ],
    ...
  },

  server: {
    plugins: [
      markdown(),
      glob(),
      ...
    ],
    ...
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Centralizamos los posts
&lt;/h3&gt;

&lt;p&gt;Ahora que podemos importar .md, vamos a centralizar la lógica para acceder a las publicaciones, crearemos el archivo &lt;code&gt;src/posts.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;all&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./contents/*.md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si pusieramos un &lt;code&gt;console.log(posts)&lt;/code&gt;, varíamos algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"¡Hola Alex Tomás!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Lorem ipsum dolor sit amet..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2021-01-18"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Este es mi primer documento con formato Markdown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"filename"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"primera-prueba.md"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡Genial! Ahora sólo nos queda darle un poco de forma y crearnos un par de funciones. Vamos a realizar estas mejoras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Ponga la metadata( title, summary, date) en el nivel superior.&lt;/li&gt;
&lt;li&gt;  Agrega un permalinkcampo. Se basará en elfilename&lt;/li&gt;
&lt;li&gt;  Ordene la lista de publicaciones dateen orden descendente (las publicaciones más recientes primero)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dejaremos el archivo &lt;code&gt;src/posts.js&lt;/code&gt; de la siguiente forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lodash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;all&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../posts/*.md&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;all&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;desc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// ordenamos los posts por fecha&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// función para formatear cada post&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// el permalink es el nombre del archivo '.md'&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;permalink&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;md$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// convertimos la fecha en un Date&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// devolvemos el post con el nuevo formato&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;permalink&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// función para buscar un post&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;findPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;permalink&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// usamos lodash para encontrar un post por su permalink (nombre de fichero):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;permalink&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: vamos a necesitar instalar el paquete de lodash:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i lodash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Listado de posts
&lt;/h3&gt;

&lt;p&gt;¡Es hora de mostrar los posts que tenemos! Abrimos el archivo &lt;code&gt;src/routes/index.svelte&lt;/code&gt; que ya nos había generado Sapper por nosotros.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;// Importamos los posts desde el fichero src/posts.js&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;svelte:head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Blog&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svelte:head&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Recent posts&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

{#each posts as post}
    &lt;span class="nt"&gt;&amp;lt;article&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;{`blog/${post.permalink}`}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;{post.title}&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{post.summary}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
{/each}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Básicamente lo que hacemos es:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Importamos los posts.&lt;/li&gt;
&lt;li&gt;  Con &lt;code&gt;svelte:head&lt;/code&gt; ponemos el título en la página.&lt;/li&gt;
&lt;li&gt;  Hacemos un bucle para imprimir un &lt;code&gt;article&lt;/code&gt; para cada post.&lt;/li&gt;
&lt;li&gt;  Añadimos un enlace con el link al post. &lt;em&gt;Recuerda que el permalink es el nombre del archivo .md&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Detalle de un post
&lt;/h3&gt;

&lt;p&gt;Ya tenemos nuestro listado de posts en &lt;code&gt;src/routes/blog/index.svelte&lt;/code&gt;. Ahora vamos a editar &lt;code&gt;src/routes/blog/[slug].svelte&lt;/code&gt;, que es otra ruta que Sapper no había dejado preparado por nosotros.&lt;/p&gt;

&lt;p&gt;¿Te has fijado en los corchetes alrededor de &lt;code&gt;[slug]&lt;/code&gt;? Eso le dice a Sapper que &lt;code&gt;slug&lt;/code&gt; es un parámetro dinámico. Sapper proporcionará todos los parámetros a nuestra función preload (). Ahora lo vemos.&lt;/p&gt;

&lt;p&gt;De momento te dejo como debería quedar el archivo final:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;context=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;findPost&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;preload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;slug&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;findPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;svelte:head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;{post.title}&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svelte:head&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;{post.title}&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{@html post.html}&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: La definición de &lt;code&gt;context="module"&lt;/code&gt; es necesaria para poder utilizar la función &lt;code&gt;preload&lt;/code&gt;antes de que el componente sea creado. De este modo podremos obtener los parámetros pasados como &lt;code&gt;props&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Así pues, podemos obtener el &lt;code&gt;slug&lt;/code&gt;y pasarselo a la función &lt;code&gt;findPost&lt;/code&gt;, que se encargará de encontrar el post a través de su nombre (slug). Así de fácil. Y nos lo guardará en la constante &lt;code&gt;post&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Finalmente sólo nos queda pintar la información.&lt;/p&gt;

&lt;p&gt;¡Ya está! Ya tienes un blog con una funcionalidad básica, pero que trabaja con archivos markdown.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusiones
&lt;/h3&gt;

&lt;p&gt;Muchas veces me ha tocado trabajar con equipos de redacción y he peleado mucho con Wordpress u otros sistemas. Es cierto que Wordpress, por ejemplo, es muy conocido y usado por redactores, pero luego vienen &lt;em&gt;problemas como código copiado/pegado y estilos heredados&lt;/em&gt;, o bien el que no es amigo/a de las tecnologías y quiere algo básico.&lt;/p&gt;

&lt;p&gt;Markdown es texto plano, tal cual. Su sintaxis es realmente básica para poder usarla por cualquier persona. Por tanto, te pueden mandar el archivo .md, lo copias en el directorio &lt;code&gt;contents&lt;/code&gt; y eso es todo. Sapper hará el resto por tí. Lo mostrará en el listado de archivos y enlazará a la página de detalle.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;¡No necesitarás base de datos!&lt;/em&gt; No toda la gente quiere o puede invertir en un hosting con base de datos, y un hosting gratuito les hace el papel. Ésta es una muy buena solución.&lt;/p&gt;

&lt;p&gt;Y esto es todo. Espero que te pueda servir 😉&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>markdown</category>
      <category>blog</category>
      <category>sapper</category>
    </item>
  </channel>
</rss>
