# umiQiankun
**Repository Path**: yueliangliaoliao/umi-qiankun
## Basic Information
- **Project Name**: umiQiankun
- **Description**: umijs/plugin-qiankun 微应用前端实践
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-09-01
- **Last Updated**: 2022-09-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 准备两个应用
## 初始化主应用
### 使用 pro 来快速的初始化主应用。
``` node
npm i @ant-design/pro-cli -g
pro create app
```
> 选择版本

### 安装依赖:
```
$ cd app && yarn
$ yarn add @umijs/plugin-qiankun -D
```
* PS 如果安装报错:error An unexpected error occurred ,请检查 npm 设置

* 设置为官方源
```
npm config set registry http://registry.npmjs.org
```
## 配置主应用
### 配置子应用路由 config/routes.ts

```js
{
name: 'subapp',
path: '/subapp',
microApp: 'subapp',
access: 'normalRouteFilter'
},
```
### 开启 Umi UI(可选):
```
// 打开开发模式下页面右下角的小气泡,方便添加区块和模版等pro资产
$ tyarn add @umijs/preset-ui -D
// 或
$ npm install --save-dev @umijs/preset-ui
```
## 初始化子应用
```
mkdir subapp && cd subapp
yarn create @umijs/umi-app
```
### package.json 设置名称
```
{
"name":"subapp",
}
```
## 配置子应用
### 安装依赖
```js
yarn add @umijs/plugin-qiankun -D
```
### 配置子应用.umirc.ts
```
qiankun: {
slave: {},
},
```
### 设置端口号.env
> 设置固定的端口号,可以固定路径,方便后面的配置使用
```
PORT=8002
```
## 连接父子应用
### 在主应用 app 的 config/config.ts 添加配置
```
qiankun: {
master: {
apps: [
{
name: 'subapp',
entry: 'http://localhost:8002'
}
]
}
}
```
- 启动项目后,页面一直loading 需调整页面结构

- 由于添加了qiankun ,dom结构发生了变化,需要将替换root 为 root-master

### 测试子应用路由的使用
- 补充子应用路由 .umirc.ts
```js
routes: [
{
path: '/', component: '@/pages/index',
routes: [
{
path: '/child1',
component: '@/pages/Child1',
},
{
path: '/child2',
component: '@/pages/Child2',
},
],
},
],
```
- 调整页面结构 `src/pages/index.tsx`
```
import { Link } from 'umi';
import styles from './index.less';
export default function IndexPage(props) {
return (
子应用公共布局
child1
{props.children}
);
}
```
- 添加嵌套页面 `src/pages/Child1.tsx`
```js
import { Link } from 'umi'
function Child1() {
return (
Child1
前往Child2
返回子应用主页subapp
)
}
export default Child1
```
- 添加嵌套页面 `src/pages/Child2.tsx`
```js
import React from 'react'
function Child2() {
return (
我是Child2
)
}
export default Child2
```
### 路由效果展示

## 父子级通信
> 需确保已安装 `@umijs/plugin-model` 或 `@umijs/preset-react`
### 父应用安装
```
yarn add @umijs/plugin-model @umijs/preset-react
```
### 父级:`src/app.tsx`
```js
// 添加子应用初始参数
export function useQiankunStateForSlave() {
const [masterState, setMasterState] = useState<{ name: string }>();
useEffect(() => {
setMasterState({ name: '我是app的数据来给subapp比个✌️' });
}, []);
return {
masterState,
setMasterState
}
}
```
### 子集调用 `src/pages/index.tsx`
```js
import { Link, useModel, } from 'umi';
import { Button, Space } from 'antd'
export default function IndexPage(props) {
const masterProps = useModel('@@qiankunStateFromMaster');
return (
子应用公共布局
child1
{masterProps?.masterState?.name}
{props.children}
);
}
```
### 父子通信展示

# 部署时的跨域问题
本地访问的时候,使用localhost是可以正常访问,部署到测试环境出现CORS跨域问题,解决方案是通过配置子应用的Nginx 来解决。
```js
server { // ....此处省略
location / {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
index index.html index.htm;
}
}
```
# 路由权限[access]
子项目应如何设置路由权限,即如果没有权限访问子应用的页面,应在路由上直接拦截,返回到403页面。
- 首先,父应用应针对子应用设置权限,以subapp项目为例:
```js
const routes = [
//....
{
name: 'subapp',
path: '/subapp',
microApp: 'subapp',
access: 'normalRouteFilter' // 设置权限校验
},
]
```
- 其次,在子应用中配置access.ts 文件。
- 子应用添加 layout 配置
```
layout: {
name: 'Matrix 矩阵',
locale: false,
siderWidth: 0,
// 不展示顶栏
headerRender: false,
// 不展示页脚
footerRender: false,
// 不展示菜单
menuRender: false,
// 不展示菜单顶栏
menuHeaderRender: false,
disableContentMargin: false,
flatMenu: true,
}
```
# 参考
- [@umijs/plugin-qiankun](https://v3.umijs.org/plugins/plugin-qiankun)
- [Ant Design Pro](https://pro.ant.design/zh-CN/docs/getting-started)
- [完整代码](https://gitee.com/yueliangliaoliao/umi-qiankun)