HTML本身不直接参与Module Federation,真正起作用的是html-webpack-plugin与ModuleFederationPlugin协同注入remoteEntry.js;必须先加载remoteEntry.js再执行主应用JS,否则报“Container not found”错误。
HTML 本身不直接参与 Module Federation,真正起作用的是
和 Webpack 的
协同注入远程资源。你看到的“HTML 做 module federation”,本质是让 HTML 文件正确加载远程模块入口(
)并支持动态 import。
为什么
html
-webpack-plugin 必须配合 Module Federation 使用
负责生成最终的
,而 Module Federation 的远程模块依赖
必须通过
标签提前加载,否则
会报
错误。
如果不使用
,就得手动在 HTML 中写死
,无法适配不同环境(开发/测试/生产)
在编译时把
配置转成 script 标签,并确保顺序:先加载
,再执行主应用 JS
它还自动处理 publicPath、hash、CDN 前缀等,避免
类错误
remotes 配置必须写在 html-webpack-plugin 之前还是之后
顺序无关紧要,但
必须在
的
数组中靠前位置 —— 因为
会在模板编译阶段读取 Webpack 的
,而
生成的
必须已存在才能被识别。
Webpack 插件执行顺序由插件自身注册逻辑决定,不是数组顺序;但保险起见,把
放
前面更稳妥
如果
先执行,它可能找不到
,导致生成的 HTML 缺少对应 script 标签
典型安全写法:
如何让 HTML 正确加载带版本号的 remoteEntry.js
直接硬编码 URL 不可维护,要用
+ 构建时变量控制。例如远程应用部署在
,不能靠前端运行时拼接,必须在构建阶段注入。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
立即学习
“
前端免费学习笔记(深入)
”;
在容器应用的
中,用
或
注入地址:
确保
和远程地址协议一致(都用
),否则会触发 CORS 或跨域 script 加载失败
若用 CDN,建议加 cache-busting 参数,如
,避免浏览器缓存旧版
最容易被忽略的一点:HTML 中 script 标签的加载是同步阻塞的,但 Module Federation 的远程模块加载是异步的。如果你在
的
内联脚本里立刻调用
,大概率失败 —— 必须等
的全局容器注册完成,这个时机由
内部的
控制,不是 DOM ready。
html-webpack-pluginModuleFederationPluginremoteEntry.jshtml-webpack-pluginindex.htmlremoteEntry.jsimport('app1/Button')Container not foundhtml-webpack-pluginhtml-webpack-pluginremotesremoteEntry.js__webpack_require__.e is not a functionModuleFederationPluginhtml-webpack-pluginpluginshtml-webpack-plugincompilation.assetsModuleFederationPluginremoteEntry.jsModuleFederationPluginHtmlWebpackPluginhtml-webpack-pluginremoteEntry.jsplugins: [
new ModuleFederationPlugin({ /* ... */ }),
new HtmlWebpackPlugin({ template: './public/index.html' })
]publicPathhttps://cdn.example.com/v1.2.0/remoteEntry.jswebpack.config.jsprocess.env.REMOTE_URLDefinePluginnew ModuleFederationPlugin({
remotes: {
app1: `app1@${process.env.APP1_REMOTE_URL || 'http://localhost:3001/remoteEntry.js'}`
}
})output.publicPathhttps://https://cdn.example.com/remoteEntry.js?v=1.2.0remoteEntry.jsindex.htmlimport('app1/Button')remoteEntry.jsimport()__webpack_init_sharing__