gpt4 book ai didi

node.js - 无法找到 Typescript 模块,即使 tsc 成功地解决了它

转载 作者:搜寻专家 更新时间:2023-10-30 20:53:59 27 4
gpt4 key购买 nike

我有一个用 Typescript 编写的 Node.js 项目,预计将作为 CLI 运行,并且无法使用绝对路径(相对路径)导入位于 node_modules 目录之外的模块工作正常)。值得一提的是,我正在使用 oclif framework用于构建我的 CLI。

我的项目组织如下:

cli
|--node_modules
|--src
|--my-module.ts
|--subdir
|--index.ts

my-module.ts 我有:

 export class MyClass {
myClassFcn(s: string) {
return 'result'
}
}

index.ts 脚本包含如下内容:

 import {MyClass} = require('my-module')

当我尝试使用 ts-node 执行我的应用程序时,我得到了

(node:10423) [MODULE_NOT_FOUND] Error Plugin: cli: Cannot find module 'my-module'
module: @oclif/config@1.6.17
task: toCached
plugin: cli
root: /home/eschmidt/Workspace/cli
Error Plugin: cli: Cannot find module 'my-module'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:571:15)
at Function.Module._load (internal/modules/cjs/loader.js:497:25)
at Module.require (internal/modules/cjs/loader.js:626:17)
at require (internal/modules/cjs/helpers.js:20:18)
at Object.<anonymous> (/home/eschmidt/Workspace/cli/src/commands/create/index.ts:5:1)
at Module._compile (internal/modules/cjs/loader.js:678:30)
at Module.m._compile (/home/eschmidt/Workspace/cli/node_modules/ts-node/src/index.ts:403:23)
at Module._extensions..js (internal/modules/cjs/loader.js:689:10)
at Object.require.extensions.(anonymous function) [as .ts] (/home/eschmidt/Workspace/cli/node_modules/ts-node/src/index.ts:406:12)
at Module.load (internal/modules/cjs/loader.js:589:32)
module: @oclif/config@1.6.17
task: toCached
plugin: my-plugin
root: /home/eschmidt/Workspace/cli

我无法理解的是,当我运行 tsc --traceResolution 时,模块已正确解析:

======== Module name 'my-module' was successfully resolved to '/home/eschmidt/Workspace/cli/src/my-module.ts'. ========

我的 tsconfig.json 文件包含:

{
"compilerOptions": {
"declaration": true,
"moduleResolution": "node",
"forceConsistentCasingInFileNames": true,
"importHelpers": true,
"module": "commonjs",
"sourceMap": true,
"outDir": "./lib",
"pretty": true,
"rootDirs": [
"./src/"
],
"strict": true,
"target": "es2017",
"baseUrl": "src"
},
"include": [
"./src/**/*"
]
}

如果有人能阐明这个问题,或者至少建议在哪里寻求进一步的帮助,我将不胜感激。如果需要更多详细信息,请告诉我。

提前致谢!

最佳答案

原来问题是因为虽然tsc和ts-node都使用baseUrl进行绝对路径解析,但它们都没有执行任何类型的从绝对路径到相对路径的实际映射在生成的 Javascript 代码中。换句话说,转换后的 JS 文件和 ts-node 内部生成的代码最终都具有:

import  {MyClass} = require('my-module')

而我希望它们包含类似的内容:

import  {MyClass} = require('../my-module')

这阻止了 Node 的模块加载器找到模块。 ts-node 也没有工作,我相信,因为根本没有 tsconfig.json 文件来指示路径映射。

尽管 IMO 令人困惑,并且没有正确记录,但这是预期的行为,正如所讨论的那样 here .截至目前,Typescript 不支持绝对到相对路径映射(请参阅 https://github.com/Microsoft/TypeScript/issues/15479 )。

为了避免称为路径 hell 的情况,这意味着相对导入路径非常深,我找到了module-alias。和 tsmodule-alias非常有用。这些模块会改变模块加载器的行为,以便它自动将别名映射到相对路径。

有关此问题的更多信息,请参阅此 issue在 Github 上。

关于node.js - 无法找到 Typescript 模块,即使 tsc 成功地解决了它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50593774/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com