Html-loader + file-loader 没有捆绑正确的图像源
Html-loader + file-loader not bundling the correct image source
我计划将 Webpack 用于一个项目,我正在使用 Html-loader + file-loader 设置我的工作流以获得一个生产 html 文件,其中包含动态 src图像,正如 Colt Steele 在 this video 中教授的那样。这是我的 src/ 文件:
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Popular on Letterboxd</title>
</head>
<body>
<img src="./assets/chira.jpg" />
</body>
</html>
index.js:
import img from './assets/chira.jpg';
import "./main.css";
和main.css
body {
background-color: darkblue;
}
这些是我的配置文件(我有一个用于开发和生产的个人文件,以及一个用于两者的通用文件):
webpack.common.js:
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/index.js',
devtool: "none",
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html'
})
],
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
],
},
{
test: /\.html$/,
use: ["html-loader"]
},
{
test: /\.(png|jpe?g|gif|svg)$/i,
use: [
{
loader: 'file-loader',
options: {
name: '[name].[hash].[ext]',
publicPath: 'assets',
outputPath: 'assets/img'
}
}
]
}
],
},
};
webpack.dev.js:
const path = require('path');
const common = require("./webpack.common");
const merge = require('webpack-merge');
module.exports = merge(common, {
mode: "development",
devServer: {
contentBase: path.join(__dirname, 'src'),
},
output: {
filename: "main.js",
path: path.resolve(__dirname, "dist")
},
});
和webpack.prod.js:
const path = require('path');
const common = require("./webpack.common");
const merge = require('webpack-merge');
module.exports = merge(common, {
mode: "production",
output: {
filename: "main.[contentHash].js",
path: path.resolve(__dirname, "dist")
},
});
然而,当我 运行 npm 运行 构建时,它执行这个命令:
"build": "webpack --config webpack.prod.js"
并且我得到了带有 assets/img/[name].[hash].[ext] 的预期 dist 文件夹,但是在我的 index.html 中我没有得到预期的 src 标签:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Popular on Letterboxd</title>
</head>
<body>
<img src="[object Module]" />
<script type="text/javascript" src="main.e55bd4ff82bf2f5cec90.js"></script></body>
</html>
一段时间以来,我一直在努力解决这个问题,但我似乎无法在任何地方得到正确的答案,而且到目前为止,我尝试过的任何方法都没有奏效。如果遇到此问题的任何人都可以解决他们如何修复它,或者如果有人知道问题可能是什么以及我能做什么,我将不胜感激。提前致谢!
如果文件加载器版本是 5.0 那么。在文件加载器上添加另一个选项 "esModule: false" 将解决此问题。
{
test: /\.(png|jpe?g|gif|svg)$/i,
use: [
{
loader: 'file-loader',
options: {
name: '[name].[hash].[ext]',
publicPath: 'assets',
outputPath: 'assets/img',
esModule: false
}
}
]
}
如果您使用的是 webpack 5 或更高版本,file-loader
将被删除。 File loader documentation
您可以改用模块 asset/resource
。删除 file-loader
规则并将以下规则添加到 webpack.common.js
中的模块
module: {
rules: [
{
test: /\.(png|jpe?g|gif|svg)$/i,
type: 'asset/resource'
}
]
},
然后在 webpack.prod.js
的 output
中添加 assetModuleFilename
output: {
assetModuleFilename: "assets/img/[name].[hash][ext]"
}
并保持 webpack.common.js 中的 html-loader
规则不变。
参考文献Asset Modules
我计划将 Webpack 用于一个项目,我正在使用 Html-loader + file-loader 设置我的工作流以获得一个生产 html 文件,其中包含动态 src图像,正如 Colt Steele 在 this video 中教授的那样。这是我的 src/ 文件:
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Popular on Letterboxd</title>
</head>
<body>
<img src="./assets/chira.jpg" />
</body>
</html>
index.js:
import img from './assets/chira.jpg';
import "./main.css";
和main.css
body {
background-color: darkblue;
}
这些是我的配置文件(我有一个用于开发和生产的个人文件,以及一个用于两者的通用文件):
webpack.common.js:
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/index.js',
devtool: "none",
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html'
})
],
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
],
},
{
test: /\.html$/,
use: ["html-loader"]
},
{
test: /\.(png|jpe?g|gif|svg)$/i,
use: [
{
loader: 'file-loader',
options: {
name: '[name].[hash].[ext]',
publicPath: 'assets',
outputPath: 'assets/img'
}
}
]
}
],
},
};
webpack.dev.js:
const path = require('path');
const common = require("./webpack.common");
const merge = require('webpack-merge');
module.exports = merge(common, {
mode: "development",
devServer: {
contentBase: path.join(__dirname, 'src'),
},
output: {
filename: "main.js",
path: path.resolve(__dirname, "dist")
},
});
和webpack.prod.js:
const path = require('path');
const common = require("./webpack.common");
const merge = require('webpack-merge');
module.exports = merge(common, {
mode: "production",
output: {
filename: "main.[contentHash].js",
path: path.resolve(__dirname, "dist")
},
});
然而,当我 运行 npm 运行 构建时,它执行这个命令:
"build": "webpack --config webpack.prod.js"
并且我得到了带有 assets/img/[name].[hash].[ext] 的预期 dist 文件夹,但是在我的 index.html 中我没有得到预期的 src 标签:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Popular on Letterboxd</title>
</head>
<body>
<img src="[object Module]" />
<script type="text/javascript" src="main.e55bd4ff82bf2f5cec90.js"></script></body>
</html>
一段时间以来,我一直在努力解决这个问题,但我似乎无法在任何地方得到正确的答案,而且到目前为止,我尝试过的任何方法都没有奏效。如果遇到此问题的任何人都可以解决他们如何修复它,或者如果有人知道问题可能是什么以及我能做什么,我将不胜感激。提前致谢!
如果文件加载器版本是 5.0 那么。在文件加载器上添加另一个选项 "esModule: false" 将解决此问题。
{
test: /\.(png|jpe?g|gif|svg)$/i,
use: [
{
loader: 'file-loader',
options: {
name: '[name].[hash].[ext]',
publicPath: 'assets',
outputPath: 'assets/img',
esModule: false
}
}
]
}
如果您使用的是 webpack 5 或更高版本,file-loader
将被删除。 File loader documentation
您可以改用模块 asset/resource
。删除 file-loader
规则并将以下规则添加到 webpack.common.js
module: {
rules: [
{
test: /\.(png|jpe?g|gif|svg)$/i,
type: 'asset/resource'
}
]
},
然后在 webpack.prod.js
的output
中添加 assetModuleFilename
output: {
assetModuleFilename: "assets/img/[name].[hash][ext]"
}
并保持 webpack.common.js 中的 html-loader
规则不变。
参考文献Asset Modules