Node.js 无法使用模块解析运行已编译的typescript程序

Node.js 无法使用模块解析运行已编译的typescript程序,node.js,typescript,tsconfig,tsconfig-paths,Node.js,Typescript,Tsconfig,Tsconfig Paths,我正在尝试计算以下脚本文件 import { magic } from 'lib/magic'; magic(); 文件结构是: ./src/ main.ts lib/ a/magic.ts b/magic.ts 在tsconfig.json内部,我将lib/magic映射到右文件,如下所示 { "compilerOptions": { "target": "e

我正在尝试计算以下脚本文件

import { magic } from 'lib/magic';

magic();
文件结构是:

./src/
     main.ts
     lib/
         a/magic.ts
         b/magic.ts
在tsconfig.json内部,我将
lib/magic
映射到右文件,如下所示

{
    "compilerOptions": {
        "target": "esnext",
        "module": "commonjs",
        "outDir": "./dist",
        "baseUrl": ".",
        "paths": {
            "lib/*": [ "src/lib/a/*" ]
        }
    },
    "include": [ "./src/**/*.ts" ],
    "exclude": [ "./node_modules" ]
}
$> tsc -p ./tsconfig-a.json
import { magic } from './lib/a/magic';

magic();
sed -e 's/lib\/a/lib\/b/' ./dist/main.js > ./dist/main-node.js
就是将导入的
lib/magic
映射到
/src/lib/a/magic.ts的
路径
部分

因此,我可以编译如下

{
    "compilerOptions": {
        "target": "esnext",
        "module": "commonjs",
        "outDir": "./dist",
        "baseUrl": ".",
        "paths": {
            "lib/*": [ "src/lib/a/*" ]
        }
    },
    "include": [ "./src/**/*.ts" ],
    "exclude": [ "./node_modules" ]
}
$> tsc -p ./tsconfig-a.json
import { magic } from './lib/a/magic';

magic();
sed -e 's/lib\/a/lib\/b/' ./dist/main.js > ./dist/main-node.js
它在
dist
中生成输出。但是,当我尝试运行它时

$> node ./dist/main.js
internal/modules/cjs/loader.js:626
    throw err;
^

Error: Cannot find module 'lib/magic'
Require stack:
...

这是有道理的,因为在dist中没有
lib/magic
。有什么建议可以解决这个问题吗?

除非有人证明我错了,以下是我目前的发现

这是一个问题,其中指出,所有这些事实上都是预期的行为

所以你基本上必须在第二步修复它。在我的例子中,我想构建两个版本,一个用于
a
,另一个用于
b
。修复它的最简单方法是让它在默认情况下为
a
工作,如下所示

{
    "compilerOptions": {
        "target": "esnext",
        "module": "commonjs",
        "outDir": "./dist",
        "baseUrl": ".",
        "paths": {
            "lib/*": [ "src/lib/a/*" ]
        }
    },
    "include": [ "./src/**/*.ts" ],
    "exclude": [ "./node_modules" ]
}
$> tsc -p ./tsconfig-a.json
import { magic } from './lib/a/magic';

magic();
sed -e 's/lib\/a/lib\/b/' ./dist/main.js > ./dist/main-node.js
然后构建
b
并按如下方式替换该路径

{
    "compilerOptions": {
        "target": "esnext",
        "module": "commonjs",
        "outDir": "./dist",
        "baseUrl": ".",
        "paths": {
            "lib/*": [ "src/lib/a/*" ]
        }
    },
    "include": [ "./src/**/*.ts" ],
    "exclude": [ "./node_modules" ]
}
$> tsc -p ./tsconfig-a.json
import { magic } from './lib/a/magic';

magic();
sed -e 's/lib\/a/lib\/b/' ./dist/main.js > ./dist/main-node.js
在我的例子中,一个版本用于NodeJs,另一个用于浏览器,因此我还需要添加
.js
扩展。万一有人感兴趣,这是命令

$> echo "import { magic } from  './lib/a/magic';" | sed "s#^\(import[^']*\)'\([^']*\)#\1 '\2.js#g" 
如果你有更好的解决方案,请让我知道,因为这一切感觉有点不舒服