Я использую веб-пакет с HtmlWebpackPlugin
, html-loader
и file-loader
. У меня есть простая структура проекта, в которой я использую не фреймворки, а только машинопись. Таким образом, я пишу свой HTML-код непосредственно в index.html
. Я также использую этот HTML-файл в качестве шаблона в HtmlWebpackPlugin
.
Как и все веб-сайты, мне нужно поместить изображение, которое ссылается на PNG в моей папке активов. file-loader
должен загрузить файл правильно, поместите новое имя файла внутри src
тега, но это не то, что происходит. Вместо этого в качестве значения src
тега у меня есть [object Module]
. Я предполагаю, что file-loader
испускает некоторый объект, и он представляется так, когда его .toString()
метод запущен. Однако я вижу, что file-loader
файл успешно обработан и передан с новым именем в выходной путь. Я не получаю ошибок. Вот моя конфигурация webpack и 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>
Структура проекта:
config/
webpack.config.js
dist/
src/
styles/
assets/
logo.png
index.html
app.ts
Отредактируйте мои зависимости 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"
источник
Angular 8
доAngular 9
какfile-loader
от версии4.2.0
до6.0.0
. Используяrequire(...).default
исправил это для меня.Рекомендуемое исправление @ stellr42
esModule: false
в вашейfile-loader
конфигурации - лучший обходной путь в настоящее время.Тем не менее, это на самом деле ошибка,
html-loader
которая отслеживается здесь: https://github.com/webpack-contrib/html-loader/issues/203Похоже , поддержка ES Модуль была добавлена
file-loader
,css-loader
и другими друзья, ноhtml-loader
была упущена.Как только эта ошибка будет исправлена, будет лучше удалить
esModule: false
и просто обновить ееhtml-loader
, так как модули ES предлагают некоторые незначительные преимущества (как упомянуто в документации )В качестве альтернативы, если (как и я) вы обнаружили эту проблему, потому что у вас были проблемы с загрузкой изображения из CSS (а не из HTML), тогда исправление - просто обновить
css-loader
, не нужно отключать модули ES.источник
Это происходит в файловом загрузчике версии 5.0.2, более ранняя версия работает нормально без вызова
default
свойстваисточник
Только что обновил мой загрузчик файлов до ^ 5.0.2 минут назад.
Я знаю,
esModule: false
было предложено исправить, но это не сработало для меня.Мое исправление
<img src={require('assets/logo.png').default}/>
было странным. Первый раз,.default
но он работал.источник