TypeScript 使用新的"module"值输出ESM代码的选项:将"moduleResolution"设置为"NodeNext",

aoyhnmkz  于 6个月前  发布在  TypeScript
关注(0)|答案(4)|浏览(60)

🔍 搜索词

esm, nodenext, module, moduleResolution

✅ 可实现性检查清单

⭐ 建议

目前,当设置 "moduleResolution""NodeNext" 时,您必须将 "module" 设置为 "NodeNext" 。我希望有一个新的 module 值,它与 moduleResolution: "NodeNext" 一起有效,但强制TS输出ESM代码(即import/export而不是require),类似于 "module": "ES2020" 的输出。

📃 激励示例

我认为TS依赖于package.json作为工具,没有直接向其提供指令的方法(特别是在使用程序化API时),这是一个有问题的设计。
TSC作为一个工具应该有一种从用户那里获取指令的方法,这些指令比package.json的值更强大。
我希望能够直接控制我要告诉tsc做什么,而不是依赖于副作用(package.json)。
直到NodeNext,这都是这样的,但现在情况已经改变了。
此外,模块解析和模块之间不应该有如此紧密的联系,因为它们实际上并不相互关联。

💻 用例

背景:
我正在开发一个名为 Bit 的大型开源工具。
当使用bit时,您通常不会有 package.json 文件,因为bit为您生成和管理它们。
bit还使用TS以编程方式编译文件。
一旦我将tsconfig设置为:

"compilerOptions": {
    "moduleResolution": "NodeNext",
    "module": "NodeNext"
  },

tsc正在寻找一个package.json并找不到,因此它将为 .ts 文件输出CJS输出。
我通过操作文件名 I gave to ts compiler when calling its API See calling to ts transpile module APi [here](https://bit.cloud/teambit/typescript/typescript-compiler/~code/typescript-compiler.ts#l108) And the manipulation of the filename [here](https://bit.cloud/teambit/typescript/typescript-compiler/~code/typescript-compiler.ts#l206) This works just fine when compiling the code. (I saw other tools using this method like the ts-jest `` useESM`选项等来克服这个问题。)
然而,这引入了两个问题:

  1. 这是一种非常hacky的方式来做这件事,当我只想“强制”ts编译为ESM(类似于 "module": "ES2020" )而不是基于package.json时。
  2. 这在编译上没问题,但例如IDE不知道这一点,导致错误如:
The 'import.meta' meta-property is not allowed in files which will build into CommonJS output.ts(1470)

IDE从他的Angular 认为(从正确的Angular 来看),该文件将被编译为CJS,但事实并非如此。
但我没有办法告诉他它将在行动中被编译为ESM。
目前,我的其他选择是将tsconfig设置为:

"compilerOptions": {
    "moduleResolution": "Node",
    "module": "ES2020"
  },

但这会导致另一个模块解析问题。
我相信这个解析问题是一个bug。我可以轻松地重现这个解析问题(对我来说很容易),但不幸的是,我不知道如何轻松地让其他人重现它,因为这需要安装bit并执行一些bit操作。它在某种程度上与node_modules中的symlinks有关等等。(我很乐意在现场展示并指导某人在他的机器上重现它,如果他愿意安装bit的话)。

xjreopfe

xjreopfe1#

为什么在这里需要moduleResolution: NodeNext?如果你没有package.json文件,那么显然你不是针对Node的。听起来你想要moduleResolution: bundler - 在那种配置中不起作用是什么?

3lxsmp7m

3lxsmp7m2#

如果我理解正确的话,OP的目标确实是Node,但使用的工具是用来以编程方式生成package.json的。对于这个用例来说,bundler可能过于宽松(例如,它允许无扩展名的导入,我记得是这样)。

ykejflvf

ykejflvf3#

正如@fatcerberus所说,我确实在做目标节点,但我的工具是在后续过程中以编程方式生成package.json(例如当我创建包tar时),但它不存在于开发工作区。
因此,bundler无法适应这种情况。
对于我来说,模块解析NodeNext表现得像预期一样,我的主要问题是它绑定到模块:NodeNext,然后发出CJS文件,因为它找不到package.json(我使用的是常规的.ts / tsx文件,而不是.mts - 我是一个平台,所以实际代码不是我可以控制的,所以我不能强制所有用户使用.mts为例)。
因此,我希望只是明确地指示TS像看到带有type:module的package.json或像看到.mts文件一样发出ESM。

oipij1gg

oipij1gg4#

我非常感谢这里的任何反馈。

相关问题