无法在节点中导入ESM .ts模块

时间:2020-09-04 14:09:43

标签: javascript node.js typescript ecmascript-6 nestjs

我一直试图在nodejs中导入以打字稿编写的ESM模块。但是我收到以下错误:

An import path cannot end with a '.ts' extension.

实用程序

 export class Util {
    constructor ( ) {
       
    }
      log(msg) {
        console.log(msg) 
    }
  }

index.ts

import {log} from './Util.ts'
log(task.query.criteria, payload.parameters)

我还在"type":"module"内添加了package.json

我将.ts更改为.js只是为了查看它是否有效,然后我得到了:

Object.defineProperty(exports, "__esModule", { value: true });                         ^

ReferenceError: exports is not defined
at file:///C:/Users/abc/NestJsPOC/NestPOC/dist/main.js:2:23

tsconfig.json

{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "target": "es2017",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true
  }
}

编辑

我也尝试过:

 var log = require('../utility/util.js');

Util.js

    function log(msg) {
      console.log(msg)
     
  }
    module.exports= { log}

index.ts

    log('hello')

错误

TypeError: log is not a function

1 个答案:

答案 0 :(得分:0)

似乎您希望将ESM与Node和TS结合使用。

在我回答您的问题时要进行更新的设置是:

tsconfig.json

在tsconfig.json文件上,确保具有以下设置:

{
    "compilerOptions": {
        "lib": ["es2020"],
        "module": "ESNext",
        "moduleResolution": "node",
        "target": "ES2020",
        "esModuleInterop": true,
        ...
    },
    ... 
}

package.json

请确保您的package.json文件具有以下属性。

{ 
    ...
    "type":"module",
    ...
}

运行已转译的文件

别忘了您不能直接在NodeJS中导入TS文件,您需要先使用tsc对其进行转换,然后在运行时将其导入NodeJS中,因此最终您将要导入js而不是ts文件。要将其作为TS运行,请确保阅读答案的下一部分。

另外,在运行它时,请确保使用标志--experimental-specifier-resolution=node,因为它将使您具有TypeScript中没有扩展名的导入:

node --experimental-specifier-resolution=node index.js

有关该标志的更多详细信息,请阅读https://nodejs.org/api/esm.html#esm_customizing_esm_specifier_resolution_algorithm

在ts-node上运行

TS Node是一个运行时编译器,因此使用Node时可以在运行时导入打字稿文件。

当前,TS节点中有一项实验功能,允许您使用ESM运行它,要使用它,您需要安装TS节点9.1+。 有关实施和可能出现的问题的更多详细信息,请检查:https://github.com/TypeStrong/ts-node/issues/1007

要安装它,您将需要运行:

npm i -D ts-node 

要运行支持新解析模式和TSNode加载器的服务,您将需要运行:

node --experimental-specifier-resolution=node --loader ts-node/esm index.ts

此后,您将可以在运行时在项目中使用TS和ESM,并且可以执行以下语句:

import {log} from './Util'

其中日志是Util.ts的导出成员

重要!我不建议在生产环境中使用ts-node,因此这对于开发环境非常方便且有用,但请确保在生产环境中进行转换和使用生成的代码,以避免可能TS节点的内存问题。