14

我正在尝试使用 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 开发服务器 2.4.5
  • 打字稿 2.3.2


更新 1: 2017.06.05
因此,查看这个 SO 问题Medium 上的这篇文章,我已经能够确定问题不在于我如何使用 webpack,而在于我使用的是 TypeScript。该错误是由于打字稿编译器不知道 .jpg 文件是什么而导致的打字稿错误。

显然,我需要提供一个 d.ts 文件或使用 require 语句。

差不多好了...

4

7 回答 7

13

使用常规要求,这就是我在 tsx 文件中使用它的方式:

const logo = require('../assets/logo.png');

...

<img alt='logo' style={{ width: 100 }} src={String(logo)} />

希望这可以帮助。importing 对我也不起作用。

于 2017-10-01T13:36:22.910 回答
3

这就是我让它工作的方式:

// This declaration can be move in some common .d.ts file, will prevent tslint from throwing error
declare function require(path: string);

const SampleComponent = () => (
  <div>
    <img src={require('./styles/images/deadline.png')} alt="Test" />
  </div>
);

您在答案中提出的方式最终将为放置在组件中的每个图像文件编写模块声明。

于 2017-06-22T21:14:32.907 回答
1

错误 ,TS2307: Cannot find module '../images/kitten-header.jpg'突出显示 TypeScript 编译器不理解 .jpg 文件的导入。

webpack 配置很好,尽管出现编译错误,但图像文件被成功复制到 dist 文件夹就证明了这一点。

我们有两种方法可以解决这个问题。

首先,我们可以通过使用“require”语句绕过 TypeScript 导入。为此,导入...

import kittenHeader from '../images/kitten-header.jpg';

...可以替换为要求...

const kittenHeader = require('../images/kitten-header.jpg');

...而这应该就是所需要的。

请注意,在我的情况下,我还需要安装一些类型来支持“require”语句。没有这些,我得到了一个TS2304: Cannot find name 'require'错误。

最初我使用@types/node,如this SO answer中所述,但@EvanSebastian 指出节点旨在支持编写NodeJS模块,这不是我正在做的事情(请参阅问题评论)。

我按照建议尝试@types/webpack-env了 ,但这导致TS2322: Type '{ src: {}; }' is not assignable to type 'HTMLProps<HTMLImageElement>'.我的图像标签的 src 属性出错。

最近,我改用 using @types/requirejs,我希望它足够专注以避免包含大量不适当的附加类型。它目前正在工作:

npm install @types/requirejs --save-dev

或者,我们可以保留导入并提供一个d.ts文件,其中包含声明适当模块的类型信息。我无法确切地发现这个文件会是什么样子。

于 2017-06-05T13:06:13.300 回答
0

const logo = require('../../../assets/img/logo.svg')

 <img src={logo.default} style={{ width: "100%", height: "50px" }} alt="" />

于 2021-08-14T21:37:52.607 回答
0

在您想要的任何 React-Typescript 组件中尝试我的代码

import * as logo from './assests/icon.jpg';

const img = logo.default;

const Comp = ()=> {
    return <img src={img} alt="image" className="" />
}
于 2021-05-11T12:42:35.173 回答
0

在 src 目录中的任何位置添加一个打字稿定义文件,并(将其命名为 image.d.ts)导出 jpeg 文件的模块定义,如下所示:

export module "*.jpg";
于 2020-04-15T21:13:03.270 回答
0

除了 mcku 的回答,您还可以通过这种方式使用导入:

// @ts-ignore
import * as kittenHeader from '../images/kitten-header.jpg';
...
<img alt='logo' style={{ width: 100 }} src={logo} />

尽管您必须忽略警告。

于 2019-01-12T21:15:37.400 回答