Saya mencoba melakukan sesuatu dalam sebuah proyek yang saya tidak yakin apakah itu mungkin, saya dengan cara yang salah atau salah paham. Kami menggunakan webpack, dan idenya adalah untuk menyajikan lebih dari satu file html.
localhost: 8181 -> melayani index.html
localhost: 8181 / example.html -> melayani example.html
Saya mencoba melakukannya dengan menyetel beberapa titik masuk, mengikuti dokumentasinya :
Struktur foldernya adalah:
/
|- 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>
Ada yang tahu apa yang saya lakukan salah?
Terima kasih.
webpack
webpack-dev-server
miguelitomp.dll
sumber
sumber
Jawaban:
Lihat entrypoint sebagai root dari pohon yang mereferensikan banyak aset lain seperti modul javascript, gambar, template, dan sebagainya. Ketika Anda menentukan lebih dari satu entrypoint, pada dasarnya Anda membagi aset Anda menjadi apa yang disebut potongan agar tidak semua kode dan aset Anda dalam satu bundel tunggal.
Apa yang menurut saya ingin Anda capai adalah memiliki lebih dari satu "index.html" untuk aplikasi berbeda yang juga merujuk ke berbagai bagian aset Anda yang telah Anda tentukan dengan titik masuk Anda.
Menyalin file index.html atau bahkan membuat file dengan referensi ke entrypoint ini tidak ditangani oleh mekanisme entrypoint - sebaliknya. Pendekatan dasar untuk menangani halaman html adalah menggunakan
html-webpack-plugin
yang tidak hanya dapat menyalin file html tetapi juga memiliki mekanisme ekstensif untuk pembuatan template. Ini sangat membantu jika Anda ingin bundel Anda diakhiri dengan hash bundel yang cukup untuk menghindari masalah cache browser saat Anda memperbarui aplikasi Anda.Karena Anda telah menentukan pola nama karena
[id].bundle_[chunkhash].js
Anda tidak dapat lagi mereferensikan bundel javascript Andamain.bundle.js
karena akan disebut sesuatu sepertimain.bundle_73efb6da.js
.Silakan lihat di html-webpack-plugin . Sangat relevan untuk kasus penggunaan Anda:
Anda mungkin harus memiliki sesuatu seperti itu pada akhirnya (peringatan: tidak diuji)
Harap berhati-hati untuk mereferensikan nama entrypoint dalam larik chunks, jadi dalam contoh Anda ini seharusnya
exampleEntry
. Mungkin juga merupakan ide bagus untuk memindahkan templat Anda ke folder tertentu daripada menyimpannya langsung di dalam folder src root.Semoga ini membantu.
sumber
Untuk menggunakan Beberapa file HTML dalam
Webpack
menggunakan 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) };
Anda dapat menambahkan halaman HTML sebanyak yang diperlukan ke
htmlPageNames
array. Pastikan bahwa setiap HTML dan file JS yang sesuai memiliki nama yang sama (Kode di atas mengasumsikan demikian).sumber
Anda juga dapat menggunakan Plugin Copy Webpack jika Anda tidak memerlukan dua build yang berbeda, misalnya, dengan asumsi Anda hanya ingin menyajikan HTML yang berbeda dengan yang sama
main.bundle.js
.Plugin ini sangat sederhana (hanya diuji di webpack v4):
Kemudian
example.html
Anda dapat memuat build dariindex.html
. Misalnya:sumber
Ada solusi lain, dengan asumsi Webpack ^ 4.44.1. Artinya, mengimpor HTML di aplikasi JS / TS Anda.
Contoh webpack.config.js
Aplikasi yang sesuai
index.ejs
about.html
Webpack akan menyalin about.html ke folder keluaran yang sesuai .
sumber
Kode ini akan membantu jika Anda memiliki banyak template :)
sumber