不起作用,因为remoteentry.js是模块注册器而非可执行脚本,需由宿主js通过import()调用才能激活暴露模块;它依赖webpack运行时上下文,且浏览器不识别import("remoteapp/button")中的远程协议,必须经构建工具解析remotes映射。

HTML 本身不支持模块联邦(Module Federation),它只是静态宿主容器;真正实现远程模块加载的是 JavaScript 运行时 + Webpack/Vite 构建产物,remoteEntry.js 必须由 JS 脚本动态加载并执行,不能靠 HTML 标签直接引入生效。
为什么 <script src="remoteEntry.js"></script> 不起作用
模块联邦的 remoteEntry.js 不是普通脚本:它导出的是一个“模块注册器”,而非可立即执行的逻辑。直接用 <script></script> 引入只会执行注册逻辑,但不会触发任何模块暴露或共享行为——因为没有宿主应用调用 import() 去消费它。
- Webpack 生成的
remoteEntry.js依赖全局__webpack_require__环境,单独加载时缺少上下文,exposes模块不会被激活 - 浏览器原生不识别
import("remoteApp/Button")中的remoteApp/协议,必须由 Webpack 运行时解析 remotes 映射 - Vite 用户尤其要注意:
@originjs/vite-plugin-federation同样要求import()调用,且路径前缀(如remoteApp/Button)必须与remotes配置中的 key 完全一致
HTML 中必须做的最小初始化动作
宿主应用的 HTML 文件只需确保两件事:正确加载宿主自身的 bundle(含 Module Federation 运行时),以及保证 publicPath 设置无误——其余全部交给 JS 控制。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 在
或底部插入宿主应用主 JS(如main.js),不要提前加载任何 remote 的 script -
publicPath必须设为绝对 URL(如http://localhost:3000/),否则remoteEntry.js的 chunk 加载会 404 - 避免在 HTML 里写
crossorigin="anonymous"却没配好 remote 服务的 CORS 响应头,否则控制台静默失败
import() 是唯一合法入口,且时机决定是否“按需”
模块联邦不提供自动加载机制,所有远程模块都必须通过 import() 触发。所谓“按需”,完全取决于你把 import() 放在哪:
- 放在路由组件内(如 React Router 的
lazy(() => import("remoteApp/Dashboard")))→ 真正按需 - 放在事件回调中(如
onClick={() => import("remoteApp/Report").then(render)})→ 用户触发才加载 - 写在组件顶层(
const RemoteBtn = () => { import("remoteApp/Button"); ... })→ 组件定义即加载,不算按需 - 写成
import Button from "remoteApp/Button"→ 编译报错,模块联邦不支持静态导入远程模块
远程模块加载失败时,HTML 看不到错误但 JS 会卡住
当 import("remoteApp/Button") 失败(如网络中断、remoteEntry.js 404、CORS 阻止),Promise 被 reject,但 HTML 页面不会刷新或报错——错误只存在于 JS Promise 链中,容易被忽略。
- 默认无重试:Webpack 生成的加载代码在
__webpack_require__.l中遇到错误直接reject(__webpack_error__),不重试 - 必须手动封装:例如用
async function loadWithRetry(url, retries = 3) { try { return await import(url); } catch (e) { if (retries > 0) return loadWithRetry(url, retries - 1); throw e; } } - 注意加载状态:建议配合 loading skeleton 或 error boundary,否则用户点击后无响应,会以为功能不可用
真正的难点不在 HTML 写法,而在于构建配置与运行时调用的耦合性——remotes 配置、exposes 路径、import() 字符串三者必须字面量一致,漏一个斜杠或大小写就失败,且错误信息极不友好。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










