Umi 实现微前端
建议阅读 Umi 微前端,了解 微前端 的基本使用
介绍
Lerna 是一个快速、领先的构建系统,用于管理和发布来自同一源码仓库的多个
JavaScript/TypeScript软件包Umi 企业级前端开发框架,它提供了一套完整的
Web应用开发解决方案,包括路由、状态管理、数据请求、页面布局、主题定制等功能
项目地址
实践
包版本
node:18.20.7npm:10.8.2lerna:8.1.8umi:4.4.0
项目目录
1 | ├── 根目录 |
搭建 monorepo 项目 (可选)
通过
npm install lerna -g全局安装lerna命令行执行
npx lerna init初始化项目配置
lerna.json文件如下1
2
3
4
5{
"npmClient": "npm", // 使用 npm
"packages": ["packages/*"], // 指定包目录
... // 其他配置
}配置
package.json文件如下1
2
3
4{
"workspaces": ["packages/*"],
... // 其他配置
}
创建主/子应用
依次执行下面命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 从根目录进入 packages 目录
cd ./packages
# 创建主应用 app
npx create-umi@latest
# What's the target folder name?
app
# Pick Umi App Template
Ant Design Pro
# Pick Npm Client
npm
# Pick Npm Registry (这一步会在 根目录 下创建 `.npmrc` 文件)
npm在
packages/app/package.json中配置name一定要配置,否则npm workspaces找不到项目1
2
3
4{
"name": "app",
... // 其他配置
}在
packages/app下新建.env文件,并配置 启动端口和禁用babel的缓存1
2PORT=8000
BABEL_CACHE=none
依次执行下面命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 从根目录进入 packages 目录
cd ./packages
# 创建子应用 app1
npx create-umi@latest
# What's the target folder name?
app1
# Pick Umi App Template
Simple App
# Pick Npm Client
npm
# Pick Npm Registry (这一步会在 根目录 下创建 `.npmrc` 文件, 不需要可以删除)
npm在
packages/app1/package.json中配置name一定要配置,否则npm workspaces找不到项目1
2
3
4{
"name": "app1",
... // 其他配置
}在
packages/app1下新建.env文件,并配置 启动端口和禁用babel的缓存1
2PORT=8001
BABEL_CACHE=none
依次执行下面命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 从根目录进入 packages 目录
cd ./packages
# 创建子应用 app2
npx create-umi@latest
# What's the target folder name?
app2
# Pick Umi App Template
Simple App
# Pick Npm Client
npm
# Pick Npm Registry (这一步会在 根目录 下创建 `.npmrc` 文件, 不需要可以删除)
npm在
packages/app2/package.json中配置name一定要配置,否则npm workspaces找不到项目1
2
3
4{
"name": "app2",
... // 其他配置
}在
packages/app2下新建.env文件,并配置 启动端口和禁用babel的缓存1
2PORT=8002
BABEL_CACHE=none
启动项目
在根目录下执行 npm install 安装依赖
方式一:进入各个应用目录,分别执行
npm run dev1
2
3
4
5
6
7
8
9
10
11
12
13
14# 进入 packages/app 目录
cd ./packages/app
# 启动主应用
npm run dev
# 进入 packages/app1 目录
cd ./packages/app1
# 启动子应用
npm run dev
# 进入 packages/app2 目录
cd ./packages/app2
# 启动子应用
npm run dev方式二:进入根目录,执行
npm run dev -w=xxx,-w就是--workspace,xxx对应各个应用package.json的name,详见:npm workspace1
2
3
4
5
6
7
8# 根目录下启动主应用
npm run dev -w=app
# 根目录下启动子应用
npm run dev -w=app1
# 根目录下启动子应用
npm run dev -w=app2
链接主/子应用
在主应用 packages/app/.umirc.ts 中添加下面内容
1 | export default { |
安装
qiankun插件1
2# 根目录下执行
npm i @umijs/plugins -D -w=app1 -w=app2在子应用
packages/app1/.umirc.ts与packages/app2/.umirc.ts文件中引入qiankun插件1
2
3
4
5
6
7export default {
... // 其他配置
plugins: ['@umijs/plugins/dist/qiankun'],
qiankun: {
slave: {},
},
};
更多微前端配置
Umi 项目原理?🤔
通过
create-umi@latest创建项目,会生成一个.umirc.ts配置文件当项目启动时,通过
Webpack插件找到.umirc.ts和src/app.ts文件,并生成src/.umi/*文件夹这个插件应该在
@umi某个包里面,具体干了什么事情?猜测根据用户配置动态生成
根组件,就是常见的createRoot(document.getElementById('root')).render(<App />)根据用户配置动态加载插件,减小打包体积
减少耦合,与业务无关的内容提取出去









