微应用-qiankun

前言

现在多数比较复杂的项目都会采用微应用的方式进行开发,一方面是对技术没有特别严格的要求,比如整个项目react,vue可以任意使用,另一方面也降低了各个模块的复杂度,但是微应用的学习成本也是不可忽略的因素。目前项目中已经采用了微应用开发,后面几篇文章会针对微应用做详细阐述,本篇使用qiankun来进行一个demo测试,后续会对这个几个微前端框架进行一个详细对比

1 相关概念

qiankun 官网 qiankun.umijs.org/zh/guide

微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略。 各个子应用独立开发、独立部署,互不影响。

2 搭建项目

踩坑

目前公司使用的是无界进行微应用的开发,脚手架用的vite。然后我就没仔细看文档,就想着开始直接用 vite 创建vue3 来测试qiankun,理想很丰满,现实很打脸,没想到qiankun更新这么久的框架对vite的支持不是很友好,当时有报错去查问题,各种方法都去尝试,结果还是有问题,搞了一个几个小时就放那了,第二天又查资料才知道需要配置插件,不然不能使用,好家伙,掉坑里了。

创建应用

我们来创建一个react项目作为一个主应用,再创建一个同样的react做为子应用

1、安装 create-react-app

npm install -g create-react-app

2、检测 create-react-app 是否安装成功

create-react-app -V

3、创建 React 项目 (可以在同一个文件夹下)

npx create-react-app micro-main-app (主应用)
npx create-react-app micro-react1 (子应用)

设置端口

同时我们可以在这个两个应用的根目录添加一个.env文件,设置我们本地开发的端口,这样可以避免端口占用,根据自己实际情况来设置。

主应用修改

进入 micro-main-app 目录安装 qiankun
$ yarn add qiankun # 或者 npm i qiankun -S

修改 index.js (已经删除了一些多余的文件)

js 复制代码
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { registerMicroApps, start } from 'qiankun';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <App />
);


registerMicroApps([
  {
    name: 'micro-react1', // 子应用名称,尽量和子应用package.json name 一致
    entry: '//localhost:8001', //子应用env设置的端口
    container: '#reactContainer', //子应用渲染节点
    activeRule: '/reactActiveRule', //路由监听,如果进入该路由,则渲染子应用
  }
]);

start();

修改app.js

js 复制代码
function App() {
  return (
    <div className="App">
      我是主应用
      {/* 子应用渲染节点,(必须)*/}
      <div id="reactContainer"></div>
    </div>
  );
}

export default App;

子应用修改

src 下新建 public-path.js,在 index.js 最顶部引入

js 复制代码
if (window.__POWERED_BY_QIANKUN__) {
    // eslint-disable-next-line no-undef
    __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
  }

根目录创建 webpack.config.js

js 复制代码
const packageName = require('./package.json').name;
module.exports = {
  output: {
    library: `${packageName}-[name]`,
    libraryTarget: 'umd',
    jsonpFunction: `webpackJsonp_${packageName}`,
  },
};

index.js 导出生命周期

js 复制代码
 import './public-path';
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('rootReact'));
root.render(
  <App />
);

if (!window.__POWERED_BY_QIANKUN__) {
  root.render(
    <App />
  )
}
export async function bootstrap() {
  // 启动微应用
}
export async function mount() {
  // 加载微应用
}
export async function unmount() {
  // 卸载微应用
}
export async function update() {
  // 更新微应用
}

此时所有项目配置都已经完成,正常的是已经可以从主应用打开子应用的 我们把两个应用服务跑起来,一个8000端口,一个8001端口

此时两个服务都已经正常运行,我们从浏览器地址栏修改主应用的ulr进行测试

可以从页面上看到子应用是已经加载进来了,但是有报生命周期函数的错,按照官方给的几点常见问题去排查修复,都无法解决。

解决方案

子应用 index.js 添加该方法

blog.csdn.net/qq_40513881... 附上地址 测试

最后

下一篇会进行vue子应用的添加以及整体项目的完善

相关推荐
陈随易1 小时前
农村程序员-关于小孩教育的思考
前端·后端·程序员
云深时现月1 小时前
jenkins使用cli发行uni-app到h5
前端·uni-app·jenkins
昨天今天明天好多天1 小时前
【Node.js]
前端·node.js
2401_857610031 小时前
深入探索React合成事件(SyntheticEvent):跨浏览器的事件处理利器
前端·javascript·react.js
雾散声声慢2 小时前
前端开发中怎么把链接转为二维码并展示?
前端
熊的猫2 小时前
DOM 规范 — MutationObserver 接口
前端·javascript·chrome·webpack·前端框架·node.js·ecmascript
天农学子2 小时前
Easyui ComboBox 数据加载完成之后过滤数据
前端·javascript·easyui
mez_Blog2 小时前
Vue之插槽(slot)
前端·javascript·vue.js·前端框架·插槽
爱睡D小猪2 小时前
vue文本高亮处理
前端·javascript·vue.js
开心工作室_kaic2 小时前
ssm102“魅力”繁峙宣传网站的设计与实现+vue(论文+源码)_kaic
前端·javascript·vue.js