返回笔记首页

Wujie 无界微前端(3)- 适用场景与简历指南

主题配置

五、适用场景分析

5.1 最适合 Wujie 的场景

场景1:老系统迁移改造

背景: 公司有多个老系统(jQuery、AngularJS、Vue2 等),需要统一到新平台。

为什么选 Wujie
  • 子应用零改造,老系统无需任何修改
  • iframe 天然隔离,不会有任何冲突
  • 完整的 DOM 环境,保证老系统正常运行
实施方案
javascript
// 主应用配置
<WujieVue
  v-for="legacy in legacySystems"
  :key="legacy.name"
  v-show="currentSystem === legacy.name"
  :name="legacy.name"
  :url="legacy.url"
  :alive="false"  // 老系统不保活,避免内存问题
/>

const legacySystems = [
  { name: 'jquery-system', url: 'https://old.example.com/jquery/' },
  { name: 'angular-system', url: 'https://old.example.com/angular/' },
  { name: 'vue2-system', url: 'https://old.example.com/vue2/' }
]

场景2:第三方系统集成

背景: 需要集成多个第三方系统(如 CRM、ERP、OA 等),这些系统无法修改源代码。

为什么选 Wujie
  • 零改造要求,第三方系统直接接入
  • 强隔离保证安全性
  • 支持跨域,可以接入任何域名的系统
实施方案
vue
<template>
  <div class="third-party-integration">
    <nav>
      <button @click="switchSystem('crm')">CRM系统</button>
      <button @click="switchSystem('erp')">ERP系统</button>
      <button @click="switchSystem('oa')">OA系统</button>
    </nav>

    <WujieVue
      :name="currentSystem"
      :url="getSystemUrl(currentSystem)"
      :props="systemProps"
    />
  </div>
</template>

<script setup>
import { ref, computed } from 'vue'

const currentSystem = ref('crm')

const systems = {
  crm: 'https://crm.external.com/',
  erp: 'https://erp.external.com/',
  oa: 'https://oa.external.com/'
}

const systemProps = computed(() => ({
  token: getToken(),
  userId: getUserId(),
  // 通过 props 传递认证信息
  auth: {
    token: getToken(),
    userId: getUserId()
  }
}))

const getSystemUrl = (name) => {
  return systems[name]
}

const switchSystem = (name) => {
  currentSystem.value = name
}
</script>

场景3:多应用频繁切换

背景: 用户需要在多个应用间频繁切换(如工作台场景),要求切换速度快、状态保留。

为什么选 Wujie
  • 保活能力强,切换速度快(几乎无感知)
  • 完整保留应用状态
  • 内存开销可控
实施方案
vue
<template>
  <div class="workspace">
    <!-- 标签页 -->
    <div class="tabs">
      <div
        v-for="tab in openedTabs"
        :key="tab.name"
        :class="['tab', { active: currentTab === tab.name }]"
        @click="switchTab(tab.name)"
      >
        {{ tab.title }}
        <span class="close" @click.stop="closeTab(tab.name)">×</span>
      </div>
    </div>

    <!-- 应用容器 -->
    <div class="app-container">
      <WujieVue
        v-for="tab in openedTabs"
        :key="tab.name"
        v-show="currentTab === tab.name"
        :name="tab.name"
        :url="tab.url"
        :alive="true"  <!-- 开启保活 -->
        @activated="onAppActivated(tab)"
        @deactivated="onAppDeactivated(tab)"
      />
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue'

const openedTabs = ref([
  { name: 'app1', title: '应用1', url: 'http://localhost:8081/' }
])

const currentTab = ref('app1')

const switchTab = (name) => {
  currentTab.value = name
}

const closeTab = (name) => {
  const index = openedTabs.value.findIndex(tab => tab.name === name)
  if (index > -1) {
    openedTabs.value.splice(index, 1)

    // 销毁应用
    import('wujie').then(({ destroyApp }) => {
      destroyApp(name)
    })

    // 切换到其他标签
    if (currentTab.value === name && openedTabs.value.length > 0) {
      currentTab.value = openedTabs.value[0].name
    }
  }
}

const onAppActivated = (tab) => {
  console.log(`${tab.title} 激活`)
  // 可以在这里刷新数据
}

const onAppDeactivated = (tab) => {
  console.log(`${tab.title} 失活`)
  // 可以在这里保存状态
}
</script>

5.2 不适合 Wujie 的场景

场景1:需要极致性能

原因: iframe 有一定的性能开销,对于追求极致性能的场景不是最佳选择。

替代方案: 使用 qiankun 或 Micro-App

场景2:需要深度定制沙箱

原因: Wujie 的沙箱是基于 iframe 的,定制能力有限。

替代方案: 使用 qiankun,可以自定义沙箱逻辑

场景3:需要精细的构建优化

原因: Wujie 是运行时方案,构建时优化能力不如 Module Federation。

替代方案: 使用 Module Federation

5.3 实际项目案例

案例1:企业门户整合

项目背景: 某大型企业有 15 个内部系统,技术栈各异(Vue2/3、React、AngularJS、jQuery),需要整合到统一门户。

解决方案
  • 采用 Wujie 作为主框架
  • 所有子系统零改造接入
  • 实现统一登录、权限控制、导航菜单
关键配置
javascript
const systems = [
  { name: 'hr', title: 'HR系统', url: 'http://hr.internal.com', tech: 'jQuery' },
  { name: 'finance', title: '财务系统', url: 'http://finance.internal.com', tech: 'AngularJS' },
  { name: 'oa', title: 'OA系统', url: 'http://oa.internal.com', tech: 'Vue2' },
  // ... 12 more systems
]

// 统一登录
const ssoToken = getSSOToken()
systems.forEach(system => {
  system.props = {
    token: ssoToken,
    logout: handleLogout
  }
})
实施效果
  • 15 个系统全部零改造接入
  • 统一入口,用户体验大幅提升
  • 开发周期从 6 个月缩短到 1 个月
  • 运维成本降低 70%

案例2:多租户 SaaS 平台

项目背景: 为不同客户提供定制化系统,每个客户的系统可能完全不同。

解决方案
  • 使用 Wujie 动态加载客户系统
  • 支持运行时配置
  • 完全隔离,保证安全性
关键代码
javascript
class TenantManager {
  constructor() {
    this.tenants = new Map()
  }

  async loadTenant(tenantId) {
    // 获取租户配置
    const config = await fetch(`/api/tenants/${tenantId}/config`).then(r => r.json())

    this.tenants.set(tenantId, config)

    return config
  }

  getTenantUrl(tenantId) {
    const config = this.tenants.get(tenantId)
    return config?.url || ''
  }

  getTenantProps(tenantId) {
    const config = this.tenants.get(tenantId)
    return {
      tenantId,
      config,
      api: `/api/tenants/${tenantId}`
    }
  }
}

// 使用
const tenantManager = new TenantManager()

const currentTenant = ref(null)

onMounted(async () => {
  const tenantId = getTenantIdFromUrl()
  currentTenant.value = await tenantManager.loadTenant(tenantId)
})

六、简历撰写指南

6.1 项目经验描述模板

项目名称: Wujie 微前端企业门户整合

项目时间: 2024.05 - 2024.11

项目描述: 负责公司 15 个内部系统的统一门户整合,采用 Wujie 无界微前端框架实现零改造接入。解决了多系统分散、用户体验差、维护成本高等问题,实现了统一入口、统一登录、统一权限管理。

核心职责

  1. 技术方案选型与设计
    • 深入研究 Wujie 原理:iframe 沙箱 + Web Component 容器架构
    • 对比 qiankun、Wujie、Micro-App,选择 Wujie 原因:子应用零改造、强隔离、支持保活
    • 设计统一门户架构:Layout、导航、权限、通信机制
    • 制定接入规范和开发流程
  2. 门户主应用开发
    • 实现统一 Layout:顶部导航、侧边菜单、面包屑、用户信息
    • 开发权限控制系统:基于角色的访问控制(RBAC)
    • 实现单点登录(SSO):统一认证,token 传递给子系统
    • 开发应用管理模块:动态配置、应用注册、权限分配
  3. 15 个子系统接入
    • 零改造接入 15 个子系统(jQuery、AngularJS、Vue2/3、React)
    • 配置 Wujie props,传递认证信息和配置
    • 处理跨域问题,配置 CORS 和代理
    • 解决路由冲突、全局变量污染等问题
  4. 性能优化实践
    • 实现智能预加载:根据用户行为预加载高频系统
    • 启用保活机制:常用系统保活,切换速度提升 85%
    • 资源优化:并行加载、CDN 加速、浏览器缓存
    • 内存管理:自动清理低频系统,防止内存溢出
  5. 通信机制设计
    • 封装统一通信工具类:支持 props、EventBus、请求-响应模式
    • 实现全局状态管理:类 Vuex 的状态共享方案
    • 开发消息中心:统一处理系统间消息通知
    • 建立错误上报机制:子系统错误统一收集和处理
  6. 工程化建设
    • 建立 CI/CD 流程:主应用和子系统独立部署
    • 开发监控系统:应用加载监控、性能监控、错误监控
    • 编写接入文档和最佳实践
    • 建立应急响应机制:快速定位和解决问题

技术栈: Wujie、Vue3、iframe、Web Component、SSO

项目成果
  • 接入效率:15 个系统全部零改造接入,开发周期从 6 个月缩短到 1 个月(提升 83%)
  • 用户体验:统一入口,单点登录,切换速度提升 85%(保活机制)
  • 运维成本:统一部署和监控,运维成本降低 70%
  • 系统隔离:完全隔离,互不影响,系统稳定性提升 90%
  • 维护效率:统一权限管理,管理效率提升 60%
  • 新系统接入:标准化流程,接入时间从 1 周缩短到 1 天

6.2 SOP 标准回答话术

面试官:详细说说 Wujie 的原理和优势

回答话术

"好的。Wujie 是腾讯开源的微前端框架,它的核心创新是将 iframe 的沙箱能力和 Web Component 的容器能力结合起来。

第一,架构设计

传统 iframe 方案的问题是子应用在 iframe 内,和主应用完全分离,通信困难,弹窗、路由等都有问题。

Wujie 的创新点是:

  1. 用 iframe 作为 JS 沙箱,获得天然的隔离能力
  2. 用 Web Component 作为容器,承载子应用的 DOM
  3. 劫持子应用的 document,让它指向 Web Component 的 Shadow DOM

这样就兼得了 iframe 的隔离能力和正常页面的渲染能力。

第二,工作流程

当加载子应用时:

  1. 创建一个隐藏的 iframe
  2. 创建一个 Web Component 容器
  3. 劫持 iframe 的 document,指向 Web Component
  4. 在 iframe 中执行子应用的 JS
  5. 子应用的 DOM 操作都作用在 Web Component 上

这个过程对子应用完全透明,所以可以做到零改造。

第三,核心优势
  1. 天然 JS 隔离:iframe 提供完整的 JS 执行环境,全局变量完全隔离,不会有任何冲突
  2. 天然 CSS 隔离:Web Component 的 Shadow DOM 提供样式隔离
  3. 零改造接入:子应用不需要做任何修改,直接接入
  4. 保活能力强:支持应用保活,切换速度极快
  5. 完整 DOM 环境:子应用有完整的 document、window,不会有兼容性问题
我们项目的实践

我们用 Wujie 整合了 15 个内部系统,技术栈包括 jQuery、AngularJS、Vue2/3、React。所有系统都是零改造接入的,不需要修改任何代码。

遇到的主要问题是性能优化。因为 iframe 有一定开销,我们做了几个优化:

  1. 智能预加载:根据用户行为预加载高频系统
  2. 保活机制:常用的 3-5 个系统保活,切换速度提升 85%
  3. 资源优化:CDN 加速、浏览器缓存
  4. 内存管理:自动清理低频系统

最终效果很好,用户几乎感觉不到是在切换系统,体验非常流畅。"

面试官:Wujie 的保活机制是如何实现的?
回答话术

"Wujie 的保活机制是它的一个杀手锏功能。

实现原理

正常情况下,当子应用失活时,Wujie 会销毁它的 iframe 和 Web Component。但如果开启了保活(alive: true),Wujie 会保留这些资源:

  1. iframe 不销毁,JS 执行环境保留
  2. Web Component 不销毁,DOM 结构保留
  3. 应用的状态、数据、定时器等全部保留

当再次激活时:

  1. 不需要重新加载资源
  2. 不需要重新初始化
  3. 直接显示 Web Component
  4. 触发 activated 生命周期

这样切换几乎是瞬间完成的。

我们的优化策略

保活虽然快,但会占用内存,所以不能所有应用都保活。我们设计了一个智能保活策略:

  1. LRU 策略:最多保活 3-5 个应用,按最近使用排序,超过限制就销毁最久未使用的
  2. 高频应用优先:统计用户的访问频率,高频应用总是保活
  3. 内存监控:如果内存占用超过阈值,自动清理

代码实现大概是这样:

javascript
class AliveManager {
  constructor() {
    this.maxAlive = 3
    this.aliveQueue = [] // LRU 队列
  }

  activate(appName) {
    // 移到队列前面
    const index = this.aliveQueue.indexOf(appName)
    if (index > -1) {
      this.aliveQueue.splice(index, 1)
    }
    this.aliveQueue.unshift(appName)

    // 超过限制,销毁最久未使用的
    if (this.aliveQueue.length > this.maxAlive) {
      const removed = this.aliveQueue.pop()
      destroyApp(removed)
    }
  }
}
实际效果

开启保活后,常用系统的切换速度从 2-3 秒降到 100-200ms,提升了 85%。用户反馈体验非常好,几乎感觉不到延迟。"

面试官:如何处理子应用之间的通信?
回答话术

"Wujie 提供了两种主要的通信方式:props 和 EventBus。

第一种:props 传递(单向)

主应用通过 props 把数据传给子应用:

javascript
<WujieVue
  name="app1"
  url="http://localhost:8081/"
  :props="{ user, token, apiBaseUrl }"
/>

子应用通过 window.$wujie.props 获取:

javascript
const user = window.$wujie.props.user
const token = window.$wujie.props.token

这种方式简单直接,适合传递配置、用户信息等。

第二种:EventBus(双向)

主应用和子应用都可以发送和接收事件:

javascript
// 主应用发送
bus.$emit('user-update', newUser)

// 子应用接收
window.$wujie.bus.$on('user-update', (user) => {
  console.log('用户信息更新', user)
})

这种方式灵活,适合复杂的交互。

我们的实践

实际项目中,我们封装了一个统一的通信工具类,支持三种模式:

  1. Props 模式:传递静态配置
  2. 事件模式:处理通知、消息
  3. 请求-响应模式:需要返回结果的场景

还实现了一个类似 Vuex 的全局状态管理,主应用和所有子应用共享状态:

javascript
const store = new WujieStore({
  user: null,
  token: null
})

// 主应用修改
store.commit('setUser', newUser)

// 所有子应用自动同步

这样解决了复杂场景下的通信问题。"

6.3 难点与亮点分析

难点1:老系统兼容性

问题描述: 15 个老系统,技术栈各异(jQuery、AngularJS、Vue2),某些系统有很多全局变量和事件监听,容易出问题。

解决方案
javascript
// 1. 全局变量检测
class GlobalVarDetector {
  constructor() {
    this.snapshot = {}
  }

  takeSnapshot() {
    for (const key in window) {
      this.snapshot[key] = window[key]
    }
  }

  detect() {
    const newVars = []
    for (const key in window) {
      if (!(key in this.snapshot)) {
        newVars.push(key)
      }
    }

    if (newVars.length > 0) {
      console.warn('检测到新增全局变量', newVars)
    }
  }
}

// 2. 事件监听清理
const eventListeners = new WeakMap()

const originalAddEventListener = window.addEventListener
window.addEventListener = function(type, listener, options) {
  if (!eventListeners.has(this)) {
    eventListeners.set(this, [])
  }
  eventListeners.get(this).push({ type, listener, options })

  return originalAddEventListener.call(this, type, listener, options)
}

// 应用卸载时清理
function cleanupListeners() {
  const listeners = eventListeners.get(window) || []
  listeners.forEach(({ type, listener, options }) => {
    window.removeEventListener(type, listener, options)
  })
}

难点2:性能优化与内存管理

问题描述: 15 个系统同时保活会导致内存占用过高,浏览器卡顿。

解决方案
javascript
// 智能内存管理
class MemoryOptimizer {
  constructor() {
    this.threshold = 100 * 1024 * 1024 // 100MB
    this.apps = new Map()
  }

  monitor() {
    setInterval(() => {
      if (!performance.memory) return

      const { usedJSHeapSize } = performance.memory

      if (usedJSHeapSize > this.threshold) {
        this.cleanup()
      }
    }, 30000)
  }

  cleanup() {
    // 按访问时间排序
    const sorted = Array.from(this.apps.entries())
      .sort((a, b) => a[1].lastVisit - b[1].lastVisit)

    // 销毁最久未访问的应用
    if (sorted.length > 0) {
      const [appName] = sorted[0]
      destroyApp(appName)
      this.apps.delete(appName)

      console.log(`内存优化:已清理 ${appName}`)
    }
  }
}

亮点1:动态权限控制

实现了基于角色的动态权限控制(RBAC):

javascript
class PermissionManager {
  constructor() {
    this.permissions = new Map()
  }

  async loadUserPermissions(userId) {
    const res = await fetch(`/api/users/${userId}/permissions`)
    const data = await res.json()

    this.permissions.set(userId, data.permissions)
  }

  hasPermission(userId, appName) {
    const permissions = this.permissions.get(userId) || []
    return permissions.includes(`app:${appName}`)
  }

  getVisibleApps(userId) {
    const allApps = getAllApps()
    return allApps.filter(app =>
      this.hasPermission(userId, app.name)
    )
  }
}

// 使用
const permissionManager = new PermissionManager()

const visibleApps = computed(() => {
  return permissionManager.getVisibleApps(currentUserId.value)
})

亮点2:智能预加载

根据用户行为模式智能预加载:

javascript
class PredictivePreloader {
  constructor() {
    this.history = []
    this.patterns = new Map()
  }

  recordNavigation(from, to) {
    this.history.push({ from, to, timestamp: Date.now() })

    // 分析模式
    this.analyzePattern(from, to)
  }

  analyzePattern(from, to) {
    const key = `${from}->${to}`
    const count = this.patterns.get(key) || 0
    this.patterns.set(key, count + 1)

    // 如果访问次数超过 3 次,自动预加载
    if (count >= 3) {
      this.preload(to)
    }
  }

  predict(currentApp) {
    // 预测下一个可能访问的应用
    const predictions = Array.from(this.patterns.entries())
      .filter(([key]) => key.startsWith(currentApp))
      .sort((a, b) => b[1] - a[1])

    if (predictions.length > 0) {
      const [key] = predictions[0]
      const nextApp = key.split('->')[1]
      this.preload(nextApp)
    }
  }

  preload(appName) {
    const config = getAppConfig(appName)
    if (config) {
      preloadApp(config)
      console.log(`预测式预加载: ${appName}`)
    }
  }
}

6.4 完整简历示例

plain
【Wujie 微前端企业门户整合】2024.05 - 2024.11

项目背景:
公司内部有 15 个系统分散在不同域名,技术栈各异(jQuery、AngularJS、Vue2/3、React),用户需要记住多个网址和账号,体验极差。需要统一整合到一个门户,但老系统无法重构。

技术选型:
对比 qiankun、Wujie、Micro-App 后选择 Wujie,核心原因:
- 子应用零改造,老系统无需任何修改
- iframe 天然隔离,技术栈差异大不怕冲突
- 保活能力强,适合多应用频繁切换
- 完整 DOM 环境,兼容性好

核心工作:

1. 技术方案设计
   - 深入研究 Wujie 原理:iframe 沙箱 + Web Component 劫持机制
   - 设计门户架构:Layout、导航、权限、SSO、通信
   - 制定接入规范:URL 规范、通信协议、错误处理

2. 统一门户开发
   - 实现响应式 Layout:支持 PC/移动端
   - 开发应用管理:动态配置、权限分配、状态监控
   - 实现 SSO:OAuth 2.0,统一认证,token 传递
   - 开发权限系统:基于 RBAC,动态菜单

3. 15 个系统接入
   - 零改造接入所有系统,配置 URL 和 props 即可
   - 处理跨域:配置 CORS、Nginx 反向代理
   - 解决兼容性:全局变量检测、事件监听清理
   - 路由同步:主应用路由与子应用联动

4. 性能优化
   - 智能预加载:分析用户行为,预测下一步操作,提前加载
   - 保活策略:LRU 算法,最多保活 5 个高频应用
   - 资源优化:CDN 加速、浏览器缓存、并行加载
   - 内存管理:监控内存占用,自动清理低频应用

5. 通信机制
   - 封装统一通信工具:props、EventBus、请求-响应
   - 实现全局状态管理:类 Vuex,主子应用状态同步
   - 开发消息中心:统一消息通知、系统公告
   - 错误上报:统一收集子应用错误

6. 工程化建设
   - CI/CD:Jenkins 自动化部署,主应用和子系统独立发布
   - 监控系统:应用加载监控、性能监控、错误告警
   - 文档中心:接入文档、API 文档、最佳实践
   - 应急响应:故障快速定位和恢复机制

技术难点:
- 老系统兼容:全局变量检测、事件监听清理、异常捕获
- 性能优化:智能预加载、保活策略、内存管理
- 权限控制:动态权限、菜单过滤、按钮级控制

技术亮点:
- 预测式预加载:根据用户行为模式预测并预加载
- 智能保活策略:LRU + 访问频率,内存可控
- 动态权限系统:RBAC,支持运行时权限变更

技术栈:
Wujie、Vue3、iframe、Web Component、OAuth 2.0、Nginx

项目成果:
- 接入效率:15 个系统零改造,开发周期从 6 个月缩短到 1 个月
- 用户体验:统一入口,单点登录,满意度从 60% 提升到 95%
- 切换速度:保活机制,常用系统切换提升 85%(2-3秒 → 100-200ms)
- 运维成本:统一部署监控,运维成本降低 70%
- 系统稳定性:完全隔离,稳定性提升 90%,故障影响面降低 95%
- 维护效率:统一管理,效率提升 60%
- 新系统接入:标准化流程,接入时间从 1 周缩短到 1 天

七、总结

Wujie 是非常强大的微前端框架,特别适合:

  • 老系统整合(零改造)
  • 第三方系统集成
  • 多应用频繁切换
  • 需要强隔离的场景

核心优势

  1. 零改造接入
  2. 天然强隔离(iframe + Web Component)
  3. 保活能力强
  4. 完整 DOM 环境
  5. 兼容性好

最佳实践

  1. 合理使用保活(3-5个)
  2. 实现智能预加载
  3. 做好内存管理
  4. 封装统一通信
  5. 建立监控体系