English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Explicación detallada de webpack+Desarrollo de sitios web multipágina con express

Después de aprender el tutorial de nivel de puerta de entrada de webpack, pienso que es especialmente diseñado para aplicaciones de una página, por ejemplo, webpack+react, webpack+vue, etc., pueden resolver varios problemas de carga y empacado de dependencias de recursos. Incluso css se empaca en js y se agrega dinámicamente al documento DOM.

Entonces, si queremos un sitio web web común de múltiples páginas, css separado, js cargado con módulos?

Dirección del proyecto:webpackDemo_jb51.rar

Inicialización del proyecto, instalación de dependencias

package.json

"devDependencies": {
  "css-loader": "^0.23.1",
  "extract-texto-webpack-plugin": "^1.0.1",
  "file-loader": "^0.8.5",
  "html-loader": "^0.4.3",
  "html-webpack-plugin": "^2.9.0",
  "jquery": "^1.12.0",
  "less": "^2.6.0",
  "less-loader": "^2.2.2",
  "sass-loader": "^4.0.2",
  "style-loader": "^0.13.0",
  "url-loader": "^0.5.7",
  "webpack": "^1.12.13",
  "webpack-dev-server": "^1.14.1"
}

Estructura de directorio (uso el framework express, otros según las necesidades personales)

- webpackDemo
  - src        #Directorio de desarrollo de código
    - css      #Directorio css, organizado en tres niveles: página (módulo), común y tercero
      + page
      + common
      + lib
    - js       #Scripts de JS, organizados según page y components
      + page
      + components
    + template      #Plantilla HTML
  - node_modules    #Módulos de nodejs utilizados
  - public            #Archivos estáticos de express
    - dist            #Directorio de salida de compilación y empacado de webpack, no es necesario crear el directorio, se puede generar automáticamente según la configuración de webpack
      + css        
      + js
    + img      #Recursos de imágenes
  + view            #Archivos estáticos de express (salida de compilación y empacado de webpack en el directorio view)
  package.json      #Configuración del proyecto
  webpack.config.js  #Configuración de webpack

Desarrollo de página

En src/js/Crear un archivo index.js en el directorio page, en src/Crear un archivo index.html en el directorio view. El nombre del archivo JS de entrada y el nombre del archivo de plantilla deben coincidir.

El contenido de index.html es el siguiente:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8>
  <title>Inicio</title>
  <!--
    Descripción: No es necesario introducir css ni facicon en el head, webpack realizará la carga necesaria o generará etiquetas style según los requisitos del archivo JS de entrada.
  -->
</head>
<body>
  <!--
    Descripción: No es necesario introducir archivos JS individuales en el body, webpack realizará la carga necesaria o generará etiquetas script según el archivo JS de entrada.
  -->
</body>
</html>

Es solo una plantilla HTML simple, sin necesidad de introducir CSS y JS, al paquetizar con webpack se puede cargar automáticamente.

El contenido de index.js es el siguiente:

//Introducir css
require("../../css/lib/base.css");
require("../../css/page/index.scss");
$('body').append('<p class="text">index</p>');

page1.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8>
  <title>page1</title>
</head>
<body>
</body>
</html>

page1.js:

//Introducir css
require("../../css/lib/base.css");
require("../../css/page/page1.less");
$('body').html('page1');

Configuración de webpack (uso el framework express, otros según las necesidades personales)

var path = require('path');
var webpack = require('webpack');
/*
extract-texto-webpack-plugin,
Con él puede extraer sus estilos a archivos css separados.
La mamá ya no tiene que preocuparse de que los estilos se empaqueten en archivos js.
 */
var ExtractTextPlugin = require('extract-texto-webpack-plugin');
/*
html-webpack-plugin, un plugin esencial en webpack para generar HTML
Puede verlo aquí https://www.npmjs.com/paquete/html-webpack-plugin
 */
var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
  entry: { //Configurar el archivo de entrada, escriba cuántos hay
    index: './src/js/page/index.js',
    page1: './src/js/page/page1.js'
  },
  salida: { 
    ruta: path.join(__dirname, './public/dist/'), //configuración de directorio de salida, la configuración de rutas para recursos como plantillas, estilos, scripts, imágenes, etc. se refiere a él
    publicPath: '"/dist/',        //ruta del servidor para recursos como plantillas, estilos, scripts, imágenes, etc.
    ruta: 'js/[name].js',      //configuración generada para el js principal de cada página
    chunkFilename: 'js/[id].chunk.js'  //configuración generada por chunk
  },
  módulo: {
    cargadores: [ //Loader, sobre la configuración de parámetros de cada loader, puedes buscarlo por tu cuenta.
      {
        test: /.css$/,
        //Configurar el extractor y el loader de css.'-loader' puede omitirse
        loader: ExtractTextPlugin.extract('style-loader', 'css-loader) 
      
        test: /.less$/,
        //Configurar el extractor y el loader de less. ¡Es necesario explicar el punto medio!
        //Llamar sucesivamente loaders de less, css de derecha a izquierda en el orden, la salida del anterior es la entrada del siguiente
        //También puedes desarrollar tu propio loader. La forma de escribir loader se puede buscar en Google.
        loader: ExtractTextPlugin.extract('css!less')
      
        test: /\.scss$/,
        //Configurar el extractor y el loader de scss. ¡Es necesario explicar el punto medio!
        //Llamar sucesivamente loaders de scss, css de derecha a izquierda en el orden, la salida del anterior es la entrada del siguiente
        //También puedes desarrollar tu propio loader. La forma de escribir loader se puede buscar en Google.
        loader: ExtractTextPlugin.extract('css!scss')
      
        //Cargador de plantillas HTML, capaz de procesar recursos estáticos referenciados, configuración de parámetros predeterminada attrs=img:src, procesando recursos de referencias de src de imágenes
        //Por ejemplo, si configuras, attrs=img:src img:data-src se puede procesar junto con data-Recursos citados en src, como se muestra a continuación
        test: /.html$/,
        loader: "html?attrs=img:src img:data-src"
      
        //Cargador de archivos, procesar recursos estáticos
        test: /\.(woff|woff2|ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
        loader: 'file-loader?name=./fonts/[name].[ext]
      
        //Cargador de imágenes, similar a file-Cargador de imágenes, similar a file64,reducir las solicitudes http
        //La siguiente configuración, convertirá las imágenes inferiores a8192Convertir imágenes de byte a base64Código
        test: /\.(png|jpg|gif)$/,
        loader: 'url-loader?limit=8192&name=./img/[hash].[ext]'
      }
    ]),
  },
  plugins: [
    new webpack.ProvidePlugin({ //cargar jq
      $: 'jquery'
    }),
    new webpack.optimize.CommonsChunkPlugin({
      name: 'commons', // extraer módulos comunes, generar chunk llamado `commons`
      chunks: ['index','page1'], //Extraer las partes comunes de qué módulos
      minChunks: 2 // Extraer al menos2Partes comunes de varios módulos
    }),
    new ExtractTextPlugin('css/[name].css'), //usar la etiqueta link para cargar css y configurar la ruta, relativa a la configuración de publickPath en la salida
    //HtmlWebpackPlugin, configuraciones relacionadas con la generación de plantillas, cada una para una configuración de página, cuántas escribas, cuántas
    new HtmlWebpackPlugin({ //Insertar css según el plantilla/Generar el HTML final con js, css, etc.
      favicon: '.',/src/favicon.ico', //ruta del favicon, se introduce a través de webpack y se puede generar un valor de hash
      filename: '../../views/index.html', //ruta de almacenamiento del html generado, relativa a path
      template: '.',/src/template/index.html', //ruta del archivo de plantilla html
      inject: 'body', //ubicación de inserción de js, true/'head'/'body'/false
      hash: true, //Generar valores de hash para los recursos estáticos
      chunks: ['commons', 'index'],//Los chunks que se necesitan importar, si no se configuran, se importarán todos los recursos de la página.
      minify: { //Comprimir el archivo HTML  
        removeComments: true, //Remover los comentarios del HTML
        collapseWhitespace: false //eliminar los espacios en blanco y los saltos de línea
      }
    }),
    new HtmlWebpackPlugin({ //Insertar css según el plantilla/Generar el HTML final con js, css, etc.
      favicon: '.',/src/favicon.ico', //ruta del favicon, se introduce a través de webpack y se puede generar un valor de hash
      filename: '../../views/page1.html', //ruta de almacenamiento del html generado, relativa a path
      template: '.',/src/template/page1.html', //ruta del archivo de plantilla html
      inject: true, //ubicación de inserción de js, true/'head'/'body'/false
      hash: true, //Generar valores de hash para los recursos estáticos
      chunks: ['commons', 'list'],//Los chunks que se necesitan importar, si no se configuran, se importarán todos los recursos de la página.
      minify: { //Comprimir el archivo HTML  
        removeComments: true, //Remover los comentarios del HTML
        collapseWhitespace: false //eliminar los espacios en blanco y los saltos de línea
      }
    }
    // new webpack.HotModuleReplacementPlugin(), //Carga caliente
  ],
  //Usar webpack-dev-server, para mejorar la eficiencia del desarrollo
  // devServer: {
  //   contentBase: '.',/',
  //   host: 'localhost',
  //   puerto: 9090, //Por defecto8080
  //   inline: true, //Se puede monitorear el cambio de js
  //   hot: true, //Reinicio caliente
  // }
};

Bueno, después de configurar los siguientes ajustes, ejecuta la orden de empaque de webpack para completar el empaque del proyecto.

Hash: e6219853995506fd132a
Version: webpack 1.14.0
Time: 1338ms
        Asset    Size Chunks       Chunk Names
     js/index.js 457 bytes    0 [emitted] index
     js/page1.js 392 bytes    1 [emitted] página1
    js/commons.js   306 kB    2 [emitted] commons
    css/index.css  62 bytes    0 [emitted] index
    css/page1.css  62 bytes    1 [emitted] página1
   css/commons.css 803 bytes    2 [emitted] commons
     favicon.ico  1.15 kB     [emitted]
../../view/index.html 496 bytes     [emitted]
../../view/page1.html 499 bytes     [emitted]
  [0] ./src/js/page/index.js 170 bytes {0} [built]
  [0] ./src/js/page/page1.js 106 bytes {1} [built]
  + 7 módulos ocultos
Child html-webpack-plugin for "../../view/page1.html":
    + 1 módulos ocultos
Child html-webpack-plugin for "../../view/index.html":
    + 1 módulos ocultos
Child extract-texto-webpack-plugin:
    + 2 módulos ocultos
Child extract-texto-webpack-plugin:
    + 2 módulos ocultos
Child extract-texto-webpack-plugin:
    + 2 módulos ocultos

En este momento, vaya al directorio views para ver el archivo index.html generado, como se muestra a continuación:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8>
  <title>Inicio</title>  
<link rel="shortcut icon" href="/dist/favicon.ico" rel="external nofollow" ><link href="/dist/css/commons.css?e6219853995506fd132a" rel="external nofollow" rel="stylesheet"><link href="/dist/css/index.css?e6219853995506fd132a" rel="external nofollow" rel="stylesheet"></head>
<body>
  <script type="text/javascript" src="/dist/js/commons.js?e6219853995506fd132a"></script><script type="text/javascript" src="/dist/js/index.js?e6219853995506fd132a"></script></body>
</html>

Se puede ver que los archivos generados, además de conservar el contenido del plantilla original, también agregan automáticamente los archivos CSS y JS que deben ser incluidos según la definición del archivo de entrada index.js, así como el favicon, y también agregan el valor de hash correspondiente.

Dos preguntas

  1. ¿Cómo detecta webpack automáticamente el archivo entry y realiza la configuración de plantilla correspondiente?
  2. Cómo manejar directamente problemas de inclusión automática de estilos y scripts
var path = require('path');
var webpack = require('webpack');
var glob = require('glob');
/*
extract-texto-webpack-plugin,
Con él puede extraer sus estilos a archivos css separados.
La mamá ya no tiene que preocuparse de que los estilos se empaqueten en archivos js.
 */
var ExtractTextPlugin = require('extract-texto-webpack-plugin');
/*
html-webpack-plugin, un plugin esencial en webpack para generar HTML
Puede verlo aquí https://www.npmjs.com/paquete/html-webpack-plugin
 */
var HtmlWebpackPlugin = require('html-webpack-plugin');
/**
 *extraer módulos comunes, generar chunk llamado `commons`
 */
var CommonsChunkPlugin = webpack.optimize.CommonsChunkPlugin;
//Compresión
var UglifyJsPlugin = webpack.optimize.UglifyJsPlugin;
//Determinar el modo de desarrollo
var debug = process.env.NODE_ENV !== 'production';
var getEntry = function(globPath, pathDir) {
  var files = glob.sync(globPath);
  var entries = {},
    entry, dirname, basename, pathname, extname;
  for (var i = 0; i < files.length; i++) {
    entry = files[i];
    dirname = path.dirname(entry);  //Directorio del archivo
    extname = path.extname(entry);  //Nombre de la extensión
    basename = path.basename(entry, extname); //Nombre del archivo
    pathname = path.join(dirname, basename);
    63; pathname.replace(new RegExp('^', '')), + pathDir, '') : pathname;
    entradas[pathname] = ['./ + entry]; //así se escribe en sistemas osx, win7 entradas[basename]
  }
  console.log(entradas);
  return entradas;
}
//puntos de entrada (obtenidos mediante el método getEntry)
var entradas = getEntry('src/js/page/**/*.js', 'src/js/page/');
//extraer partes comunes de módulos desde entradas para obtener nombres de archivos
var trozos = Object.keys(entradas);
//páginas de plantilla (obtenidas mediante el método getEntry)
var páginas = Object.keys(getEntry('src/template/**/*.html', 'src/template/'));
console.log(páginas)
var configuración = {
  entrada: entradas,
  salida: {
    ruta: path.join(__dirname, './public/dist/'),//configuración de directorio de salida, la configuración de rutas para recursos como plantillas, estilos, scripts, imágenes, etc. se refiere a él
    publicPath: '"/dist/',        //ruta del servidor para recursos como plantillas, estilos, scripts, imágenes, etc.
    ruta: 'js/[name].js',      //configuración generada para el js principal de cada página
    chunkFilename: 'js/[id].chunk.js?[chunkhash]'  //configuración generada por chunk
  },
  módulo: {
    cargadores: [ //cargador
      {
        test: /.css$/,
        loader: ExtractTextPlugin.extract('style', 'css')
      
        test: /.less$/,
        loader: ExtractTextPlugin.extract('css!less')
      
        test: /.html$/,
        loader: "html?-minimizar"  //evitar la compresión de html,https://github.com/webpack/html-loader/issues/50
      
        test: /\.(woff|woff2|ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
        loader: 'file-loader?name=fonts/[name].[ext]
      
        test: /\.(png|jpe?g|gif)$/,
        loader: 'url-loader?limit=8192&name=imgs/[name]-[hash].[ext]'
      }
    ]),
  },
  plugins: [
    new webpack.ProvidePlugin({ //cargar jq
      $: 'jquery'
    }),
    new CommonsChunkPlugin({
      name: 'commons', // extraer módulos comunes, generar chunk llamado `commons`
      chunks: chunks,
      minChunks: chunks.length // extraer todos los módulos dependientes comunes de la entrada
    }),
    new ExtractTextPlugin('css/[name].css'), //usar la etiqueta link para cargar css y configurar la ruta, relativa a la configuración de publickPath en la salida
    debug ? function() {} : new UglifyJsPlugin({ //comprimir código
      compress: {
        warnings: false
      },
      except: ['$super', '$', 'exports', 'require'] //palabras clave a excluir
    }),
  ]),
};
pages.forEach(function(pathname) {
  var conf = {
    filename: '../../views/ + pathname + '.html', //ruta de almacenamiento del html generado, relativa a path
    template: 'src/template/ + pathname + '.html', //ruta del archivo de plantilla html
    inject: false, //ubicación de inserción de js, true/'head'/'body'/false
    /*
    * En este bloque de compresión, se llamó a html-minify, causará muchos problemas de verificación de sintaxis html durante la compresión,
    * Si se utilizan expresiones {{...}} en las propiedades de etiquetas html, por lo que en muchos casos no es necesario configurar el item de compresión aquí,
    * Además, UglifyJsPlugin comprimirá el html junto con el código en el proceso de compresión.
    * Para evitar la compresión del html, es necesario configurar en html-Configurar 'html?-minimize' en loaders de html-Configuración del loader.
     */
    // minify: { //Comprimir el archivo HTML
    // removeComments: true, //Remover los comentarios del HTML
    // collapseWhitespace: false //eliminar los espacios en blanco y los saltos de línea
    // }
  };
  if (pathname in config.entry) {
    favicon: '.',/src/favicon.ico', //ruta del favicon, se introduce a través de webpack y se puede generar un valor de hash
    conf.inject = 'body';
    conf.chunks = ['commons', pathname];
    conf.hash = true;
  }
  config.plugins.push(new HtmlWebpackPlugin(conf));
});
module.exports = config;  

El código siguiente es más o menos igual, la diferencia esencial es que se coloca todos los archivos relacionados en un objeto a través de un método, lo que completa el efecto de importación automática!

la configuración anterior es para el sistema operativo mac osx, win7la ruta puede ser diferente

glob: aquí, la interpretación obtenida es diferente:

pero se requiere finalmente

entries:
 {
 index: ['./src/template/index.js'],
 page1: ['./src/template/page1.js']
 }
pages:
 ['index', 'page'1']'

Debe modificarse según la configuración de su computadora personal

Esto es todo el contenido de este artículo, espero que sea útil para su aprendizaje y que todos nos apoyen en el tutorial de alarido.

Declaración: el contenido de este artículo se obtiene de la red, es propiedad del autor original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha editado artificialmente y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará