【问题标题】:Why am I getting a Module Not Found error from TypeScript for PNG files even after defining a PNG type?为什么即使在定义 PNG 类型之后,我也会从 TypeScript 中为 PNG 文件收到 Module Not Found 错误?
【发布时间】:2020-11-23 03:13:18
【问题描述】:

我正在尝试用 HTML 创建游戏,我决定使用 Phaser 3 以及 Webpack 和 Typescript 来实现现代实践。我现在正在尝试导入一个 PNG 文件以与 Phaser 一起使用,但是当我尝试运行 webpack-dev-server 时,Typescript 不断抛出 Module not found: Error: Can't resolve 'assets/tower-base.png'。我花了一段时间阅读谷歌搜索结果,但我发现你需要为 png 文件定义一个自定义类型,我已经完成了。这似乎解决了大多数人的问题,但似乎对我不起作用,我不知道下一步该尝试什么。希望各位好心人能指出我哪里错了,为什么。

在我的 Phaser 场景中,我正在尝试导入图像。这是我的场景文件:

SingleScene.ts

import * as Phaser from 'phaser';
import TowerBase from 'assets/tower-base.png';

export default class SingleScene extends Phaser.Scene {
    constructor() {
        super('single-scene');
    }

    preload() {
        this.load.image('towerBase', TowerBase);
    }

    create() {
    }
}

该错误具体发生在第 2 行。因此,在谷歌搜索该问题后,我发现我需要为 PNG 文件自定义类型定义。在我的项目的根目录中,我添加了一个 custom-typings.d.ts 文件,其中仅包含 PNG 文件的定义。

custom-typings.d.ts

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

然后我在typeRoots 下的tsconfig.json 文件中引用了这个文件。这是我完整的完整配置文件

tsconfig.json

{
    "compilerOptions": {
        "outDir": "./dist/",
        "module": "es6",
        "target": "es5",
        "allowJs": true,
        "sourceMap": true,
        "noImplicitAny": true
    },
    "exclude": [
        "node_modules"
    ],
    "typeRoots": [
        "./custom-typings.d.ts",
        "./node_modules/phaser/types"
    ],
    "types": [
        "Phaser"
    ]
}

我已经确保在我的 webpack 配置中也有一个图片规则。这是我的 webpack 配置文件的模块规则部分:

webpack.config.js

module: {
    rules: [
        {
            test: /\.tsx$/,
            exclude: /node_modules/,
            loader: 'babel-loader',
        },
        {
            test: /\.js$/,
            use: ['source-map-loader'],
            enforce: 'pre',
        },
        {
            test: /\.s[ac]ss$/,
            use: ['style-loader', 'css-loader', 'sass-loader'],
        },
        {
            test: /\.(png|jpg|gif)$/,
            use: {
                loader: 'file-loader',
                options: {
                    outputPath: 'assets',
                },
            },
        },
    ],
},

据我在谷歌上搜索问题可以看出,一切都应该是这样,但显然我遗漏了一些东西,否则它会起作用。我做错了什么?

【问题讨论】:

    标签: typescript webpack webpack-dev-server typescript-typings phaser-framework


    【解决方案1】:

    您似乎在这里引用了绝对路径。如果你改为:它是否有效:

    import TowerBase from './assets/tower-base.png';
    
    

    如果是这样,并且如果您想使用绝对路径,则需要在 tsconfig.json 中设置路径映射,如下所示:

    "compilerOptions": {
      "baseUrl": "./",
        "paths": {
          "assets/*": ["./assets/*"]
        }
    }
    

    您可以在https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping找到更多信息

    【讨论】:

    • 不,使用'./assets/tower-base.png' 没有区别,我得到同样的错误。实际上,该路径无效,因为 js 文件在 /src/js/SingleScene.ts 中,而图像在 /src/assets/tower-base.png 中,所以它必须是 ./../assets/tower-base.png,这样才有效!为什么?!
    • 另外,我尝试设置一个路径以便我可以使用assets/tower-base.png,但它不起作用。我试过"baseUrl": ".", "paths": { "assets/": ["./src/assets/*"] }
    • 嗯,好的,解决了路径映射的问题,你还需要在webpack中配置别名。我从这里开始工作 - stackoverflow.com/questions/58443646/…
    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 2020-10-25
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2021-11-23
    • 2020-05-17
    • 1970-01-01
    相关资源
    最近更新 更多