uniapp中h5的微应用解决办法
考虑过用wujie,参考官网Vue组件封装 | 无界的教程,虽然没报错,但是子应用的vue节点根本没挂载上,不知道什么原因,如下图所示
后面采用iframe方式将子应用导入进来:
父应用:
<template> <view class="index-box"> <!-- #ifdef H5 --> <iframe src="http://192.168.0.101:5174/#/" id="iframe" ref="iframeRef" ></iframe> <!-- #endif --> <!-- <WujieVue width="100%" height="100%" name="vue3" :url="'//192.168.0.101:5174/#/'" :sync="true"></WujieVue> --> </view> </template> <script setup lang="ts"> import { nextTick, ref } from 'vue' const iframeRef = ref() // #ifdef H5 nextTick(() => { // 向子页面发送消息 ;(document as any).getElementById('iframe').onload = function () { this.contentWindow.postMessage( JSON.stringify({ flag: 'iframe', // 父子双方约定的通信标识 message: 'iframe加载完成子页面', }), // 'http://192.168.0.101:5174/#/', // 谁接收 '*', ) window.addEventListener('message', (event: any) => { const data = event.data[0] === '{' ? JSON.parse(event.data) : event.data; if (data.flag !== 'iframe') return console.log('子应用发来:', data.message) }) } }) // #endif </script> <style scoped lang="scss"> .index-box { height: 100%; width: 100%; #iframe { height: 100%; width: 100%; border: none; } } </style>
子应用:main.ts中
window.addEventListener( 'message', function (event) { // if (event.origin !== 'http://192.168.0.101:5173') return; // 不是父应用发来的不接收,改方法不好,因为地址会变 const data = event.data[0] === '{' ? JSON.parse(event.data) : event.data; if (data.flag !== 'iframe') return console.log('父应用发来:', data.message) ;(window as any).parent.postMessage( JSON.stringify({ flag: 'iframe', message: '子应用收到父应用消息', }), '*', ) }, false, )
注意:不同域名下,父子页面通信只能用postMessage,否则都会出现跨域问题报错哟。
目前出现一个问题就是,iframe嵌入子页面后,子页面内的ttf文件无法解析,导致iconfont图标内容丢失了
目前还没找到解决办法
更新:已找到原因
乱看网上相关配置,将图中所示devServer相关配置注释掉即可