Webpack es una herramienta de carga/empaquetado de recursos front-end. Realiza un análisis estático según las dependencias de los módulos y luego genera los recursos estáticos correspondientes a partir de estos módulos siguiendo las reglas especificadas.

Este capítulo está probado con Webpack 3.0.

En la figura podemos ver que Webpack puede convertir múltiples recursos estáticos (js, css, less) en un solo archivo estático, reduciendo así las solicitudes de la página.

A continuación, presentamos brevemente la instalación y el uso de Webpack.

Instalar Webpack

Antes de instalar Webpack, tu entorno local debe ser compatible.node.js。

Debido a que la instalación con npm es lenta, este tutorial utiliza el espejo de Taobao y su comando cnpm. Para la introducción sobre instalación y uso, consulte:Usar el espejo NPM de Taobao。

Instalar webpack con cnpm:

cnpm install webpack -g

Crear un proyecto

A continuación, creamos un directorio app:

mkdir app

Añade el archivo ejemplo1.js en el directorio app, el código es el siguiente:

archivo app/ejemplo1.js

document.write("It works.");

Añade el archivo index.html en el directorio app, el código es el siguiente:

archivo app/index.html

<html> <head> <meta charset="utf-8"> </head> <body> <script type="text/javascript" src="bundle.js" charset="utf-8"></script> </body> </html>

A continuación, usamos el comando webpack para empaquetar:

webpack ejemplo1.js bundle.js

Al ejecutar el comando anterior se compilará el archivo ejemplo1.js y se generará el archivo bundle.js. Si tiene éxito, la información de salida es la siguiente:

Hash: a41c6217554e666594cb
Version: webpack 1.12.13
Time: 50ms
    Asset     Size  Chunks             Chunk Names
bundle.js  1.42 kB       0  [emitted]  main
   [0] ./ejemplo1.js 29 bytes {0} [built]

Abre index.html en el navegador, el resultado se muestra a continuación:

Crear un segundo archivo JS

A continuación, creamos otro archivo js, ejemplo2.js, como se muestra a continuación:

archivo app/ejemplo2.js

module.exports = "It works from ejemplo2.js.";

Actualiza el archivo ejemplo1.js, el código es el siguiente:

archivo app/ejemplo1.js

document.write(require("./ejemplo2.js"));

A continuación, usamos el comando webpack para empaquetar:

webpack ejemplo1.js bundle.js Hash: dcf55acff639ebfe1677 Version: webpack 1.12.13 Time: 52ms Asset Size Chunks Chunk Names bundle.js 1.55 kB 0 [emitted] main [0] ./ejemplo1.js 41 bytes {0} [built] [1] ./ejemplo2.js 46 bytes {0} [built]

Accede en el navegador, el resultado se muestra a continuación:

webpack realiza un análisis estático según las dependencias de los módulos; estos archivos (módulos) se incluirán en el archivo bundle.js. Webpack asigna a cada módulo un id único y, a través de este id, indexa y accede a los módulos. Al iniciar la página, primero se ejecuta el código de ejemplo1.js; los demás módulos se ejecutan cuando se ejecuta require.


LOADER

Webpack por sí solo solo puede procesar módulos de JavaScript. Si se necesitan procesar otros tipos de archivos, se debe usar loader para convertirlos.

Entonces, si necesitamos añadir archivos CSS en la aplicación, debemos usar css-loader y style-loader, que hacen dos cosas diferentes: css-loader recorre el archivo CSS, luego encuentra las expresiones url() y las procesa; style-loader inserta el código CSS original en una etiqueta style de la página.

A continuación, usamos el siguiente comando para instalar css-loader y style-loader (la instalación global requiere el parámetro -g).

cnpm install css-loader style-loader

Después de ejecutar el comando anterior, se generará el directorio node_modules en el directorio actual; ese es el directorio de instalación de css-loader y style-loader.

A continuación, crea un archivo style.css, el código es el siguiente:

archivo app/style.css

body { background: yellow; }

Modifica el archivo ejemplo1.js, el código es el siguiente:

archivo app/ejemplo1.js

require("!style-loader!css-loader!./style.css"); document.write(require("./ejemplo2.js"));

A continuación, usamos el comando webpack para empaquetar:

webpack ejemplo1.js bundle.js Hash: a9ef45165f81c89a4363 Version: webpack 1.12.13 Time: 619ms Asset Size Chunks Chunk Names bundle.js 11.8 kB 0 [emitted] main [0] ./ejemplo1.js 76 bytes {0} [built] [5] ./ejemplo2.js 46 bytes {0} [built] + 4 hidden modules

Accede en el navegador, el resultado se muestra a continuación:

Al hacer require de archivos CSS, siempre hay que escribir el prefijo loader.!style-loader!css-loader!Por supuesto, podemos enlazar automáticamente el loader necesario según el tipo de módulo (extensión). En ejemplo1.js, la línearequire("!style-loader!css-loader!./style.css")se modifica arequire("./style.css") :

archivo app/ejemplo1.js

require("./style.css"); document.write(require("./ejemplo2.js"));

Luego ejecuta:

webpack ejemplo1.js bundle.js --module-bind 'css=style-loader!css-loader'

Accede en el navegador, el resultado se muestra a continuación:

Obviamente, estas dos formas de usar loader tienen el mismo efecto.


Archivo de configuración

Podemos colocar algunas opciones de compilación en el archivo de configuración para gestionarlas de manera unificada:

Crea el archivo webpack.config.js, como se muestra a continuación:

archivo app/webpack.config.js

module.exports = { entry: "./ejemplo1.js", output: { path: __dirname, filename: "bundle.js" }, module: { loaders: [ { test: /\.css$/, loader: "style-loader!css-loader" } ] } };

A continuación, solo necesitamos ejecutar el comando webpack para generar el archivo bundle.js:

webpack Hash: 4fdefac099a5f36ff74b Version: webpack 1.12.13 Time: 576ms Asset Size Chunks Chunk Names bundle.js 11.8 kB 0 [emitted] main [0] ./ejemplo1.js 65 bytes {0} [built] [5] ./ejemplo2.js 46 bytes {0} [built] + 4 hidden modules

Después de ejecutar el comando webpack, se cargará de forma predeterminada el archivo webpack.config.js del directorio actual.


Complementos

Los complementos se especifican en la opción plugins de la configuración de webpack y se utilizan para realizar trabajos que los loaders no pueden completar.

Webpack trae algunos complementos incorporados; también puedes instalar algunos complementos mediante cnpm.

El uso de complementos integrados requiere instalación mediante el siguiente comando:

cnpm install webpack --save-dev

Por ejemplo, podemos instalar el complemento integrado BannerPlugin, que se utiliza para generar información de comentarios en el encabezado del archivo.

Modifica webpack.config.js, el código es el siguiente:

archivo app/webpack.config.js

var webpack=require('webpack'); module.exports = { entry: "./ejemplo1.js", output: { path: __dirname, filename: "bundle.js" }, module: { loaders: [ { test: /\.css$/, loader: "style-loader!css-loader" } ] }, plugins:[ new webpack.BannerPlugin('Ejemplo de webpack de Ejemplo') ] };

Luego ejecuta:

webpack

Abre bundle.js y verás que en el encabezado del archivo aparece la información de comentario que especificamos.


Entorno de desarrollo

Cuando el proyecto va creciendo, el tiempo de compilación de webpack se alarga. Se pueden usar parámetros para que la salida de la compilación muestre progreso y colores.

webpack --progress --colors

Si no quieres recompilar cada vez que modificas un módulo, puedes activar el modo de vigilancia. Una vez activado el modo de vigilancia, los módulos que no han cambiado se almacenan en caché en la memoria después de la compilación y no se vuelven a compilar cada vez, por lo que la velocidad general del modo de vigilancia es muy rápida.

webpack --progress --colors --watch

Por supuesto, podemos usar el servicio de desarrollo webpack-dev-server. Así podremos iniciar un servidor web de recursos estáticos express a través de localhost:8080, y ejecutará webpack automáticamente en modo de vigilancia. Abriendo http://localhost:8080/ o http://localhost:8080/webpack-dev-server/ en el navegador se pueden ver las páginas del proyecto y la salida de recursos compilados. Además, mediante un servicio socket.io se monitorean en tiempo real los cambios y se actualiza la página automáticamente.

# Instalación cnpm install webpack-dev-server -g # Ejecución webpack-dev-server --progress --colors

Abre http://localhost:8080/ en el navegador, el resultado se muestra a continuación: