web-infra-dev / modern.js

Modern.js is a web engineering system, including a web framework and a npm package solution.
https://modernjs.dev/en/
MIT License
4.28k stars 352 forks source link

[Bug]: @modern-js/module-tools 输出 cjs 时 转换了 await import #5795

Closed dingff closed 1 month ago

dingff commented 1 month ago

版本信息

System:
    OS: macOS 14.4.1
    CPU: (12) x64 Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
    Memory: 19.54 MB / 32.00 GB
    Shell: 5.9 - /bin/zsh
  Browsers:
    Chrome: 125.0.6422.113
    Safari: 17.4.1

问题详情

cjs

image

esm

image

复现链接

none

复现步骤

none

fi3ework commented 1 month ago

@modern-js/module-tools 底层是 esbuild,所以这本质上是 esbuild 的行为。

举个例子,如果你的目标环境不支持 import(),esbuild 会自动将你源码中的 import() 转换为 require,是符合预期的行为。

如果你希望强制保留 import(),可以使用 https://esbuild.github.io/api/#supporteddemo),修改 @modern-js/module-tools 配置文件中的 https://modernjs.dev/module-tools/api/config/build-config.html#esbuildoptions 即可。

如果有更多的问题,请提供复现链接及复现步骤帮助我们更好得排查(「请提供最小重现」)。

dingff commented 1 month ago

https://github.com/web-infra-dev/modern.js/blob/b52060924b4ddb7ea5db109097ca723a9175e7b7/packages/solutions/module-tools/src/builder/esbuild/index.ts#L207 请问这里为什么要这样做呀?

dingff commented 1 month ago

@fi3ework

fi3ework commented 1 month ago

你指的是前面的还是后面的判断条件

dingff commented 1 month ago

你指的是前面的还是后面的判断条件

cjs为什么要关闭dynamic-import?

dingff commented 1 month ago

@fi3ework

fi3ework commented 1 month ago

因为 CJS 在低版本 node 的兼容性更好,而且 Node 对 code splitting 没有什么强的诉求

dingff commented 1 month ago

因为 CJS 在低版本 node 的兼容性更好,而且 Node 对 code splitting 没有什么强的诉求

但是这样在format为cjs时,动态导入的esm依赖就会报错,因为import被转换成了require,这个问题怎么解呢 @fi3ework

fi3ework commented 1 month ago

我最开始的回复已经回答了这个问题。

dingff commented 1 month ago

我最开始的回复已经回答了这个问题。

好的,感谢耐心解答