> Manuales > Manual de Webpack

Enseñamos las bases del servidor de desarrollo de Webpack: webpack-dev-server. Nos permite servir el Javascript y archivos estáticos y aplicar live-reload para mejorar el flujo de trabajo. Configuraciones útiles para distintos tipos de proyectos.

Servidor de desarrollo Webpack con live-reload: Webpack-dev-server

Otra de las tareas básicas que necesitaremos hacer en el desarrollo web en general, es disponer de un servidor donde veamos la web que estamos programando. Además, sería estupendo si esa web se actualizase automáticamente cada vez que cambiamos alguna cosa en los archivos de fuente.

Afortunadamente, contar con este servidor de desarrollo en Webpack es más fácil de lo que resultará a un mono pelar una banana. En este artículo del Manual de Webpack te lo vamos a explicar con todo detalle. Seguro que te impresionará la rapidez con la que lo consigues. Para ello usaremos un paquete de npm llamado webpack-dev-server, que realizará toda la tarea prácticamente sin necesitar configuración. Sólo por este detalle merece la pena usar Webpack.

Instalación de Webpack dev server

El primer paso, como siempre, será instalar las dependencias mediante npm. Como casi siempre en todo el flujo de trabajo con Webpack instalaremos la dependencia en modo desarrollo, con el flag "-D".

npm i -D webpack-dev-server
Nota: también podrías instalar webpack-dev-server de manera global con "npm i -g webpack-dev-server". Eso hará que el comando "webpack-dev-server" se encuentre instalado desde cualquier ruta de tu ordenador, pero generalmente no será necesario. Además, al iniciarse el servidor se usará la instalación local de preferencia, antes de la global. Independiente de esto, tal como te vamos a enseñar a continuación a iniciar el servidor de desarrollo (con un script npm) te garantiza que se usará la instalación local de webpack-dev-server.

Ejecución del servidor de desarrollo

Una vez instalado, ya podemos usar nuestro servidor de desarrollo en Webpack. Una de las novedades de Webpack 4 es que no hace falta configurar el servidor de desarrollo, ya que nos ofrece una configuración predeterminada que puede servir en muchos de los casos.

Para ponerlo en marcha vamos a crear primero un script npm. Esto lo hacemos en el package.json, en la propiedad de "scripts".

El conjunto de scripts que podemos tener en nuestro caso podría ser algo como esto, aunque claro que dependerá de cómo hayas ido configurando Webpack.

"scripts": {
  "build": "webpack --mode production",
  "builddev": "webpack --mode development",
  "start": "webpack-dev-server --mode development --open"
},

El script en concreto que inicia Webpack Dev Server es el "start". En él estamos indicando:

Para abrir el servidor tenemos que ejecutar el script que acabamos de realizar. Esto lo hacemos desde el terminal, con el comando:

npm run start

Como hemos configurado con --open el arranque del servidor, se abrirá automáticamente el navegador, mostrando la web que estamos realizando. Además, este servidor de desarrollo está configurado automáticamente con live-reload (información extra más adelante).

Nota: como alternativa a los scripts npm, si quieres asegurarte que se ejecuta la versión local de webpack-dev-server, puedes lanzar el comando: "node_modules/.bin/webpack-dev-server" (desde la raíz de tu proyecto)

Una vez arrancado webpack dev server la ventana del terminal quedará abierta, mostrando cualquier actividad de Webpack en relación al proyecto. Por ejemplo, si se actualizan los archivos de fuente, se mostrará el resultado de la compilación de estos nuevos archivos. La ventana del terminal permanecerá ocupada con este watcher y no podremos operar para lanzar nuevos comandos. Obviamente, no es un problema porque siempre podemos lanzar nuevas ventanas de terminal, pero si queremos detener el servidor es tan sencillo como pulsar CTRL + C.

Detalles relevantes del uso de Webpack-dev-server

A continuación vamos a dar algunos detalles de interés sobre este complemento de Webpack, que te pueden venir bien durante la etapa de desarrollo de tu proyecto.

Configuración con Live reload

Este servidor viene configurado inicialmente con el sistema de live reloading, lo que permite que cada vez que se cambian y se guardan los ficheros "fuente" de Webpack, se recargue el navegador automáticamente, mostrando la web con las recientes modificaciones. Esta utilidad acelera el proceso de desarrollo, pero sobre todo permite una experiencia de desarrollo bastante más agradable para el desarrollador

Para probarlo simplemente altera cualquier cosa en tu archivo de Javascript, en tus CSS, en el HTML de tu template… simplemente con guardar el archivo en tu editor se actualizará el proyecto en el navegador, mostrando los cambios realizados inmediatamente, sin tener que recargar y sin que la caché del navegador nos incordie, mostrando código antiguo.

Transpilado automático de los archivos de desarrollo

Ten en cuenta que webpack-dev-server realiza un transpilado automático de los archivos. Esto es una ayuda en la mayoría de los casos, pues así la web que estás desarrollando podrá visualizarse correctamente en navegadores que soportan ES6 y ES5. De manera predeterminada el transpilado se realizará para soportar las últimas dos versiones de los navegadores principales.

Cambiar el puerto del servidor de desarrollo

En ocasiones puede ser necesario cambiar el puerto en el que se arranca el servidor de desarrollo. Esto se puede configurar en el comando de arranque del servidor, con el flag "--port", seguido de un espacio en blanco y el número de puerto que quieras usar.

Por ejemplo, si usas scripts de npm tal como te hemos explicado, el script "start" te podría quedar de la siguiente manera:

"start": "webpack-dev-server --mode development --open --port 8888"

Configuración de webpack-dev-server desde webpack.config.js

Si necesitamos realizar alguna configuración detallada de webpack-dev-server es posible realizarla también desde el archivo de configuración webpack.config.js.

En ese archivo, donde se encuentra el JSON de configuración, igual que tenemos una propiedad para "plugins", "output", "module", etc., podemos colocar otra justamente para definir el objeto de configuración para el arranque de nuestro servidor de desarrollo.

Por ejemplo, el puerto de arranque de webpack-dev-server se podría definir también desde el archivo de configuración de Webpack, con la propiedad siguiente.

devServer: {
  port: 9001
}

Servir contenido estático

Otra configuración muy útil, y necesaria en muchos casos para el servidor de desarrollo es la de indicar la carpeta donde tenemos el contenido estático. Como contenido estático podemos encontrar cualquier archivo que no sea procesado por Webpack pero que queramos que sea entregado también por el servidor de desarrollo.

Por ejemplo, podemos tener imágenes que queramos que se sirvan tal cual (no nos referimos a imágenes que Webpack haya procesado para optimizar, sino imágenes que tengamos en nuestro proyecto y que el servidor de desarrollo tenga que mostrar también), o por ejemplo un archivo JSON estático que queramos leer desde nuestra aplicación en la fase de desarrollo.

Pues bien, en la configuración de Webpack podríamos decirle que determinada carpeta también debe estar disponible desde el servidor de desarrollo. Para ello usamos la propiedad "contentBase", de este modo:

devServer: {
    port: 9001,
    contentBase: path.join(__dirname, 'publicdocs')
  }

Ejemplo de configuración para servir imágenes estáticas

Para ilustrar este punto vamos a ver un ejemplo concreto, que nos permita aclarar posibles dudas. Imagina que tienes una carpeta llamada "public" en la raíz de tu proyecto. En ella, a su vez, encontramos una carpeta llamada "images" que contiene varias imágenes que deseas servir. Esas imágenes no las has procesado vía Webpack, sino que las has creado con tu editor favorito y las has salvado en su carpeta. La estructura de carpetas podría ser parecida a esta:

Entonces podrías configurar Webpack, en webpack.config.js o en el correspondiente archivo de configuración que vengas usando, para que sirva esas imagenes. De un modo similar a este:

module.exports = {
  entry: {
    main: './src/js/index.js',
  },
  devServer: {
    contentBase: path.join(__dirname, 'public')
  }
}
Nota: Obviamente está faltando mucha configuración en este archivo. Lo que nos interesa es la propiedad "devServer" y "contentBase", así que hemos borrado la mayoría del código de configuración para no despistar. Solo hemos dejado "entry" para que se vea mejor al nivel que debemos de colocar la propiedad "devServer".

Ahora, imagina que dentro de "images" tienes un archivo llamado "mi_imagen.png". Entonces, la ruta donde encontrarás este archivo será la siguiente:

http://localhost:8080/images/mi_imagen.png

Usar Webpack-dev-server en conjunto de otro servidor como Apache o Nginx

Con Webpack podemos configurar el flujo del proyecto tanto para el desarrollo de aplicaciones como el de sitios web. Piensa por un momento que estás trabajando con un sitio PHP y que necesitas Apache para servir y procesar las páginas PHP. En este caso el servidor de desarrollo de Webpack no podría ayudarte del todo, ya que no ejecuta el código PHP. Tendrás que arrancar tu proyecto con Apache y tirar de Webpack-dev-server para que te procese simplemente el Javascript. Esto también es posible

En este caso el trabajo con Webpack-dev-server es prácticamente el mismo, simplemente tenemos que asegurarnos que en sitio web que tienes con PHP cargas el código que te ofrece webpack-dev-server. Para ello vamos a necesitar arrancado Apache o Nginx, así como el servidor de desarrollo de Webpack. En la ruta de los scripts que cargas en tu sitio web usarás la URL que te proporciona Webpack.

<script src="http://localhost:9001/index.js"></script>
Aquí tendrás que hacer alguna configuración de la ruta del script mediante la lectura de variables de entorno, para saber si estás en el servidor de desarrollo o en producción, porque las rutas de los scripts serán distintas dependiendo del caso. Para saber más consulta el artículo gestión de variables de entorno en PHP.

Solucionar errores de cors

El único problema con esta configuración será que tu sitio web se encontrará en un servidor distinto de tu Javascript y, para que no tengas errores de cors tienes que realizar una pequeña configuración.

Igual los errores de cors no te aparecen a la primera, pero en determinado momento podrás encontrar que tus scripts no te funcionan y que el navegador te arroja un error que menciona "Cross-Origin Request Blocked...". En resumen, los podrás solucionar con las correspondientes cabeceras de HTTP incluidas mediante webpack-dev-server.

devServer: {
  port: 9001,
  headers: { "Access-Control-Allow-Origin": "*" },
},

Establecer los source maps

Hay otro tema que debes de tener, sí o sí, para mejorar tu flujo de desarrollo. Son los source-maps. Estos te permiten recibir los errores Javascript en la misma línea que donde aparecen en tu código source, y no donde aparecen una vez procesado el Javascript por Webpack.

Esto lo consigues fácilmente mediante una configuración extra en el archivo web webpack.config.js, llamada "devtool" a la que asignamos el valor "inline-source-map", que permite colocar los source-map junto con el código generado en modo desarrollo. Te dejamos un archivo de configuración completo para que no te pierdas.

const path = require("path");

module.exports = {
  output: {
    path: path.resolve(__dirname, "public/js"),
    filename: "index.js",
  },
  entry: {
    main: "./src/js/index.js",
  },
  devServer: {
    port: 9001,
    headers: { "Access-Control-Allow-Origin": "*" },
  },
  devtool: "inline-source-map",
};

Conclusión

Creemos que con lo expuesto en este artículo tendrás suficiente para poder trabajar con la mayoría de configuraciones del servidor de desarrollo. Recuerda que puedes consultar otras opciones de configuración en la documentación de webpack-dev-server.

De momento es todo lo que necesitas saber de webpack-dev-server. Un complemento esencial para Webpack y el desarrollo frontend, que mejorará tu experiencia de desarrollo de una manera sensible. Puedes usarlo prácticamente sin configuración, como has podido comprobar, lo que hace que cualquier persona sea capaz de beneficiarse de esta herramienta en el desarrollo frontend de su proyecto.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual