将 esm 模块与 ts-node 一起使用

using esm modules with ts-node

我成功地 运行 ts-node 将 t运行 扩展到 CommonJS 模块。我用的官方:docs

我也想按照官方esm docs使用esm模块,可惜没成功。我不断收到的错误是:CustomError: Cannot find module '/module/next/to/index/ts/ModuleName' imported from /Users/mainuser/angular_apps/typescript_test/index.ts

这是tsconfig.json

{
    "compilerOptions": {
      "target": "ES2015",                                 
      "module": "ES2020",                               
      "esModuleInterop": true,                             
      "forceConsistentCasingInFileNames": true,            
      "strict": true,                                      
         "skipLibCheck": true                                
    },
    "ts-node": {
      "esm": true
    }
  }
  

这是package.json的比赛:

{
  "name": "typescript_test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {},
  "devDependencies": {
    "ts-node": "^10.7.0",
    "typescript": "^4.6.3"
  },
  "type": "module"

}

I 运行 ts-node with: ./node_modules/.bin/ts-node index.ts 在项目根目录中。

我错过了什么?

这是我的 index.ts 代码:

import { SmokeTest } from "./SmokeTest";
SmokeTest.Log();

这是SmokeTest.ts文件的内容。两者都处于相同的fs级别:

export module SmokeTest{
    export function Log(){
        console.log("Smoke test running");  
    }
}

我是 运行ning node v14.19.1 和 ts-node v10.7.0

ts-node 添加到 tsconfig.json 证明对我无效。我稍微更新了 tsconfigsee node14 base 作为起点):

{
  "compilerOptions": {
    "target": "ES2020",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true,
    "outDir": "build",
    "module": "es2020",
    "moduleResolution": "node"
  },
  "include": ["./*.ts"],
  "exclude": ["node_modules"]
}

我使用了 --loader ts-node/esm 选项:

$ node --loader ts-node/esm ./index.ts

我还更新了我的 smoke-test.ts 模块,如下所示:

function Log() {
  console.log('Smoke test running')
}

export const SmokeTest = { Log }

使用本机 esm 模块导入时,.ts 文件的扩展名必须始终提供为 .js

import { SmokeTest } from './smoke-test.js'
SmokeTest.Log()