不敢相信在 2025,怎么自己 build/bundle + self-host 一个 ESM 版本的 react.js 和 react-dom.js 也是一个找不到官方答案的问题。问了 AI,答案也不靠谱

144 天前
 Radeon
所有的地方都让人去用
https://esm.sh/react@18.2.0
https://esm.sh/react-dom@18.2.0/client
这些 CDN 。问题是不用 CDN 的话,自己怎么去把完整的 ESM build 出来呢?问了 AI 也找不到具体的官方步骤
2575 次点击
所在节点    React
23 条回复
musi
144 天前
Radeon
144 天前
@musi 但是这是 build UMD 的方式,不是 ESM
Track13
144 天前
那你把 cdn 上的文件存储到本地不就可以了。😅
Radeon
144 天前
@Track13 不行呀。它那个文件只是一个 entry ,后面还要再动态拉取其他的文件的。具体拉多少文件是不知道的(根据你的代码实际调用情况)
Track13
144 天前
@Radeon 🤫,好吧,esm 的 cdn 我还没有用过。都是老老实实的用 npm 。
songray
144 天前
这个问题已经存在很多年了,不管是源码还是编译脚本没有考虑过 ESM ,要改的话至少需要几个人一起着手,不是 AI 能干的。
https://github.com/facebook/react/issues/11503
https://github.com/facebook/react/issues/10021

更关键的一点是,React 几乎所有子模块都是 internal ,没法进行摇树,所以提供 ESM 也没啥意义,你为什么不用 UMD 或者 CJS ?
Razio
144 天前
@Radeon #4 有这劲拉一个完整的 react.esm.min.js 不行吗,就单独 react 来讲,动态 import 其他文件有什么性能优势吗
Radeon
144 天前
@Razio 整个互联网上没有一个 self-contained, 完整的 react.esm.min.js 。我问过 Grok 了,Grok 确认没有。只有 UMD 版本的。Grok 也同意难以置信
Radeon
144 天前
@songray 要用在浏览器里,所以不能用 CJS 。用 UMD 的话,会污染 globalThis 呀
songray
144 天前
@Radeon 那你自己用 rollup 把 cdn 上的 react.cjs 转一下就行了,不需要直接从源码 build esm 。

你可以参考一下我刚刚写的 demo 或者直接用 dist 文件夹下的产物。

https://github.com/Ray-D-Song/esm-react-transform
UnluckyNinja
144 天前
https://github.com/esm-bundle/react 直接看看 esm.sh 怎么做的不就好了
UnluckyNinja
144 天前
@UnluckyNinja #11 *这俩没关系,修正下措辞:直接照着 esm.sh 的做法改,或者看看其他 esm 重打包怎么做的
Radeon
144 天前
@UnluckyNinja 问题是为什么要看 ESM 的步骤?不应该是 Meta/React 在 npm 包里提供步骤吗?
pursuer
144 天前
怕污染可以 rollup 打包 AMD ,虽然我觉得污染影响不大?
顺便打广告,一个利用 AMD 实现前后端共用代码的框架 地址 https://github.com/partic2/pxseed-CorePackages
Radeon
144 天前
@pursuer UMD 有官方背书的 CDN ,是完整且 minified 的,不需要 AMD 版本。但是都 2025 年了,不应该默认提供 ESM 的完整 minified 的版本在 dist 目录下吗?难道诸君都不需要?
Radeon
144 天前
@pursuer AMD 也有污染问题。只有 ESM 没有污染
Radeon
144 天前
@songray 动作这么快?🐮👍
Radeon
144 天前
@songray 感谢你的代码的提醒,不过我打算从官方背书的 UMD 版本( https://unpkg.com/react@18.3.1/umd/react.production.min.js )转。因为一是我用在浏览器环境里,不适合用 cjs ,另外这个 URL 是官方背书的
pursuer
144 天前
@Radeon ESM 不能满足我的需要,我的目标是前后端使用同一套模块加载机制且足够灵活(比如支持通过 indexeddb 加载模块,在加载前预编译代码等),所以 ESM 的灵活性对我来说是不够的,而且 service worker 内不支持 dynamic import ,所以才做了 pxseed ,AMD 只需要 require,define,requirejs 3 个变量也还好
UnluckyNinja
144 天前
@Radeon #13 其实我没太搞懂你的真正问题是啥,看上面的回复我以为你是要从现有的 cjs build 文件想办法弄一个 esm build 出来,但现在看来也不是。如果是吐槽 react 官方不作为,CRA 今年年初才终于从文档中移除,react 官方肯定不会在意这点。如果介意全局空间污染,但 2025 年介意空间污染的基本都在用构建工具了,也就不需要再去找 esm 的构建来引入了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1125351

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX