【发布时间】:2017-11-02 21:01:15
【问题描述】:
我正在尝试使用 webpack 和 webpack-dev-server 在 React 组件中显示图像作为项目的一部分。
到目前为止,我已经完成了以下步骤:
- 使用 npm 安装文件加载器
- 更新了 webpack.config.js 以添加图像文件的加载器
- 将我想要的图像导入到我的组件中
- 在我的 img 标签中使用了导入
采取这些步骤后,webpack 无法编译并出现“找不到模块”错误:
ERROR in [at-loader] ./src/components/App.tsx:4:26
TS2307: Cannot find module '../images/kitten-header.jpg'.
我的文件夹结构如下:
/dist
/images
kitten-header.jpg
bundle.js
bundle.js.map
/node_modules
(content ignored for brevity)
/src
/components
App.tsx
/images
kitten-header.jpg
/styles
App.less
index.tsx
index.html
package.json
tsconfig.json
webpack.config.js
我添加到 webpack.config.js 的新加载器是:
test: /\.(jpe?g|gif|png|svg)$/, loader: "file-loader?name=./images/[name].[ext]"
我已经在 App.tsx 中导入了图像文件,如下所示:
import kittenHeader from '../images/kitten-header.jpg';
...并像这样在 img 标签中使用导入:
<img src={ kittenHeader } />
注意:提供了 webpack.config.js 和 App.tsx 的全文,直到我稍微接近答案并意识到它们不相关(请参阅更新 1)。
我假设我在导入的相对路径方面犯了一些非常微不足道的错误。如您所想,我尝试了各种替代方案。
谁能提供一些见解?
作为参考,由于我不断地点击与错误版本的 webpack 相关的文章和问题,以下是我的版本:
- 反应 15.5.4
- Webpack 2.6.1
- Webpack-dev-server 2.4.5
- TypeScript 2.3.2
更新 1: 2017.06.05
所以,看看this SO question 和this post on Medium,我已经能够确定问题不在于我如何使用 webpack,而在于我使用的是 TypeScript。该错误是由于打字稿编译器不知道 .jpg 文件是什么而导致的打字稿错误。
显然,我需要提供一个 d.ts 文件或使用 require 语句。
差不多了……
【问题讨论】:
-
您是否有我们可以用来重现问题的源存储库?那会很方便。
-
如果你使用 webpack,你可以安装
@types/webpack-env代替require而不是import。与导入不同,您传递给require的字符串不会被 TypeScript 解析。当然,使用*.d.ts也可以 -
谢谢@EvanSebastian,你的评论就在我写答案的时候出现了。如您所见,我的答案不完整。你知道如何为 jpg 写一个 d.ts 吗?是否可以创建一个模块来覆盖 *.jpg 或者每个图像文件都需要一个 d.ts?
-
我还注意到你推荐了
@types/webpack-env,而我使用了@types/node。节点类型确实有效。在获得“要求”工作方面,这两者有什么区别?我假设它们只是相同底层“要求”实现的两个 d.ts 定义? -
@types/webpack-env和@types/node是不同的,当您需要编写 NodeJS 模块以使标准库类型可用时,您使用@types/node。@types/webpack-env用于 webpack 捆绑项目中。例如,如果您使用@types/webpack-env,require.ensure将可用
标签: reactjs webpack typescript-typings webpack-file-loader