不敢相信在 2025,怎么自己 build/bundle + self-host 一个 ESM 版本的 react.js 和 react-dom.js 也是一个找不到官方答案的问题。问了 AI,答案也不靠谱 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Radeon
V2EX    React

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

  •  
  •   Radeon 180 天前 2673 次点击
    这是一个创建于 180 天前的主题,其中的信息可能已经有所发展或是发生改变。
    所有的地方都让人去用
    https://esm.sh/[email protected]
    https://esm.sh/[email protected]/client
    这些 CDN 。问题是不用 CDN 的话,自己怎么去把完整的 ESM build 出来呢?问了 AI 也找不到具体的官方步骤
    23 条回复    2025-04-14 19:42:44 +08:00
    musi
        1
    musi  
       180 天前
    Radeon
        2
    Radeon  
    OP
       180 天前
    @musi 但是这是 build UMD 的方式,不是 ESM
    bgm004
        3
    bgm004  
       180 天前
    那你把 cdn 上的文件存储到本地不就可以了。
    Radeon
        4
    Radeon  
    OP
       180 天前
    @Track13 不行呀。它那个文件只是一个 entry ,后面还要再动态拉取其他的文件的。具体拉多少文件是不知道的(根据你的代码实际调用情况)
    bgm004
        5
    bgm004  
       180 天前
    @Radeon ,好吧,esm 的 cdn 我还没有用过。都是老老实实的用 npm 。
    songray
        6
    songray  
       180 天前
    这个问题已经存在很多年了,不管是源码还是编译脚本没有考虑过 ESM ,要改的话至少需要几个人一起着手,不是 AI 能干的。
    https://github.com/facebook/react/issues/11503
    https://github.com/facebook/react/issues/10021

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

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

    https://github.com/Ray-D-Song/esm-react-transform
    UnluckyNinja
        11
    UnluckyNinja  
       180 天前 via Android   1
    https://github.com/esm-bundle/react 直接看看 esm.sh 怎么做的不就好了
    UnluckyNinja
        12
    UnluckyNinja  
       180 天前 via Android
    @UnluckyNinja #11 *这俩没关系,修正下措辞:直接照着 esm.sh 的做法改,或者看看其他 esm 重打包怎么做的
    Radeon
        13
    Radeon  
    OP
       180 天前
    @UnluckyNinja 问题是为什么要看 ESM 的步骤?不应该是 Meta/React 在 npm 包里提供步骤吗?
    pursuer
        14
    pursuer  
       180 天前
    怕污染可以 rollup 打包 AMD ,虽然我觉得污染影响不大?
    顺便打广告,一个利用 AMD 实现前后端共用代码的框架 地址 https://github.com/partic2/pxseed-CorePackages
    Radeon
        15
    Radeon  
    OP
       180 天前
    @pursuer UMD 有官方背书的 CDN ,是完整且 minified 的,不需要 AMD 版本。但是都 2025 年了,不应该默认提供 ESM 的完整 minified 的版本在 dist 目录下吗?难道诸君都不需要?
    Radeon
        16
    Radeon  
    OP
       180 天前
    @pursuer AMD 也有污染问题。只有 ESM 没有污染
    Radeon
        17
    Radeon  
    OP
       180 天前
    @songray 动作这么快?
    Radeon
        18
    Radeon  
    OP
       180 天前
    @songray 感谢你的代码的提醒,不过我打算从官方背书的 UMD 版本( https://unpkg.com/[email protected]/umd/react.production.min.js )转。因为一是我用在浏览器环境里,不适合用 cjs ,另外这个 URL 是官方背书的
    pursuer
        19
    pursuer  
       180 天前
    @Radeon ESM 不能满足我的需要,我的目标是前后端使用同一套模块加载机制且足够灵活(比如支持通过 indexeddb 加载模块,在加载前预编译代码等),所以 ESM 的灵活性对我来说是不够的,而且 service worker 内不支持 dynamic import ,所以才做了 pxseed ,AMD 只需要 require,define,requirejs 3 个变量也还好
    UnluckyNinja
        20
    UnluckyNinja  
       180 天前
    @Radeon #13 其实我没太搞懂你的真正问题是啥,看上面的回复我以为你是要从现有的 cjs build 文件想办法弄一个 esm build 出来,但现在看来也不是。如果是吐槽 react 官方不作为,CRA 今年年初才终于从文档中移除,react 官方肯定不会在意这点。如果介意全局空间污染,但 2025 年介意空间污染的基本都在用构建工具了,也就不需要再去找 esm 的构建来引入了。
    Radeon
        21
    Radeon  
    OP
       180 天前
    @UnluckyNinja 主要是吐槽官方不作为。我只是想找一个像官方 UMD 版本 (react.production.min.js) 一样的 ESM 版本的 production.min.js 文件,但是整个东西方互联网都没有 (esm.sh 上的是 entry 文件,不是打包的)。我又想从 react/react-dom 的 npm 包自己来 build ,还是没有官方步骤
    UnluckyNinja
        22
    UnluckyNinja  
       180 天前   1
    @Radeon #21 可以试一下 vite 的库模式 https://cn.vite.dev/guide/build.html#library-mode
    Radeon
        23
    Radeon  
    OP
       180 天前
    @pursuer 但是 ESM 是趋势呀,而且 ESM 的模块空间天生是隔离的,如果你以后需要加载多个 plug-in ,每个 plug-in 自带自己的库(同一个库的不同版本),ESM 的好处就体现了。这样它们互相就不干扰了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1201 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 17:29 PVG 01:29 LAX 10:29 JFK 13:29
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86