Saya menggunakan paket web dengan HtmlWebpackPlugin
, html-loader
dan file-loader
. Saya memiliki struktur proyek sederhana di mana saya tidak menggunakan kerangka kerja, tetapi hanya naskah. Jadi, saya menulis kode HTML saya langsung ke index.html
. Saya juga menggunakan file HTML ini sebagai templat saya di HtmlWebpackPlugin
.
Karena semua situs web harus saya masukkan gambar yang merujuk ke PNG di folder aset saya. file-loader
harus memuat file dengan benar memasukkan nama file baru di dalam src
tag tetapi bukan itu yang terjadi. Sebagai gantinya, sebagai nilai src
tag, saya punya [object Module]
. Saya menganggap file-loader
memancarkan beberapa objek dan diwakili seperti ini ketika .toString()
metodenya dijalankan. Namun, saya dapat melihat bahwa file-loader
file telah diproses dengan sukses dan dipancarkan dengan nama baru ke jalur output. Saya tidak mendapatkan kesalahan. Ini adalah konfigurasi webpack saya dan index.html
.
const projectRoot = path.resolve(__dirname, '..');
{
entry: path.resolve(projectRoot, 'src', 'app.ts'),
mode: 'production',
output: {
path: path.resolve(projectRoot, 'dist'),
filename: 'app.bundle.js'
},
resolve: {
extensions: ['.ts', '.js']
},
module: {
rules: [
{
test: /\.html$/i,
use: 'html-loader'
},
{
test: /\.(eot|ttf|woff|woff2|svg|png)$/i,
use: 'file-loader'
},
{
test: /\.scss$/i,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
hmr: false
}
},
{
loader: 'css-loader',
options: {
sourceMap: false
}
},
{
loader: 'sass-loader',
options: {
sourceMap: false
}
}
]
},
{
exclude: /node_modules/,
test: /\.ts$/,
use: 'ts-loader'
}
]
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
template: path.resolve(projectRoot, 'src', 'index.html')
}),
new MiniCssExtractPlugin({
filename: '[name].[hash].css',
chunkFilename: '[id].[hash].css',
ignoreOrder: false
})
]
};
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
</head>
<body class="dark">
<header>
<nav class="navigation">
<div class="left">
<img src="assets/logo.png" class="logo"> <!-- This logo is output as [object Module] -->
</div>
<div class="right">
</div>
</nav>
</header>
</body>
</html>
Struktur proyek:
config/
webpack.config.js
dist/
src/
styles/
assets/
logo.png
index.html
app.ts
Edit dependensi package.json saya:
"clean-webpack-plugin": "^3.0.0",
"css-loader": "^3.2.0",
"file-loader": "^5.0.2",
"html-webpack-plugin": "^3.2.0",
"mini-css-extract-plugin": "^0.8.0",
"node-sass": "^4.13.0",
"sass-loader": "^8.0.0",
"style-loader": "^1.0.0",
"ts-loader": "^6.2.1",
"typescript": "^3.7.2",
"webpack": "^4.41.2",
"webpack-cli": "^3.3.10",
"webpack-dev-server": "^3.9.0"
sumber
Angular 8
keAngular 9
yang dibawafile-loader
dari versi4.2.0
ke6.0.0
. Menggunakannyarequire(...).default
untuk saya.@ stellr42 menyarankan perbaikan
esModule: false
dalamfile-loader
konfigurasi Anda adalah solusi terbaik saat ini.Namun, ini sebenarnya adalah bug
html-loader
yang sedang dilacak di sini: https://github.com/webpack-contrib/html-loader/issues/203Sepertinya dukungan ES Modul telah ditambahkan ke
file-loader
,css-loader
dan teman-teman lain, tapihtml-loader
itu tidak terjawab.Setelah bug ini diperbaiki, akan lebih baik untuk menghapus
esModule: false
dan hanya memutakhirkanhtml-loader
, karena Modul ES menawarkan beberapa manfaat kecil (seperti yang disebutkan dalam dokumen )Atau, jika (seperti saya), Anda menemukan masalah ini karena Anda mengalami masalah saat memuat gambar dari CSS (bukan dari HTML), maka perbaikannya hanya untuk memutakhirkan
css-loader
, tidak perlu menonaktifkan Modul ES.sumber
Ini terjadi pada file-loader versi 5.0.2, versi sebelumnya berfungsi dengan baik tanpa memanggil
default
propertisumber
Baru saja memperbarui pemuat file saya ke ^ 5.0.2 menit yang lalu.
Saya tahu
esModule: false
adalah perbaikan yang disarankan tetapi tidak berhasil untuk saya.Perbaikan saya adalah
<img src={require('assets/logo.png').default}/>
yang aneh. Pertama kali menggunakan.default
tetapi berhasil.sumber