Angular-CLI es una herramienta que nos la ofrece el propio equipo de Angular y que facilita mucho el proceso de inicio de cualquier aplicación basada en la tecnología, además de generar automáticamente una gran cantidad de herramientas ya configuradas para realizar la mayoría de las operaciones necesarias comprendidas en el ciclo de vida de un proyecto, como hacer builds, lanzar el proyecto en local y ejecución de test, tanto unitarios como de integración.
Angular-CLI es una herramienta NodeJS, es decir, que necesitaremos contar con NodeJS para instalarla (recomendable instalarla de forma global en nuestro PC). Una vez instalada, dispondremos del comando "ng" a partir del cual podremos lanzar cualquiera de las acciones. Sin embargo, utilizando npm ("Node Package Manager") que es el gestor de paquetes de NodeJS, podremos gestionar todos esos mismos comandos mediante scripts de npm, abstrayéndonos de la implementación concreta del comando interno (esto veremos más adelante que es bastante útil).
Los scripts de npm son como subcomandos que npm acepta para automatizar diferentes tareas. Éstos se definen en el archivo "package.json", en la sección "scripts". Generalmente, temdremos los siguientes definidos por defecto:
Los script de npm son herramientas bastante potentes y nos permiten hacer multitud de tareas, incluso encadenando varias de ellas, cuya complejidad escapa al alcance del artículo . Solamente mencionar como cada uno de los script en el fondo, de lo que se encarga es de lanzar un comando de nuestro Angular-CLI.
Angular-cli nos provee una funcionalidad que es eyectar el proyecto. Explicar qué hace este comando y para qué nos sirve es el objetivo principal del artículo. Pero primero veamos cómo tenemos que hacerlo, se realiza en dos sencillos pasos:
Tras realizar estos sencillos pasos, tendremos nuestro proyecto eyectado. En teoría, en este punto nuestro proyecto debería funcionar de la misma manera que antes, sólo lanzando nuestros correspondientes comandos de build o start desde npm el propio gestor se encarga de lanzar los comandos directos de Webpack que realizan las tareas correspondientes. Pero, ¿qué ha supuesto eyectar el proyecto? ¿Qué cambios ha generado a nivel de ficheros? Son los tres siguientes:
Como se puede observar, a través de los scripts ahora ya no utilizamos Angular CLI, y directamente estamos llamando a Webpack para el build y el serve. Además, utilizamos directamente tanto Karma como Protactor para la ejecución de los test, referenciado nuestros ficheros correspondientes de configuración para cada herramienta, los cuales ya se usaban desde Angular CLI pero ahora los tenemos directamente referenciados en el comando. A partir de este momento, ya no nos será posible volver a utilizar ninguno de los comandos del Angular CLI, pues la consola nos mostrará un error similar a este:
Una de las grandes ventajas que tiene eyectar un proyecto, respecto a la estrategia de continuar utilizando Angular CLI, que si bien es mucho más sencillo y nos abstrae de muchas configuraciones engorrosas, no da ni la flexibilidad ni la potencia que se tiene disponible al utilizar Webpack directamente configurándolo desde su correspondiente fichero.
El proceso de ejecución genera un fichero webpack.config.js bastante genérico, pero en él se puede ver varias partes más o menos diferenciadas:
Nos vamos a centrar principalmente en el apartado de plugins, pues existen una gran cantidad de ellos disponibles para su uso, y son éstos lo que dan todas las posibilidades para configurar los parámetros de nuestro build.
Hay plugins de todo tipo y pueden realizar labores de cualquier índole: definir el grado de minificación y compresión de nuestro código para reducir el tamaño de nuestros ficheros generados, copia de assets y recursos, tanto anteriores como posteriores al proceso de build y la sustitución de variable en ficheros según expresiones regulares, para, por ejemplo, definir diferentes urls dinámicamente según el entorno en el estemos desplegando.
Así, existen muchos y muy variados plugins que pueden hacer casi cualquier aspecto que un proceso de build pueda requerir, y es aquí donde entra la principal ventaja que tiene eyectar un proyecto. En la flexibilidad y potencia que permite el poder controlar casi cualquier aspecto nosotros mismos, sin más que utilizar un plugin y definir, quizá, una pocas líneas de lógica en el fichero.
Se pueden encontrar muchos ejemplos en la red de cómo utilizar cada plugin, y cuáles son sus principales funciones, así como de cuál de ellos es el que se necesita para resolver cada uno de los determinados problemas a los que todos nos hemos enfrentado alguna vez a la hora de realizar el build de nuestro proyecto.
No sólo es posible utilizar plugins oficiales, sino que existe la posibilidad de crear plugins a medida, lo cual aumenta el número de posibilidades pues la comunidad alrededor de Webpack tiene bastantes plugins desarrollados, sin embargo esta posibilidad puede conllevar el riesgo de que dichos plugins no estén correctamente desarrollados ni suficientemente probados y nos generen más problemas que soluciones. Además, podéis encontrar una lista de plugins oficiales y sus características en la documentación oficial de Webpack.
Así mismo, la eyección nos genera un fichero de configuración en JavaScript por defecto, pero podemos cambiar el lenguaje en el que queremos codificar este fichero con unos sencillos pasos. Todo esto lo podemos encontrar en la documentación oficial de Webpack en su página web.
Obviamente eyectar un proyecto puede no ser la mejor opción para todos, ya que se requieren ciertos conocimientos técnicos para poder modificar el fichero de configuración así como tiempo para encontrar lo plugins necesarios para que nuestro build funcione correctamente, tiempo que nos ahorramos si Angular CLI lo puede hacer por nosotros y no tenemos ningún requerimiento extra que nos fuerce a eyectar.
Por ello vamos a contar cuál es el proceso de revertir esta eyección, que si bien no es automático, sí se hace de una manera muy sencilla.
Si para eyectar un proyecto sólo se neceitan un par de pasos, revertir este proceso es todavía más sencillo. Al eyectarlo, uno de los cambios que se producían en nuestro código era que se añadía la propiedad ejected en el fichero angular-cli.json, para revertir el proceso sólo tenemos que ponerla a false, o borrarla directamente.
No se requiere ningún otro cambio adicional, y a partir de ese momento podremos lanzar de nuevo cualquier comando de Angular CLI, pues el comprueba ese flag para saber si el proyecto está eyectado o no. No hay ningún otro cambio necesario en los ficheros, pero es muy recomendable limpiar los cambios de fichero package.json, tanto las dependencias que no se usan (y hacer de nuevo un npm install para que dejar dependencias no usadas en la carpeta node_modules) como revertir los cambios en los script, para que al lanzar nuestras tareas con npm, éste por debajo, se encargue de utilizar de nuevo los comandos de Angular-CLI.
El fichero webpack.config.js podéis mantenerlo si queréis, no se va a usar para nada, pero puede ser interesante en un futuro, en caso de que decidáis darle otra oportunidad a la eyección del proyecto.
A modo de resumen terminaremos con una pequeña lista desgranando las principales ventajas que nos brindan ambas herramientas.
Ventajas de Angular-CLI
Ventajas de Webpack
Ahora que ya tenemos claro qué es lo que nos ofrece cada una de las herramientas, es turno de los desarrolladores y líderes técnicos de cada proyecto decidir qué les conviene más utilizar, dependiendo de los requisitos que tengamos, pero siempre teniendo en cuenta que cualquier decisión inicial que tomemos puede ser cambiada a posteriori sin demasiado trabajo adicional, según veamos en cada momento las necesidades concretas a las que nos enfrentamos.
En próximos artículos nos centraremos en mayor detalle en cómo poner solución a determinados problemas técnicos concretos utilizando los plugins oficiales de Webpack y desarrollando nuestra propia lógica en el fichero de configuración.
José Antonio Blanes
José Antonio es Jefe de Equipo en DxD de Deloitte, formando parte del área de movilidad dentro de la competencia Java. Profesional con más de siete años de experiencia, todos ellos en la firma, como desarrollador web, primero de aplicaciones basadas en el paradigma J2EE, y en la actualidad más centrado en el desarrollo web frontend basado en Angular, así como en la implementación de aplicaciones híbridas para dispositivos móviles, con más de dos años de experiencia en este tipo de desarrollos. Actualmente combina sus labores como desarrollador con la gestión de equipos y tareas dentro de la metodologías ágiles, formando parte del Development Team.