gpt4 book ai didi

javascript - Webpack 文件加载器输出 [object Module]

转载 作者:行者123 更新时间:2023-12-03 22:16:04 26 4
gpt4 key购买 nike

我正在使用带有 HtmlWebpackPlugin 的 webpack , html-loaderfile-loader .我有一个简单的项目结构,其中我不使用任何框架,而只使用 typescript 。因此,我将 HTML 代码直接写入 index.html .我也在 HtmlWebpackPlugin 中使用这个 HTML 文件作为我的模板。 .

正如所有网站一样,我需要在我的 Assets 文件夹中放置一个引用 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
})
]
};

索引.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"

最佳答案

根据文件加载器 docs :

By default, file-loader generates JS modules that use the ES modules syntax. There are some cases in which using ES modules is beneficial, like in the case of module concatenation and tree shaking.


似乎 webpack 解析了 ES 模块 require()调用如下所示的对象: {default: module} ,而不是扁平化模块本身。这种行为有些争议,在 this issue 中进行了讨论。 .
因此,要获得您的 src要正确解析属性,您需要能够访问 default导出模块的属性。如果您使用的是框架,您应该能够执行以下操作:
<img src={require('assets/logo.png').default}/> <!-- React -->
<!-- OR -->
<img src="require('assets/logo.png').default"/> <!-- Vue -->
或者,您可以启用文件加载器的 CommonJS 模块语法,webpack 将直接解析为模块本身。设置 esModule:false在你的 webpack 配置中。
webpack.config.js:
 {
test: /\.(png|jpe?g|gif)$/i,
use: [
{
loader: 'file-loader',
options: {
esModule: false,
},
},
],
},

关于javascript - Webpack 文件加载器输出 [object Module],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59070216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com