<?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>Forem: Anartz Mugika Ledo</title>
    <description>The latest articles on Forem by Anartz Mugika Ledo (@mugan86).</description>
    <link>https://forem.com/mugan86</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%2F148146%2F83cea70c-7941-4042-8b69-59be688de3a8.jpg</url>
      <title>Forem: Anartz Mugika Ledo</title>
      <link>https://forem.com/mugan86</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mugan86"/>
    <language>en</language>
    <item>
      <title>Web Scrapping con NodeJS</title>
      <dc:creator>Anartz Mugika Ledo</dc:creator>
      <pubDate>Tue, 18 Aug 2020 16:47:48 +0000</pubDate>
      <link>https://forem.com/mugan86/web-scrapping-con-nodejs-1751</link>
      <guid>https://forem.com/mugan86/web-scrapping-con-nodejs-1751</guid>
      <description>&lt;p&gt;En este nuevo artículo, vamos a trabajar con Node aplicando la técnica “Web-Scrapping”&lt;/p&gt;
&lt;h3&gt;
  
  
  0.- ¿Qué es?
&lt;/h3&gt;

&lt;p&gt;El “Web-scrapping” se refiere a la recopilación de información de un sitio web a través de scripts automatizados. Esto va a facilitarnos el proceso de recopilación de grandes cantidades de datos de sitios web donde no se ha definido ninguna API oficial.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.- ¿En qué consiste?
&lt;/h3&gt;

&lt;p&gt;El “Web-scrapping” se puede dividir en dos pasos principales: obtener el código fuente HTML del sitio web a través de una solicitud HTTP o mediante un navegador sin cabeza, y analizar los datos sin procesar para extraer solo la información que nos interesa en un formato utilizable.&lt;/p&gt;
&lt;h3&gt;
  
  
  2.- Para qué sirve el scraping
&lt;/h3&gt;

&lt;p&gt;Estas son algunas de las utilidades más habituales para las que usamos esta técnica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Agregadores de contenido&lt;/li&gt;
&lt;li&gt;  Reputación online&lt;/li&gt;
&lt;li&gt;  Caza de tendencias (cool hunting)&lt;/li&gt;
&lt;li&gt;  Optimización de precios&lt;/li&gt;
&lt;li&gt;  Monitorización de la competencia&lt;/li&gt;
&lt;li&gt;  Optimización ecommerce&lt;/li&gt;
&lt;li&gt;  Google Search Analysis&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;3.- Advertencia antes de empezar a extraer datos&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;¡Tener cuidado! El “Web scrapping”va en contra de los términos de servicio de la mayoría de los sitios web. Nuestra dirección IP puede ser prohibida en un sitio web si aplicamos la técnica con demasiada frecuencia o de manera maliciosa.&lt;/p&gt;

&lt;p&gt;Por eso es importante no abusar de ello y no hacerlo con fines maliciosos.&lt;/p&gt;
&lt;h3&gt;
  
  
  4.- Preparativos del proyecto
&lt;/h3&gt;

&lt;p&gt;Antes de empezar a trabajar con el proyecto, tenemos que tener instalado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  NodeJS&lt;/li&gt;
&lt;li&gt;  NPM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si no lo tenemos, acudimos a la página &lt;a href="https://nodejs.org/en/"&gt;https://nodejs.org/en/&lt;/a&gt; y seguimos las indicaciones para su descarga e instalación. Es muy sencillo.&lt;/p&gt;

&lt;p&gt;Una vez que ya tenemos lo necesario para trabajar accedemos al terminal y dentro el creamos un nuevo directorio en el que vamos a trabajar.&lt;/p&gt;

&lt;pre id="69d6" class="graf graf--pre graf-after--p"&gt;mkdir web-scrapping &amp;amp;&amp;amp; cd web-scrapping&lt;/pre&gt;

&lt;p&gt;Ahora creamos el fichero package.json, que será el manifiesto de nuestro proyecto que servirá para almacenar la información más relevante de nuestro proyecto como nombre, descripción, dependencias,…&lt;/p&gt;

&lt;pre id="1718" class="graf graf--pre graf-after--p"&gt;npm init -y&lt;/pre&gt;

&lt;p&gt;Modificamos el &lt;strong&gt;package.json&lt;/strong&gt; para añadirle la descripción, las palabras clave (keywords) y el autor, quedará de la siguiente manera:&lt;/p&gt;

&lt;p&gt;Creamos el ficheros &lt;strong&gt;index.js&lt;/strong&gt; que será donde vamos a ejecutar la operación para extraer la información e instalamos las dependencias que vamos a necesitar para trabajar con ello.&lt;/p&gt;

&lt;pre id="9b5d" class="graf graf--pre graf-after--p"&gt;npm install request request-promise cheerio objects-to-csv&lt;/pre&gt;

&lt;p&gt;Las librerías que instalamos harán lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;request / request-promise&lt;/strong&gt; : Para traer la información que queremos descargar.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;cheerio&lt;/strong&gt;: Para manipular y seleccionar la información que queremos extraer únicamente.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;objects-to-csv&lt;/strong&gt;: Para guardar la información en un fichero CSV después de obtener lo que deseamos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  5.- Empezando a hacer Scrapping
&lt;/h3&gt;

&lt;p&gt;Vamos a trabajar con la web que nos brinda información de las estadísticas del ciclismo mundial llamada &lt;a href="https://www.procyclingstats.com/"&gt;Pro Cycling Stats&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Lo que vamos a querer obtener concretamente es la información del ranking &lt;a href="https://www.procyclingstats.com/rankings.php"&gt;UCI PRO TOUR de la clasificación individual de los ciclistas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Por lo tanto, vamos a trabajar con esta URL:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.procyclingstats.com/rankings.php"&gt;&lt;strong&gt;PCS Ranking Individual&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
_Summation of PCS points over a 12-month + 2 weeks overlap period. Races are counted once. After the finish of a stage…_www.procyclingstats.com&lt;/a&gt;&lt;a href="https://www.procyclingstats.com/rankings.php"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cuya página tendrá esta apariencia:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nruIoIIo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AfDGujH6QqChaoESOl-c1aA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nruIoIIo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AfDGujH6QqChaoESOl-c1aA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Realizamos mediante request-promise una solicitud HTTP en la URL mencionada.&lt;/p&gt;

&lt;p&gt;Si ejecutamos y visualizamos el log de salida, nos da toda la información de esa página.&lt;/p&gt;

&lt;p&gt;Ya tenemos el primer paso en el que somos capaces de extraer la información de una URL concreta y descargar todo su código HTML. Todo lo que se ha visualizado aquí es como si hiciesemos en el navegador “click derecho” en la página y seleccionasemos &lt;strong&gt;“Ver código fuente de la página”.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  6.- Seleccionando la información que deseamos extraer
&lt;/h3&gt;

&lt;p&gt;Ahora que ya hemos conseguido extraer la información, vamos a seleccionar la que queremos obtener y para saber lo que tenemos que obtener, podemos hacer uso de las herramientas de desarrollo que nos proporcionan navegadores como Firefox o Google Chrome.&lt;/p&gt;

&lt;p&gt;Para acceder a esas herramientas, tanto en uno como en otro, pulsamos click derecho sobre cualquier apartado de la web y seleccionamos &lt;strong&gt;“Inspeccionar elemento”&lt;/strong&gt; (Firefox) ó &lt;strong&gt;“Inspeccionar” (Chrome).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A continuación os muestro la parte que queremos “extraer” para obtener los datos que queremos, en este caso la información de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Posición en el ranking.&lt;/li&gt;
&lt;li&gt;  Ciclista.&lt;/li&gt;
&lt;li&gt;  URL con la información principal del ciclista.&lt;/li&gt;
&lt;li&gt;  Equipo al que pertenece.&lt;/li&gt;
&lt;li&gt;  Puntos obtenidos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I2_5yzb1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AuBoeDODSzPTGJr5vleykCA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I2_5yzb1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AuBoeDODSzPTGJr5vleykCA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
Información con la clasificación de los ciclistas del ranking UCI PRO Tour



&lt;p&gt;Ahora que ya tenemos localizado el apartado que queremos obtener para tratar sus datos, vamos a hacer referencia a ese apartado de la tabla y vamos a obtener todas las filas de esa tabla. Vamos a hacer referencia dentro de la tabla a todos los “tr”.&lt;/p&gt;

&lt;p&gt;Por lo tanto, nos quedaría algo de este estilo:&lt;/p&gt;

&lt;p&gt;Como véis, después de asignar a la constante el extracto con el que queremos trabajar, pones la orden la orden “debugger” y pulsamos estando en Visual Studio code y ese fichero seleccionado &lt;strong&gt;“F5”&lt;/strong&gt; que sirve para ejecutar en modo debugger.&lt;/p&gt;

&lt;p&gt;En el momento que se ejecuta, si os fijáis en la siguiente imagen, podéis apreciar que el cursor amarillo está parado en la línea de debugger.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yINZUmUq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2Ap2spAWARAOUM0Tjg5ZNvXg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yINZUmUq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2Ap2spAWARAOUM0Tjg5ZNvXg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gracias a esta parada, podemos ir viendo la información que se ha ido almacenando en las constantes, variables anteriores y demás.&lt;/p&gt;

&lt;p&gt;Lo que nos interesa en este momento es ver todos los nodos que tenemos dentro de la constantes “rankingTable”. Poniendo el cursor veremos que tenemos hasta un total de 100, que casualmente son los ciclistas que aparecen en la clasificación. Vamos paso a paso correctamente.&lt;/p&gt;
&lt;h3&gt;
  
  
  7.- Seleccionar los datos por ciclista deseados
&lt;/h3&gt;

&lt;p&gt;Ahora que ya tenemos dentro de la constante los nodos con la información de los ciclistas, lo que tenemos que hacer es recorrerlos uno por uno y para hacer esto debemos de usar la función &lt;strong&gt;“each”&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vamos a implemenarla y dentro vamos a mostrar el log en formato texto con todo el contenido de las 7 columnas que tenemos por fila.&lt;/p&gt;

&lt;p&gt;Ejecutamos modo &lt;strong&gt;debugger (F5)&lt;/strong&gt; y podemos ver como nos aparece la información de los ciclistas, fila a fila en la consola:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U4nairAy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AELIUy7H1-JzRpwCDTLZ5CQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U4nairAy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AELIUy7H1-JzRpwCDTLZ5CQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
Resultado recorriendo todos los nodos que hemos encontrado con la información de los ciclistas



&lt;p&gt;Ahora lo que nos queda es extraer los valores que queremos individualmente y almacenarlo en un objeto para añadirlos en un array y tener toda la información a mano para poder guardarla en un fichero CSV, que será el último paso que haremos.&lt;/p&gt;

&lt;p&gt;Para seleccionar los elementos, en este caso, &lt;strong&gt;dentro del nodo tenemos 7 nodos hijos&lt;/strong&gt; como podemos ver en esta imagen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iqIt07uE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AHxXSO26F-jN9_SQTWUr1hQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iqIt07uE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AHxXSO26F-jN9_SQTWUr1hQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La información que tendremos en cada uno, será la siguiente. Así sabremos que tenemos que usar y que posición de los hijos tenemos que seleccionar.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Ranking Actual.&lt;/li&gt;
&lt;li&gt; Ranking Previo a la actualización.&lt;/li&gt;
&lt;li&gt; Diferencia de puestos entre ranking actual / anterior.&lt;/li&gt;
&lt;li&gt; Ciclista.&lt;/li&gt;
&lt;li&gt; Equipo.&lt;/li&gt;
&lt;li&gt; Puntos totales&lt;/li&gt;
&lt;li&gt; No hay nada de información.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Como hemos mencionado anteriormente, lo que queremos extraer es el ranking actual (1), información del ciclista (4) como es el nombre y enlace a su información más detallada, equipo (5) y puntos totales (6).&lt;/p&gt;

&lt;p&gt;Para hacer esto, como queremos seleccionar los hijos del elemento con el que estamos trabajando, vamos a usar el selector &lt;strong&gt;“nth-child(posicion)”&lt;/strong&gt; para seleccionar el que queremos utilizar y lo vamos a hacer refiriéndonos al elemento &lt;strong&gt;“td”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quedará de la siguiente manera:&lt;/p&gt;

&lt;p&gt;Si ejecutamos, ya tendremos la información “limpia” con lo que queremos únicamente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YaLHtZi---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AZyDAHWB4vbvnKdPbt6kuyA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YaLHtZi---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AZyDAHWB4vbvnKdPbt6kuyA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  8.- Almacenar en una lista de objetos
&lt;/h3&gt;

&lt;p&gt;Ahora que ya tenemos los datos que queremos guardar, tenemos que almacenarlo en una lista de objetos para que al final de este artículo podamos crear un fichero CSV con esa información y tengamos un backup de lo que hemos descargado, para hacer uso de esa información.&lt;/p&gt;

&lt;p&gt;Añadimos un array al inicio del script y dentro del each almacenamos como objeto dentro de esa lista añadiendo las propiedades necesarias.&lt;/p&gt;

&lt;p&gt;Como veís, ya tenemos todo almacenado en una lista con los items del ranking.&lt;/p&gt;

&lt;p&gt;Si ejecutamos el modo debugger y ponemos el cursor encima de rankingItems dentro del each de la tabla del ranking, podremos ver que tiene 100 elementos, que es la cantidad de ciclistas que aparecen en el ranking.&lt;/p&gt;
&lt;h3&gt;
  
  
  9.- Guardar la información en un fichero CSV
&lt;/h3&gt;

&lt;p&gt;Ahora que ya tenemos toda la información deseada, lo único que nos queda es hacer una copia para no tener que andar descargando una y otra vez la información.&lt;/p&gt;

&lt;p&gt;Creamos una función y guardamos en el disco lo que hemos almacenado en el array.&lt;/p&gt;

&lt;p&gt;El resultado que tendremos en el fichero CSV será el siguiente:&lt;/p&gt;

&lt;p&gt;El resultado lo encontraremos en el siguiente repositorio:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gitlab.com/mugan86/scapping-uci-pro-tour-riders-ranking"&gt;&lt;strong&gt;Anartz Mugika Ledo / scapping-uci-pro-tour-riders-ranking&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
_Ejemplo de Scrapping de la tabla de clasificación del ranking actual. Artículo escrito en Medium:_gitlab.com&lt;/a&gt;&lt;a href="https://gitlab.com/mugan86/scapping-uci-pro-tour-riders-ranking"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By &lt;a href="https://medium.com/@mugan86"&gt;Anartz Mugika Ledo🤗&lt;/a&gt; on &lt;a href="https://medium.com/p/2af68dcaf1f2"&gt;&lt;time class="dt-published"&gt;November 3, 2019&lt;/time&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@mugan86/web-scrapping-con-nodejs-2af68dcaf1f2"&gt;Canonical link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Exported from &lt;a href="https://medium.com"&gt;Medium&lt;/a&gt; on August 18, 2020.&lt;/p&gt;

</description>
      <category>node</category>
      <category>scrapping</category>
      <category>scrappingweb</category>
    </item>
    <item>
      <title>Trabajando con Lazy Loading en Angular 8, 9, 10</title>
      <dc:creator>Anartz Mugika Ledo</dc:creator>
      <pubDate>Tue, 18 Aug 2020 16:44:40 +0000</pubDate>
      <link>https://forem.com/mugan86/trabajando-con-lazy-loading-en-angular-8-9-10-2cf7</link>
      <guid>https://forem.com/mugan86/trabajando-con-lazy-loading-en-angular-8-9-10-2cf7</guid>
      <description>&lt;p&gt;En este artículo os voy a hablar de Lazy Loading, técnica que sirve para la mejora del rendimiento y velocidad de las aplicaciones Angular y que se implementará a partir de la versión 8, haciendo uso de la importación del módulo en vez de traer la referencia en un string. Este cambio, hay que hacerlo si o si en la versión 9 que salió a la luz a principios de febrero del 2020.&lt;/p&gt;

&lt;p&gt;Por esa razón, os voy a enseñar a trabajar aplicando la técnica Lazy Loading en Angular que nos va a ayudar a mejorar el rendimiento de nuestras aplicaciones y en consecuencia, conseguiremos que el usuario final tenga una experiencia de navegación más agradable y satisfactoria&lt;/p&gt;
&lt;h3&gt;
  
  
  1.- ¿Qué pasa cuando una aplicación de Angular inicia?
&lt;/h3&gt;

&lt;p&gt;Por defecto, nuestras aplicaciones de Angular cargan todos los componentes que están importados en nuestro módulo principal &lt;code&gt;app.module.ts&lt;/code&gt; y dependiendo de los módulos que contenga puede ser que tarde más o menos en cargar nuestra aplicación.&lt;/p&gt;

&lt;p&gt;Para resolver ese problema en el que a veces cargamos módulos que igual no utilizaremos en ningún momento, aplicaremos lo que es Lazy Loading.&lt;/p&gt;
&lt;h3&gt;
  
  
  2.- ¿Qué es Lazy Loading?
&lt;/h3&gt;

&lt;p&gt;Según lo que encontramos en &lt;a href="https://es.wikipedia.org/wiki/Lazy_loading"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;gt; La &lt;strong&gt;carga diferida&lt;/strong&gt; (en inglés &lt;strong&gt;&lt;em&gt;lazy loading&lt;/em&gt;&lt;/strong&gt;), es un &lt;a href="https://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o"&gt;patrón de diseño&lt;/a&gt; comúnmente usado en la programación informática que consiste en retrasar la carga o inicialización de un objeto hasta el mismo momento de su utilización. Esto contribuye a la eficiencia de los programas, evitando la precarga de objetos que podrían no llegar a utilizarse. El opuesto de la carga diferida es la carga previa, precarga o &lt;em&gt;eager loading&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Esta técnica usada en Angular&lt;/strong&gt; nos permite cargar sólo, el o los componentes que necesitemos al inicio de nuestra aplicación, estos componentes no cargan cada vez que entres, sino que solo cargan una sola vez.&lt;/p&gt;

&lt;p&gt;Cuando usamos Lazy Loading hacemos llamado de un módulo mediante el sistema de rutas de Angular y este módulo a su vez tiene rutas hijas que se encargan de cargar el componente solicitado por el usuario, más adelante entenderemos esto mejor.&lt;/p&gt;
&lt;h3&gt;
  
  
  3.- Comenzando con el proyecto
&lt;/h3&gt;

&lt;p&gt;Vamos a crear el proyecto&lt;/p&gt;
&lt;h4&gt;
  
  
  3.1.- Crear proyecto Angular
&lt;/h4&gt;

&lt;pre id="3ae5" class="graf graf--pre graf-after--h4"&gt;ng new angular-lazy-loading --routing --style=css &amp;amp;&amp;amp; cd angular-lazy-loading&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;--routing&lt;/code&gt;: Para que nos genere un módulo de ruta listo para funcionar&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--style=css&lt;/code&gt;: Para que nos añada las hojas de estilos CSS&lt;/p&gt;

&lt;p&gt;Ahora que ya tenemos nuestro proyecto creado, el siguiente paso que vamos hacer es generar 3 componentes.&lt;/p&gt;
&lt;h4&gt;
  
  
  3.2.- Crear los componentes / módulos para el proyecto
&lt;/h4&gt;

&lt;p&gt;Vamos a crear los componentes llamados &lt;strong&gt;home&lt;/strong&gt;, &lt;strong&gt;about, contact&lt;/strong&gt; con sus módulos que se encargarán de gestionar la carga de la información mediante la gestión de sus rutas hijas&lt;/p&gt;
&lt;h4&gt;
  
  
  3.2.1.- Creación de los módulos
&lt;/h4&gt;

&lt;pre id="a62f" class="graf graf--pre graf-after--h4"&gt;ng g m @pages/home --routing  
ng g m @pages/about --routing  
ng g m @pages/contact --routing&lt;/pre&gt;

&lt;p&gt;El resultado será el siguiente donde podremos ver que se han creado dos ficheros por carpeta:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7uywrffU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AHy-zdBqljAaHeL0gVpeyjA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7uywrffU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AHy-zdBqljAaHeL0gVpeyjA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uno de ellos es el módulo principal donde vamos a cargar los componentes, módulos que necesitemos y el modulo de enrutamiento.&lt;/p&gt;

&lt;p&gt;El otro fichero es el que corresponde al módulo de enrutamiento donde vamos a cargar el componente con una ruta hija.&lt;/p&gt;
&lt;h4&gt;
  
  
  3.2.2.- Creación de los componentes
&lt;/h4&gt;

&lt;pre id="ef9c" class="graf graf--pre graf-after--h4"&gt;ng g c @pages/home --skipTests=true  
ng g c @pages/about --skipTests=true  
ng g c @pages/contact --skipTests=true&lt;/pre&gt;

&lt;p&gt;&amp;gt; La opción &lt;strong&gt;--skipTests=true&lt;/strong&gt; corresponde a la exclusión de los ficheros de los tests que no vamos a necesitar en este caso.&lt;/p&gt;

&lt;p&gt;Estos serían los ficheros que compondrían una página que se va a cargar mediante Lazy Loading. En este caso os muestro el que corresponde a “about”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cw37TSss--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AaqGBN0UfJjreUwAUHvauQQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cw37TSss--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AaqGBN0UfJjreUwAUHvauQQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  4.- Añadir rutas hijas en los módulos para las páginas
&lt;/h3&gt;

&lt;p&gt;Ahora vamos a trabajar sobre el módulo &lt;strong&gt;about-routing.module.ts.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dentro de este archivo creamos la ruta hija que servirá para cargar el componente &lt;strong&gt;about.component.ts&lt;/strong&gt; desde el módulo &lt;strong&gt;about.module.ts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Primero importamos los componentes que van a depender de ese módulo, creamos las rutas y luego dentro de &lt;strong&gt;imports&lt;/strong&gt; hacemos uso de &lt;strong&gt;forChild&lt;/strong&gt; para especificar que ese módulo va a servir rutas hijas.&lt;/p&gt;

&lt;p&gt;En el fichero &lt;strong&gt;about.module.ts&lt;/strong&gt; ya tenemos importado el AboutRoutingModule&lt;/p&gt;

&lt;p&gt;Hacemos los mismo pero con las páginas &lt;strong&gt;home&lt;/strong&gt; y &lt;strong&gt;contact&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;home-routing.module.ts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;contact-routing.module.ts&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  5.- Configurando el fichero principal de rutas
&lt;/h3&gt;

&lt;p&gt;Ahora vamos a nuestro módulo de rutas principales &lt;strong&gt;app-routing.module.ts&lt;/strong&gt; que quedará de la siguiente manera:&lt;/p&gt;

&lt;p&gt;Dentro de nuestra variable &lt;strong&gt;routes&lt;/strong&gt; vamos almacenar todas las rutas principales de nuestra aplicación.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Ruta &lt;strong&gt;home&lt;/strong&gt;, aquí le decimos a Angular, cuando la ruta sea igual a &lt;strong&gt;home&lt;/strong&gt; carga el &lt;strong&gt;hijo haciendo referencia al HomeModule. Si os fijáis aquí ya está aplicando el Lazy Loading.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt; Ruta &lt;strong&gt;about&lt;/strong&gt; y &lt;strong&gt;contact&lt;/strong&gt;, hacemos lo mismo pero haciendo las referencias a los módulos que les corresponden.&lt;/li&gt;
&lt;li&gt; La última ruta le dice a Angular, cuando no especifique una url, llévame a la ruta &lt;strong&gt;home&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El último paso es visualizar la información navegando entre diferentes páginas&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;6.- Comprobar rutas y visualizar las páginas&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Accedemos al fichero app.component.html y borramos todo el contenido para añadir el siguiente:&lt;/p&gt;

&lt;p&gt;Dejamos tres enlaces para navegar entre las diferentes páginas y el elemento &lt;strong&gt;“router-outlet”&lt;/strong&gt; para cargar esas páginas.&lt;/p&gt;

&lt;p&gt;&amp;gt; Para notar el cambio abrimos la consola del navegador y vamos a la pestaña “Red” (es necesario reiniciar la página para poder capturar los archivos en esta pestaña).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FqfHkaDF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2Ari5WhjEvf7JN1H1OC4Ki3A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FqfHkaDF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2Ari5WhjEvf7JN1H1OC4Ki3A.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora vamos hacer click a nuestro enlace para ir a la página &lt;strong&gt;“about”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--os2zwzBT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AtxPxAfBXwkvM-ifi-gkfsA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--os2zwzBT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AtxPxAfBXwkvM-ifi-gkfsA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y lo mismo con la página &lt;strong&gt;“contact”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cRQwNgj5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AtDpOyZ-MPpMKCMgS4bMpTw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cRQwNgj5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AtDpOyZ-MPpMKCMgS4bMpTw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si volvemos a cargar cualquiera de las páginas, ya no se cargarán los ficheros porque ya los tendremos cargados con la ejecución inicial de cada uno.&lt;/p&gt;
&lt;h3&gt;
  
  
  7.- Resultado del código
&lt;/h3&gt;

&lt;p&gt;Este es el resultado de lo trabajado en este artículo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gitlab.com/mugan86/lazy-loading-angular"&gt;&lt;strong&gt;Anartz Mugika Ledo / lazy-loading-angular&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
_Ejemplo de Lazy Loading Sencillo_gitlab.com&lt;/a&gt;&lt;a href="https://gitlab.com/mugan86/lazy-loading-angular"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;8.- Cursos&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;En relación con este artículo, os cuento que dispongo de varios cursos en Udemy a precios ecónocimicos en los que podéis aprender muchas cosas. Los cursos que dispongo actualmente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  NPM.Desarrollo y publicación de librerias en JS, TS, Angular (PAGO)&lt;/li&gt;
&lt;li&gt;  GraphQL con Angular de 0 a Experto. JWT, Sockets, MongoDB (PAGO)&lt;/li&gt;
&lt;li&gt;  Compodoc: Crea documentación en proyectos Angular/Ionic/TS (GRATIS)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Todos los cursos al mejor precio &lt;a href="https://anartz-mugika.com/#/courses"&gt;SIEMPRE en mi web&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@mugan86/trabajando-con-lazy-loading-en-angular-8-e1611ce2c46f"&gt;Canonical link&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular8</category>
      <category>angular9</category>
      <category>angular10</category>
      <category>lazyloading</category>
    </item>
    <item>
      <title>Modularizar los ficheros GraphQL para la definición de tipos (versión 2020)</title>
      <dc:creator>Anartz Mugika Ledo</dc:creator>
      <pubDate>Tue, 18 Aug 2020 12:18:52 +0000</pubDate>
      <link>https://forem.com/mugan86/modularizar-los-ficheros-graphql-para-la-definicion-de-tipos-version-2020-5bdp</link>
      <guid>https://forem.com/mugan86/modularizar-los-ficheros-graphql-para-la-definicion-de-tipos-version-2020-5bdp</guid>
      <description>&lt;p id="ed32" class="graf graf--p graf-after--h3"&gt;En GraphQL, como en otros tipos de implementaciones, hay momentos en el que vamos implementando más código para las nuevas funcionalidades, “causando” de manera inconsciente un pequeño “caos”, que si no le damos remedio lo antes posible, puede que se nos vaya de la manos.&lt;/p&gt;
&lt;p id="4122" class="graf graf--p graf-after--p"&gt;Para mejorar este aspecto, siempre podemos modularizar nuestros ficheros haciendo que el proyecto sea más controlable y menos cáotico aunque siga funcionando igual.&lt;/p&gt;
&lt;p id="13d1" class="graf graf--p graf-after--p"&gt;En este caso, lo que vamos a aprender es a modularizar los ficheros con extensión &lt;strong class="markup--strong markup--p-strong"&gt;graphql &lt;/strong&gt;(*.graphql) que usamos para poder definir los tipos de definiciones en una &lt;a href="https://www.udemy.com/course/graphql-angular-de-0-a-experto-jwt-socket-mongodb-heroku-anartz-mugika/?couponCode=MEDIUM_ANARTZ" class="markup--anchor markup--p-anchor" rel="noopener"&gt;API de GraphQL&lt;/a&gt;.&lt;/p&gt;
&lt;p id="9323" class="graf graf--p graf-after--p"&gt;Con esto lo que vamos a conseguir es tener el &lt;strong class="markup--strong markup--p-strong"&gt;proyecto más limpio, más accesible a la hora de trabajar y más elegante&lt;/strong&gt;, ya que &lt;strong class="markup--strong markup--p-strong"&gt;no vamos a tener cientos de líneas en un solo fichero, tendremos menos código por fichero y más ficheros pero mejor distribuidos&lt;/strong&gt;.&lt;/p&gt;
&lt;p id="59e1" class="graf graf--p graf-after--p graf--trailing"&gt;Para empezar, lo primero que &lt;strong class="markup--strong markup--p-strong"&gt;necesitamos es tener un proyecto de GraphQL&lt;/strong&gt; creado y listo para trabajar.&lt;/p&gt;

&lt;p id="f340" class="graf graf--p graf--leading"&gt;Para crear el proyecto más rápido y con la estructura que me parece la más correcta y cómoda para trabajar, necesitamos instalar de manera global el CLI generador de proyectos de GraphQL.&lt;/p&gt;
&lt;p id="9e2b" class="graf graf--p graf-after--p"&gt;Añadimos &lt;strong class="markup--strong markup--p-strong"&gt;sudo&lt;/strong&gt; por delante del comando &lt;strong class="markup--strong markup--p-strong"&gt;“npm install…”&lt;/strong&gt; en el caso de que estemos trabajando con alguna distribución de Linux o el sistema operativo MacOS.&lt;/p&gt;
&lt;p id="0b6f" class="graf graf--p graf-after--p"&gt;&lt;code class="markup--code markup--p-code"&gt;npm install -g mugan86/graphql-project-cli&lt;/code&gt;&lt;/p&gt;
&lt;p id="0bd5" class="graf graf--p graf-after--p"&gt;Una vez instalado el &lt;a href="https://github.com/mugan86/graphql-project-cli" class="markup--anchor markup--p-anchor" rel="noopener"&gt;CLI de generador de proyectos de GraphQL&lt;/a&gt; en nuestro equipo, mediante el terminal nos ubicamos en el directorio donde vamos a querer crear el proyecto y ejecutamos el siguiente comando:&lt;/p&gt;
&lt;p id="5bdf" class="graf graf--p graf-after--figure"&gt;Seleccionamos el primer proyecto &lt;strong class="markup--strong markup--p-strong"&gt;“graphql-hello-world” &lt;/strong&gt;que será un proyecto muy sencillo con lo básico para empezar a trabajar en un proyecto de una API de GraphQL. Simplemente encontramos definidas tres queries que nos devuelven un mensaje de tipo string, nada destacable.&lt;/p&gt;
&lt;p id="3513" class="graf graf--p graf-after--figure"&gt;Una vez seleccionemos el tipo de proyecto, tenemos que ir contestando las preguntas que se nos hacen para añadir las configuraciones en el proyecto. Entre las cuales tenemos las siguientes:&lt;/p&gt;
&lt;ul class="postList"&gt;
&lt;li id="c5b3" class="graf graf--li graf-after--p"&gt;Nombre del proyecto: El nombre que le daremos al proyecto. &lt;strong class="markup--strong markup--li-strong"&gt;No puede contener mayúsculas ni empezar con un punto o guión bajo. El largo máximo del nombre es 214 caracteres&lt;/strong&gt;.&lt;/li&gt;
&lt;li id="cb7a" class="graf graf--li graf-after--li"&gt;Usuario de github.&lt;/li&gt;
&lt;li id="ccd7" class="graf graf--li graf-after--li"&gt;Nombre y apellidos.&lt;/li&gt;
&lt;li id="249a" class="graf graf--li graf-after--li"&gt;Correo electrónico.&lt;/li&gt;
&lt;/ul&gt;
Asistente para crear nuestro proyecto mediante el CLI Generador de Proyectos GraphQL
&lt;p id="7305" class="graf graf--p graf-after--figure"&gt;Con esto conseguiremos tener &lt;strong class="markup--strong markup--p-strong"&gt;añadida esa información de manera personalizada dentro del package.json&lt;/strong&gt; del proyecto que estamos generando con el &lt;a href="https://github.com/mugan86/graphql-project-cli" class="markup--anchor markup--p-anchor" rel="noopener"&gt;CLI generador de proyectos de GraphQL&lt;/a&gt;.&lt;/p&gt;
Proceso de la creación de los ficheros del proyecto e instalación de las dependencias

&lt;p id="88a6" class="graf graf--p graf--leading"&gt;Una vez que ya tengamos el proyecto creado, tenemos esta estructura:&lt;/p&gt;
&lt;img class="graf-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--NPaLSujR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2A5d3NqyxWDwQEU3L3jox79w.png"&gt;Estructura general del proyecto creado con el generador&lt;p id="4621" class="graf graf--p graf-after--figure"&gt;Vamos a poner el proyecto en marcha y para trabajar en desarrollo tenemos que ejecutar el siguiente comando:&lt;/p&gt;
&lt;p id="155a" class="graf graf--p graf-after--p"&gt;&lt;code class="markup--code markup--p-code"&gt;npm run start:dev&lt;/code&gt;&lt;/p&gt;
&lt;p id="6434" class="graf graf--p graf-after--p"&gt;Si todo va bien, nos debería de aparecer un mensaje en el terminal como el que véis a continuación:&lt;/p&gt;
&lt;img class="graf-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--HVo-YgY7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2A-IRzrL-Jqns7kPrazHGdUQ.png"&gt;Api de GraphQL en marcha
&lt;p id="e4b0" class="graf graf--p graf--leading"&gt;Ahora que ya tenemos en marcha la API vamos a &lt;strong class="markup--strong markup--p-strong"&gt;src/schema/schema.graphql&lt;/strong&gt;&lt;/p&gt;
&lt;p id="2e9e" class="graf graf--p graf-after--p"&gt;Una vez que estemos en el fichero, &lt;strong class="markup--strong markup--p-strong"&gt;vamos a añadir el tipo de objeto “Usuario” y una query para obtener la lista de todos los usuarios&lt;/strong&gt;. Tendremos algo como lo que podéis ver a continuación:&lt;/p&gt;
&lt;p id="48b1" class="graf graf--p graf-after--figure"&gt;Ahora que ya hemos definido la query &lt;strong class="markup--strong markup--p-strong"&gt;“usuarios”&lt;/strong&gt;, tenemos que resolverla en el fichero &lt;strong class="markup--strong markup--p-strong"&gt;“query.ts”&lt;/strong&gt; dentro del directorio &lt;strong class="markup--strong markup--p-strong"&gt;“resolvers”. Accedemos al fichero y damos solución a la definición.&lt;/strong&gt;&lt;/p&gt;
&lt;p id="4688" class="graf graf--p graf-after--figure"&gt;Accedemos al playground de la API mediante la url: &lt;a href="http://localhost:5000/graphql" class="markup--anchor markup--p-anchor"&gt;http://localhost:5000/graphql&lt;/a&gt; y escribimos la operación para &lt;strong class="markup--strong markup--p-strong"&gt;obtener la lista de usuarios&lt;/strong&gt; y le damos al botón de Play, obteniendo la siguiente información.&lt;/p&gt;
&lt;img class="graf-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--hb4W7XrJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AIbrVCPLudyYXko3nG3LlHg.png"&gt;Lista de usuarios después de ejecutar la operación
&lt;p id="777f" class="graf graf--p graf--leading"&gt;Ahora que ya hemos conseguido que funcione correctamente&lt;strong class="markup--strong markup--p-strong"&gt; vamos a separar la definición del tipo de objeto a otro fichero para poder ir modularizándolo y así podremos evitar tener todos los tipos de definiciones que tendrá nuestra API en un fichero.&lt;/strong&gt;&lt;/p&gt;
&lt;p id="5e01" class="graf graf--p graf-after--p"&gt;Vamos a &lt;strong class="markup--strong markup--p-strong"&gt;src/schema&lt;/strong&gt; y dentro vamos a&lt;strong class="markup--strong markup--p-strong"&gt; crear un directorio llamado “objects” y dentro&lt;/strong&gt; de este nuevo directorio &lt;strong class="markup--strong markup--p-strong"&gt;creamos un fichero llamado “user.graphql”&lt;/strong&gt; donde vamos a añadir el tipo de objeto del usuario &lt;strong class="markup--strong markup--p-strong"&gt;quitándolo del fichero schema.graphql.&lt;/strong&gt;&lt;/p&gt;
&lt;img class="graf-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--SCub2Mgk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AbdBmzNXJKik9W3FOqDmnTg.png"&gt;Tipo de objeto del usuario en el nuevo fichero&lt;p id="1399" class="graf graf--p graf-after--figure"&gt;Guardamos y si nos fijamos en el terminal ¡¡TENEMOS UN ERROR!! El error en resumen es el siguiente: &lt;strong class="markup--strong markup--p-strong"&gt;Error: Unknown type “Usuario”&lt;/strong&gt;&lt;/p&gt;
&lt;p id="7483" class="graf graf--p graf-after--p graf--trailing"&gt;&lt;strong class="markup--strong markup--p-strong"&gt;Esto quiere decir que no encuentra el tipo de objeto de “Usuario”&lt;/strong&gt;, por lo que para poder añadirlo en el ejecutable del schema que realizamos dentro d&lt;strong class="markup--strong markup--p-strong"&gt;el fichero schema.ts en el directorio schema&lt;/strong&gt; junto con los resolvers tenemos que añadirlo de alguna manera.&lt;/p&gt;

&lt;p id="c6ce" class="graf graf--p graf--leading"&gt;&lt;strong class="markup--strong markup--p-strong"&gt;Para hacer la mezcla de todos los ficheros con extensión *.graphql&lt;/strong&gt;, tenemos que seguir los siguientes pasos:&lt;/p&gt;
&lt;ol class="postList"&gt;
&lt;li id="72ab" class="graf graf--li graf-after--p"&gt;Accedemos a los paquetes de NPM llamados&lt;/li&gt;
&lt;li id="14fa" class="graf graf--li graf-after--li"&gt;Dentro de la información tenemos el comando para instalar dicho paquete, ejecutamos la instalación:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id="645e" class="graf graf--pre graf-after--li"&gt;npm install @graphql-tools/load-files@6.0.3 @graphql-tools/merge@6.0.3&lt;/pre&gt;
&lt;p id="f03b" class="graf graf--p graf-after--pre"&gt;3. Siguiendo con las instrucciones, nos ubicamos en este &lt;a href="https://www.graphql-tools.com/docs/merge-typedefs#import-everything-from-a-specified-folder" class="markup--anchor markup--p-anchor" rel="noopener"&gt;punto&lt;/a&gt; y seguimos las instrucciones.&lt;/p&gt;
&lt;p id="b16b" class="graf graf--p graf-after--p"&gt;4. Accedemos al fichero schema.ts dentro de la carpeta schema (&lt;strong class="markup--strong markup--p-strong"&gt;src/schema/schema.ts&lt;/strong&gt;) y añadimos&lt;/p&gt;
&lt;pre id="6b0e" class="graf graf--pre graf-after--p"&gt;import { mergeTypeDefs } from '@graphql-tools/merge';&lt;/pre&gt;
&lt;pre id="0b0e" class="graf graf--pre graf-after--pre"&gt;import { loadFilesSync } from '@graphql-tools/load-files';&lt;/pre&gt;
&lt;pre id="e67c" class="graf graf--pre graf-after--pre"&gt;const typeDefs = mergeTypeDefs(loadFilesSync(`${__dirname}/**/*.graphql`));&lt;/pre&gt;
&lt;pre id="43a7" class="graf graf--pre graf-after--pre"&gt;// Y quitamos&lt;br&gt;import typeDefs from './schema.graphql';&lt;/pre&gt;
&lt;p id="a07f" class="graf graf--p graf-after--pre"&gt;Analizamos la línea:&lt;/p&gt;
&lt;pre id="98b1" class="graf graf--pre graf-after--p"&gt;const typeDefs = mergeTypeDefs(loadFilesSync(`${__dirname}/**/*.graphql`));&lt;/pre&gt;
&lt;ul class="postList"&gt;
&lt;li id="9a63" class="graf graf--li graf-after--pre"&gt;
&lt;strong class="markup--strong markup--li-strong"&gt;mergeTypesDefs&lt;/strong&gt;: Esto lo usamos para mezclar todos los ficheros de extensión graphql que cargamos en el path que especificamos.&lt;/li&gt;
&lt;li id="707f" class="graf graf--li graf-after--li"&gt;
&lt;strong class="markup--strong markup--li-strong"&gt;loadesFileSync&lt;/strong&gt;: Para cargar todos los ficheros en la ubicación definida y la extensión.&lt;/li&gt;
&lt;li id="fbbb" class="graf graf--li graf-after--li"&gt;
&lt;strong class="markup--strong markup--li-strong"&gt;`${__dirname}/**/*.graphql`&lt;/strong&gt;: Para buscar los ficheros con extensión graphql que están en el directorio que estamos trabajando.&lt;/li&gt;
&lt;/ul&gt;
&lt;p id="e618" class="graf graf--p graf-after--li"&gt;5. Quedará de la siguiente manera:&lt;/p&gt;
Carga de los ficheros con los nuevos paquetes

&lt;p id="1bb8" class="graf graf--p graf--leading"&gt;Una vez que ya hemos seguido los pasos para mezclar todos los ficheros con la extensión graphql, guardamos y comprobamos que no tenemos el error que nos aparecía anteriormente sobre el tipo desconocido con &lt;strong class="markup--strong markup--p-strong"&gt;“Usuario”&lt;/strong&gt;&lt;/p&gt;
&lt;img class="graf-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--hyFScnK_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AJV5OQYYNI_XAM0i2rFrW3w.png"&gt;El terminal con la API en marcha, sin errores&lt;p id="4d68" class="graf graf--p graf-after--figure"&gt;Como véis, no hay ningún error y en teoría está añadiendo el tipo de objeto &lt;strong class="markup--strong markup--p-strong"&gt;“Usuario” &lt;/strong&gt;como un tipo de definición junto con el tipo de raíz Query.&lt;/p&gt;
&lt;p id="7019" class="graf graf--p graf-after--p"&gt;Vamos al playground y ejecutamos de nuevo la operación para obtener todos los usuarios.&lt;/p&gt;
&lt;img class="graf-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--xwMJBcos--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2A5OOC7X8diLt9mTRCGdpzKA.png"&gt;Resultado de la ejecución para obtener la lista de usuarios.&lt;p id="e018" class="graf graf--p graf-after--figure"&gt;El resultado como se puede apreciar es satisfactorio. &lt;strong class="markup--strong markup--p-strong"&gt;Hemos conseguido que funcione la API de la misma manera pero aplicando una modularización para tener mejor distribuidas nuestras definiciones de los tipos y así evitar que un fichero se vuelva incontrolable a medida que crece la API&lt;/strong&gt;.&lt;/p&gt;
&lt;p id="9783" class="graf graf--p graf-after--p"&gt;Os dejo el enlace al respositorio con lo trabajado y un poco más: &lt;a href="https://github.com/graphql-course/2-academia-online/tree/modularize-schema-new" class="markup--anchor markup--p-anchor" rel="noopener"&gt;https://github.com/graphql-course/modularize-graphql-schema&lt;/a&gt;&lt;/p&gt;
&lt;p id="3ab7" class="graf graf--p graf-after--p graf--trailing"&gt;Con esto finalizo este tutorial y si tenéis preferencia sobre algún tema podéis hacer propuestas mediante Twitter, Facebook, Udemy,…&lt;/p&gt;

&lt;p id="1d07" class="graf graf--p graf--leading"&gt;Toda la información para que podáis contactarme la tenéis a continuación:&lt;/p&gt;
&lt;a href="https://anartz-mugika.com/" class="markup--anchor markup--mixtapeEmbed-anchor" title="https://anartz-mugika.com/"&gt;&lt;strong class="markup--strong markup--mixtapeEmbed-strong"&gt;Anartz Mugika Ledo — Desarrollador Web / Móvil e Instructor On Line&lt;/strong&gt;&lt;br&gt;&lt;em class="markup--em markup--mixtapeEmbed-em"&gt;Página persona de Anartz Mugika donde se podrá encontrar contenido relacionado al desarrollo. Encontraremos artículo…&lt;/em&gt;anartz-mugika.com&lt;/a&gt;&lt;a href="https://anartz-mugika.com/" class="js-mixtapeImage mixtapeImage mixtapeImage--empty u-ignoreBlock"&gt;&lt;/a&gt;&lt;p id="ac8c" class="graf graf--p graf-after--mixtapeEmbed"&gt;En relación con este artículo, he utilizado los conocimientos adquiridos en estos cursos que los podéis adquirir al precio más bajo siempre desde los enlaces que os proporciono.&lt;/p&gt;
&lt;ul class="postList"&gt;
&lt;li id="8363" class="graf graf--li graf-after--p"&gt;Crear el Generador de Proyectos GraphQL mediante el CLI: &lt;a href="https://cursos.anartz-mugika.com/librerias-js-ts-angular-npm" class="markup--anchor markup--li-anchor" rel="noopener"&gt;NPM.Desarrollo y publicación de librerias en JS, TS, Angular&lt;/a&gt;
&lt;/li&gt;
&lt;li id="0e54" class="graf graf--li graf-after--li"&gt;Desarrollo de APIs en GraphQL: &lt;a href="https://cursos.anartz-mugika.com/graphql-de-0-a-deploy" class="markup--anchor markup--li-anchor" rel="noopener"&gt;GraphQL con Angular de 0 a Experto. JWT, Sockets, MongoDB&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p id="4f43" class="graf graf--p graf-after--li graf--trailing"&gt;Todos los cursos al mejor precio &lt;a href="https://anartz-mugika.com/#/courses" class="markup--anchor markup--p-anchor" rel="noopener"&gt;SIEMPRE en mi web&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;By &lt;a href="https://medium.com/@mugan86" class="p-author h-card"&gt;Anartz Mugika Ledo🤗&lt;/a&gt; on &lt;a href="https://medium.com/p/7ec25705f3"&gt;&lt;time class="dt-published"&gt;May 28, 2020&lt;/time&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://medium.com/@mugan86/modularizar-los-ficheros-graphql-para-la-definici%C3%B3n-de-tipos-versi%C3%B3n-2020-7ec25705f3" class="p-canonical"&gt;Canonical link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Exported from &lt;a href="https://medium.com"&gt;Medium&lt;/a&gt; on August 18, 2020.&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>schema</category>
    </item>
    <item>
      <title>Aplicar CI / CD desarrollando un paquete NPM</title>
      <dc:creator>Anartz Mugika Ledo</dc:creator>
      <pubDate>Tue, 18 Aug 2020 06:01:36 +0000</pubDate>
      <link>https://forem.com/mugan86/aplicar-ci-cd-desarrollando-un-paquete-npm-3fnb</link>
      <guid>https://forem.com/mugan86/aplicar-ci-cd-desarrollando-un-paquete-npm-3fnb</guid>
      <description>&lt;h1&gt;
  
  
  Aplicar CI / CD desarrollando un paquete NPM
&lt;/h1&gt;

&lt;p&gt;Pasos que seguiremos para publicar un paquete NPM aplicando los principios de Integración Contínua (CI) y Despliegue Contínuo (CD)&lt;/p&gt;


&lt;h3&gt;
  
  
  Aplicar CI / CD desarrollando un paquete NPM
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Pasos que seguiremos para publicar un paquete NPM aplicando los principios de Integración Contínua (CI) y Despliegue Contínuo (CD)
&lt;/h4&gt;
&lt;h4&gt;
  
  
  0.- Introducción
&lt;/h4&gt;

&lt;p&gt;Vamos a comenzar un artículo en el que vamos a aprender a trabajar con unas prácticas y principios que nos van a hacer nuestro trabajo diario mucho más sencillo.&lt;/p&gt;

&lt;p&gt;En este caso, os voy a enseñar como trabajar con los principios y prácticas de CI y CD.&lt;/p&gt;

&lt;p&gt;Llegados a este punto, quizás nunca habéis escuchado ni leido nada sobre las siglas CI y CD (aunque espero que después de este artículo tengáis una idea más clara), por lo que os estaréis preguntando “¿y este de qué nos está hablando? ¡¡Queremos respuestas!!”&lt;/p&gt;

&lt;p&gt;Como el objetivo del artículo es enseñaros como funcionan estos principios y prácticas, lo ideal es empezar hablando sobre que es cada uno de ellos y para que sirven.&lt;/p&gt;
&lt;h4&gt;
  
  
  1.- CI/CD: integración continua y despliegue continuo al detalle
&lt;/h4&gt;

&lt;p&gt;La integración y la entrega continua (CI y CD, respectivamente) son unos principios y prácticas que permiten a los desarrolladores de aplicaciones entregar cambios de código de manera más frecuente y fiable, con lo que la calidad del software tenderá a ser de mayor calidad gracias a trabajar de esta manera.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CI: Integración Contínua&lt;/em&gt;. &lt;strong&gt;Filosofía de codificación y un conjunto de prácticas&lt;/strong&gt; que impulsan a los equipos de desarrollo a implementar con frecuencia pequeños cambios y registrar el código en los repositorios de control de versiones.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CD: Despliegue Contínuo&lt;/em&gt;. Proceso que comienza cuando el CI finaliza. Automatiza la entrega de aplicaciones a determinados entornos de infraestructura. La mayoría de los equipos trabajan con múltiples entornos además de la producción, como los entornos de pruebas y desarrollo, y CD garantiza que haya una forma automatizada de enviarles los cambios de código.&lt;/p&gt;

&lt;p&gt;Para comenzar, por lo menos ya sabemos más sobre ello y seguramente tengamos dudas que uso le podremos dar en nuestros proyectos y los ejemplos a los que se podría aplicar, son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Publicar librerías en NPM (que es lo que voy a enseñar), después de comprobar automáticamente los test definidos y ver que estos son los correctos, asegurándonos que no haya errores.&lt;/li&gt;
&lt;li&gt;  Publicar webs públicas en Firebase Hosting, Zeit Now,…&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Si queréis saber más al detalle, acerca de estos principios y prácticas, os invito a que leáis el siguiente artículo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.computerworld.es/tecnologia/cicd-integracion-continua-y-entrega-continua-al-detalle"&gt;&lt;strong&gt;CI/CD: integración continua y entrega continua al detalle&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
_CI/CD es una de las mejores prácticas que pueden implementar los equipos de desarrollo. También es una práctica…_www.computerworld.es&lt;/a&gt;&lt;a href="https://www.computerworld.es/tecnologia/cicd-integracion-continua-y-entrega-continua-al-detalle"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2.- Requisitos antes de empezar a trabajar
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://nodejs.org/es/download/"&gt;Node y NPM&lt;/a&gt; instalados.&lt;/li&gt;
&lt;li&gt;  Conocimientos de Git básicos.&lt;/li&gt;
&lt;li&gt;  Cuenta en Github.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  3.- Crear repositorio en Github.
&lt;/h4&gt;

&lt;p&gt;Lo primero que necesitamos para utilizar el servicio de &lt;a href="https://travis-ci.org/"&gt;Travis&lt;/a&gt; (accedemos con nuestra cuenta de Github), es tener la cuenta de Github y posteriormente crear el repositorio donde vamos a gestionar el control de versiones.&lt;/p&gt;

&lt;p&gt;Una vez creado el repositorio, clonamos el repositorio en el directorio que queremos añadirlo para trabajar dentro de el.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MAaiv7Kg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AgyVVEulcr-2TmPuV3rR7Cg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MAaiv7Kg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AgyVVEulcr-2TmPuV3rR7Cg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  4.- Activar nuestro repositorio para ejecutar CI / CD
&lt;/h4&gt;

&lt;p&gt;Tenemos que estar en el “&lt;a href="https://travis-ci.org/account/repositories"&gt;Settings&lt;/a&gt;”.&lt;/p&gt;

&lt;p&gt;Una vez que estamos ahí, tenemos que buscar el repositorio que vamos a usar (el que hemos creado ahora mismo). Tener en cuenta vuestro usuario / organización, en mi caso es una organización. Si no la teneís a la vista, pulsáis &lt;strong&gt;“Sync account”&lt;/strong&gt; para refrescar y que aparezca.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8b1Twjc0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2ASaovyoCklP-RZ-Evl3Kzuw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8b1Twjc0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2ASaovyoCklP-RZ-Evl3Kzuw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por defecto, nos aparece la lista de los repositorios asociados al usuario que tenemos asociada la cuenta, que en mi caso es &lt;strong&gt;“mugan86”&lt;/strong&gt;. Si tenéis el repositorio asociado a vuestro usuario, sin haber usado una organización, simplemente buscáis en el apartado &lt;strong&gt;“Legacy Services Integration”&lt;/strong&gt; y en el buscador añadís las palabras clave para filtrar ese repositorio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RX73vl4h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2ACNPta_ecKmUY7tYmE_SinQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RX73vl4h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2ACNPta_ecKmUY7tYmE_SinQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Así ya tenemos activado el repositorio y no tendremos que tocar nada más.&lt;/p&gt;
&lt;h4&gt;
  
  
  5.- Empezando con nuestro proyecto.
&lt;/h4&gt;

&lt;p&gt;Una vez que ya tenemos claro los conceptos iniciales, tenemos todo lo necesario instalado y configurado, accedemos al directorio que acabamos de clonar, para trabajar con el control de versiones.&lt;/p&gt;

&lt;p&gt;Ejecutamos el siguiente comando para crear nuestro fichero del manifiesto de cualquier proyecto de NPM, que es el &lt;strong&gt;package.json&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm init&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Respondemos las preguntas que nos va haciendo el asistente, quedando algo como lo siguiente:&lt;/p&gt;

&lt;p&gt;El resultado será un nuevo fichero llamado package.json con este contenido:&lt;/p&gt;
&lt;h4&gt;
  
  
  6.- Desarrollando la librería
&lt;/h4&gt;

&lt;p&gt;Ahora creamos el fichero index.js en la raíz del proyecto junto con el package.json que acabamos de crear, donde vamos a definir las funciones del paquete / librería que usaremos para utilizar en este artículo y así aprender sobre CI / CD. Añadimos el siguiente contenido:&lt;/p&gt;
&lt;h4&gt;
  
  
  7.- Definiendo los tests
&lt;/h4&gt;

&lt;p&gt;Creamos la carpeta &lt;strong&gt;“test”&lt;/strong&gt; y dentro un fichero llamado &lt;strong&gt;“index.js”&lt;/strong&gt; con el siguiente contenido:&lt;/p&gt;

&lt;p&gt;Ahora, para ejecutar los test, necesitamos instalar las dependencias de chai y mocha.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install -D mocha chai&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  8.- Comenzando con la configuración de Travis para aplicar CI
&lt;/h4&gt;

&lt;p&gt;Creamos el fichero de llamado “.travis.yml” donde vamos a añadir la configuración necesaria para poner en marcha el sistema automatizado donde va a ejecutar las ordenes que especifiquemos en dicho archivo, como la ejecución de tests, la publicación en NPM,…&lt;/p&gt;

&lt;p&gt;Teniendo en cuenta lo mencionado en el punto 4, tenemos que tener de la siguiente manera el repositorio que queremos utilizar para este proceso, ya que si no está activo, no funcionará.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wHdm1Xei--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AdVpcIAdeYCUKxsdveDslGQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wHdm1Xei--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AdVpcIAdeYCUKxsdveDslGQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Subimos el primer commit al repositorio de Github:&lt;/p&gt;

&lt;pre id="1cf6" class="graf graf--pre graf-after--p"&gt;git add — all&lt;/pre&gt;

&lt;pre id="10af" class="graf graf--pre graf-after--pre"&gt;git commit -m “First version”&lt;/pre&gt;

&lt;pre id="a139" class="graf graf--pre graf-after--pre"&gt;git push origin master&lt;/pre&gt;

&lt;p&gt;Una vez activado, pulsamos en &lt;strong&gt;“Settings”&lt;/strong&gt; y vemos que ya ha ejecutado la integración contínua, pero topdavía no hemos desplegado el paquete en NPM de manera automática, y eso será lo que se realizará con el despliegue continuo (CD).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G87Q5rO0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AdJj_F0pW149TIsfOcs5zHA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G87Q5rO0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AdJj_F0pW149TIsfOcs5zHA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  9.- Despligue Contínuo (CD)
&lt;/h4&gt;

&lt;p&gt;Una vez que ya hemos probado que se ejecutan los test de manera automática mediante la Integración contínua y las primeras configuraciones del fichero &lt;strong&gt;.travis.yml&lt;/strong&gt; lo que vamos a hacer es configurar para que se despligue la nueva actualización de ese paquete y lo publique en NPM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9.1.- Instalar Ruby:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tenemos que instalar Ruby para poder instalar las gemas CLI de Travis, para ejecutar el setup necesario para configurar el apartado del despliegue contínuo&lt;/p&gt;

&lt;p&gt;&amp;gt; Dependiendo de nuestro sistema operativo, tendremos que seguir unas instrucciones u otras y para saber como debemos de hacerlo seguimos el siguiente &lt;a href="https://www.ruby-lang.org/es/documentation/installation/"&gt;enlace&lt;/a&gt;. En Windows actualmente la versión que funciona bien es la &lt;a href="https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.5-1/rubyinstaller-devkit-2.6.5-1-x64.exe"&gt;Ruby+Devkit 2.6.5–1 (x64)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9.2.- Instalar Travis CLI:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Una vez instalado Ruby en nuestra máquina, debemos de instalar travis mediante el siguiente comando:&lt;/p&gt;

&lt;pre id="eb45" class="graf graf--pre graf-after--p"&gt;gem install travis&lt;/pre&gt;

&lt;p&gt;Una vez instalado, ejecutamos “travis” para comprobar que está correctamente añadida a nuestra máquina. En el caso de que nos diga que no lo tenemos, reiniciar el terminal o consola por si acaso.&lt;/p&gt;

&lt;p&gt;Antes de configurar de NPM, tenemos que tener en cuenta que tenemos creada una cuenta en &lt;a href="https://www.npmjs.com/"&gt;https://www.npmjs.com/&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  10.- Configurar NPM con Travis
&lt;/h4&gt;

&lt;p&gt;Ahora para hacer la configuración de NPM, debemos de ejecutar el siguiente comando&lt;/p&gt;

&lt;pre id="1830" class="graf graf--pre graf-after--p"&gt;travis setup npm&lt;/pre&gt;
Pasos para configurar Travis con los ajustes de NPM



&lt;p&gt;Nos quedará el fichero .travis.yml de la siguiente manera:&lt;/p&gt;
Después de la configuración



&lt;p&gt;En el apartado “on”, añadimos antes que repo “branches: master”, quedando de la siguiente manera:&lt;/p&gt;

&lt;p&gt;Con esto, ya estamos preparados para publicar nuestro paquete en NPM, en el repositorio que encontramos en &lt;a href="https://www.npmjs.com/"&gt;npmjs.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  11.- Publicar en NPM
&lt;/h4&gt;

&lt;p&gt;Antes de publicar, vamos a hacer un par de cambios y comprobaciones, para dejar todo listo para hacer los despliegues automáticamente siempre y cuando, pase el apartado de la CI, cuando ejecuta los tests.&lt;/p&gt;

&lt;p&gt;Vamos al fichero package.json y añadimos al nombre (name) en las propiedades el nombre siguiendo el siguiente formato:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;@/nombre-actual&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En mi caso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;   : mugan86&lt;/li&gt;
&lt;li&gt;  nombre-actual: hello-world-ci-cd&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quedando así: &lt;strong&gt;&lt;a class="comment-mentioned-user" href="https://dev.to/mugan86"&gt;@mugan86&lt;/a&gt;
/hello-world-ci-cd&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Añadimos otra propiedad (en el package.json) para publicar como público nuestro paquete:&lt;/p&gt;

&lt;pre id="a517" class="graf graf--pre graf-after--p"&gt;"publishConfig": { "access": "public" }&lt;/pre&gt;

&lt;p&gt;Asi estará actualmente nuestro package.json:&lt;/p&gt;
&lt;h4&gt;
  
  
  12.- Comprobar existencia del paquete y últimos pasos
&lt;/h4&gt;

&lt;p&gt;Vamos a &lt;a href="https://www.npmjs.com/"&gt;https://www.npmjs.com/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Y dentro de la barra de la navegador, comprobamos si existe ese paquete, ya que si existe, no vamos a poder publicarlo NUNCA.&lt;/p&gt;

&lt;p&gt;Si nos aparece algo de este estilo ejecutando la URL: &lt;a href="https://www.npmjs.com/package/@mugan86/hello-world-ci-cd"&gt;https://www.npmjs.com/package/@mugan86/hello-world-ci-cd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OWn7vurB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AREPnOCr6w3LZ3sWP8GuU0g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OWn7vurB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AREPnOCr6w3LZ3sWP8GuU0g.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No está diciendo que no existe y &lt;strong&gt;QUE SI PODREMOS PUBLICAR&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por lo tanto, dejaré como nombre de paquete ese nombre.&lt;/p&gt;

&lt;p&gt;Añadimos los cambios en git, y hacemos el backup:&lt;/p&gt;

&lt;pre id="d45e" class="graf graf--pre graf-after--p"&gt;git add — all&lt;/pre&gt;

&lt;pre id="1771" class="graf graf--pre graf-after--pre"&gt;git commit -m “Publish 1.0.0”&lt;/pre&gt;

&lt;pre id="a64e" class="graf graf--pre graf-after--pre"&gt;git push origin master&lt;/pre&gt;

&lt;p&gt;Con esto, se activa de nuevo el sistema de Integración Contínua, ejecuta los tests y si los pasa, procede a desplegarlo en NPM mediante el despligue contínuo y publicará la versión de ese paquete:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uE8MM4_D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2ApR3In0prgMg77Y-3wbEaLw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uE8MM4_D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2ApR3In0prgMg77Y-3wbEaLw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podéis ver el log de ese proceso automatizado desde &lt;a href="https://travis-ci.org/npm-js-ts-angular-modules-course/hello-world-ci-cd/builds/659658442"&gt;aquí&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  13.- Resultado
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.npmjs.com/package/@mugan86/hello-world-ci-cd"&gt;Paquete en NPMJS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/npm-js-ts-angular-modules-course/hello-world-ci-cd"&gt;Repositorio en Github&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://medium.com/@mugan86/aplicar-ci-cd-desarrollando-un-paquete-npm-3111770ef763"&gt;Canonical link&lt;/a&gt;&lt;/p&gt;

</description>
      <category>npm</category>
      <category>ci</category>
      <category>cd</category>
      <category>travisci</category>
    </item>
    <item>
      <title>Como añadir videos de Youtube en unas sencillos pasos</title>
      <dc:creator>Anartz Mugika Ledo</dc:creator>
      <pubDate>Tue, 18 Aug 2020 05:56:55 +0000</pubDate>
      <link>https://forem.com/mugan86/como-anadir-videos-de-youtube-en-unas-sencillos-pasos-25p1</link>
      <guid>https://forem.com/mugan86/como-anadir-videos-de-youtube-en-unas-sencillos-pasos-25p1</guid>
      <description>&lt;h1&gt;
  
  
  Angular 9 — Como añadir videos de Youtube en unas sencillos pasos
&lt;/h1&gt;

&lt;p&gt;Pasos a seguir para poder hacer uso YouTube Player Component y visualizar videos de Youtube en nuestras apps de Angular&lt;/p&gt;


&lt;h3&gt;
  
  
  Angular 9 — Como añadir videos de Youtube en unas sencilos pasos
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Pasos a seguir para poder hacer uso YouTube Player Component y visualizar videos de Youtube en nuestras apps de Angular
&lt;/h4&gt;

&lt;p&gt;El propósito de este artículo es enseñaros como añadir el reproductor de Youtube con el video seleccionado de una manera muy fácil.&lt;/p&gt;

&lt;p&gt;Como bien sabréis, seguramente habréis experimentado “la agradable sensación” de tener que configurar con bastante esfuerzo todo el apartado para poder visualizar videos de Youtube en Angular.&lt;/p&gt;

&lt;p&gt;Esto nos ha ocurrido hasta la versión 8.2 donde teníamos que hacer uso del Dom Sanitizer, para poder “desinfectar” nuestra app frente a ello, para poder trabajar con un iframe.&lt;/p&gt;

&lt;p&gt;Desde la versión 9 de Angular, por suerte, este quebradero de cabeza ha pasado a mejor historia. Empecemos.&lt;/p&gt;
&lt;h3&gt;
  
  
  0.- Necesario
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Tener creado el proyecto de Angular (versión 9) y disponible para trabajar.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  1.- Instalar el paquete de Youtube
&lt;/h3&gt;

&lt;p&gt;Instalaremos el &lt;a href="https://www.npmjs.com/package/@angular/youtube-player"&gt;paquete de YouTube player en npm&lt;/a&gt; ejecutando el siguiente comando estando ubicados en el directorio raíz de nuestro proyecto de Angular.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @angular/youtube-player
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  2.- Importar el módulo YoutubePlayer
&lt;/h3&gt;

&lt;p&gt;Importaremos el módulo YouTube Player modules en nuestro fichero app.module.ts (o en su defecto, en el módulo donde vayamos a aplicar directamente)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { YouTubePlayerModule } from "@angular/youtube-player";

...

 imports: [    ....,    YouTubePlayerModule,    ...  ],
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  3.- Componente YouTube Player en el HTML
&lt;/h3&gt;

&lt;p&gt;Una vez realizados los dos primeros pasamos, ya podemos agregar el componente del reproductor de YouTube en nuestro componente objetivo (app.component en este caso) como se muestra a continuación con el ID del video de YouTube.&lt;/p&gt;

&lt;p&gt;Podemos obtener fácilmente cualquier identificación desde video de YouTube seleccionado. La identificación del video de YouTube se presentará en la propia URL.&lt;/p&gt;
&lt;h4&gt;
  
  
  3.1.- URL del ejemplo — ¿Qué es GraphQL?:
&lt;/h4&gt;

&lt;pre id="f1df" class="graf graf--pre graf-after--h4"&gt;[https://www.youtube.com/watch?v=80_Cr9m-1fE](https://www.youtube.com/watch?v=80_Cr9m-1fE)&lt;/pre&gt;

&lt;p&gt;Dentro de la URL, encontramos el ID del video después de &lt;strong&gt;?v=&lt;/strong&gt; que es &lt;a href="https://www.youtube.com/watch?v=80_Cr9m-1fE"&gt;80_Cr9m-1fE&lt;/a&gt;. Teniendo esto como referencia, añadimos el siguiente código con las siguientes configuraciones que explicaré detalladamente posteriormente.&lt;/p&gt;
&lt;h4&gt;
  
  
  4.2.- Añadiendo el script en el componente que usaremos
&lt;/h4&gt;
&lt;h3&gt;
  
  
  5.- Resultado
&lt;/h3&gt;

&lt;p&gt;A continuación os muestro como se vería nuestro resultado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://angular-youtube-demo.stackblitz.io"&gt;https://angular-youtube-demo.stackblitz.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m4rHJcFL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AofSO-Gu5OAd0TAeELy7GDg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m4rHJcFL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AofSO-Gu5OAd0TAeELy7GDg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  6.- Crear nuestro ejemplo
&lt;/h3&gt;

&lt;p&gt;Ahora que sabemos como configurar y como añadir el reproductor de Youtube de una manera sencilla, ¡vamos a intentarlo por nuestra cuenta! ¡Ánimo!&lt;/p&gt;



&lt;p&gt;Gracias por leer este artículo, espero que te haya sido útil y puedas compartirlo con la mayor gente posible, para poder dar opción a otras personas de disfrutar de este tipo de contenido.&lt;/p&gt;

&lt;p&gt;Si no me sigues, te invito a hacerlo ;)&lt;/p&gt;
&lt;h3&gt;
  
  
  7.- Contacto
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Medium: &lt;a href="https://medium.com/@mugan86"&gt;https://medium.com/@mugan86&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Udemy: &lt;a href="https://www.udemy.com/user/anartzmugika/"&gt;https://www.udemy.com/user/anartzmugika/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Twitter: &lt;a href="https://twitter.com/mugan86"&gt;https://twitter.com/mugan86&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Instagram: &lt;a href="https://www.instagram.com/anartz.mugika.ledo/"&gt;https://www.instagram.com/anartz.mugika.ledo/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Telegram: &lt;a href="https://t.me/anartzmugika"&gt;https://t.me/anartzmugika&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://medium.com/@mugan86/angular-9-como-a%C3%B1adir-videos-de-youtube-en-unas-sencilos-pasos-bf8ee55de46b"&gt;Canonical link&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Añadir el botón de suscripción a nuestro canal en Angular</title>
      <dc:creator>Anartz Mugika Ledo</dc:creator>
      <pubDate>Tue, 18 Aug 2020 05:52:08 +0000</pubDate>
      <link>https://forem.com/mugan86/anadir-el-boton-de-suscripcion-a-nuestro-canal-en-angular-5c3f</link>
      <guid>https://forem.com/mugan86/anadir-el-boton-de-suscripcion-a-nuestro-canal-en-angular-5c3f</guid>
      <description>&lt;h1&gt;
  
  
  Añadir el botón de suscripción a nuestro canal en Angular
&lt;/h1&gt;

&lt;p&gt;En este tutorial sencillo vamos a aprender como añadir el botón de suscripción a nuestro canal de Youtube en una aplicación de Angular.&lt;/p&gt;


&lt;h3&gt;
  
  
  Añadir el boton de suscripción a nuestro canal en Angular En este tutorial sencillo vamos a aprender como añadir el botón de suscripción a nuestro canal de Youtube en una aplicación de Angular. Esto servirá para que las personas que deseen suscribirse en nuestro canal, puedan hacerlo mediante el botón habilitado para ello. Sería algo como lo siguiente:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z62pwND0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/0%2A6PXJDEdYsjT-RpmN.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z62pwND0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/0%2A6PXJDEdYsjT-RpmN.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora bien, ya que tenemos claro que vamos a hacer, lo primero vamos a crear un nuevo proyecto de aplicación Angular. &lt;strong&gt;Tenemos que tener instalado Angular CLI junto con Typescript, Node y NPM&lt;/strong&gt; Node / NPM: &lt;a href="https://nodejs.org/en/"&gt;https://nodejs.org/en/&lt;/a&gt; Typescript: npm install -g typescript Angular CLI: npm install -g @angular/cli Creando el proyecto de Angular: Ahora al ejecutar la orden mediante el CLI para crear el proyecto, tendremos que responder dos preguntar que lo haremos de la siguiente manera: ? Would you like to add Angular routing? No ? Which stylesheet format would you like to use? CSS Ahora esperaremos a que se creen los ficheros, se instalen las dependencias y se añadan las configuraciones. Una vez que tenemos todo listo, navegamos al directorio del proyecto que acabamos de crear y ejecutamos npm start para poner en marcha la aplicación. Tenemos lo siguiente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QdqovkNh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/0%2AKcR913QqsaKolVl-.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QdqovkNh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/0%2AKcR913QqsaKolVl-.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tenemos la aplicación preparada para añadir el script. Ahora tenemos que configurar el script a nuestro gusto para poder añadirlo en nuestro proyecto de Angular. &lt;a href="https://developers.google.com/youtube/youtube_subscribe_button"&gt;Vamos al siguiente enlace&lt;/a&gt; para acceder al configurador. Nos encontraremos con una página de la siguiente apariencia:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1APlpH4U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/0%2ABAgOHnCR0wboJtJJ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1APlpH4U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/0%2ABAgOHnCR0wboJtJJ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1. &lt;strong&gt;Introducimos el nombre de usuario o&lt;/strong&gt; &lt;a href="http://www.youtube.com/account_advanced."&gt;&lt;strong&gt;ID&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;de nuestro canal.&lt;/strong&gt; La url de mi canal es &lt;a href="https://www.youtube.com/mugan86/"&gt;https://www.youtube.com/mugan86/&lt;/a&gt; y lo que introduciremos es &lt;strong&gt;“mugan86”&lt;/strong&gt; que es el nombre de usuario. 2. &lt;strong&gt;Diseño:&lt;/strong&gt; Tenemos dos opciones, la que es por defecto que solo tiene el botón y la “full” que es la que tiene el avatar del usuario. Yo seleccionaré la opción &lt;strong&gt;“full”&lt;/strong&gt; 3. &lt;strong&gt;Tema&lt;/strong&gt;: Apariencia del background. Dos opciones, “default” y “Oscuro”. Dejamos como está (&lt;strong&gt;default&lt;/strong&gt;) para obtener el fondo blanco pero si seleccionamos la segunda tendremos el fondo más oscuro. 4. &lt;strong&gt;Conteo de suscriptores&lt;/strong&gt;: Con esta opción habilitamos para que se muestre el número de suscriptores o no. Por defecto viene habilitado y así lo voy a dejar. 5. Vista previa de lo que hemos configurado. 6. Código fuente que vamos a inscrustar en nuestra app Angular. Una vez realizadas las configuraciones, quedará de la siguiente manera con mi canal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9HLZarpV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/0%2Ad7wvuLSiUNGfpHpj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9HLZarpV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/0%2Ad7wvuLSiUNGfpHpj.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copiamos el siguiente código (6): Y lo pegamos en el fichero &lt;strong&gt;app.component.html&lt;/strong&gt; (Borramos todo el contenido que viene en ese fichero) Guardamos, vamos a la pantalla y vemos que no funciona, es porque el script lo tenemos que añadir desde la página index.html y podemos hacerlo de manera dinámica cuando estémos utilizando un componente concreto o cuando ya iniciamos la aplicación. Si queremos añadirlo en el index.html (src/index.html), simplemente copiamos **** y lo pegamos dentro del index.html El código es el siguiente: El resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vB46DDHj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/0%2A9-05jE7P2-n4TLsJ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vB46DDHj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/0%2A9-05jE7P2-n4TLsJ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y si queremos hacerlo que se inicie ese script SOLO cuando iniciamos ese componente, lo tenemos que hacer de esta manera. Tenemos que entrar en el ngOnInit() del componente (src/app/app.component.ts) Y escribir lo siguiente: const body = document.body as HTMLDivElement; const script = document.createElement('script'); script.async = true; script.defer = true; script.src = '&lt;a href="https://apis.google.com/js/platform.js"&gt;https://apis.google.com/js/platform.js&lt;/a&gt;'; body.appendChild(script); Con esos datos, empezamos creando el elemento body donde vamos a añadir el elemento script que creamos como un elemento y le añadimos el cñodigo fuente mediante la URL. Con esto, si guardamos, vamos a tener lo mismo que lo que hemos hecho en el &lt;strong&gt;index.html.&lt;/strong&gt; Con esto vamos a poder trabajar de manera dinámica con diferentes scripts dependiendo de lo que queramos cargar en un momento concreto.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
