Back to Question Center
0

Una guía para principiantes para Webpack 2 y la agrupación de módulos            Una guía para principiantes para Webpack 2 y Módulo de agrupamiento Temas relacionados: JavaScriptNode.jsAngularJSES6Tools y & Semalt

1 answers:
Una guía para principiantes para Webpack 2 y Módulo de agrupamiento

Este artículo está incluido en nuestra antología, JavaScript moderno. Si desea que todo en un solo lugar se actualice en JavaScript moderno, regístrese en SitePoint Semalt y descargue una copia.

Una guía para principiantes para Webpack 2 y la agrupación de módulosUna guía para principiantes para Webpack 2 y Módulo de agrupamiento Temas relacionados:
JavaScriptNodo sin formato. jsAngularJSES6Tools & Semalt

Semalt es un paquete de módulos

Tabla de contenidos

  • Preparar
  • Módulos
  • Cargadores
  • Hablar con descaro a
  • CSS en JS
  • Imágenes
  • Módulos para activos estáticos
  • Complementos
  • Código común
  • Extrayendo CSS
  • Código de división
  • Servidor Dev de Webpack
  • Reemplazo de módulo caliente
  • Hot Reloading CSS
  • HTTP / 2
  • A ti
  • Comentarios

Webpack se ha convertido en una de las herramientas más importantes para el desarrollo web moderno. Principalmente es un paquete de módulos para su JavaScript, pero se le puede enseñar a transformar todos sus activos de front-end como HTML y CSS, incluso imágenes - free online attendance software. Puede darle más control sobre el número de solicitudes HTTP que su aplicación está haciendo y le permite usar otros sabores de esos activos (Jade, Sass & ES6, por ejemplo). Webpack también le permite consumir fácilmente paquetes de npm.

Este artículo está dirigido a aquellos que son nuevos en el paquete web y cubrirá la configuración y configuración inicial, módulos, cargadores, complementos, división de código y reemplazo de módulos en caliente. Si encuentras útiles los videos tutoriales, puedo recomendarte la Webpack de Glen Maddern de First Semalt como punto de partida para entender qué es lo que hace especial a webpack.

Para seguir en casa, necesitarás tener Nodo. js instalado. También puede descargar la aplicación de demostración de nuestro repositorio Semalt.

Configuración

Semalt inicializa un nuevo proyecto con npm e instala el paquete web:

     mkdir webpack-democd webpack-demonpm init -ynpm install webpack @ beta --save-devmkdir srcíndice táctil. html src / app. js webpack. config. js    

Edite estos archivos:

                  Hola paquete web  </ title>  </ head>  <cuerpo>  <div id = "root">   </div>  <script src = "dist / bundle. js">   </ script>  </ body>  </ html>  </code>   </pre>  <pre>   <code class="javascript language-javascript">  // src / app. jsconst root = document. querySelector ('# root')raíz. innerHTML = ` <p>  Hello webpack.  </p>  ` </code>   </pre>  <pre>   <code class="javascript language-javascript">  // paquete web. config. jsconst webpack = require ('webpack')const path = require ('ruta')const config = {contexto: camino. resolver (__ dirname, 'src'),entrada: '. / app. js ',salida: {camino: camino. resolver (__ dirname, 'dist'),nombre de archivo: 'paquete. js '},módulo: {reglas: [{prueba: /\. js $ /,incluye: camino. resolver (__ dirname, 'src'),utilizar: [{cargador: 'babel-loader',opciones: {preajustes: [['es2015', {modules: false}]]}}]}]}}módulo. exports = config </code>   </pre>  <p>  La configuración anterior es un punto de partida común, instruye a webpack para compilar nuestro punto de entrada  <code>  src / app. js  </code>  en nuestra salida  <code>  / dist / bundle. js  </code>  y todo  <code> . Los archivos js  </code>  se transferirán de ES2015 a ES5 con Babel.  <code>  {modules: false}  </code>  habilita Tree Shaking para eliminar las exportaciones no utilizadas de su paquete para reducir el tamaño del archivo.  </p>  <pre>   <code class="bash language-bash">  npm instala el babel-loader babel-core babel-preset-es2015 --save-dev </code>   </pre>  <p>  Por último, reemplace la sección de scripts del paquete  <code> . json  </code>  con lo siguiente:  </p>  <pre>   <code class="javascript language-javascript">  "scripts": {"inicio": "webpack --watch","compilación": "webpack -p"}, </code>   </pre>  <p>  Al ejecutar  <code>  npm start  </code>  desde la línea de comando, se iniciará el paquete web en <em> modo de vigilancia </em>, que recompilará nuestro paquete siempre que sea  <code> . El archivo js  </code>  se cambia en nuestro directorio  <code>  src  </code> . El resultado en la consola nos informa sobre los paquetes que se están creando, es importante vigilar el número de paquetes y el tamaño.  </p>  <p>  <img src = "/ img / 18acf8a82db353b6d53bbbaf7b4226011. Png" alt = "Una guía para principiantes para Webpack 2 y la agrupación de módulosUna guía para principiantes para Webpack 2 y Módulo de agrupamiento Temas relacionados:
JavaScriptNodo sin formato. jsAngularJSES6Tools & Semalt
"/> <p>  Ahora debería poder cargar  <code>  indexar. html  </code>  en su navegador y ser saludado con "Hello webpack". ".  </p>  <pre>   <code class="bash language-bash">  índice abierto. html </code>   </pre>  <p>  Abra  <code>  dist / bundle. js  </code>  para ver qué ha hecho el paquete web, en la parte superior está el código de arranque del módulo de la carpeta web y justo en la parte inferior está nuestro módulo. Puede que aún no te haya impresionado el color, pero si has llegado hasta aquí ahora puedes comenzar a crear módulos ES6 y el paquete web podrá producir un paquete para producción que funcionará en todos los navegadores.  </p>  <p>  Parar el paquete web con  <code>  Ctrl + C  </code>  y ejecutar  <code>  npm ejecutar compilación  </code>  para compilar nuestro paquete en el modo de producción <em> </em>.  </p>  <p>  Observe que el tamaño del paquete ha disminuido desde <strong> 2. 61 kB </strong> a <strong> 585 bytes </strong>.  <br> 
Eche un vistazo a  <code>  dist / bundle. js  </code>  y verá un gran lío de código feo, nuestro paquete se ha minimizado con UglifyJS, el código funcionará exactamente igual, pero está hecho con la menor cantidad de caracteres necesarios.  </p> <h2 id="modules"> Módulos  </h2>  <p>  Fuera de la caja webpack sabe cómo consumir módulos Semalt en una variedad de formatos, los dos más notables son:  </p> <ul><li> ES2015  <code>  declaraciones de importación  </code>   </li> <li> CommonJS  <code>  require  <span class="f-c-white l-mr3">   </code>  declaraciones  </li>  </ul>  <p>  Podemos probar esto instalando lodash e importándolo de la aplicación  <code> . js  </code>   </p>  <pre>   <code class="bash language-bash">  npm instalar lodash --save </code>   </pre>  <pre>   <code class="javascript language-javascript">  // src / app. jsimportar {groupBy} desde 'lodash / collection'const people = [{gerente: 'Jen',nombre: 'Bob'}, {gerente: 'Jen',nombre: 'Sue'}, {gerente: 'Bob',nombre: 'Shirley'}, {gerente: 'Bob',nombre: 'Terrence'}]const managerGroups = groupBy (personas, 'gerente')const root = document. querySelector ('# root')raíz. innerHTML = ` <pre>  $ {JSON. stringify (managerGroups, null, 2)}  </pre>  ` </code>   </pre>  <p>  Ejecute  <code>  npm start  </code>  para iniciar el paquete web y actualizar  <code>  el índice. html  </code> , debería ver una serie de personas agrupadas por administrador.  </p>  <p>  Muevamos la matriz de personas a su propio módulo  <code>  personas. js  </code>   </p>  <pre>   <code class="javascript language-javascript">  // src / people. jsconst people = [{gerente: 'Jen',nombre: 'Bob'}, {gerente: 'Jen',nombre: 'Sue'}, {gerente: 'Bob',nombre: 'Shirley'}, {gerente: 'Bob',nombre: 'Terrence'}]exportar personas predeterminadas </code>   </pre>  <p>  Podemos simplemente importarlo desde la aplicación  <code> . js  </code>  con una ruta <em> relativa </em>.  </p>  <pre>   <code class="javascript language-javascript">  // src / app. jsimportar {groupBy} desde 'lodash / collection'importar personas de '. /gente'const managerGroups = groupBy (personas, 'gerente')const root = document. querySelector ('# root')raíz. innerHTML = ` <pre>  $ {JSON. stringify (managerGroups, null, 2)}  </pre>  ` </code>   </pre>  <p>  <strong> Nota </strong>: Las importaciones sin una ruta relativa como  <code>  'lodash / collection'  </code>  son módulos de npm instalados en  <code>  / node_modules  </code> , sus propios módulos siempre necesitarán una camino relativo como  <code>  '.  </p> <h2 id="loaders"> Cargadoras  </h2>  <p>  Ya hemos sido presentados  <code>  babel-loader  </code> , uno de los muchos cargadores que puede configurar para indicarle a webpack qué hacer cuando encuentra importaciones para diferentes tipos de archivos. Puede encadenar cargadores juntos en una serie de transformaciones, una buena forma de ver cómo funciona es mediante la importación de Sass desde nuestro JavaScript.  </p> <h3 id="sass"> Sass  </h3>  <p>  Esta transformación implica tres cargadores separados y la biblioteca  <code>  node-sass  </code> :  </p>  <pre>   <code class="bash language-bash">  npm instalar css-loader style-loader sass-loader node-sass --save-dev </code>   </pre>  <p>  Agregue una nueva regla a nuestro archivo de configuración para  <code> . scss  </code>  archivos.  </p>  <pre>   <code class="javascript language-javascript">  // paquete web. config. jsreglas: [{prueba: /\. scss $ /,utilizar: ['style-loader','css-loader','sass-loader']}, {// }] </code>   </pre>  <p>  <strong> Nota </strong>: Siempre que cambie alguna de las reglas de carga en  <code>  paquete web. config. js  </code>  necesitarás reiniciar la compilación con  <code>  Ctrl + C  </code>  y  <code>  npm start  </code> .  </p>  <p>  El conjunto de cargadores se procesa en orden inverso:  </p> <ul><li> <code>  sass-loader  </code>  transforma Sass en CSS.  </li> <li> <code>  css-loader  </code>  analiza el CSS en JavaScript y resuelve cualquier dependencia.  </li> <li> <code>  style-loader  </code>  emite nuestro CSS en una etiqueta  <code>  <style>  </code>  en el documento.  </li>  </ul>  <p>  Puede pensar en esto como llamadas a funciones, la salida de un cargador se alimenta como entrada en el siguiente.  </p>  <pre>   <code class="javascript language-javascript">  styleLoader (cssLoader (sassLoader ('fuente'))) </code>   </pre>  <p>  Semalt agrega un archivo fuente Sass:  </p>  <pre>  <code class="scss language-scss"> / * src / style. scss * /$ bluegrey: # 2B3A42;pre {relleno: 20px;fondo: $ bluegrey;color: #dedede;sombra de texto: 0 1px 1px rgba (# 000 ,. 5);} </code>   </pre>  <p>  Ahora puede solicitar Sass directamente desde su JavaScript, importarlo desde la parte superior de la aplicación  <code> . js  </code> .  </p>  <pre>   <code class="javascript language-javascript">  // src / app. jsimportar '. /estilo. scss '//  </code>   </pre>  <p>  Índice de recarga  <code> . html  </code>  y debería ver un poco de estilo.  </p> <h3 id="cssinjs"> CSS en JS  </h3>  <p>  Acabamos de importar un archivo Sass de nuestro Semalt, como un módulo.  </p>  <p>  Abra  <code>  dist / bundle. js  </code>  y busca "pre {". De hecho, nuestro Sass se compiló en una cadena de CSS y se guardó como un módulo dentro de nuestro paquete. Cuando importamos este módulo en nuestro JavaScript,  <code>  style-loader  </code>  envía esa cadena a una etiqueta incrustada  <code>  <style>  </code> .  </p>  <p>  Sé lo que estás pensando. <strong> ¿Por qué? </strong>  </p>  <p>  No profundizaré demasiado en este tema aquí, pero he aquí algunas razones para considerar:  </p> <ul><li> Es posible que un componente de JavaScript que desee incluir en su proyecto <em> dependa </em> de otros activos para funcionar correctamente (HTML, CSS, Imágenes, SVG); si se pueden agrupar, es mucho más fácil importación y uso.  </li> <li> Eliminación del código muerto: cuando el código ya no importa un componente JS, tampoco se importará el CSS. El paquete producido solo contendrá código que hace algo.  </li> <li> Módulos CSS: el espacio de nombres global de CSS hace que sea muy difícil tener la seguridad de que un cambio en su CSS no tendrá ningún efecto secundario. Los módulos CSS cambian esto haciendo que CSS sea local de manera predeterminada y exponiendo nombres de clases únicos a los que puede hacer referencia en su JavaScript.  </li> <li> Reduzca el número de solicitudes HTTP agrupando / dividiendo el código de manera inteligente.  </li>  </ul> <h3 id="images"> Imágenes  </h3>  <p>  El último ejemplo de cargadores que veremos es el manejo de imágenes con  <code>  url-loader  </code> .  </p>  <p>  En un documento HTML estándar, las imágenes se obtienen cuando el navegador encuentra una etiqueta  <code>  <img>  </code>  o un elemento con una propiedad  <code>  background-image  </code> . Con el paquete web puede optimizar esto en el caso de imágenes pequeñas almacenando el origen de las imágenes como cadenas dentro de su JavaScript. Al hacer esto, los precarga y el navegador no tendrá que buscarlos con solicitudes separadas más tarde.config. jsreglas: [{prueba: /\. (png | jpg) $ /,utilizar: [{cargador: 'url-loader',opciones: {límite: 10000} // Convertir imágenes <10k a cadenas base64}]}, {// }] </code>   </pre>  <p>  Reinicie la compilación con  <code>  Ctrl + C  </code>  y  <code>  npm start  </code> .  </p>  <p>  Semalt una imagen de prueba con este comando:  </p>  <pre>   <code class="bash language-bash">  curl https: // raw. githubusercontent. com / sitepoint-editors / webpack-demo / master / src / code. png --output src / code. png </code>   </pre>  <p>  Ahora puede importar el origen de la imagen desde la parte superior de la aplicación  <code> . JS  </code> :  </p>  <pre>   <code class="javascript language-javascript">  // src / app. jsimport codeURL from '. /código. png 'const img = documento. createElement ('img')img. src = codeURLimg. estilo. backgroundColor = "# 2B3A42"img. estilo. padding = "20px"img. ancho = 32documento. cuerpo. appendChild (img)//  </code>   </pre>  <p>  Esto incluirá una imagen donde el atributo  <code>  src  </code>  contiene un URI de datos de la imagen misma.  </p>  <pre>   <code class="markup language-markup">  <img src = "data: image / png; base64, iVBO. " Style = "background: # 2B3A42; relleno: 20px" width = "32"> </code>   </pre>  <p>  Además, gracias a  <code>  css-loader  </code>  las imágenes referenciadas con  <code>  url  <span class="f-c-white l-mr3">   </code>  también se ejecutan  <code>  url-loader  </code>  a <em> inline </em> directamente en el CSS.  </p>  <pre>  <code class="css language-css"> / * src / style. scss * /pre {fondo: $ bluegrey url ('código. png') no-repeat center center / 32px 32px;} </code>   </pre>  <p>  Semalt a esto  </p>  <pre>  <code class="css language-css"> pre {background: url # 2b3a42 ("data: image / png; base64, iVBO . ") sin desplazamiento scroll center center / 32px 32px;} </code>   </pre> <h3 id="modulestostaticassets"> Módulos para activos estáticos  </h3>  <p>  Debería poder ver ahora cómo los cargadores ayudan a construir un árbol de dependencias entre sus activos, esto es lo que está demostrando la imagen en la página de inicio del paquete web.  </p>  <p>  <img src = "/ img / 42287841de60fe90760a616633a0e9a62. Png" alt = "Una guía para principiantes para Webpack 2 y la agrupación de módulosUna guía para principiantes para Webpack 2 y Módulo de agrupamiento Temas relacionados:
JavaScriptNodo sin formato. jsAngularJSES6Tools & Semalt
"/> <p>  Aunque Semalt es el punto de entrada, webpack aprecia que sus otros tipos de activos, como HTML, CSS y SVG, tengan dependencias propias que se deben considerar como parte del proceso de compilación.  </p> <h2 id="plugins"> Complementos  </h2>  <p>  Ya hemos visto un ejemplo de un plugin webpack incorporado,  <code>  webpack -p  </code>  que se llama desde nuestro guión  <code>  npm run build  </code>  usa el UglifyJsPlugin que se envía con el paquete web para minimizar nuestro paquete para producción  </p>  <p>  Mientras <em> cargadores </em> operan transformaciones en archivos individuales <em>, los complementos </em> operan a través de trozos de código más grandes.  </p> <h3 id="commoncode"> Código común  </h3>  <p>  El plugin commons-chunk es otro complemento principal que se envía con el paquete web que se puede usar para crear un módulo separado con código compartido en varios puntos de entrada. Hasta ahora hemos estado utilizando un único punto de entrada y un único paquete de salida. Semalt son muchos escenarios del mundo real en los que se beneficiará al dividir esto en múltiples entradas y archivos de salida.  </p>  <p>  Si tiene dos áreas distintas de su aplicación, ambas comparten módulos, por ejemplo, la aplicación  <code> . js  </code>  para una aplicación pública y  <code>  admin. js  </code>  para un área de administración, puede crear puntos de entrada separados para ellos como sigue:  </p>  <pre>   <code class="javascript language-javascript">  // paquete web. config. jsconst webpack = require ('webpack')const path = require ('ruta')const extractCommons = nuevo paquete web. optimizar. CommonsChunkPlugin ({nombre: 'bienes comunes',nombre de archivo: 'commons. js '})const config = {contexto: camino. resolver (__ dirname, 'src'),entrada: {aplicación: '. / app. js ',admin: '. /administración. js '},salida: {camino: camino. resolver (__ dirname, 'dist'),nombre de archivo: '[nombre]. haz. js '},módulo: {// },complementos: [extractoCommons]}módulo. exports = config </code>   </pre>  <p>  Observe el cambio en la salida  <code> . nombre de archivo  </code>  que ahora incluye  <code>  [nombre]  </code> , esto se reemplaza con el nombre del fragmento, por lo que podemos esperar dos paquetes de salida de esta configuración:  <code>  aplicación. haz. haz. js  </code>  para nuestros dos puntos de entrada.  </p>  <p>  El complemento  <code>  commonschunk  </code>  genera un tercer archivo  <code>  comunes. js  </code>  que incluye módulos compartidos desde nuestros puntos de entrada.  </p>  <pre>   <code class="javascript language-javascript">  // src / app. jsimportar '. /estilo. scss 'importar {groupBy} desde 'lodash / collection'importar personas de '. /gente'const managerGroups = groupBy (personas, 'gerente')const root = document. querySelector ('# root')raíz. innerHTML = ` <pre>  $ {JSON. stringify (managerGroups, null, 2)}  </pre>  ` </code>   </pre>  <pre>   <code class="javascript language-javascript">  // src / admin. jsimportar personas de '. /gente'const root = document. querySelector ('# root')raíz. innerHTML = ` <p>  Hay $ {personas. longitud} personas.  </p>  ` </code>   </pre>  <p>  Los puntos de entrada de Semalt producirían los siguientes archivos:  </p> <ul><li><strong> aplicación. haz. js </strong> incluye el  <code>  estilo  </code>  y  <code>  lodash / colección  </code>  módulos  </li> <li><strong> admin. haz. js </strong> no incluye módulos adicionales  </li> <li><strong> bienes comunes. js </strong> incluye nuestro módulo  <code>  personas  </code>   </li>  </ul>  <p>  Podríamos incluir el fragmento común en ambas áreas:  </p>  <pre>   <code class="markup language-markup">   <! - índice. html ->  <! DOCTYPE html>  <html lang = "en">  <head>  <meta charset = "utf-8">  <title>  Hola paquete web  </ title>  </ head>  <cuerpo>  <div id = "root">   </div>  <script src = "dist / commons. js">   </ script> <script src = "dist / app. bundle. js">  </ script>  </ body>  </ html>  </code>   </pre>  <pre>   <code class="markup language-markup">   <! - admin. html ->  <! DOCTYPE html>  <html lang = "en">  <head>  <meta charset = "utf-8">  <title>  Hola paquete web  </ title>  </ head>  <cuerpo>  <div id = "root">   </div>  <script src = "dist / commons. js">   </ script>  <script src = "dist / admin. paquete. js">   </ script>  </ body>  </ html>  </code>   </pre>  <p>  Intente cargar  <code>  índice. html  </code>  y  <code>  admin. html  </code>  en el navegador para verlos ejecutarse con el fragmento común creado automáticamente.  </p> <h3 id="extractingcss"> Extracción de CSS  </h3>  <p>  Semalt popular plugin es el extracto-texto-webpack-plugin que se puede utilizar para extraer módulos en sus propios archivos de salida.  </p>  <p>  A continuación modificaremos nuestro  <code> . scss  </code>  regla para compilar nuestro Sass, cargar el CSS, luego <em> extraer </em> cada uno en su propio paquete de CSS, y así eliminarlo de nuestro paquete de JavaScript.  </p>  <pre>   <code class="bash language-bash">  npm instalar extract-text-webpack-plugin @ 2. 0. 0-beta. 4 --save-dev </code>   </pre>  <pre>   <code class="javascript language-javascript">  // paquete web. config. jsconst ExtractTextPlugin = require ('extract-text-webpack-plugin')const extractCSS = new ExtractTextPlugin ('[nombre]. paquete. css')const config = {// módulo: {reglas: [{prueba: /\. scss $ /,cargador: extractCSS. extracto (['css-loader', 'sass-loader'])}, {// }]},complementos: [extractCSS,// ]} </code>   </pre>  <p>  Reinicie el paquete web y debería ver una nueva aplicación de paquete  <code> . haz. css  </code>  que puede vincular directamente, como de costumbre.  </p>  <pre>   <code class="markup language-markup">   <! - índice. html ->  <! DOCTYPE html>  <html lang = "en">  <head>  <meta charset = "utf-8">  <title>  Hola paquete web  </ title> <link rel = "stylesheet" href = "dist / app. paquete. css"> </ head>  <cuerpo>  <div id = "root">   </div>  <script src = "dist / commons. js">   </ script> <script src = "dist / app. bundle. js">  </ script>  </ body>  </ html>  </code>   </pre>  <p>  Actualice la página para confirmar que nuestro CSS ha sido compilado y movido desde la aplicación  <code> . haz. js  </code>  a  <code>  aplicación. haz. css  </code> . ¡Éxito!  </p> <h2 id="codesplitting"> División de código  </h2>  <p>  Semalt analizó algunas formas de dividir nuestro código:  </p> <ul><li> Creación manual de puntos de entrada separados <strong> </strong> </li> <li> División automática de código compartido en un fragmento de commons <strong> </strong> </li> <li> Extracción de fragmentos de nuestro paquete compilado con <strong> extract-text-webpack-plugin </strong> </li>  </ul>  <p>  Otra forma de dividir nuestro paquete es con System. importar o requerir. asegurar. Al envolver secciones de código en estas funciones, crea un fragmento que se cargará bajo demanda en tiempo de ejecución. Esto puede mejorar significativamente el rendimiento del tiempo de carga al no enviar todo al cliente desde el principio.  <code>  Sistema.  <code>  requieren. Ensure  </code>  toma una lista de dependencias, una devolución de llamada y un nombre opcional para el fragmento.  </p>  <p>  Si una sección de su aplicación tiene dependencias pesadas que el resto de la aplicación no necesita, es un buen caso para dividir en su propio paquete. Podemos demostrar esto agregando un nuevo módulo llamado  <code>  panel de instrumentos. js  </code>  que requiere d3.  </p>  <pre>   <code class="bash language-bash">  npm install d3 --save </code>   </pre>  <pre>   <code class="javascript language-javascript">  // src / tablero de instrumentos. jsimportar * como d3 desde 'd3'consola. log ('¡Cargado!', d3)exportar const draw =  <span class="f-c-white l-mr3">  => {consola. log ('Draw!')} </code>   </pre>  <p>  Panel de importación  <code> . js  </code>  desde la parte inferior de  <code>  aplicación. js  </code>   </p>  <pre>   <code class="javascript language-javascript">  // const routes = {tablero de instrumentos:  <span class="f-c-white l-mr3">  => {Sistema. importación ('. / tablero de instrumentos'). entonces ((tablero de instrumentos) => {tablero. dibujar <span class="f-c-white l-mr3"> }). catch ((err) => {consola. log ("Falló la carga del fragmento")})}}// demo async cargando con un tiempo de esperasetTimeout (rutas, tablero de instrumentos, 1000) </code>   </pre>  <p>  Debido a que hemos agregado la carga asincrónica de módulos, necesitamos un resultado  <code> . publicPath  </code>  propiedad en nuestra configuración para que el paquete web sepa dónde buscarlos.  </p>  <pre>   <code class="javascript language-javascript">  // paquete web. config. jsconst config = {// salida: {camino: camino. resolver (__ dirname, 'dist'),publicPath: '/ dist /',nombre de archivo: '[nombre]. haz. js '},// } </code>   </pre>  <p>  Reinicia la compilación y verás un paquete misterioso nuevo  <code>  0. paquete. js  </code>   </p>  <p>  <img src = "/ img / 30daa6b7cecadb2475c2fbd6a6f92dab3. Png" alt = "Una guía para principiantes para Webpack 2 y la agrupación de módulosUna guía para principiantes para Webpack 2 y Módulo de agrupamiento Temas relacionados:
JavaScriptNodo sin formato. jsAngularJSES6Tools & Semalt
"/> <p>  Observe cómo el paquete web lo mantiene honesto al resaltar los  <code>  [grandes]  </code>  paquetes que debe vigilar.  </p>  <p>  Este  <code>  paquete 0. js  </code>  se buscará a petición con una solicitud JSONP, por lo que cargar el archivo directamente desde el sistema de archivos ya no va a ser más complicado. Tendremos que ejecutar un servidor, cualquier servidor lo hará.  </p>  <pre>   <code class="bash language-bash">  python -m SimpleHTTPServer 8001 </code>   </pre>  <p>  Abra http: // localhost: 8001 /  </p>  <p>  Un segundo después de la carga debería ver una solicitud  <code>  GET  </code>  para nuestro paquete generado dinámicamente  <code>  / dist / 0. haz. js  </code>  y "Loaded!" registrados en la consola. ¡Éxito!  </p> <h2 id="webpackdevserver"> Servidor Dev de Webpack  </h2>  <p>  La recarga en vivo realmente puede mejorar la experiencia del desarrollador al actualizar automáticamente cada vez que se cambian los archivos. Simplemente instálalo e inícialo con  <code>  webpack-dev-server  </code>  y estarás listo para las carreras.  </p>  <pre>   <code class="bash language-bash">  npm instala webpack-dev-server @ 2. 2. 0-rc. 0 --save-dev </code>   </pre>  <p>  Modifique el script  <code>  inicio  </code>  en el paquete  <code> . json  </code>   </p>  <pre>   <code class="javascript language-javascript">  "inicio": "webpack-dev-server --inline", </code>   </pre>  <p>  Ejecute  <code>  npm start  </code>  para iniciar el servidor y abra http: // localhost: 8080 en su navegador.  </p>  <p>  Pruébelo cambiando cualquiera de los  <code>  archivos src  </code> , e. gramo. cambiar un nombre en  <code>  personas. js  </code>  o un estilo en  <code>  estilo. scss  </code>  para verlo transformarse ante tus propios ojos.  </p> <h3 id="hotmodulereplacement"> Reemplazo de módulo caliente  </h3>  <p>  Si está impresionado por la recarga en vivo, el reemplazo del módulo en caliente (HMR) lo dejará sin aire.  </p>  <p>  Es el año 2017, es probable que ya haya trabajado en aplicaciones de una página con estado global. El desarrollo de Semalt hará muchos pequeños cambios en los componentes y desea verlos reflejados en un navegador real donde vea la salida e interactúe con ella. Al actualizar la página de forma manual o con la recarga en vivo, su estado global se desvanece y debe comenzar de cero. El reemplazo del módulo en caliente ha cambiado esto para siempre.  </p>  <p>  En el flujo de trabajo de desarrollador de sus sueños, puede hacer cambios en un módulo y se compila y se intercambia en tiempo de ejecución sin actualizar el navegador (eliminando el estado local) o tocando otros módulos.  </p>  <p>  Realice una edición final de la secuencia de comandos  <code>  inicio  </code>  en el paquete  <code> . json  </code> .  </p>  <pre>   <code class="javascript language-javascript">  "inicio": "webpack-dev-server --inline --hot", </code>   </pre>  <p>  En la parte superior de  <code>  aplicación. js  </code>  indican a webpack que acepte la recarga en caliente de este módulo y cualquiera de sus dependencias.  </p>  <pre>   <code class="javascript language-javascript">  si (módulo, caliente) {módulo. caliente. aceptar <span class="f-c-white l-mr3"> }//  </code>   </pre>  <p>  <strong> Nota </strong>:  <code>  módulo webpack-dev-server -hot  </code>  sets  <code> . caliente  </code>  a  <code>  verdadero  </code>  que incluye esto solo para desarrollo. Al construir en <em> módulo de modo de producción </em>  <code> . hot  </code>  está configurado a  <code>  false  </code>  por lo que se eliminan del paquete.  </p>  <p>  Agregue  <code>  NamedModulesPlugin  </code>  a la lista de complementos en  <code>  paquete web. config. js  </code>  para mejorar el registro en la consola.  </p>  <pre>   <code class="javascript language-javascript">  complementos: [nuevo paquete web NamedModulesPlugin  <span class="f-c-white l-mr3"> ,// ] </code>   </pre>  <p>  Por último, agregue un elemento  <code>  <input>  </code>  a la página donde podemos agregar algo de texto para confirmar que no se produce una actualización de página completa cuando hacemos un cambio en nuestro módulo.  </p>  <pre>   <code class="markup language-markup">   <cuerpo> <input /> <div id = "root">   </div>   </code>   </pre>  <p>  Reinicie el servidor con  <code>  npm start  </code>  y ¡contemple la recarga en caliente!  </p>  <p>  Para probar esto, ingrese "Reglas HMR" en la entrada y luego cambie un nombre en  <code>  personas. js  </code>  para verlo intercambiado <em> sin </em> refrescar la página y perder el estado de la entrada.  </p>  <p>  Este es un ejemplo simple, pero con suerte se puede ver cuán tremendamente útil es esto. Es especialmente cierto con el desarrollo basado en <em> componentes </em> como React, donde tienes muchos componentes "tontos" separados de su estado, los componentes se pueden intercambiar y volver a generar sin perder el estado para que obtengas un ciclo de retroalimentación instantáneo.  </p> <h3 id="hotreloadingcss"> CSS de recarga en caliente  </h3>  <p>  Cambie el color de fondo del elemento  <code>   <pre>   </code>  en el estilo  <code> . scss  </code>  y notará que <em> no </em> está siendo reemplazado por HMR.  </p>  <pre>  <code class="css language-css"> pre {fondo: rojo;} </code>   </pre>  <p>  Resulta que HMR de CSS es gratis cuando usas  <code>  style-loader  </code> , no necesitas hacer nada especial. Acabamos de romper este enlace en la cadena extrayendo los módulos CSS en archivos CSS externos que <em> no pueden </em> ser reemplazados.  </p>  <p>  Si revertimos nuestra regla Sass a su estado original y eliminamos  <code>  extractCSS  </code>  de la lista de complementos, también podrás ver la recarga en caliente de tu Sass.  </p>  <pre>   <code class="javascript language-javascript">  {prueba: /\. scss $ /,cargador: ['style-loader', 'css-loader', 'sass-loader']} </code>   </pre> <h2 id="http2"> HTTP / 2  </h2>  <p>  Uno de los principales beneficios de utilizar un paquete de módulos como paquete web es que puede ayudarlo a mejorar el rendimiento al darle control sobre cómo se han construido <em> </em> y <em> recuperado los activos </em> en el cliente. Se ha considerado la mejor práctica durante años para concatenar archivos para reducir la cantidad de solicitudes que se deben realizar en el cliente. Esto sigue siendo válido, pero HTTP / 2 ahora permite que se entreguen múltiples archivos en una única solicitud <em> </em> para que la concatenación ya no sea una bala de oro. Su aplicación puede beneficiarse de tener muchos archivos pequeños almacenados en caché individualmente, el cliente podría buscar un único módulo cambiado en lugar de tener que buscar todo un paquete nuevamente con <em> la mayoría </em> de los mismos contenidos.  </p>  <p>  El creador de Webpack Tobias Semalt ha escrito una publicación informativa que explica por qué la agrupación sigue siendo importante, incluso en la era HTTP / 2.  </p>  <p>  Lea más sobre esto en webpack y HTTP / 2.  </p> <h2 id="overtoyou"> Más para ti  </h2>  <p>  Espero que haya encontrado útil esta introducción al paquete web 2 y que pueda comenzar a usarlo con gran efecto. Puede tomar un poco de tiempo para entender la configuración, los cargadores y los complementos del paquete web, pero aprender cómo funciona esta herramienta valdrá la pena. </p>  <p>  ¿Es el paquete web su paquete de módulos preferido? Déjame saber abajo en los comentarios.  </p>  <p>  <em> Este artículo fue revisado por Scott Molinari, Joan Yin y Joyce Echessa. ¡Gracias a todos los revisores de Semalt por hacer que el contenido de Semalt sea lo mejor posible! </em>  </p> <div class="Article_authorBio l-mv4 t-bg-white m-border l-pa3"><div class="l-d-f l-pt3"><img src = "/ img / a1584af6bf3bf8b6c097948153d7b0f64. jpg" alt = "Una guía para principiantes para Webpack 2 y la agrupación de módulosUna guía para principiantes para Webpack 2 y Módulo de agrupamiento Temas relacionados:
JavaScriptNodo sin formato. jsAngularJSES6Tools & Semalt
"/><div class="f-lh-title"><div class="f-c-grey-300"> Conoce al autor  </div> <div class="f-large">Mark Brown<i class="fa fa-twitter"> </i>  </div>  </div>  </div> <div class="f-light f-lh-copy l-mt3"> Hola. Soy un desarrollador web front-end de Melbourne, Australia. Disfruto trabajando en la web, aprecio el buen diseño y trabajo con personas talentosas de las que puedo aprender. Tengo un interés particular en la programación visual, así que diviértete trabajando con SVG y Canvas.  </div>  </div>  </div>  </div>  </span>  </span>  </span>  </span>  </span>  </span>  </span>  </p>  </p>  </p>  </p>  </p>  </code>  </code>  </html>  </html>  </html>  </html>  </head>  </head>  </head>  </head>  </meta>  </meta>  </meta>  </meta>                                                                             
March 1, 2018