qiankun基座+react+vite子应用搭建微前端

主应用

你可以选择在现有的项目进行搭建qiankun基座,也可以新开一个项目来搭建qiankun基座

我这里直接选择在已有项目搭建一个

先安装 qiankun

csharp 复制代码
$ yarn add qiankun # 或者 npm i qiankun -S

注册主应用

php 复制代码
import { registerMicroApps, start } from 'qiankun';


registerMicroApps([
  {
    name: 'datartApp', // app name registered
    entry: '//localhost:5174',
    container: '#subapp',
    activeRule: '/IframePage/iframe_test',
  },
]);
// 启动 qiankun
start();

几个说明

name是子应用的名称,这个后面可以看到 entry就是子应用的启动地址 container是子应用挂载到基座的节点 activeRule是触发加载子应用的路由,当然也有不是通过路由触发子应用的方法

注册子应用

使用vite-plugin-qiankun插件

1.在main.jsx中挂载

和官网的有所不同,这个写法判断是否前端环境去挂载到对应的节点上

js 复制代码
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import './index.css';
import App from './App.jsx';
import { Provider } from 'react-redux';
import store from './store';
import { renderWithQiankun, qiankunWindow } from 'vite-plugin-qiankun/dist/helper';
import React from 'react'

let root = null; // 👈 保存 createRoot 实例

// 创建 React 渲染方法
const render = (props = {}) => {
  const { container } = props;
  const mountNode = container
    ? container.querySelector('#root')
    : document.getElementById('root');

  if (mountNode) {
    root = createRoot(mountNode); // 👈 保存实例  
    root.render(
      <Provider store={store}>
        <App />
      </Provider>
    );
  }
};

console.log(qiankunWindow.__POWERED_BY_QIANKUN__, 'qiankun环境下');

if (!qiankunWindow.__POWERED_BY_QIANKUN__) {
  render();
}

renderWithQiankun({
  mount(props) {
    console.log('mount');
    render(props);
  },
  bootstrap() {
    console.log('bootstrap');
  },
  unmount(props) {
    console.log('unmount');
    root?.unmount(); // 👈 正确卸载
    const { container } = props;
    const mountNode = container?.querySelector('#root');
    if (mountNode) mountNode.innerHTML = ''; // 可选:清理内容
    root = null;
  },
});

2.vite的配置修改,声明挂载节点和名称

这里的datartApp就是对应上面在主应用基座里面的配置

js 复制代码
plugins: [
      react(),
      tailwindcss(), 
      qiankun("datartApp", {
        useDevMode: true,
      })],

配置好子应用之后的报错

这个错误通常发生在微前端子应用的 HTML 中使用 <script type="module"> 来引入脚本时,它可能会发生冲突,特别是在处理 react-refresh 和 HMR(热模块替换)时。

错误的原因:

react-refresh 是 React 开发模式下热模块替换的一部分,用来在不刷新整个页面的情况下更新组件。如果在微前端(比如 qiankun)的子应用中引入了这个模块,它可能会与其他脚本冲突,导致遇到 import-html-entry 相关的错误。

js 复制代码
import qiankun from 'vite-plugin-qiankun';
export default defineConfig(({mode}) => {
  const isDev = mode === 'development'
  return {
    plugins: [
      !isDev && react(),
      tailwindcss(), 
      qiankun("datartApp", {
        useDevMode: true,
      })],

这里就不会引入react,react就不会初始化,所以需要在入口文件引入一遍

这种挂载到window的操作会报错 不能在子应用中使用,需要排除一下,不然控制台都是报错

子应用路由修改

配置和主应用触发路由相同的路由,加载对应的页面

访问路由尝试

注册主应用的时候,声明的触发路由是

js 复制代码
activeRule: '/IframePage/iframe_test',

所以直接访问即可,当路由切换过去 可能会整个页面会被挂载失效,请检查下对应的name和挂载的dom节点是否正确,发现died的时候是已经可以加载子应用,但出现了问题或者报错

成功载入页面

如果觉得有趣或有收获,请关注我的更新,给个喜欢和分享。您的支持是我写作的最大动力!
往期好文推荐
相关推荐
beckyye15 小时前
给web增加简单的ai对话功能
前端·ai·通义千问·qwen
青衫码上行15 小时前
【Java Web学习 | 第1篇】前端 - HTML
java·前端·学习
元直数字电路验证15 小时前
HTML 标签及推荐嵌套结构
前端·javascript·html
charlie11451419115 小时前
HTML 理论笔记
开发语言·前端·笔记·学习·html·1024程序员节
知识分享小能手16 小时前
uni-app 入门学习教程,从入门到精通,uni-app 企业项目实战:鲁嗑瓜子项目开发知识点(9)
前端·javascript·学习·微信小程序·小程序·uni-app·vue
阿金要当大魔王~~16 小时前
uniapp img 动态渲染 的几种用法
java·服务器·前端·1024程序员节
one.dream16 小时前
用webpack 插件实现 img 图片的懒加载
前端·webpack·node.js
打小就很皮...16 小时前
Steps + Input.TextArea + InfiniteScroll 联调优化
前端·react.js
皓月Code16 小时前
第四章、路由配置
前端·javascript·react.js·1024程序员节
Mr.Jessy17 小时前
JavaScript学习第六天:函数
开发语言·前端·javascript·学习·html·1024程序员节