Vue3 + Wujie微前端实战:5分钟搞定子应用保活与预加载配置
如果你正在用Vue3构建一个中后台管理系统,大概率会遇到这样的场景:需要把几个独立开发、技术栈各异的子系统整合到一个统一平台里。传统的iframe方案虽然简单,但路由状态丢失、通信困难、白屏时间长这些问题让人头疼;而一些主流的微前端框架又需要复杂的配置和子应用改造。最近我在重构公司的一个运营平台时,尝试了腾讯开源的无界(Wujie)微前端框架,发现它在子应用保活和预加载这两个核心体验优化点上,配置简单得令人惊喜——基本上5分钟就能搞定,而且效果立竿见影。
无界基于 Web Components + iframe 的组合,既利用了iframe的原生隔离优势,又通过Web Components解决了样式污染和DOM割裂问题。更重要的是,它的保活模式能让子应用切换时状态完全不丢失,预加载则能大幅提升首屏打开速度。这两个功能配合使用,体验上几乎接近SSR的效果。下面我就结合具体的配置实例,带你快速掌握这两个核心功能的实战用法。
1. 环境准备与基础集成
在深入保活和预加载之前,我们先花两分钟把无界的基础集成搞定。无界对Vue3的支持非常友好,提供了专门的wujie-vue3包。
1.1 安装依赖
在你的Vue3主应用中,只需要安装一个包:
pnpm add wujie-vue3
# 或者使用npm
npm install wujie-vue3 --save
# 或者使用yarn
yarn add wujie-vue3
注意:无界框架本身(
wujie)会作为wujie-vue3的依赖自动安装,你不需要单独安装。这种设计很贴心,减少了依赖管理的复杂度。
1.2 主应用基础配置
在主应用的入口文件(通常是main.ts或main.js)中,进行简单的初始化:
// main.ts
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
// 1. 引入无界Vue3适配
import WujieVue from 'wujie-vue3'
// 2. 创建Vue应用实例
const app = createApp(App)
// 3. 使用无界插件
app.use(WujieVue)
app.use(router)
app.mount('#app')
到这里,基础集成已经完成了。无界通过Vue插件的方式注册了一个全局组件<WujieVue>,我们可以在任何Vue组件中直接使用它来加载子应用。
1.3 子应用跨域配置(开发环境)
在开发环境下,主应用和子应用通常运行在不同的端口,这就涉及跨域问题。无界要求子应用支持跨域访问,配置很简单:
子应用侧(以Vite为例):
// vite.config.js
export default defineConfig({
server: {
port: 5173, // 子应用端口
headers: {
'Access-Control-Allow-Origin': '*' // 允许所有域名跨域
}
}
})
或者使用更安全的配置:
headers: {
'Access-Control-Allow-Origin': 'http://localhost:3000', // 主应用地址
'Access-Control-Allow-Credentials': 'true',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS',
'Access-Control-Allow-Headers': 'X-Requested-With, content-type, Authorization'
}
在生产环境,建议通过Nginx反向代理解决跨域,这样更安全且性能更好:
# Nginx配置示例
server {
listen 80;
server_name main-app.com;
location / {
proxy_pass http://localhost:3000; # 主应用
proxy_set_header Host $host;
}
location /child-app/ {
proxy_pass http://localhost:5173/; # 子应用
proxy_set_header Host $host;
# 关键:添加跨域头
add_header Access-Control-Allow-Origin 'http://main-app.com';
add_header Access-Control-Allow-Credentials 'true';
}
}
2. 保活模式:让子应用状态持久化
保活模式是无界最吸引人的特性之一。传统微前端方案中,子应用切换时会完全销毁重建,导致内部状态丢失。而无界的保活模式能让子应用在切换时保持完整状态,再次激活时瞬间恢复。
2.1 什么是保活模式?
简单来说,保活模式就像Vue的<keep-alive>组件,但作用在整个子应用级别。当你在主应用的不同页面间切换时:
- 普通模式:每次进入子应用都重新加载,状态重置
- 保活模式:子应用首次加载后,实例和状态保留在内存中,再次进入时直接恢复
这种机制特别适合以下场景:
- 仪表盘类应用,有复杂的图表和筛选条件
- 表单填写页面,用户可能需要在不同应用间跳转参考
- 数据可视化大屏,切换后不希望重新请求数据
2.2 配置保活模式
配置保活模式简单到只需要一个属性:
<!-- ParentApp.vue -->
<template>
<div class="layout">
<!-- 左侧菜单 -->
<aside class="sidebar">
<nav>
<router-link to="/dashboard">仪表盘</router-link>
<router-link to="/analytics">数据分析</router-link>
<router-link to="/settings">系统设置</router-link>
</nav>
</aside>
<!-- 右侧内容区 -->
<main class="content">
<router-view />
</main>
</div>
</template>
<script setup lang="ts">
// 不需要额外引入,WujieVue已全局注册
</script>
<!-- AnalyticsPage.vue -->
<template>
<div class="analytics-container">
<h2>数据分析子应用</h2>
<!-- 关键:alive属性开启保活 -->
<WujieVue
width="100%"
height="calc(100vh - 60px)"
name="analytics-app"
:url="analyticsUrl"
:alive="true" <!-- 就是这个属性! -->
:sync="true"
/>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const analyticsUrl = ref('http://localhost:5173')
// 生产环境可以换成:
// const analyticsUrl = ref('https://analytics.your-domain.com')
</script>
是的,就这么简单!alive="true"就开启了保活模式。当用户从数据分析页面切换到其他页面再切回来时,子应用的状态(比如表格的筛选条件、图表的缩放级别、表单的填写内容)都会完整保留。
2.3 保活模式的内部机制
理解无界如何实现保活,能帮你更好地使用它。无界的保活机制基于两个核心技术:
1. iframe保持存活
// 简化版原理示意
class WujieSandbox {
constructor() {
// 创建iframe作为JS沙箱
this.iframe = document.createElement('iframe')
this.iframe.style.display = 'none' // 隐藏但不移除
document.body.appendChild(this.iframe)
// 子应用卸载时,iframe保留在内存中
this.unmount = () => {
// 只移除DOM显示,不销毁iframe
this.container.removeChild(this.webComponent)
}
// 子应用重新激活时
this.remount = () => {
// 重新挂载webComponent
this.container.appendChild(this.webComponent)
}
}
}
2. Web Component状态保持 无界会创建一个<wujie-app>自定义元素(Web Component),子应用的DOM结构渲染在其Shadow DOM内部。保活模式下,这个Web Component在子应用卸载时从容器中移除,但实例仍然保留在内存中。
| 操作阶段 | iframe状态 | Web Component状态 | DOM状态 |
|---|---|---|---|
| 首次加载 | 创建并执行JS | 创建并挂载 | 渲染到Shadow DOM |
| 切 |


298

被折叠的 条评论
为什么被折叠?



