微前端 - 以无界为例


一、微前端核心概念

微前端是一种将单体前端应用拆分为多个独立子应用的架构模式,每个子应用可独立开发、部署和运行,具备以下特点:

  1. 技术栈无关性:允许主应用和子应用使用不同框架(如 React + Vue)。
  2. 独立部署:子应用独立构建、测试和发布,互不影响。
  3. 沙箱隔离:通过 JavaScript/CSS 沙箱避免全局污染。
  4. 动态加载:按需加载子应用资源,提升性能。

二、无界框架核心机制

无界(Wujie) 是腾讯开源的微前端框架,核心优势:
基于 Web Components:天然支持样式隔离。
Iframe 沙箱:实现 JS 执行环境的完全隔离。
子应用保活:切换页面时保留子应用状态,避免重复渲染。
通信简化:内置 props 传递和事件总线机制。


三、实战示例:React 主应用 + Vue 子应用

略复杂的demo

1. 主应用(React)配置

步骤说明:主应用负责路由管理和子应用容器渲染。

// 主应用:src/App.jsx
import React from 'react';
import { WujieReact } from "wujie-react";

function App() {
  return (
    <div>
      {/* 导航菜单 */}
      <nav>
        <Link to="/vue-app">Vue 子应用</Link>
        <Link to="/react-app">React 子应用</Link>
      </nav>

      {/* Vue 子应用容器 */}
      <WujieReact
        name="vueApp" 
        url="http://localhost:3001" 
        sync={true}
        props={{ user: { name: "Alice" } }}
      />

      {/* React 子应用容器 */}
      <WujieReact
        name="reactApp"
        url="http://localhost:3002"
        sync={true}
      />
    </div>
  );
}

export default App;
2. Vue 子应用配置

关键点:适配无界生命周期,接收主应用传递的 props

// Vue 子应用:src/main.js
import { createApp } from 'vue';
import App from './App.vue';

if (window.__POWERED_BY_WUJIE__) {
  // 无界环境:挂载到无界提供的容器
  window.__WUJIE_MOUNT = () => {
    const app = createApp(App);
    // 接收主应用传递的 props
    app.config.globalProperties.$wujieProps = window.$wujie.props;
    app.mount('#app');
  };
  // 子应用卸载时清理
  window.__WUJIE_UNMOUNT = () => {
    app.unmount();
  };
} else {
  // 独立运行模式
  createApp(App).mount('#app');
}
3. React 子应用配置
// React 子应用:src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

if (window.__POWERED_BY_WUJIE__) {
  // 无界环境挂载
  window.__WUJIE_MOUNT = () => {
    ReactDOM.render(<App />, document.getElementById('root'));
  };
  window.__WUJIE_UNMOUNT = () => {
    ReactDOM.unmountComponentAtNode(document.getElementById('root'));
  };
} else {
  // 独立运行
  ReactDOM.render(<App />, document.getElementById('root'));
}

四、跨框架通信示例

1. 主应用向子应用传递数据(Props)
// 主应用传递动态数据
<WujieReact
  name="vueApp"
  url="http://localhost:3001"
  :props="{ 
    user: currentUser,
    onUpdate: (data) => console.log('收到子应用数据:', data) 
  }"
/>
2. Vue 子应用接收并使用 Props
<!-- Vue 子应用组件 -->
<template>
  <div>
    <h2>用户: {{ $wujieProps.user.name }}</h2>
    <button @click="sendToMain">发送数据到主应用</button>
  </div>
</template>

<script>
export default {
  methods: {
    sendToMain() {
      // 调用主应用传递的回调函数
      this.$wujieProps.onUpdate({ message: '来自 Vue 的数据' });
    }
  }
}
</script>
3. React 子应用与主应用通信
// React 子应用组件
import { useEffect } from 'react';

export default function ReactApp() {
  // 接收主应用数据
  const user = window.$wujie?.props.user;

  // 向主应用发送事件
  const handleClick = () => {
    window.$wujie?.bus.emit('react-event', { time: Date.now() });
  };

  return (
    <div>
      <p>主应用用户: {user?.name}</p>
      <button onClick={handleClick}>触发事件</button>
    </div>
  );
}

五、构建与部署配置

1. 子应用 Webpack 配置(Vue)
// vue.config.js
module.exports = {
  publicPath: process.env.NODE_ENV === 'production' ? 'http://cdn.com/vue-app/' : '/',
  devServer: {
    headers: {
      'Access-Control-Allow-Origin': '*' // 允许跨域
    }
  }
};
2. 子应用 Webpack 配置(React)
// config-overrides.js (使用 react-app-rewired)
module.exports = {
  webpack: (config) => {
    config.output.library = 'reactApp';
    config.output.libraryTarget = 'umd';
    config.output.publicPath = process.env.NODE_ENV === 'production' 
      ? 'http://cdn.com/react-app/' 
      : 'http://localhost:3002/';
    return config;
  },
  devServer: (config) => {
    config.headers = { 'Access-Control-Allow-Origin': '*' };
    return config;
  }
};

六、无界框架核心优势对比

功能无界 (Wujie)qiankun
隔离机制Web Components + iframe 双重沙箱Proxy 代理 + 样式重写
通信方式Props + EventBus + URL 同步全局状态管理(如 Redux)
子应用保活✅ 支持(保留 DOM 和状态)❌ 每次切换重新挂载

<think>好的,我现在需要回答用户关于无界微前端路由传参的问题。首先,我需要回忆一下无界微前端的基本概念和路由传参的相关知识。无界微前端是一种前端架构方案,允许将不同的子应用集成到主应用中,实现独立开发和部署。路由传参是在不同子应用或主应用之间通过URL传递参数的一种方式。 接下来,我需要确定用户可能关心的几个方面:路由传参的基本方法、不同场景下的应用、参数的类型和限制,以及可能遇到的常见问题。如,用户可能想知道如何通过URL参数传递数据,或者如何在主应用和子应用之间同步路由状态。 然后,我需要考虑无界微前端的路由机制。通常,主应用负责整体的路由管理,而子应用可能使用不同的框架(如Vue、React等),需要适配主应用的路由系统。传参可以通过URL的查询参数(query parameters)、路径参数(path parameters)或者通过状态管理库(如Vuex、Redux)进行。不过,URL传参是最直接的方式,因为它便于分享和书签。 我需要分步骤解释如何实现路由传参。首先是主应用如何设置路由参数,比如在跳转到子应用的路由时附加参数。如,主应用的路由可能是`/sub-app?param1=value1`,子应用需要解析这个参数。其次是子应用如何接收和处理这些参数,可能需要使用路由库(如vue-router或react-router)来获取查询参数。 还要提到动态路由传参的情况,比如路径参数`/sub-app/:id`,这时候子应用需要根据不同的id渲染不同的内容。同时,需要注意浏览器历史记录的管理,避免参数丢失或路由冲突。 另外,安全性也是一个考虑点,比如对参数进行验证和转义,防止XSS攻击。还要讨论参数的持久化,比如使用localStorage或sessionStorage来存储参数,但这样可能会增加复杂度。 最后,可能需要给出一个具体的示,比如主应用使用Vue Router,子应用使用React Router,展示如何配置路由和传递参数。同时,提醒用户在传参过程中可能遇到的常见问题,比如编码问题(使用encodeURIComponent处理特殊字符)、子应用路由配置不正确导致参数无法正确解析等。 总结来说,我需要组织内容结构清晰,先介绍基本概念,再分步骤讲解传参方法,结合实际示,最后给出注意事项和常见问题解决方案。确保语言简洁明了,符合用户的理解水平。</think>无界微前端中的路由传参是实现主应用与子应用、子应用之间数据通信的重要手段,主要通过URL参数和路由状态两种方式实现。以下是具体实现方式和示--- ### 一、通过URL参数传参(显式传参) **原理**:通过路由路径或查询字符串传递参数,参数暴露在URL中,适合简单数据传递。 #### 1. 路径参数(动态路由) ```javascript // 主应用路由配置 { path: '/child/:id', // 定义动态参数 id name: 'ChildPage', component: ChildAppWrapper } ``` 子应用通过路由对象获取: ```javascript // 子应用(Vue示) const id = this.$route.params.id; // 子应用(React示) const { id } = useParams(); // react-router v6 ``` #### 2. 查询参数(Query String) 主应用跳转时拼接参数: ```javascript // 主应用跳转逻辑 router.push('/child-app?name=John&age=25'); ``` 子应用解析参数: ```javascript // Vue子应用 const name = this.$route.query.name; // React子应用 import { useSearchParams } from 'react-router-dom'; const [searchParams] = useSearchParams(); const name = searchParams.get('name'); ``` --- ### 二、通过路由状态传参(隐式传参) **原理**:通过路由跳转时的`state`传递复杂对象,参数不会暴露在URL中,适合敏感或大数据量传输。 #### 主应用传递参数 ```javascript // Vue主应用 this.$router.push({ path: '/child', state: { userInfo: { name: 'John', role: 'admin' } } }); // React主应用 navigate('/child', { state: { userInfo: { name: 'John', role: 'admin' } } }); ``` #### 子应用接收参数 ```javascript // Vue子应用(需在路由配置中启用props) const route = useRoute(); const userInfo = route.state?.userInfo; // React子应用 import { useLocation } from 'react-router-dom'; const location = useLocation(); const userInfo = location.state?.userInfo; ``` --- ### 三、跨应用通信进阶方案 当需要高频或实时通信时,建议结合其他方案: 1. **全局状态管理**:主应用与子应用共享Vuex/Pinia/Redux Store 2. **CustomEvent通信**:通过`window.dispatchEvent`和`window.addEventListener`实现事件驱动 3. **Props传递**:主应用通过`<wujie-vue>`组件props向子应用注入数据 --- ### 四、注意事项 1. **编码问题**:URL参数需使用`encodeURIComponent`处理特殊字符 2. **参数长度**:URL有长度限制(约2000字符),大数据建议用路由state 3. **安全防范**:对接收参数进行校验,避免XSS攻击 4. **路由同步**:主应用需监听子应用路由变化,保持路由状态一致 --- **完整示**:主应用(Vue3)向子应用(React18)传递参数 ```html <!-- 主应用跳转 --> <template> <button @click="gotoChild">进入子应用</button> </template> <script setup> import { useRouter } from 'vue-router'; const router = useRouter(); const gotoChild = () => { router.push({ path: '/child-app/123', query: { from: 'main' }, state: { secretKey: 'abc123' } }); }; </script> ``` ```javascript // React子应用获取参数 import { useParams, useSearchParams, useLocation } from 'react-router-dom'; function ChildPage() { // 路径参数 const { id } = useParams(); // 123 // 查询参数 const [searchParams] = useSearchParams(); const from = searchParams.get('from'); // 'main' // 路由状态 const location = useLocation(); const secretKey = location.state?.secretKey; // 'abc123' return <div>{/* 渲染内容 */}</div>; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秀秀_heo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值