【问题标题】:cannot run compiled typescript prog using module resolution无法使用模块解析运行已编译的打字稿编
【发布时间】:2020-07-17 13:41:20
【问题描述】:

我正在尝试编译以下打字稿文件

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" ]
}

正是 paths 部分将导入 lib/magic 映射到 ./src/lib/a/magic.ts

所以,我可以编译如下

$> tsc -p ./tsconfig-a.json

它在dist 中产生输出。但是,当我尝试运行它时

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

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

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

【问题讨论】:

    标签: node.js typescript tsconfig tsconfig-paths


    【解决方案1】:

    在有人证明我错之前,这是我迄今为止的发现。

    Here 是一个问题,其中声明所有这些实际上都是预期的行为。

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

    import { magic } from './lib/a/magic';
    
    magic();
    

    然后构建b 并替换该路径如下

    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" 
    

    如果您有更好的解决方案,请告诉我,因为这一切都感觉有点 hacky

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 2018-07-30
      相关资源
      最近更新 更多