NestJS 中使用esm

先说结论

修改tsconfig 如下,修改 module/moduleResolution 这两个字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"compilerOptions": {
"module": "Node16", // +
"moduleResolution": "Node", // +
"declaration": true,
"removeComments": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"target": "es2017",
"sourceMap": true,
"outDir": "./dist",
"baseUrl": "./",
"allowJs": true,
"incremental": true
}
}

安装 @brillout/load-module npm包,如下使用

1
2
const MyEsmClass = await loadModule('my-esm-class')
const myobj = new MyEsmClass()

相关issue

  1. 为什么ts中无法直接使用 await import()
    1. https://github.com/nestjs/nest/issues/10047
    2. https://github.com/microsoft/TypeScript/issues/43329