为什么即使在定义了 PNG 类型之后,我仍会从 PNG 文件的 TypeScript 中收到“未找到模块”错误?
Why am I getting a Module Not Found error from TypeScript for PNG files even after defining a PNG type?
我正在尝试在 HTML 中创建游戏,并且我决定使用 Phaser 3 以及 Webpack 和 Typescript 以实现现代实践。我现在正在尝试导入一个 PNG 文件以与 Phaser 一起使用,但是当我尝试 运行 webpack-dev-server 时,Typescript 一直抛出 Module not found: Error: Can't resolve 'assets/tower-base.png'
。我花了一段时间阅读 google 结果,但我发现您需要为 png 文件定义自定义类型,我已经完成了。这似乎解决了大多数人的问题,但似乎对我不起作用,我不知道下一步该尝试什么。我希望你们好心的人能指出我哪里错了以及为什么。
在我的移相器场景中,我正在尝试导入图像。这是我的场景文件:
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 文件的自定义类型定义。在项目的根目录中,我添加了一个仅包含 PNG 文件定义的 custom-typings.d.ts
文件。
自定义-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',
},
},
},
],
},
据我通过谷歌搜索问题可以看出一切都应该是这样,但显然我遗漏了一些东西或者它会起作用。我做错了什么?
您似乎在此处引用了绝对路径。如果你改为:
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
找到更多信息
我正在尝试在 HTML 中创建游戏,并且我决定使用 Phaser 3 以及 Webpack 和 Typescript 以实现现代实践。我现在正在尝试导入一个 PNG 文件以与 Phaser 一起使用,但是当我尝试 运行 webpack-dev-server 时,Typescript 一直抛出 Module not found: Error: Can't resolve 'assets/tower-base.png'
。我花了一段时间阅读 google 结果,但我发现您需要为 png 文件定义自定义类型,我已经完成了。这似乎解决了大多数人的问题,但似乎对我不起作用,我不知道下一步该尝试什么。我希望你们好心的人能指出我哪里错了以及为什么。
在我的移相器场景中,我正在尝试导入图像。这是我的场景文件:
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 文件的自定义类型定义。在项目的根目录中,我添加了一个仅包含 PNG 文件定义的 custom-typings.d.ts
文件。
自定义-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',
},
},
},
],
},
据我通过谷歌搜索问题可以看出一切都应该是这样,但显然我遗漏了一些东西或者它会起作用。我做错了什么?
您似乎在此处引用了绝对路径。如果你改为:
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
找到更多信息