Node.js --experimental-vm-modules命令行选项与package.json中的"type":"module"有何区别?(这是一个提问标题)

8

我目前正在将一个NodeJS项目从混乱的CommonJS和Babel转换过的ES模块重写为完全基于ES模块的项目。

在这个过程中,我有点困惑Node是如何处理这些东西的。我尝试阅读了相关文档,但是我的理解好像还缺了最后一块拼图。

我原以为我不再需要使用Babel来转换ES模块,这似乎是正确的。然而,当我运行我的(Jest)测试时,我仍然需要使用--experimental-vm-modules Node标志才能让一切正常工作。

我的问题是:那个标志是干什么用的?阅读文档,这似乎启用了ES模块,但是我不是已经通过在package.json文件中指定"类型":"模块"来启用ES模块了吗?

相关链接:


1
似乎Jest的ESM支持不是很稳定(非常新),我最近尝试了TS + ESM + Jest设置,但无论如何都无法让Jest正常工作。+1 - bogdanoff
2
也许这就是问题所在。我想知道其他测试框架是否能更好地处理这个问题。我觉得整个CommonJS/ESM的事情对很多人来说都很困惑。 - Peter
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
2
指定 package.json 中的 "module" 类型只是告诉库作者您的源代码基于 ESM。 对于 jest,您需要使用 experimental-vm-modules,因为 jest 使用的启用 ESM 支持的 node api 在 node 18.x 中仍不稳定。

https://jestjs.io/docs/ecmascript-modules


据我理解,只要我将模块放在包中,Node 就知道我的所有代码都是 ES 模块。然而,为什么 Jest 运行我的代码时没有发生这种情况呢?似乎 Jest 需要那个 API 才能显式地启用支持,但我不确定为什么它需要启用它,如果它已经在 package.json 中了。 - Peter
1
Jest目前还不完全支持ESM,它使用新的ESM虚拟机作为沙盒来运行你的ESM代码,通常在运行测试之前,Jest会将你的代码转换为CommonJS。 - ZEE
1
好的,我认为有趣的内容在链接到该页面的github问题中:https://github.com/facebook/jest/issues/9430 Jest使用称为“vm”API来在沙盒中运行测试。而这个API仍然有一些关于ES模块的实验部分(编辑:我与@ZEE并行输入了此评论,因此它包含一些重复信息)。 - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,