🔍 搜索词
esm, nodenext, module, moduleResolution
✅ 可实现性检查清单
- 这不会对现有的TypeScript/JavaScript代码造成破坏性的改变
- 这不会改变现有JavaScript代码的运行时行为
- 这可以在不根据表达式的类型输出不同JS的情况下实现
- 这不是一个运行时特性(例如库功能、JavaScript输出非ECMAScript语法、新的JS语法糖等)
- 这不是一个请求添加新实用类型的请求: https://github.com/microsoft/TypeScript/wiki/No-New-Utility-Types
- 这个特性将与我们设计目标的其他部分一致: https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals
⭐ 建议
目前,当设置 "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`选项等来克服这个问题。)
然而,这引入了两个问题:
- 这是一种非常hacky的方式来做这件事,当我只想“强制”ts编译为ESM(类似于
"module": "ES2020"
)而不是基于package.json时。 - 这在编译上没问题,但例如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的话)。
4条答案
按热度按时间xjreopfe1#
为什么在这里需要
moduleResolution: NodeNext
?如果你没有package.json文件,那么显然你不是针对Node的。听起来你想要moduleResolution: bundler
- 在那种配置中不起作用是什么?3lxsmp7m2#
如果我理解正确的话,OP的目标确实是Node,但使用的工具是用来以编程方式生成
package.json
的。对于这个用例来说,bundler
可能过于宽松(例如,它允许无扩展名的导入,我记得是这样)。ykejflvf3#
正如@fatcerberus所说,我确实在做目标节点,但我的工具是在后续过程中以编程方式生成package.json(例如当我创建包tar时),但它不存在于开发工作区。
因此,bundler无法适应这种情况。
对于我来说,模块解析NodeNext表现得像预期一样,我的主要问题是它绑定到模块:NodeNext,然后发出CJS文件,因为它找不到package.json(我使用的是常规的.ts / tsx文件,而不是.mts - 我是一个平台,所以实际代码不是我可以控制的,所以我不能强制所有用户使用.mts为例)。
因此,我希望只是明确地指示TS像看到带有type:module的package.json或像看到.mts文件一样发出ESM。
oipij1gg4#
我非常感谢这里的任何反馈。