无法运行 TS 节点 + ES 应用程序 - 要么得到“ERR_UNKNOWN_FILE_EXTENSION”或“new ERR_MODULE_NOT_FOUND”

ilm*_*moi 6 node.js typescript ts-node

我正在尝试将我的代码编译为 ES 代码(使用"type": "module"内部 package.json 和"module": "esnext"内部 tsconfig.json)。

我无法使用以下 3 种方法中的任何一种来运行它:

  1. ts-node src/server.ts结果是:
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /Users/ilmoi/Dropbox/crypto_bc/dbricks/mvp/server/src/server.ts
    at new NodeError (node:internal/errors:363:5)
    at Loader.defaultGetFormat [as _getFormat] (node:internal/modules/esm/get_format:71:15)
    at Loader.getFormat (node:internal/modules/esm/loader:105:42)
    at Loader.getModuleJob (node:internal/modules/esm/loader:243:31)
    at Loader.import (node:internal/modules/esm/loader:177:17)
    at Object.loadESM (node:internal/process/esm_loader:68:5)
Run Code Online (Sandbox Code Playgroud)

这个线程来看,这似乎是 ts-node 的问题。

  1. 所以我尝试node --loader ts-node/esm ./src/server.ts得到这个:
(node:45543) ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
/Users/ilmoi/Dropbox/crypto_bc/dbricks/mvp/server/node_modules/ts-node/dist-raw/node-esm-resolve-implementation.js:383
    throw new ERR_MODULE_NOT_FOUND(
          ^
CustomError: Cannot find module '/Users/ilmoi/Dropbox/crypto_bc/dbricks/mvp/server/src/app' imported from /Users/ilmoi/Dropbox/crypto_bc/dbricks/mvp/server/src/server.ts
    at finalizeResolution (/Users/ilmoi/Dropbox/crypto_bc/dbricks/mvp/server/node_modules/ts-node/dist-raw/node-esm-resolve-implementation.js:383:11)
    at moduleResolve (/Users/ilmoi/Dropbox/crypto_bc/dbricks/mvp/server/node_modules/ts-node/dist-raw/node-esm-resolve-implementation.js:818:10)
    at Object.defaultResolve (/Users/ilmoi/Dropbox/crypto_bc/dbricks/mvp/server/node_modules/ts-node/dist-raw/node-esm-resolve-implementation.js:929:11)
    at /Users/ilmoi/Dropbox/crypto_bc/dbricks/mvp/server/node_modules/ts-node/src/esm.ts:68:38
    at Generator.next (<anonymous>)
    at /Users/ilmoi/Dropbox/crypto_bc/dbricks/mvp/server/node_modules/ts-node/dist/esm.js:8:71
    at new Promise (<anonymous>)
    at __awaiter (/Users/ilmoi/Dropbox/crypto_bc/dbricks/mvp/server/node_modules/ts-node/dist/esm.js:4:12)
    at resolve (/Users/ilmoi/Dropbox/crypto_bc/dbricks/mvp/server/node_modules/ts-node/dist/esm.js:32:16)
    at Loader.resolve (node:internal/modules/esm/loader:89:40)
Run Code Online (Sandbox Code Playgroud)

但 src/app.ts 显然位于文件夹中!

  1. 所以我尝试先编译tsc然后运行node --loader ts-node/esm ./dist/src/server.js。我得到的错误与 (2) 几乎相同,只是这次它/Users/ilmoi/Dropbox/crypto_bc/dbricks/mvp/server/dist/src/app丢失了。这也没有意义,因为我可以在文件夹中看到它。

我该如何解决这个问题?我已经阅读了有关堆栈溢出的每个线程,但我没有选择。为什么运行 ES 节点应用程序如此困难?

akk*_*kk3 6

我遇到了这个问题,我想将所有文件保留在打字稿中。我看到了 @BlueFrog 提供的答案,但.js我没有将模块导入转换为 ,而是使用了这个实验性标志:

node --experimental-specifier-resolution=node --loader ts-node/esm myScript.ts
Run Code Online (Sandbox Code Playgroud)

它工作成功。

更多信息请点击此处


Blu*_*rog 2

遇到了同样的问题。通过遵循此 ts-node 问题已修复。


TL;DR 只需将.js扩展添加到模块导入中并运行 ts-nodenode --loader ts-node/esm src/index.ts