考虑过用wujie,参考官网Vue组件封装 | 无界的教程,虽然没报错,但是子应用的vue节点根本没挂载上,不知道什么原因,如下图所示
后面采用iframe方式将子应用导入进来:
父应用:
<template><view class="index-box"><!-- #ifdef H5 --><iframesrc="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') returnconsole.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') returnconsole.log('父应用发来:', data.message);(window as any).parent.postMessage(JSON.stringify({flag: 'iframe',message: '子应用收到父应用消息',}),'*',)},false, )
注意:不同域名下,父子页面通信只能用postMessage,否则都会出现跨域问题报错哟。
目前出现一个问题就是,iframe嵌入子页面后,子页面内的ttf文件无法解析,导致iconfont图标内容丢失了
目前还没找到解决办法
更新:已找到原因
乱看网上相关配置,将图中所示devServer相关配置注释掉即可