Próbuję zrobić coś w projekcie, co do czego nie jestem pewien, czy jest to możliwe, popełniam błąd lub coś nie rozumiem. Używamy webpacka, a pomysł polega na tym, aby obsługiwać więcej niż jeden plik html.
localhost: 8181 -> obsługuje index.html
localhost: 8181 / example.html -> serwuje example.html
Próbuję to zrobić, ustawiając wiele punktów wejścia, postępując zgodnie z dokumentacją :
Struktura folderów jest następująca:
/
|- 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>
example.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>
Ktoś wie, co robię źle?
Dziękuję Ci.
webpack
webpack-dev-server
miguelitomp
źródło
źródło
Odpowiedzi:
Zobacz punkt wejścia jako podstawę drzewa, które odwołuje się do wielu innych zasobów, takich jak moduły javascript, obrazy, szablony i tak dalej. Kiedy definiujesz więcej niż jeden punkt wejścia, zasadniczo dzielisz swoje zasoby na tak zwane części, aby nie mieć całego kodu i zasobów w jednym pakiecie.
Myślę, że chcesz osiągnąć więcej niż jeden plik „index.html” dla różnych aplikacji, które również odnoszą się do różnych fragmentów zasobów, które zostały już zdefiniowane w punktach wejścia.
Kopiowanie pliku index.html lub nawet generowanie takiego z odniesieniami do tych punktów wejściowych nie jest obsługiwane przez mechanizm punktów wejściowych - jest odwrotnie. Podstawowym podejściem do obsługi stron html jest użycie narzędzia,
html-webpack-plugin
które nie tylko może kopiować pliki html, ale także ma rozbudowany mechanizm tworzenia szablonów. Jest to szczególnie przydatne, jeśli chcesz, aby Twoje pakiety miały sufiks z hashem pakietu, który jest ładny, aby uniknąć problemów z pamięcią podręczną przeglądarki podczas aktualizacji aplikacji.Ponieważ zdefiniowałeś wzorzec nazwy,
[id].bundle_[chunkhash].js
nie możesz już odwoływać się do pakietu javascript,main.bundle.js
ponieważ będzie on nazywany czymś w rodzajumain.bundle_73efb6da.js
.Spójrz na wtyczkę html-webpack-plugin . Szczególnie istotne dla twojego przypadku użycia:
Prawdopodobnie powinieneś mieć coś takiego na końcu (uwaga: nie testowane)
Pamiętaj, aby odwołać się do nazwy punktu wejścia w tablicy chunks, więc w Twoim przykładzie powinno to być
exampleEntry
. Prawdopodobnie dobrym pomysłem jest również przeniesienie szablonów do określonego folderu zamiast umieszczania ich bezpośrednio w głównym folderze src.Mam nadzieję że to pomoże.
źródło
Możesz także użyć wtyczki Copy Webpack, jeśli nie potrzebujesz dwóch różnych kompilacji, tj. Zakładając, że chcesz po prostu obsługiwać inny kod HTML z tym samym
main.bundle.js
.Wtyczka jest naprawdę prosta (testowana tylko w pakiecie webpack v4):
Następnie
example.html
możesz załadować kompilację zindex.html
. Na przykład:źródło
Aby użyć wielu plików HTML
Webpack
przy użyciu 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) };
Możesz dodać dowolną liczbę stron HTML do
htmlPageNames
tablicy. Upewnij się, że każdy plik HTML i odpowiadający mu plik JS mają taką samą nazwę (zakłada to powyższy kod).źródło
Istnieje inne rozwiązanie, zakładając Webpack ^ 4.44.1. Oznacza to importowanie kodu HTML do aplikacji JS / TS.
Przykładowy plik webpack.config.js
Odpowiednia aplikacja
index.ejs
about.html
Webpack skopiuje about.html do odpowiedniego folderu wyjściowego .
źródło
Ten kod pomógłby, gdybyś miał dużo szablonów :)
źródło