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

Posted

技术标签:

【中文标题】如何在 Typescript 输出中使用 node --experimental-modules【英文标题】:How to use node --experimental-modules with Typescript output 【发布时间】: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。嘿,我想要新的闪亮的东西。

我错过了什么?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于如何在 Typescript 输出中使用 node --experimental-modules的主要内容,如果未能解决你的问题,请参考以下文章

什么 TypeScript 配置产生最接近 Node.js 16 功能的输出?

Typescript:如何解析 node.js 的绝对模块路径?

Typescript 开发环境安装Node.js安装以及输出HelloWorld

如何在 Windows 上的“观察输出文件”模式 (tsc -w) 下使用 TypeScript 编译器?

TypeScript console.log不起作用

如何使用 ts-node-dev 和正确的行号在 Visual Studio Code 中调试 Typescript 代码