【问题标题】:How to use node --experimental-modules with Typescript output如何在 Typescript 输出中使用 node --experimental-modules
【发布时间】:2020-02-15 13:50:52
【问题描述】:

可能是有史以来最愚蠢的问题,但我有一个 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"]
}

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

import { schema } from './schema'

构建的导入语句没有任何.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 的 main 一起工作的方式,这会给我带来其他错误:

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。嘿,我想要新的闪亮的东西。

我错过了什么?

【问题讨论】:

    标签: node.js typescript


    【解决方案1】:

    使用 Typescript 在浏览器中使用原生模块支持的两个问题:

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-18
      • 2018-12-06
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 2017-07-27
      • 1970-01-01
      • 2016-12-20
      相关资源
      最近更新 更多