V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Radeon
V2EX  ›  React

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

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

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

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

    https://github.com/Ray-D-Song/esm-react-transform
    UnluckyNinja
        11
    UnluckyNinja  
       11 天前 via Android   ❤️ 1
    https://github.com/esm-bundle/react 直接看看 esm.sh 怎么做的不就好了
    UnluckyNinja
        12
    UnluckyNinja  
       11 天前 via Android
    @UnluckyNinja #11 *这俩没关系,修正下措辞:直接照着 esm.sh 的做法改,或者看看其他 esm 重打包怎么做的
    Radeon
        13
    Radeon  
    OP
       11 天前
    @UnluckyNinja 问题是为什么要看 ESM 的步骤?不应该是 Meta/React 在 npm 包里提供步骤吗?
    pursuer
        14
    pursuer  
       11 天前
    怕污染可以 rollup 打包 AMD ,虽然我觉得污染影响不大?
    顺便打广告,一个利用 AMD 实现前后端共用代码的框架 地址 https://github.com/partic2/pxseed-CorePackages
    Radeon
        15
    Radeon  
    OP
       11 天前
    @pursuer UMD 有官方背书的 CDN ,是完整且 minified 的,不需要 AMD 版本。但是都 2025 年了,不应该默认提供 ESM 的完整 minified 的版本在 dist 目录下吗?难道诸君都不需要?
    Radeon
        16
    Radeon  
    OP
       11 天前
    @pursuer AMD 也有污染问题。只有 ESM 没有污染
    Radeon
        17
    Radeon  
    OP
       11 天前
    @songray 动作这么快?🐮👍
    Radeon
        18
    Radeon  
    OP
       11 天前
    @songray 感谢你的代码的提醒,不过我打算从官方背书的 UMD 版本( https://unpkg.com/react@18.3.1/umd/react.production.min.js )转。因为一是我用在浏览器环境里,不适合用 cjs ,另外这个 URL 是官方背书的
    pursuer
        19
    pursuer  
       10 天前
    @Radeon ESM 不能满足我的需要,我的目标是前后端使用同一套模块加载机制且足够灵活(比如支持通过 indexeddb 加载模块,在加载前预编译代码等),所以 ESM 的灵活性对我来说是不够的,而且 service worker 内不支持 dynamic import ,所以才做了 pxseed ,AMD 只需要 require,define,requirejs 3 个变量也还好
    UnluckyNinja
        20
    UnluckyNinja  
       10 天前
    @Radeon #13 其实我没太搞懂你的真正问题是啥,看上面的回复我以为你是要从现有的 cjs build 文件想办法弄一个 esm build 出来,但现在看来也不是。如果是吐槽 react 官方不作为,CRA 今年年初才终于从文档中移除,react 官方肯定不会在意这点。如果介意全局空间污染,但 2025 年介意空间污染的基本都在用构建工具了,也就不需要再去找 esm 的构建来引入了。
    Radeon
        21
    Radeon  
    OP
       10 天前
    @UnluckyNinja 主要是吐槽官方不作为。我只是想找一个像官方 UMD 版本 (react.production.min.js) 一样的 ESM 版本的 production.min.js 文件,但是整个东西方互联网都没有 (esm.sh 上的是 entry 文件,不是打包的)。我又想从 react/react-dom 的 npm 包自己来 build ,还是没有官方步骤
    UnluckyNinja
        22
    UnluckyNinja  
       10 天前   ❤️ 1
    @Radeon #21 可以试一下 vite 的库模式 https://cn.vite.dev/guide/build.html#library-mode
    Radeon
        23
    Radeon  
    OP
       10 天前
    @pursuer 但是 ESM 是趋势呀,而且 ESM 的模块空间天生是隔离的,如果你以后需要加载多个 plug-in ,每个 plug-in 自带自己的库(同一个库的不同版本),ESM 的好处就体现了。这样它们互相就不干扰了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3502 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:23 · PVG 18:23 · LAX 03:23 · JFK 06:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.