Estoy usando webpack con HtmlWebpackPlugin
, html-loader
y file-loader
. Tengo una estructura de proyecto simple en la que no uso marcos, sino solo mecanografiado. Por lo tanto, escribo mi código HTML directamente en index.html
. También uso este archivo HTML como mi plantilla HtmlWebpackPlugin
.
Como todos los sitios web, necesito poner una imagen que haga referencia a PNG en mi carpeta de activos. file-loader
debe cargar el archivo correctamente, poner el nuevo nombre de archivo dentro de la src
etiqueta, pero eso no es lo que está sucediendo. En cambio, como el valor de la src
etiqueta, tengo [object Module]
. Supongo que file-loader
emite algún objeto y se representa así cuando .toString()
se ejecuta su método. Sin embargo, puedo ver que file-loader
ha procesado el archivo con éxito y emitió un nuevo nombre a la ruta de salida. No consigo errores. Aquí está mi configuración de paquete web y 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>
Estructura del proyecto:
config/
webpack.config.js
dist/
src/
styles/
assets/
logo.png
index.html
app.ts
Editar mis dependencias package.json:
"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"
fuente
Angular 8
aAngular 9
como eso trajofile-loader
de la versión4.2.0
a6.0.0
. El uso lorequire(...).default
arregló para mí.La solución sugerida de @ stellr42
esModule: false
en sufile-loader
configuración es la mejor solución en este momento.Sin embargo, esto es realmente un error en el
html-loader
que se está rastreando aquí: https://github.com/webpack-contrib/html-loader/issues/203Parece que el apoyo ES módulo se añadió a
file-loader
,css-loader
y otros amigos, perohtml-loader
se perdió.Una vez que se solucione este error, será mejor eliminarlo
esModule: false
y simplemente actualizarlohtml-loader
, ya que los módulos ES ofrecen algunos beneficios menores (como se menciona en los documentos )Alternativamente, si (como yo), encontró este problema porque tenía problemas para cargar una imagen desde CSS (en lugar de desde HTML), entonces la solución es solo actualizar
css-loader
, no es necesario deshabilitar los módulos ES.fuente
Esto sucede en el cargador de archivos versión 5.0.2, la versión anterior funciona bien sin llamar a la
default
propiedadfuente
Acabo de actualizar mi cargador de archivos a ^ 5.0.2 minutos atrás.
Lo sé
esModule: false
fue la solución sugerida, pero eso no funcionó para mí.Mi solución fue
<img src={require('assets/logo.png').default}/>
que era raro. Primera vez usando.default
pero funcionó.fuente