logo
  • 指南
  • 配置
  • 插件
  • API
  • 示例
  • 社区
  • Modern.js 2.x 文档
  • 简体中文
    • 简体中文
    • English
    • 开始
      介绍
      快速上手
      版本升级
      名词解释
      技术栈
      核心概念
      页面入口
      构建工具
      Web 服务器
      基础功能
      路由
      路由基础
      配置式路由
      数据管理
      数据获取
      数据写入
      数据缓存
      渲染
      服务端渲染(SSR)
      服务端流式渲染(Streaming SSR)
      渲染缓存
      静态站点生成(SSG)
      渲染预处理 (Render Preprocessing)
      样式开发
      引入 CSS
      使用 CSS Modules
      使用 CSS-in-JS
      使用 Tailwind CSS
      HTML 模板
      引用静态资源
      引用 JSON 文件
      引用 SVG 资源
      引用 Wasm 资源
      调试
      数据模拟(Mock)
      网络代理
      使用 Rsdoctor
      使用 Storybook
      测试
      Playwright
      Vitest
      Jest
      Cypress
      路径别名
      环境变量
      构建产物目录
      部署应用
      进阶功能
      使用 Rspack
      使用 BFF
      基础用法
      运行时框架
      扩展 BFF Server
      扩展一体化调用 SDK
      文件上传
      跨项目调用
      优化页面性能
      代码分割
      静态资源内联
      产物体积优化
      React Compiler
      提升构建性能
      浏览器兼容性
      配置底层工具
      源码构建模式
      服务端监控
      Monitors
      日志事件
      指标事件
      国际化
      基础概念
      快速开始
      配置说明
      语言检测
      资源加载
      路由集成
      API 参考
      高级用法
      最佳实践
      自定义 Web Server
      专题详解
      模块联邦
      简介
      开始使用
      应用级别模块
      服务端渲染
      部署
      集成国际化能力
      常见问题
      依赖安装问题
      命令行问题
      构建相关问题
      热更新问题
      已下线功能
      📝 编辑此页面
      上一页开始使用下一页服务端渲染

      #应用级别模块

      Modern.js 提供了运行时 API,支持快速从应用中导出应用级别的 Module Federation 模块。

      我们以 使用模块联邦 创建的应用为例,进一步说明如何导入应用级别模块。

      #安装依赖

      在原本应用的基础上,我们需要安装 @module-federation/bridge-react 依赖,用于使用 Bridge 加载应用级别模块。

      npm
      yarn
      pnpm
      bun
      deno
      npm add @module-federation/bridge-react
      yarn add @module-federation/bridge-react
      pnpm add @module-federation/bridge-react
      bun add @module-federation/bridge-react
      deno add npm:@module-federation/bridge-react

      #生产者导出模块

      和直接导出组件级别的模块不同,我们需要为应用级别模块创建一个独立的入口来作为 Module Federation 的导出。

      我们创建 src/export-App.tsx 文件:

      Note

      这里可以是任意的文件名,Modern.js 没有做强制约定。

      src/export-App.tsx
      import '@modern-js/runtime/registry/main'; // 这一行必须引入,它会默认导入微前端运行时依赖
      import { render } from '@modern-js/runtime/browser';
      import { createRoot } from '@modern-js/runtime/react';
      import { createBridgeComponent } from '@module-federation/bridge-react';
      
      const ModernRoot = createRoot();
      export const provider = createBridgeComponent({
        rootComponent: ModernRoot,
        render: (Component, dom) => render(Component, dom),
      });
      
      export default provider;

      该文件会将 main 入口的应用根组件传递给 Bridge API,并通过 Bridge 将调用渲染函数将其渲染到指定的节点上。

      接下来,我们配置 module-federation.config.ts,将导出修改为 src/export-App.tsx:

      module-federation.config.ts
      import { createModuleFederationConfig } from '@module-federation/modern-js';
      
      export default createModuleFederationConfig({
        name: 'remote',
        manifest: {
          filePath:'static',
        },
        filename: 'static/remoteEntry.js',
        exposes: {
          './app': './src/export-App.tsx',
        },
        shared: {
          react: { singleton: true },
          'react-dom': { singleton: true },
        },
      });
      Info

      createBridgeComponent 用于导出应用级别模块,Modern.js 相关 API 可以查看 createRoot、render。

      #消费者使用模块

      然后我们修改消费者配置,移除之前创建的的路由文件 src/routes/remote/page.tsx。

      我们希望所有访问到 /remote 的路由都能被进入上述应用级别模块中,因此我们重新添加 src/routes/remote/$.tsx。

      Note

      如果你还不了解 $.tsx 的能力,可以阅读 通配路由。

      src/routes/remote/$.tsx
      import { createRemoteAppComponent } from '@module-federation/bridge-react';
      import { loadRemote } from '@module-federation/modern-js/runtime';
      
      const ErrorBoundary = (info?: { error: { message: string } }) => {
        return (
          <div>
            <h2>This is ErrorBoundary Component, Something went wrong:</h2>
            <pre style={{ color: 'red' }}>{info?.error.message}</pre>
          </div>
        );
      };
      const Loading = <div>loading...</div>;
      const RemoteApp = createRemoteAppComponent({
        loader: () => loadRemote('remote/app'),
        fallback: ErrorBoundary,
        loading: Loading,
      });
      
      export default RemoteApp;
      Info

      createRemoteAppComponent 用于加载应用级别模块。

      #启动应用

      现在,生产者应用和消费者应用都已经搭建完毕,我们可以在本地运行 modern dev 启动两个应用。

      启动后,消费者应用访问 /remote 路由时,会进入生产者应用中。访问 http://localhost:8080/remote,可以看到页面中已经包含了生产者的远程模块的完整页面。

      你可以在生产者应用中,创建新的路由文件,并在代码中添加路由导航,可以发现这些功能也能够正常运行。

      上述用例可以参考:Modern.js & Module Federation 应用级别模块。

      #相关文档

      • Module Federation Bridge