feat: enable esm cli runtime#8227
Conversation
🦋 Changeset detectedLatest commit: 2db4bb7 The changes in this PR will be included in the next version bump. This PR includes changesets to release 110 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
✅ Deploy Preview for modernjs-v3 ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
|
牛,我这两天会看下这个 PR,如果你准备好了可以直接艾特我们。 |
|
@yimingjfe 也关注一下 |
也没什么需要准备的,只是ut的问题还没解决(不太熟悉rstest,希望你们有经验的给点建议) |
OK 我来看看,咱们也是最近才接上 rstest |
|
我目前完成了整体的 review,这里有几个点我会去新建 PR 并且先合并到 main 中,后续可能需要你做一些冲突解决:
另外我还会确认如何处理 Node ESM 和 bundle target node 导出的问题 |
|
这个 PR 最大的问题是 Modern.js 需要支持 Node 20,可以帮忙看下 import-meta-resolve 是否有双栈的版本 |
node 20 可以直接运行esm,不需要加参数吧。只有一个 而且项目默认还是走cjs产物,只有esm项目会走esm产物。预期中cjs时也不需要去resolve esm,在cjs产物中直接去掉这个包应该就行 |
我理解现在就是非 ESM 项目没法在 20 里启动了,如果不加这个参数的话 |
在solution/app-tools中有判断,非esm项目默认还是走cjs产物,不会有影响吧 |
|
@zllkjc 另外很多packages.json相关的问题,我认为都可以通过合并esm/esm-node来解决。 原先拆分似乎是因为要关掉js redirect。但根据我实际测试,即使打开这个参数也不会影响走 |
这个问题我看到了,明天我们讨论一下,评论里已经提到相关同学了 |
|
目前我已经 resolve 了大部分需要后续 PR 解决的 comment,包括:
其他的内容需要在这个 PR 里解决,例如 deploy 的问题可以帮忙确认一下具体原因。 我这边会着手来查看 rstest 测试 modern:source 的问题。 |
|
Comment里提到的问题我明天会一一确认处理。
这个指的是? |
|
我试了确实如此,但好像不是我引入的问题,这个是
另外使用较新的node 20(20.19+)是可以正常运行的
|
|
抱歉,我这里截图有误,我没有你的仓库的代码权限,你是否可以再拉取一下 main 分支,然后重新提交下,rsbuild 的问题我在其他 PR 已经修复了。这个分支之前存在一个由于 import-meta-resolve 导致的错误。 |
好的,我拉到本地再验证一下。 |
|
可以给我一个你仓库的权限吗,这样我可以直接修改一些因为其他 PR 导致的报错 |
done |
|
目前看起来没有其他问题了,我可以将它合入,你看还有其他需要改动的点吗~ |
|
辛苦把 PR Title 和 PR 的 Summary 重新整理一下,方便其他开发者理解~ |
这个PR我没啥要改的了,你们觉得合适了可以随时merge |
后续我将基于这个 PR 做上述这些优化~ 再次感谢小伙伴对 Modern.js 的贡献! |






Summary
为modern.js常见包启用esm runtime。在运行modern-js相关cli命令时,于esm项目下默认运行esm产物,非esm项目仍然运行原cjs产物(通过项目package.json中的type判断)
主要修改:
solutions/app-tools/bin/modern.js中增加项目类型判断,执行不同入口文件requirerequire.resolve__dirname的使用,以兼容esm运行时nanoidjs-yaml包commanderlodashtsconfig-paths包增加esm入口,以兼容相关import语法toolkit/utils/src/cli/require.ts中的逻辑,增加esm运行时环境下的支持MODERN_LIB_FORMAT,该环境变量仅用于编译时(不用于运行时),区分打包目标产物是esm还是cjs,以进行适当的tree shakingEnables ESM runtime for some modern.js packages. When running modern-js CLI commands, ESM artifacts will be run by default in ESM projects, while non-ESM projects will still run the original CJS artifacts (determined by the type in the project's package.json).
Main modifications:
solutions/app-tools/bin/modern.jsto execute different entry files.exportsto the package.json of some packages, pointing to ESM artifacts.require,require.resolve, and__dirnameto ensure compatibility with the ESM runtime.nanoidandjs-yamlpackages.commander,lodash, andtsconfig-pathspackages to ensure compatibility with related import syntax.toolkit/utils/src/cli/require.tsto add support for the ESM runtime environment.MODERN_LIB_FORMATis introduced. This environment variable is only used at compile time (not at runtime) to distinguish between the packaged target artifacts, e.g., esm or cjs, in order to perform appropriate tree shaking.Related Links
拆分自 #8097
Checklist
pnpm run change.