如何在Typescript输出中使用node --experimental-modules

时间:2019-10-18 14:34:34

标签: node.js typescript

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

现在,我要向用主节点应用消耗的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"]
}

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

import { schema } from './schema'

内置的import语句不包含任何.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

原因是导入没有.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'

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

我想念什么?

1 个答案:

答案 0 :(得分:0)

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

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

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