Introducción
Con la creciente complejidad de los proyectos Javascript y la necesidad de automatizar tareas, hacer un seguimiento del rendimiento de las aplicaciones y ejecutar algunas actividades de mantenimiento, se ha vuelto muy relevante decidir qué tipo de herramienta de compilación adoptar.Antes de que las herramientas de compilación se convirtieran en una necesidad, no estaba claro cómo manejar las tareas rutinarias. Esto no era muy necesario porque Javascript no necesitaba particularmente ser compilado; sin embargo, con proyectos como aplicaciones de una sola página, y la llegada de las herramientas de compilación, las tareas que se repiten son ahora automatizadas.Viendo que se ha convertido en algo más que una necesidad el uso de herramientas de compilación, los desarrolladores de software en este momento se enfrentan al reto de elegir una que sea perfecta para su proyecto.
En este artículo, vamos a comparar Grunt, Gulp y Webpack en relación con las siguientes características:
- Facilidad de uso
- Popularidad
- Fiabilidad
- Extensibilidad
Grunt y Gulp son ejecutores de tareas, mientras que Webpack es un agrupador de módulos. Los ejecutores de tareas se utilizan básicamente para automatizar tareas en un proceso de desarrollo. Algunas de estas tareas incluyen la compresión de archivos JS, la compilación de archivos Sass, la vigilancia de los cambios en los archivos, la minificación de archivos y el auto-prefixing.Module bundlers toman varios módulos de la aplicación que tienen dependencias y los agrupan en activos estáticos. Los agrupadores de módulos realizan la tarea de los ejecutores de tareas, y van varios pasos más allá.Con suerte, al final del artículo, estará más claro qué herramienta de compilación utilizar para su proyecto.
Facilidad de uso
Cuanto más compleja es una herramienta, más difícil es utilizarla. Al ser corredores de tareas, Gulp y Grunt ofrecen características como minificación de código, preprocesamiento de CSS, pruebas unitarias y una lista de otras.
En comparación con Grunt o Webpack, Gulp es mucho más fácil de usar. Es posible poner en marcha un proyecto con Gulp en pocos minutos. Grunt, sin embargo, tiene menos problemas de configuración que Webpack.
Para configurar Gulp, se siguen los siguientes pasos
- Comprobar que node, npm y npx están instalados
- Instalar Gulp CLI usando
npm install --global gulp-cli
- Crear un archivo package.json para devDependencias
- Instala el paquete gulp en las devDependencias usando
npm install --save-dev gulp@next
- Crea un archivo gulp.js donde se escribirán las tareasfunction defaultTask(cb) { // coloca aquí el código de tu tarea por defecto cb();}exports.default = defaultTask
Para usar Grunt, tienes que hacer lo siguiente:
- Actualiza tu npm usando
npm update -g npm
- Instala Grunt CLI usando npm install -g grunt-cli
- Configura tu paquete.json donde se listan tus devDependencias
- Crea un archivo Gruntfile.js donde se escriben las tareas. Las tareas siempre se escriben dentro de este bloque:module.exports = function(grunt) { // Las tareas de Grunt van aquí};
Los procesos para configurar Gulp y Grunt parecen similares. Sin embargo, Gulp es más expresivo; te permite escribir código que establece claramente su función. Gulp se basa en los flujos de Node, lo que permite la canalización. Grunt, por otro lado, se basa en archivos de configuración de datos donde cada archivo de origen y destino debe ser declarado. A medida que el proyecto se hace más grande, Grunt se vuelve aún más engorroso de manejar.
Si, por ejemplo, necesitas compilar Sass, minificar el archivo CSS resultante y Uglificar tu archivo JS usando Grunt, el archivo Gruntfile.js
se verá así
module.exports = function (grunt) { grunt.initConfig({ sass: { dist: { files: { 'dist-grunt/css/style.css': 'assets/scss/style.scss' } } }, cssmin: { dist: { files: { 'dist-grunt/css/styles.min.css': } } }, uglify: { dist: { files: { 'dist-grunt/js/scripts.min.js': } } }, grunt.loadNpmTasks('grunt-sass'); grunt.loadNpmTasks('grunt-contrib-cssmin'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.registerTask('default', );};
Por otro lado, si el mismo proceso se va a hacer con Gulp, el gulp.js
se verá así:
var gulp = require('gulp');var sass = require('gulp-sass');var cleanCSS = require('gulp-clean-css');var uglify = require('gulp-uglify');gulp.task('sass', function () { return gulp.src('assets/scss/**/*.scss') .pipe(sass().on('error', sass.logError)) .pipe(gulp.dest('dist-gulp/css'));});gulp.task('css', , function () { return gulp.src() .pipe(cleanCSS()) .pipe(gulp.dest('dist-gulp/css'));});gulp.task('default', );
Gulp y Grunt son ambos más fáciles de configurar en comparación con Webpack.
Para usar Webpack, tienes que hacer lo siguiente:
- Instalar Nodejs y Npm
- En tu terminal, crea una carpeta Webpack usando
mkdir folder-name
- Inicializa el proyecto Nodejs usando
npm init -y
- Crea los siguientes archivos
touch index.html webpack.config.js index.js
- Instala Webpack y el servidor de desarrollo de Webpack usando
npm i
--
save-dev webpack@latest webpack-dev-server@latest
- Instalar Webpack globalmente
npm i -g webpack@latest
-
Escribir la configuración de Webpack en el archivo
webpack.config.js
.const webpack = require(‘webpack’);
let config = { entry: ‘./index.js’, output: { filename: ‘output.js’ }}module.exports = config;
La configuración anterior es el inicio básico de Webpack. Webpack tiene varias características útiles y puede hacer mucho más. La plétora de posibilidades descubiertas con Webpack podría justificar sus complejidades. Se necesita más tiempo para entender cómo funciona Webpack; también puede ser engorroso cuando se gestionan varias configuraciones para múltiples entornos.
Popularidad
Las métricas para medir la popularidad de cada una de estas herramientas difieren. Grunt ha existido mucho antes que Gulp, y muchos desarrolladores lo han utilizado ampliamente. Sin embargo, según la encuesta State of JavaScript 2018, Webpack se sitúa por encima de Gulp y Grunt.
Hay un interés creciente por aprender a utilizar Webpack; esto es justificable viendo el amplio abanico de posibilidades que se ponen a disposición con su uso.
También usando las estadísticas de Github, Webpack, Gulp y Grunt tienen más de 41.000, 30.000 y 11.000 estrellas respectivamente.
Fiabilidad
Gulp, Grunt y Webpack tienen una gran dependencia de los plugins. Las tres herramientas tienen grandes comunidades en las que se pueden tratar y arreglar los problemas. En el caso de Gulp y Grunt, hay una gran dependencia del autor del plugin para mantener los plugins, y a veces, hay poca o ninguna documentación a la que recurrir cuando se enfrenta un problema. El resultado suele ser esperar a que estos autores realicen actualizaciones o resolverlo uno mismo. Sin embargo, la mayoría de los plugins de Webpack son mantenidos por el equipo central de Webpack mientras que el resto son gestionados por la comunidad de Webpack; y esto lo hace más fiable.
Extensibilidad
Gulp, Grunt y Webpack han sido mejorados en los últimos años. Todos ellos tienen más espacio para plugins más nuevos e incluso más eficientes y estandarizados.
Algunos usuarios de Grunt están empezando a adoptar Gulp porque permite el piping, y eso explica que se diga que Grunt tendrá pronto una actualización que también permite el piping. El piping permite a los usuarios de Gulp adjuntar la salida de una tarea a otra dependencia, haciendo que el código sea más corto y se trabaje más rápido.
Actualmente, Gulp parece más extensible que Grunt porque cuando el proyecto escala, no es tan difícil gestionar el archivo gulp. Gulp utiliza plugins que realizan cada uno una única tarea a diferencia de Grunt donde un plugin puede realizar múltiples tareas.
Webpack puede extenderse incluso más allá de su funcionalidad principal con la ayuda de plugins y cargadores, el único problema es las complicaciones que pueden surgir al configurarlo. Sin embargo, como Webpack agrupa todos los módulos que tienen dependencias, no es tan laborioso trabajar en proyectos Webpack incluso grandes.
En el momento de escribir esto, Grunt tiene 6.459 plugins en su registro de plugins, mientras que Gulp tiene 3.672 plugins listados en su propio registro de plugins. Con tantos plugins para ambos, es probable que encuentres un plugin para hacer lo que necesites.Webpack tiene su propio conjunto de plugins oficiales listados aquí, y una lista de otros plugins de terceros que se pueden encontrar en awesome-webpack.
Conclusión
Webpack es similar a una combinación de Gulp/Grunt y Browserify. Webpack es algo necesario para los proyectos que tienen intenciones de escalar. Por eso se suele utilizar con React o Angular.
Grunt y Gulp podrían utilizarse cuando el proyecto es moderado, o bastante grande. Si te sientes realmente cómodo escribiendo funciones JS, entonces Gulp es aconsejable, pero, si prefieres escribir configuraciones de tareas, entonces Grunt será suficiente.