Estoy tratando de hacer algo en un proyecto que no estoy seguro de que sea posible, estoy equivocado o estoy entendiendo mal algo. Estamos usando webpack y la idea es servir más de un archivo html.
localhost: 8181 -> sirve index.html
localhost: 8181 / example.html -> sirve example.html
Estoy tratando de hacerlo estableciendo múltiples puntos de entrada, siguiendo la documentación :
La estructura de carpetas es:
/
|- package.json
|- webpack.config.js
/src
|- index.html
|- example.html
| /js
|- main.js
|- example.js
Webpack.config.js:
...
entry: {
main: './js/main.js',
exampleEntry: './js/example.js'
},
output: {
path: path.resolve(__dirname, 'build', 'target'),
publicPath: '/',
filename: '[name].bundle.js',
chunkFilename: '[id].bundle_[chunkhash].js',
sourceMapFilename: '[file].map'
},
...
index.html
<!DOCTYPE html>
<html
<head>
...
<link type="text/css" href="https://stackoverflow.com/style/default.css">
</head>
<body>
<div id="container"></div>
<script src="/main.bundle.js"></script>
</body>
</html>
ejemplo.html:
<!DOCTYPE html>
<html
<head>
...
<link type="text/css" href="https://stackoverflow.com/style/default.css">
</head>
<body>
...
<script src="/example.bundle.js"></script>
</body>
</html>
¿Alguien sabe lo que estoy haciendo mal?
Gracias.
webpack
webpack-dev-server
miguelitomp
fuente
fuente
Respuestas:
Vea un punto de entrada como la raíz de un árbol que hace referencia a muchos otros activos, como módulos de JavaScript, imágenes, plantillas, etc. Cuando define más de un punto de entrada, básicamente divide sus activos en los llamados fragmentos para no tener todo su código y activos en un solo paquete.
Lo que creo que desea lograr es tener más de un "index.html" para diferentes aplicaciones que también se refieran a diferentes partes de sus activos que ya definió con sus puntos de entrada.
Copiar un archivo index.html o incluso generar uno con referencias a estos puntos de entrada no se maneja mediante el mecanismo de punto de entrada, es al revés. Un enfoque básico para manejar páginas html es usar el
html-webpack-plugin
que no solo puede copiar archivos html sino que también tiene un extenso mecanismo para crear plantillas. Esto es especialmente útil si desea que sus paquetes tengan un sufijo con un hash de paquete que sea bonito para evitar problemas de almacenamiento en caché del navegador cuando actualice su aplicación.Como ha definido un patrón de nombre, ya
[id].bundle_[chunkhash].js
no puede hacer referencia a su paquete de javascript,main.bundle.js
ya que se llamará algo así comomain.bundle_73efb6da.js
.Eche un vistazo al html-webpack-plugin . Especialmente relevante para su caso de uso:
Probablemente deberías tener algo así al final (advertencia: no probado)
Tenga en cuenta que debe hacer referencia al nombre del punto de entrada en la matriz de fragmentos, por lo que en su ejemplo debería ser así
exampleEntry
. Probablemente también sea una buena idea mover sus plantillas a una carpeta específica en lugar de tenerlas directamente dentro de la carpeta raíz src.Espero que esto ayude.
fuente
También puede usar Copy Webpack Plugin si no necesita dos compilaciones diferentes, es decir, asumiendo que solo desea servir un HTML diferente con el mismo
main.bundle.js
.El complemento es realmente simple (solo probado en webpack v4):
Luego
example.html
, puede cargar la compilación desdeindex.html
. P.ej:fuente
Para utilizar varios archivos HTML en el
Webpack
uso de HtmlWebpackPlugin :const HtmlWebpackPlugin = require('html-webpack-plugin'); let htmlPageNames = ['example1', 'example2', 'example3', 'example4']; let multipleHtmlPlugins = htmlPageNames.map(name => { return new HtmlWebpackPlugin({ template: `./src/${name}.html`, // relative path to the HTML files filename: `${name}.html`, // output HTML files chunks: [`${name}`] // respective JS files }) }); module.exports = { entry: { main: './js/main.js', example1: './js/example1.js', //... repeat until example 4 }, module: { //.. your rules }; plugins: [ new HtmlWebpackPlugin({ template: "./src/index.html", chunks: ['main'] }) ].concat(multipleHtmlPlugins) };
Puede agregar tantas páginas HTML como sea necesario a la
htmlPageNames
matriz. Asegúrese de que cada HTML y el archivo JS correspondiente tengan el mismo nombre (el código anterior asume eso).fuente
Hay otra solución, asumiendo Webpack ^ 4.44.1. Es decir, importar el HTML en su aplicación JS / TS.
Ejemplo de webpack.config.js
Aplicación correspondiente
index.ejs
about.html
Webpack copiará about.html en la carpeta de salida correspondiente .
fuente
Este código ayudaría si tiene muchas plantillas :)
fuente