微应用-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子应用的添加以及整体项目的完善

相关推荐
css趣多多1 小时前
案例自定义tabBar
前端
姑苏洛言2 小时前
DeepSeek写微信转盘小程序需求文档,这不比产品经理强?
前端
林的快手3 小时前
CSS列表属性
前端·javascript·css·ajax·firefox·html5·safari
匹马夕阳3 小时前
ECharts极简入门
前端·信息可视化·echarts
API_technology3 小时前
电商API安全防护:JWT令牌与XSS防御实战
前端·安全·xss
yqcoder3 小时前
Express + MongoDB 实现在筛选时间段中用户名的模糊查询
java·前端·javascript
十八朵郁金香4 小时前
通俗易懂的DOM1级标准介绍
开发语言·前端·javascript
m0_528723815 小时前
HTML中,title和h1标签的区别是什么?
前端·html
Dark_programmer5 小时前
html - - - - - modal弹窗出现时,页面怎么能限制滚动
前端·html
GDAL5 小时前
HTML Canvas clip 深入全面讲解
前端·javascript·canvas