打算进军微前端?前先熟悉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页面将再接收到一条信息
相关推荐
ZJ_.11 分钟前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
GIS开发特训营15 分钟前
Vue零基础教程|从前端框架到GIS开发系列课程(七)响应式系统介绍
前端·vue.js·前端框架·gis开发·webgis·三维gis
Cachel wood41 分钟前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
学代码的小前端43 分钟前
0基础学前端-----CSS DAY9
前端·css
joan_851 小时前
layui表格templet图片渲染--模板字符串和字符串拼接
前端·javascript·layui
程序猿进阶1 小时前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
还是大剑师兰特1 小时前
什么是尾调用,使用尾调用有什么好处?
javascript·大剑师·尾调用
m0_748236111 小时前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
Watermelo6172 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
m0_748248942 小时前
HTML5系列(11)-- Web 无障碍开发指南
前端·html·html5