基于qiankun的前端可组装应用开发实践

简介: 模块化可组装是云巧组件的核心理念之一。本文以某门户后台管理系统的前端为例(由N个模块组装而成),介绍一种前端模块化、可组装的开发实践。

模块化可组装是云巧组件的核心理念之一。接下来以某门户后台管理系统的前端为例(由N个模块组装而成),介绍一种前端模块化、可组装的开发实践。

实现的效果:

  1. 模块A(独立的后端服务、数据自包含、业务逻辑独立完整)前端独立运行:

(应用完整,包含所有功能)

  1. 模块A集成在某门户后台管理系统中:

(仅集成内容区,导航、路由由主应用控制)

三个关键点:

  1. 页面如何同时满足独立部署及以区块方式被集成?
  2. 跨应用如何统一账号信息?
  3. 如何实现布局等控件的自动适应?

具体实现:

  1. 利用微前端框架qiankun实现页面的跨应用集成。
  1. 子应用中:在 umi 框架内基于@umijs/plugin-qiankun插件可一键开启微前端模式,并可自动适应作为子应用集成/独立部署两种情况。(其他脚手架可参考:qiankun-快速上手
import { defineConfig } from'@ali-dayu/koi';
exportdefaultdefineConfig({
// ...qiankun: {
// 作为子应用slave: {},
  },
// ...});

b. 主应用中:(以下以 umi3 框架配置为例,其他脚手架可参考:qiankun-快速上手

首先,在配置文件中开启微前端模式。

import { defineConfig } from'@ali-dayu/koi';
exportdefaultdefineConfig({
// ...qiankun: {
// 作为主应用master: {},
  },
// ...});

然后,在app.ts运行时配置微应用和加载地址。

exportconstqiankun= {
apps: [
    {
name: 'app1',
entry: 'https://xxx.xxx.xxx',
    },
    {
name: 'app2',
entry: 'https://xxx.xxx.xxx',
    },
  ],
};

最后,在需要加载该模块子应用的位置提供容器,配置加载子应用。

importReactfrom'react';
import { MicroAppWithMemoHistory, useLocation, history } from'umi';
import { PageHeader } from'@/layout/components/PageHeader';
exportdefault () => {
const { query } =useLocation() asany;
return (
<divclassName={styles.settings}><PageHeadertitle={`${query?.name}`}/><MicroAppWithMemoHistoryname="app1"url="/xxx"autoSetLoading/></div>  );
};


  1. 基于统一的单点登录认证体系实现跨应用免登与账号信息同步。(以下以 umi3 框架配置为例,其他脚手架可参考相关文档)

后端使用统一的登录鉴权SDK,基于分布式session或统一网关实现跨后端应用的单点登录、统一鉴权。而前端仅需要封装请求库,增加一个拦截器逻辑,识别到需要重新登录的code时跳转单点登录页面,所有请求使用该请求库即可。

importumiRequestfrom'umi-request';
umiRequest.interceptors.response.use(async (response, options) => {
constdata=awaitresponse.clone().json();
const { code, extInfo } =data;
// 未登录/过期,需要重新登录if (code==='ConsoleNeedLogin') {
// 单点登录逻辑// ....  }
returnresponse;
});
export { umiRequestasdefault };
export*from'umi-request';


  1. 通过构建时环境变量、运行时window变量等配置控制布局的自动适应。
  1. 注入构建时环境变量
// 读取编译时环境变量并注入// 以 umi 脚手架为例,其他构建脚手架参考相关文档const { XXX_NEED_LAYOUT } =process.env;
exportdefaultdefineConfig({
// ...define: {
XXX_NEED_LAYOUT,
  },
// ...}


b. 解析变量,优先级策略是,显式配置 > 根据环境自动判断,运行时配置 > 构建时配置

exportconstxxxNeedLayout: boolean= (() => {
if (window.XXX_NEED_LAYOUT!==undefined) {
// 运行时window变量,优先级最高returnwindow.XXX_NEED_LAYOUT;
  } elseif (XXX_NEED_LAYOUT!==undefined) {
// 编译时注入的环境变量,优先级次之returnXXX_NEED_LAYOUT==='true';
  } else {
// 无显式指定是否需要布局,判断当前应用是否为qiankun子应用来决定是否隐藏布局return!window.__POWERED_BY_QIANKUN__;
  }
})();

c. 在模块A的布局实现中读取配置,并根据此变量实现布局的自适应。

// ...import { needLayout } from'@/utils/runtimeEnvVars';
// ...constPage: React.FC<any>= (props: any) => {
return (
<LayoutclassName={styles.layouts}>      {needLayout&& (
<Sider><Menu// .../></Sider>    )}
<Content>{children}</Content></Layout>  );
};


相关文章
|
6月前
|
缓存 前端开发 JavaScript
Vite 构建流程大揭秘:快速构建前端项目的秘密武器
Vite 构建流程大揭秘:快速构建前端项目的秘密武器
|
1月前
|
JSON JavaScript 前端开发
Vue3源码架构简析及Monorepo流程构建
【10月更文挑战第12天】Vue3源码架构简析及Monorepo流程构建
Vue3源码架构简析及Monorepo流程构建
|
3月前
|
设计模式 JavaScript 前端开发
Vue.js 组件设计模式:在前端热潮中找到归属感,打造可复用组件库,开启高效开发之旅!
【8月更文挑战第22天】Vue.js 以其高效构建单页应用著称,更可通过精良的组件设计打造可复用组件库。组件应职责单一、边界清晰,如一个显示文本并触发事件的按钮组件,通过 props 传递标签文本,利用插槽增强灵活性,允许父组件注入动态内容。结合 CSS 预处理器管理和封装独立模块,配以详尽文档,有效提升开发效率及代码可维护性。合理设计模式下,组件库既灵活又强大,持续实践可优化项目工作流。
52 1
|
6月前
|
JavaScript 前端开发 应用服务中间件
若依框架vue分离版-前端部署
若依框架vue分离版-前端部署
129 1
|
6月前
|
存储 JavaScript 前端开发
|
JSON JavaScript API
【从零到一手撕脚手架 | 第二节】模块化封装 降低耦合度 封装 axios pinia router
前一节我们讲解了脚手架的基础项目搭建。接下来教大家将Vue技术栈常用的工具进行封装,让我们项目的代码更易维护。
344 0
【从零到一手撕脚手架 | 第二节】模块化封装  降低耦合度 封装 axios pinia router
|
JavaScript 前端开发 Go
微前端之qiankun 介绍和简单使用
微前端之qiankun 介绍和简单使用
5946 0
|
Java 关系型数据库 程序员
【组件设计开发】采用领域驱动设计设计和开发可组装的组件
采用领域驱动设计设计和开发可组装的组件
27947 7
【组件设计开发】采用领域驱动设计设计和开发可组装的组件
|
设计模式 前端开发 JavaScript
如何通俗地理解「分布式系统」;Vue是否可以在一个项目中使用多个UI框架;大厂上线流程:先上前端还是后端|极客观点
如何通俗地理解「分布式系统」;Vue是否可以在一个项目中使用多个UI框架;大厂上线流程:先上前端还是后端|极客观点
320 0
|
前端开发 JavaScript API
前端工程化中重要概念之打包工具
在前端开发中,打包工具是必不可少的工具之一。它可以帮助我们将多个JavaScript、CSS或其他资源文件打包成一个或多个文件,从而减少网络请求次数,提高网站性能。同时,打包工具还可以进行代码压缩、转换、处理依赖等操作,使得前端开发更加高效和规范化。下面介绍一些在前端工程化中常用的打包工具及其作用:
366 0
下一篇
无影云桌面