Qiankun 子应用数据互通 + 资源共享 完整方案(React+Vue)

Qiankun 子应用数据互通 + 资源共享 完整方案(React+Vue)

微前端最核心的痛点就是子应用之间数据互通、公共资源共享 ,我直接给你最实用、能直接落地 的 4 套方案,覆盖 99% 业务场景,包含:

全局状态共享、跨应用通信、公共资源(组件/工具/样式)复用、请求共享。


一、全局状态共享(最常用:登录态、用户信息、主题)

Qiankun 内置全局状态管理主应用 ↔ 子应用、子应用 ↔ 子应用都能实时同步数据,不用任何第三方库。

1)主应用:创建全局状态(唯一数据源)

jsx 复制代码
// 主应用入口
import { registerMicroApps, start, initGlobalState } from 'qiankun';

// 1. 初始化全局 state
const initialState = {
  userInfo: null,       // 用户信息
  token: '',            // 登录token
  theme: 'light',       // 主题
  lang: 'zh-CN'         // 语言
};

// 2. 创建全局状态操作方法
const { setGlobalState, onGlobalStateChange } = initGlobalState(initialState);

// 3. 注册子应用时把全局方法传给所有子应用
registerMicroApps([
  {
    name: 'react-subapp',
    entry: '//localhost:3001',
    container: '#subapp-container',
    activeRule: '/react',
    props: {
      setGlobalState,        // 子应用修改全局状态
      onGlobalStateChange,   // 子应用监听变化
    },
  },
  {
    name: 'vue-subapp',
    entry: '//localhost:8080',
    container: '#subapp-container',
    activeRule: '/vue',
    props: {
      setGlobalState,
      onGlobalStateChange,
    },
  }
]);

start();

2)子应用(React / Vue):使用全局状态

✅ React 子应用使用

jsx 复制代码
export async function mount(props) {
  const { setGlobalState, onGlobalStateChange } = props;

  // 1. 监听全局状态变化(所有应用都会收到)
  onGlobalStateChange((state) => {
    console.log('全局状态更新:', state);
    // 存到 redux/context/本地状态
  }, true); // true = 立即触发一次

  // 2. 修改全局状态
  setGlobalState({
    userInfo: { name: '微前端用户' },
    token: '123456'
  });
}

✅ Vue 子应用使用

js 复制代码
export async function mount(props) {
  const { setGlobalState, onGlobalStateChange } = props;

  // 监听
  onGlobalStateChange((state) => {
    console.log(state);
    // 存到 pinia/vuex
  }, true);

  // 修改
  setGlobalState({ theme: 'dark' });
}

二、子应用 ↔ 子应用直接通信(事件总线)

适合:弹窗通知、刷新列表、跨应用触发动作

主应用创建一个全局事件总线

jsx 复制代码
// 主应用:创建 EventBus
window.eventBus = {
  events: {},
  on(name, fn) {
    this.events[name] = this.events[name] || [];
    this.events[name].push(fn);
  },
  emit(name, data) {
    (this.events[name] || []).forEach(fn => fn(data));
  }
};

任意子应用发送事件

js 复制代码
// React / Vue 都能用
window.eventBus.emit('update-user', { id: 100 });

任意子应用监听事件

js 复制代码
window.eventBus.on('update-user', (data) => {
  console.log('收到跨应用消息:', data);
});

三、公共资源共享(组件 / 工具库 / 样式 / 接口)

1)公共 JS 工具方法共享(最常用)

主应用把工具库挂载到 window,所有子应用直接用:

jsx 复制代码
// 主应用
window.CommonUtils = {
  formatTime: (t) => t,
  request: axios,          // 共享请求实例
  getToken: () => localStorage.getItem('token')
};

子应用直接使用:

js 复制代码
const token = window.CommonUtils.getToken();

2)公共样式共享(主题、全局样式)

  1. 主应用把 common.css 暴露静态服务
  2. 子应用通过 link 引入
html 复制代码
<link rel="stylesheet" href="http://localhost:3000/common.css">

3)公共组件共享(React/Vue 跨技术栈也能复用)

方案 A:Web Component(无技术栈限制)

主应用封装 Web Component,React/Vue 都能直接用。

方案 B:子应用导出组件,主应用加载(进阶)

适合同技术栈。


四、请求共享(统一 token、统一拦截、统一域名)

主应用共享 Axios 实例(最强方案)

jsx 复制代码
// 主应用
import axios from 'axios';
const request = axios.create({ baseURL: '/api' });

// 请求拦截统一加 token
request.interceptors.request.use(config => {
  config.headers.token = localStorage.getItem('token');
  return config;
});

// 挂载到全局
window.$request = request;

子应用直接用

js 复制代码
window.$request.get('/user/info').then(res => {});

五、 localStorage / sessionStorage 共享(默认互通)

同域名/同端口下,主应用 & 子应用默认共享 localStorage

js 复制代码
// 主应用存
localStorage.setItem('token', '123');

// 子应用取
localStorage.getItem('token');

六、4 种方案对比(直接看这个选型)

方案 适用场景 技术栈 难度
Qiankun 全局状态 用户信息、登录态、主题、语言 全部
EventBus 事件 跨应用触发动作、通知、刷新 全部 ⭐⭐
Window 挂载 工具库、请求、公共方法 全部
Web Component 跨技术栈公共组件 React+Vue ⭐⭐⭐

七、我给你一个企业级最佳实践(直接照抄)

  1. 主应用维护全局状态(userInfo、token、theme)
  2. 主应用共享请求实例(统一拦截、统一域名)
  3. 子应用只读取、不随意写(保证数据唯一来源)
  4. 跨应用动作用 EventBus
  5. 公共组件用 Web Component

总结

  • 数据互通 :用 Qiankun 全局状态(最简单、官方推荐)
  • 跨应用触发动作 :用 EventBus
  • 资源共享 :主应用挂载到 window(工具/请求/样式)
  • 本地存储:默认互通,直接用 localStorage
相关推荐
Carson带你学Android17 小时前
别再乱学了!深度解读 Google 官方发布 Android 6 大核心 Skills
android·前端·ai编程
张风捷特烈17 小时前
状态管理大乱斗#06 | Riverpod 源码评析 (下) - 外功心法
android·前端·flutter
ZC跨境爬虫17 小时前
跟着 MDN 学 HTML day_16:(音频与视频处理——从画布滤镜到3D沉浸音频的进阶指南)
前端·javascript·ui·3d·html·音视频
魔术师Grace17 小时前
普通人学 AI,不要一上来就学提示词
前端·人工智能·程序员
m0_7381207217 小时前
Webshell流量分析——常见扫描器AWVS,goby,xray流量特征分析
服务器·前端·安全·web安全·网络安全
QQ_18808380017 小时前
python+flask+vue在线宠物医疗预约平台的设计与实现_b5z03zls
vue.js·python·flask
神奇的程序员1 天前
开发了一个管理本地开发环境的软件
前端·flutter
XiYang-DING1 天前
HTML 核心标签
前端·html
Csvn1 天前
技术选型方法论
前端
Csvn1 天前
前端架构演进:从页面到平台的十年变革
前端