Estou tentando fazer algo em um projeto que não tenho certeza se é possível, estou errado ou entendendo algo errado. Estamos usando o webpack e a ideia é servir mais de um arquivo html.
localhost: 8181 -> atende index.html
localhost: 8181 / example.html -> atende example.html
Estou tentando fazer isso definindo vários pontos de entrada, seguindo a documentação :
A estrutura da pasta é:
/
|- 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>
exemplo.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>
Alguém sabe o que estou fazendo de errado?
Obrigado.
webpack
webpack-dev-server
miguelitomp
fonte
fonte
Respostas:
Veja um ponto de entrada como a raiz de uma árvore que faz referência a muitos outros ativos, como módulos javascript, imagens, modelos e assim por diante. Quando você define mais de um ponto de entrada, basicamente divide seus ativos nos chamados blocos para não ter todo o seu código e ativos em um único pacote.
O que eu acho que você deseja alcançar é ter mais de um "index.html" para diferentes aplicativos que também se referem a diferentes partes de seus ativos que você já definiu com seus pontos de entrada.
Copiar um arquivo index.html ou mesmo gerar um com referências a esses pontos de entrada não é tratado pelo mecanismo de ponto de entrada - é o contrário. Uma abordagem básica para lidar com páginas html é usar o,
html-webpack-plugin
que não só pode copiar arquivos html, mas também tem um mecanismo extenso para modelagem. Isso é especialmente útil se você quiser que seus bundles tenham um sufixo de hash de bundle que seja bonito para evitar problemas de cache do navegador ao atualizar seu aplicativo.Como você definiu um padrão de nome, já
[id].bundle_[chunkhash].js
não pode fazer referência ao seu pacote javascript,main.bundle.js
pois ele será chamado de algo semelhantemain.bundle_73efb6da.js
.Dê uma olhada no plugin html-webpack . Especialmente relevante para o seu caso de uso:
Você provavelmente deve ter algo assim no final (aviso: não testado)
Esteja ciente de fazer referência ao nome do ponto de entrada na matriz de blocos, portanto, em seu exemplo deve ser
exampleEntry
. Provavelmente, também é uma boa ideia mover seus modelos para uma pasta específica em vez de colocá-los diretamente na pasta raiz src.Espero que isto ajude.
fonte
Você também pode usar o Copy Webpack Plugin se não precisar de duas compilações diferentes, ou seja, assumindo que deseja apenas servir um HTML diferente com o mesmo
main.bundle.js
.O plugin é realmente muito simples (testado apenas no webpack v4):
Em seguida,
example.html
você pode carregar a compilaçãoindex.html
. Por exemplo:fonte
Para usar vários arquivos HTML ao
Webpack
usar 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) };
Você pode adicionar quantas páginas HTML forem necessárias ao
htmlPageNames
array. Certifique-se de que cada HTML e arquivo JS correspondente tenham o mesmo nome (o código acima assume isso).fonte
Existe outra solução, assumindo Webpack ^ 4.44.1. Ou seja, importando o HTML em seu aplicativo JS / TS.
Amostra de webpack.config.js
App correspondente
index.ejs
about.html
Webpack copiará about.html para a pasta de saída correspondente .
fonte
Este código ajudaria se você tiver muitos modelos :)
fonte