3 回答
TA贡献1856条经验 获得超11个赞
根据文件加载器文档:
默认情况下,file-loader 生成使用 ES 模块语法的 JS 模块。在某些情况下,使用 ES 模块是有益的,例如在模块连接和摇树的情况下。
似乎 webpack 将 ES 模块require()调用解析为如下所示的对象:{default: module},而不是扁平化模块本身。这种行为有些争议,本期对此进行了讨论。
因此,要让您的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,
},
},
],
},
TA贡献1817条经验 获得超14个赞
esModule: false
在您的file-loader
配置中建议的修复是当前最好的解决方法。
然而,这实际上是一个在html-loader
这里被跟踪的错误:https ://github.com/webpack-contrib/html-loader/issues/203
看起来 ES Module 支持已添加到file-loader
、css-loader
和其他朋友,但html-loader
错过了。
修复此错误后,最好删除esModule: false
并简单地升级html-loader
,因为 ES 模块提供了一些小好处(如文档中所述)
或者,如果(像我一样),您发现这个问题是因为您无法从 CSS(而不是从 HTML)加载图像,那么修复只是升级css-loader
,无需禁用 ES 模块。
TA贡献1794条经验 获得超8个赞
刚刚将我的文件加载器更新为 ^5.0.2 分钟前。
我知道esModule: false
是建议的修复,但这对我不起作用。
我的解决方法<img src={require('assets/logo.png').default}/>
很奇怪。第一次使用.default
,但它工作。
添加回答
举报