为什么我必须对 React 中的图像使用“require”而不是“import from”?

IT技术 reactjs typescript webpack webpack-4
2021-05-23 14:50:29

我看到这个答案建议了如下所示的导入图像的语法(注释掉)。就我而言,它没有解决(抱怨在该文件中找不到module),我不得不切换到当前处于活动状态的语法。

// import Author from "../assets/author.png";
var Author = require("../assets/author.png");

我可以想象的不同之处在于我正在使用 TypeScript(通过awesome- typescript -loader转换我的 TSX并加载我的 PNG file-loader),而他们似乎使用 JSX。但就我的理解而言,它最终都会转换为普通的 JS 并需要

作为 React 的菜鸟,我不确定这种差异的原因是什么,我也不知道该用什么 google 来调查自己。

4个回答

这对typescript来说比 webpack 本身更严重,您可能需要在声明文件中声明module。

创建一个 declarations.d.ts

更新你的 tsconfig.json

"include": [
    "./declarations.d.ts",
],

把这个放在那个文件上:

declare module '*.png';

错误可能消失了。

您可以像这样为图像声明一个module:

declare module "*.png" {
  const value: any;
  export default value;
}

然后,您将能够像这样导入图像:

import AuthorSrc from "../assets/author.png";

发生这种情况是因为 webpack 不支持开箱即用的图像导入。因此,您需要在 webpack 配置文件中为此添加规则。添加新规则时,TypeScript 不会自动知道这一点,因此您需要声明一个新module来解决此问题。如果没有该module,您将能够导入图像,但 TypeScript 会抛出错误,因为您没有告诉它是可能的。

这个问题与 webpack 或任何打包器无关,也不是 typescript 的问题。

Typescript 已经声明 `require("path") 是一种将module包含到当前module范围内的方法,同时它也可以用来读取一些随机文件(例如 json 文件)。

正如 Vincent 和 Playma256 所指定的,您可以声明一个module通配符以匹配某些文件类型,因此您可以将其作为导入语句导入。但你真的不需要这样做。如果您尝试导入 png 或 json 文件(tslint 可能,但这取决于您的配置),Typescript 不会给您错误。

顺便说一句,如果您的声明位于 tsconfig.json 中定义的项目的源文件夹中,则您不需要按照 Playma256 的规定包含它。

我在 node 中创建了一个示例项目供您测试:

https://github.com/rodrigoelp/typescript-declare-files

我觉得你可以用 webpack&&typescript 来解决这个问题。 webpack 的官网已经介绍了这方面的内容 https://webpack.js.org/guides/typescript/ ,我自己也试过了 https://github.com/reactpersopnal/webpack-root/tree/feature/typescript 原因是你想在 TypeScript 中使用非代码资源,所以我们需要推迟为 webpack 的这些导入输入类型。您可以简单地添加 custom.d.ts。

declare module "*.jpg" {
    const content: any;
    export default content;
}