如何将 Node --experimental-modules 与 Typescript 输出结合使用

Vik*_*alk 5 node.js typescript

可能是有史以来最愚蠢的问题,但我有一个 Node 项目正在使用 ES 模块和--experimental-modulesNode 12。

现在,我将一个内部包添加到由主节点应用程序使用的用 Typescript 编写的 monorepo 中。我正在努力处理我的 Typescript 构建设置,这些设置会生成可与--experimental-modules.

当前 tsconfig.json:

{
  "include": [
    "src/**/*ts"
  ],
  "exclude": [
    "node_modules",
    "**/*.spec.ts"
  ],
  "compilerOptions": {
    "module": "esnext",
    "esModuleInterop": true,
    "target": "esnext",
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist"
  },
  "lib": ["es2015"]
}
Run Code Online (Sandbox Code Playgroud)

如果我index.ts从邻居 ts 文件导入:

import { schema } from './schema'
Run Code Online (Sandbox Code Playgroud)

构建的导入语句没有任何.js,这使我的节点应用程序窒息:

(node:78972) ExperimentalWarning: The ESM module loader is experimental.
internal/modules/esm/default_resolve.js:79
  let url = moduleWrapResolve(specifier, parentURL);
            ^

Error: Cannot find module /Users/viktor/dev/projects/kb-frontend/packages/graph/dist/schema imported from /Users/viktor/dev/projects/kb-frontend/packages/graph/dist/index.js
Run Code Online (Sandbox Code Playgroud)

原因是导入没有.js在 ts 构建的 dist 目录中进行修补,它可以正常工作。

我不能简单地将我的 ts 模块更改为 commonjs,因为这也会改变我的主要导出与基于 esm 的主要工作的方式,从而给我带来其他错误:

import { server as graphMiddleware } from '@kb-front/graph'
         ^^^^^^
SyntaxError: The requested module '@kb-front/graph' does not provide an export named 'server'
Run Code Online (Sandbox Code Playgroud)

我不想.default在这里和那里添加很多东西,因为我的整个设置是为了避免使用commonjs,而只是将 js 和 typescript 与 esm 一起使用。嘿,我想要新的闪亮的东西。

我缺少什么?

Vik*_*alk 1

在带有 Typescript 的浏览器中使用本机模块支持的两个问题:

https://github.com/microsoft/TypeScript/issues/13422 https://github.com/microsoft/TypeScript/issues/16577

从他们那里我得到了只用 .js 扩展名导入的技巧。超级奇怪,但适合我的情况。