如何在 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 编译器?
如何使用 ts-node-dev 和正确的行号在 Visual Studio Code 中调试 Typescript 代码