打算进军微前端?前先熟悉iframe,WebView吧

前言

在移动应用开发中,原生iOS Android当然是最棒的,但是资源消耗页数巨大的,除此之外常常选择的便是 React Native与 Fluter。但使用这些框架开发的代价仍然很大,有什么好办法解决便是内嵌H5页面,在移动应用中去内嵌H5,这个怎么做到那,在React Native与 Fluter中便是使用webView来进行交互。

这与微前端有什么关系呢?

  • 微前端是一种架构模式,旨在将大型前端应用拆分为多个小的、独立的可部署部分(微应用),每个部分可以由不同的团队独立开发、测试和部署。这种模式使得不同的技术栈、框架和版本可以共存,从而提高了开发的灵活性和可维护性。 在移动应用中使用 WebView 来加载 H5 页面,可以看作是微前端的一种实现方式。通过 WebView,你可以将不同的 H5 应用作为独立的微应用嵌入到移动应用中。这种方式允许开发团队使用不同的技术栈来构建这些微应用,同时保持主应用的稳定性。

跨页面通信

每一个内嵌项目都逃不过夸页面通信,而iframe,webView便很好的解决了这个问题。这里将以iframe为例(主要webview的话要创建套多项目演示了,环境调试很麻烦🥲)

  • 分别启动一个Vue项目与一个React项目

这里我们就将在 Vue项目内嵌入React项目并让他们进行页面级别的通信。

书写之前我们先来看看iframe身上重要的属性

父页面可以通过iframe.contentWindow直接访问内部对象,而子页面也可以通过window.parent来获取父窗口的应用

vue

xml 复制代码
<template>
  <div style="background-color: skyblue;">
    <!-- iframe 用于嵌入 React H5 应用 -->
    <iframe
      id="reactFrame"
      src="http://localhost:5173/"
      frameborder="0"
      style="border: none; width: 100vw; height: 80vh;"
      @load="onIframeLoad"
    ></iframe>
    <button @click="sendMessageTo">react发送信息</button>
  </div>
</template>

<script>
export default {
  name: 'IframeComponent',
  methods: {
    onIframeLoad() {
      // 向 iframe 发送消息
      const reactFrame = document.getElementById('reactFrame');
      reactFrame.contentWindow.postMessage('Hello from parent to React', 'http://localhost:5173');
    },
    handleMessage(event) {
      // 检查消息来源是否可信
      if (event.origin !== 'http://localhost:5173') return;
      console.log('Received message from React:', event);
      // 在这里处理接收到的消息,比如调用 JSBridge 或者更新 DOM
    },
    sendMessageTo() {
      // 向 iframe 发送消息
      const reactFrame = document.getElementById('reactFrame');
      reactFrame.contentWindow.postMessage('Hello from Vue to React', 'http://localhost:5173');
    }
  },
  mounted() {
    // 监听来自 iframe 的消息
    window.addEventListener('message', this.handleMessage);
  },
  beforeUnmount() {
    // 清理事件监听器
    window.removeEventListener('message', this.handleMessage);
  }
};
</script>

react

javascript 复制代码
import { useEffect } from 'react';

function App() {
  useEffect(() => {
    const receiveMessage = (event) => {
      // 检查消息来源是否可信
      if (event.origin !== 'http://127.0.0.1:5173') return;

      console.log('Received message from parent:', event.data);

      // 回复消息给父页面
      event.source.postMessage('Hello from React', event.origin);
    };

    window.addEventListener('message', receiveMessage);

    // 清理事件监听器
    return () => {
      window.removeEventListener('message', receiveMessage);
    };
  }, []);

  const sendMessageToParent = () => {
    window.parent.postMessage('Message from React button click', '*'); // 使用'*'表示接受任何来源的消息,实际使用时应指定确切的来源URL以提高安全性
  };

  return (
    <div>
      <h1>React H5</h1>
      <button onClick={sendMessageToParent}>向容器发送信息</button>
    </div>
  );
}

export default App;

测试

  1. 打开你的浏览器,访问 Vue 应用(http://localhost:5173)。
  2. 你应该能够看到 Vue 应用以及嵌入的 React 应用。
  3. 当 Vue 应用加载完成时,它会向 React 应用发送一条消息。
  1. React 应用会接收到这条消息并在控制台中打印出来,同时它也会向 Vue 应用发送一条消息作为响应。
  2. 点击按钮,vue页面或react页面将再接收到一条信息
相关推荐
填满你的记忆5 分钟前
【计算机网络·基础篇】TCP 的“三次握手”与“四次挥手”:后端面试的“生死线”
java·网络·网络协议·tcp/ip·计算机网络·面试
源代码•宸5 分钟前
Golang原理剖析(逃逸分析)
经验分享·后端·算法·面试·golang··内存逃逸
摘星编程13 分钟前
在OpenHarmony上用React Native:MapView路线规划
javascript·react native·react.js
虹少侠17 分钟前
基于 WebKit 构建 macOS 多浮窗视频播放的技术实践(含完整产品落地)
前端·macos·swift·webkit
木易 士心20 分钟前
Vue 响应式数据失效全解析:从原理机制到工程实践
前端·javascript·vue.js
Rattenking21 分钟前
【CSS】---- 根据【张鑫旭-高宽不等图片固定比例布局的三重进化】的思考
前端·css
AC赳赳老秦22 分钟前
ELK栈联动:DeepSeek编写Logstash过滤规则与ES日志分析逻辑
运维·前端·javascript·低代码·jenkins·数据库架构·deepseek
忠实米线29 分钟前
使用lottie.js播放json动画文件
开发语言·javascript·json
0思必得030 分钟前
[Web自动化] Selenium浏览器对象方法(操纵浏览器)
前端·python·selenium·自动化·web自动化
Marshmallowc33 分钟前
React页面刷新数据丢失怎么办?彻底掌握LocalStorage持久化与状态回填的最佳实践
前端·javascript·react.js