基于vite配置模块联邦(修改版本)

一、MF 引出下面两个概念:

  • Host:引用了其他应用模块的应用, 即当前应用
  • Remote:被其他应用使用模块的应用, 即远程应用

二、在vite中配置---在host端加载remote端导出的页面

2.1 安装 @originjs/vite-plugin-federation

vite-plugin-federation是一款为vite提供,用于支持多个独立构建的应用可以将自己的部分能力作为组件提供出来,组成一个应用程序。他们之间不存在相互依赖,可以进行独立的开发和部署。灵感来源于webpack 5提供的Module Federation特性。它通过viterollup提供的hock,对构建文件进行干预,从而将所有远程模块的组件,汇总到remoteEntry.js中。本地模块通过remoteEntry.js入口,从而调用加载三方组件以及组件编译后的jscss等文件。

// 使用npm
npm install  @originjs/vite-plugin-federation --save-dev

// 使用yarn
yarn add  @originjs/vite-plugin-federation --dev

// 使用pnpm
pnpm install @originjs/vite-plugin-federation --D

2.2 新建项目文件

1.新建一个文件夹projects(自定义)

在该文件夹下创建三个项目,npm create vite@latest此命令重复三次即可

host-vite:动态加载、运行远程模块

remote-host-vite:既能加载、运行远程模块,又能提供远程模块

remote-vite:提供远程模块

2.用vscode打开projects文件夹

注意:以下步骤重复三次(因为创建了三个项目,一个host端两个remote端

### Vue 和 Vite模块联邦的实现方案 #### 背景介绍 模块联邦(Module Federation)最初由 Webpack 提出,用于解决微前端架构中的模块共享和应用集成问题。随着 Vite 的发展,其通过插件机制兼容了 Rollup 并实现了类似的模块联邦功能[^1]。这使得开发者能够在现代框架如 Vue 中利用 Vite 构建高效的模块联邦解决方案。 --- #### 技术核心 模块联邦的核心在于以下几个方面: - **exposes**: 定义当前项目中哪些模块可以被其他项目引用。 - **remotes**: 配置远程项目的入口地址,以便当前项目能够加载来自其他项目的模块。 - **shared**: 声明多个项目之间共享的依赖项,避免重复打包相同的库[^2]。 在 Vue 和 Vite 的组合下,可以通过 `vite-plugin-federation` 插件轻松实现这一目标[^4]。 --- #### 实现步骤详解 ##### 1. 主应用 (Host Application) 配置 主应用负责加载远程模块并将其集成到自身的页面中。以下是配置示例: ```javascript // vite.config.js import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; import federation from '@originjs/vite-plugin-federation'; export default defineConfig({ plugins: [ vue(), federation({ name: 'host-app', // 当前应用名称 filename: 'remoteEntry.js', remotes: { remoteApp: 'http://localhost:5000/assets/remoteEntry.js', // 远程模块路径 }, shared: ['vue'], // 共享依赖 }), ], }); ``` 在此配置中,`name` 表示当前应用的名字;`remotes` 则指定了远程模块的位置;而 `shared` 属性定义了两个应用间共享的依赖项[^4]。 --- ##### 2. 远程应用 (Remote Application) 配置 远程应用暴露特定组件供主应用调用。以下是配置示例: ```javascript // vite.config.js import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; import federation from '@originjs/vite-plugin-federation'; export default defineConfig({ plugins: [ vue(), federation({ name: 'remote-app', // 应用名 filename: 'remoteEntry.js', exposes: { './PageComponent': './src/components/PageComponent.vue', // 暴露组件 }, shared: ['vue'], }), ], }); ``` 这里的关键是 `exposes` 字段,它明确了哪些模块会被公开给外部访问[^4]。 --- ##### 3. 动态加载远程模块 在主应用中,可以通过动态导入的方式来加载远程模块的内容。例如: ```javascript <template> <div id="app"> <button @click="loadRemote">Load Remote Component</button> <component v-if="RemoteComponent" :is="RemoteComponent"></component> </div> </template> <script> export default { data() { return { RemoteComponent: null, }; }, methods: { async loadRemote() { const module = await import('remoteApp/PageComponent'); // 加载远程模块 this.RemoteComponent = module.default; }, }, }; </script> ``` 此代码片段展示了如何通过 `import()` 方法异步获取远程组件,并将其挂载至 DOM 结构中[^2]。 --- #### 关键优势 采用 Vite 和 Vue 的模块联邦方案具有以下显著优点: - **高性能构建**:得益于 Vite 的按需加载特性以及快速冷启动能力,整体开发体验更加流畅[^3]。 - **灵活性高**:支持多种场景下的模块化设计需求,无论是单体应用还是分布式微服务架构均适用。 - **安全性保障**:内置的安全策略可有效防止潜在风险,保护数据传输过程中的隐私信息[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值