微前端传值

在微前端架构中,不同子应用之间通过 postMessage 进行通信是一种常见的做法。这种方式允许不同源的窗口之间进行安全的信息交换。

下面是如何使用 postMessage 在微前端环境中发送和接收消息的示例。

步骤 1: 发送消息

假设您有一个主应用(host app)和一个子应用(micro app)。子应用需要向主应用发送消息。

子应用代码示例:
复制代码
// 子应用的 JavaScript 文件
function sendMessageToHostApp(message) {
  const hostWindow = window.parent; // 获取父窗口
  if (hostWindow && hostWindow.postMessage) {
    hostWindow.postMessage(message, '*'); // 发送到任何源
  }
}

// 示例调用
sendMessageToHostApp({ type: 'GREETING', content: 'Hello from micro app!' });

步骤 2: 接收消息

接下来,您需要在主应用中监听 message 事件,以便能够接收到来自子应用的消息。

主应用代码示例:
复制代码
// 主应用的 JavaScript 文件
window.addEventListener('message', function(event) {
  console.log('Received message:', event.data);

  // 检查消息来源是否可信
  if (event.origin !== 'http://your-sub-app-origin.com') {
    return;
  }

  // 处理消息
  switch (event.data.type) {
    case 'GREETING':
      console.log('Greeting received:', event.data.content);
      break;
    default:
      console.log('Unknown message type:', event.data.type);
  }
}, false);

注意事项:

  1. 消息来源验证:

    • 在接收到消息时,最好检查 event.origin 以确保消息来自预期的子应用。
    • 如果您的子应用部署在与主应用不同的域名上,您需要确保允许正确的源。
  2. 消息格式:

    • 使用结构化的消息格式(如 JSON 对象),以便于解析和处理。
  3. 错误处理:

    • 当发送或接收消息时,应考虑异常情况并进行适当的错误处理。
  4. 通信安全:

    • 在生产环境中,确保只信任来自安全源的消息。

示例完整代码

子应用(Micro App)
复制代码
<!-- micro-app.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Micro App</title>
</head>
<body>
  <h1>Micro App</h1>
  <button onclick="sendMessage()">Send Message</button>

  <script>
    function sendMessage() {
      const message = { type: 'GREETING', content: 'Hello from micro app!' };
      const hostWindow = window.parent;
      if (hostWindow && hostWindow.postMessage) {
        hostWindow.postMessage(message, '*'); // 发送到任何源
      }
    }
  </script>
</body>
</html>
主应用(Host App)
复制代码
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Host App</title>
</head>
<body>
  <h1>Host App</h1>
  <iframe src="http://your-sub-app-origin.com/micro-app.html" width="300" height="200"></iframe>

  <script>
    window.addEventListener('message', function(event) {
      console.log('Received message:', event.data);

      // 检查消息来源是否可信
      if (event.origin !== 'http://your-sub-app-origin.com') {
        return;
      }

      // 处理消息
      switch (event.data.type) {
        case 'GREETING':
          console.log('Greeting received:', event.data.content);
          break;
        default:
          console.log('Unknown message type:', event.data.type);
      }
    }, false);
  </script>
</body>
</html>
相关推荐
mldong5 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排6 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60616 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角7 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!7 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰8 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi9 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen10 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马10 小时前
AI源码分析:拆解模型底层实现逻辑
前端
IT_陈寒11 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端