Estou usando o webpack com HtmlWebpackPlugin
, html-loader
e file-loader
. Eu tenho uma estrutura de projeto simples na qual não uso estruturas, mas apenas texto datilografado. Assim, escrevo meu código HTML diretamente para index.html
. Eu também uso esse arquivo HTML como modelo em HtmlWebpackPlugin
.
Como todos os sites, preciso colocar uma imagem que se refira a um PNG na minha pasta de ativos. file-loader
deve carregar o arquivo corretamente, coloque o novo nome de arquivo dentro da src
tag, mas não é isso que está acontecendo. Em vez disso, como o valor da src
tag, eu tenho [object Module]
. Suponho que file-loader
emite algum objeto e ele é representado assim quando seu .toString()
método é executado. No entanto, posso ver que file-loader
processou o arquivo com sucesso e emitiu um novo nome para o caminho de saída. Não recebo erros. Aqui está a minha configuração do webpack e 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>
Estrutura do projeto:
config/
webpack.config.js
dist/
src/
styles/
assets/
logo.png
index.html
app.ts
Edite as dependências My 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"
fonte
Angular 8
paraAngular 9
como a que trouxefile-loader
da versão4.2.0
para6.0.0
. Usandorequire(...).default
fixo para mim.A correção sugerida pelo @ stellr42
esModule: false
na suafile-loader
configuração é a melhor solução alternativa no momento.No entanto, esse é realmente um bug no
html-loader
qual está sendo rastreado aqui: https://github.com/webpack-contrib/html-loader/issues/203Parece que o apoio Módulo ES foi adicionado
file-loader
,css-loader
e outros amigos, mashtml-loader
foi perdida.Depois que esse bug for corrigido, será melhor remover
esModule: false
e simplesmente atualizarhtml-loader
, pois os Módulos ES oferecem alguns benefícios menores (conforme mencionado nos documentos )Como alternativa, se (como eu), você encontrou esse problema porque estava com problemas para carregar uma imagem do CSS (em vez do HTML), a correção é apenas para atualizar
css-loader
, não é necessário desativar os Módulos ES.fonte
Isso acontece no carregador de arquivos versão 5.0.2, a versão anterior funciona bem sem chamar a
default
propriedadefonte
Acabei de atualizar meu carregador de arquivos para ^ 5.0.2 minutos atrás.
Eu sei que
esModule: false
foi a correção sugerida, mas que não funcionou para mim.Minha correção
<img src={require('assets/logo.png').default}/>
foi estranha. Primeira vez usando,.default
mas funcionou.fonte