当前位置: 首页 > news >正文

抽成独立组件库:微前端架构下公共组件共享的最佳实践

文章目录

  • 🛠 抽成独立组件库:微前端架构下公共组件共享的最佳实践
    • 一、引言:为什么要抽成独立组件库?
      • 公共组件库的优势:
    • 二、组件库的构建流程
      • 1. 准备工作:组件库的设计
      • 2. 封装一个简单的卡片组件
      • 3. 配置打包工具
    • 三、如何在子应用中使用组件库
      • 1. 发布到 npm(或 CDN)
        • 方法一:发布到 npm
        • 方法二:上传到 CDN
      • 2. 子应用中引用
        • 方法一:通过 npm 引入
        • 方法二:通过 CDN 引入
    • 四、优势与挑战
      • 优势:
      • 挑战:
    • 五、示意图
    • 六、结语

在这里插入图片描述

🛠 抽成独立组件库:微前端架构下公共组件共享的最佳实践

一、引言:为什么要抽成独立组件库?

假设你正在做一个大型的前端项目,涉及到多个子应用,每个子应用可能是由不同的团队开发的。
每个子应用都需要一个 卡片组件 Card.vue,而且这个组件需要保证样式统一、功能一致,但每个子应用又不能“直接”共享主应用的代码。

此时,公共组件库就显得至关重要了。
它将卡片组件按钮组件列表组件等封装成一个独立的、可复用的库,让不同子应用通过 npm 共享和使用,解决了多个子应用之间 组件复用 的问题。

公共组件库的优势:

  1. 统一样式和功能
    所有子应用都使用同一个组件库,确保风格一致,避免出现不同团队之间风格不统一的问题。
  2. 代码复用
    一次开发、多处使用,避免重复的开发工作,提高开发效率。
  3. 易于维护
    组件库的更新只需在一个地方进行,子应用直接更新 npm 包即可,减少了多个子应用间的同步问题。
  4. 版本控制
    可以轻松管理组件的版本,解决了不同版本的组件库问题。

二、组件库的构建流程

1. 准备工作:组件库的设计

在构建独立组件库之前,我们首先需要考虑以下几个方面:

  • 组件的通用性:确保每个组件具有良好的通用性,避免写死的样式和功能。组件应能接收外部参数(如 props)进行灵活配置。
  • 依赖管理:避免引入不必要的依赖,尽量使用 Vue 自带的功能。对于需要的外部库,可以通过 peerDependencies 管理。
  • 打包工具:选择适合的打包工具来生成组件库的最终产物。通常使用 ViteWebpack 来打包 Vue 组件库。

2. 封装一个简单的卡片组件

让我们从封装一个最简单的 卡片组件 Card.vue 开始:

<!-- Card.vue -->
<template><div class="card" :style="{ backgroundColor: color }"><h3>{{ title }}</h3><p>{{ content }}</p></div>
</template><script>
export default {name: 'Card',props: {title: {type: String,required: true,},content: {type: String,required: true,},color: {type: String,default: '#fff',},},
};
</script><style scoped>
.card {padding: 16px;border-radius: 8px;box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
</style>

这个组件非常简单,它接受三个 props

  • title:卡片的标题。
  • content:卡片的内容。
  • color:卡片的背景颜色。

3. 配置打包工具

我们以 Vite 为例,来配置打包工具生成一个可以被其他项目引用的库。

步骤 1:初始化组件库

首先,创建一个新项目并初始化 Vite

npm create vite@latest common-ui --template vue
cd common-ui
npm install

步骤 2:配置 vite.config.js

vite.config.js 文件中,配置打包选项,生成一个 UMD 格式的组件库。

// vite.config.js
import { defineConfig } from 'vite';export default defineConfig({build: {lib: {entry: 'src/index.js', // 入口文件name: 'CommonUI', // 库的名字fileName: 'common-ui', // 打包后的文件名formats: ['umd'], // 输出格式},rollupOptions: {// 确保外部依赖不被打包external: ['vue'],output: {globals: {vue: 'Vue',},},},},
});

步骤 3:添加组件导出文件

创建一个 src/index.js 文件,导出你的组件库中的所有组件。

// src/index.js
import Card from './components/Card.vue';export { Card };

步骤 4:打包

现在,使用 Vite 打包你的组件库:

npm run build

这会在 dist/ 目录下生成 common-ui.umd.js 文件,这是一个可供其他项目引用的 UMD 格式的文件。


三、如何在子应用中使用组件库

1. 发布到 npm(或 CDN)

方法一:发布到 npm

你可以将打包后的 common-ui.umd.js 上传到 npm,然后其他子应用通过 npm 安装:

npm publish
方法二:上传到 CDN

如果你不想发布到 npm,可以将文件上传到 CDN 或主应用的静态目录,并提供一个 URL 供子应用引用。

2. 子应用中引用

在子应用中,通过 npm<script> 标签引入公共组件库,然后使用其中的组件:

方法一:通过 npm 引入
# 子应用中安装公共组件库
npm install common-ui
// 子应用 main.js
import { createApp } from 'vue';
import App from './App.vue';
import { Card } from 'common-ui'; // 引入公共组件const app = createApp(App);// 全局注册公共组件
app.component('Card', Card);app.mount('#child-app');
方法二:通过 CDN 引入
<!-- 子应用 index.html -->
<script src="http://localhost:8080/common-ui.umd.js"></script>
// 子应用 main.js
const Card = window.CommonUI.Card; // 从全局对象取出 Card
app.component('Card', Card);

四、优势与挑战

优势:

优势说明
统一性保证所有子应用使用相同版本的组件,统一风格和功能。
易于维护公共组件只需要更新一次,所有子应用通过更新 npm 包即可获得新功能。
版本控制可以通过 npm 或其他包管理工具管理不同版本的组件库,避免版本不一致的问题。
代码复用一次开发,多处使用,节省开发时间和成本。

挑战:

挑战说明
发布与管理需要定期发布和更新组件库,可能需要搭建自己的 npm 私服。
依赖管理公共组件库可能依赖某些外部库,需要在多个子应用中统一版本。

五、示意图

[主应用] --------------------> [npm 仓库/公共组件库]|                                  ||-----------------> [子应用A] <------||-----------------> [子应用B] <------||-----------------> [子应用C] <------|

主应用通过 npm 发布组件库,子应用通过 npm install 安装并使用。


六、结语

封装成独立组件库,是微前端项目中解决 组件共享 问题的最佳实践之一。
它通过统一风格、提高代码复用率、简化维护工作,为开发团队提供了高效、规范的开发流程。无论是通过 npm 还是通过 CDN,公共组件库都能保证跨项目、跨仓库的共享使用

小白金句

一个组件库,多个子应用,风格统一,开发高效!


以上就是关于如何在 qiankun 微前端架构 中通过 抽成独立组件库 进行跨项目组件共享的详细介绍。
如果有任何问题或需要更深入的帮助,请随时向我提问! 😊


文章转载自:

http://zzdJBfhk.srhqm.cn
http://mbxTwqwr.srhqm.cn
http://g84hkHtT.srhqm.cn
http://7lwbQdEJ.srhqm.cn
http://EvaUmx2f.srhqm.cn
http://SjY6mC1C.srhqm.cn
http://PsOHMvIJ.srhqm.cn
http://51UlwFDB.srhqm.cn
http://WGPjPsHg.srhqm.cn
http://433DwgtJ.srhqm.cn
http://rIZvTRVN.srhqm.cn
http://NG6aJgyz.srhqm.cn
http://ZioLqYAn.srhqm.cn
http://dZlNVZfL.srhqm.cn
http://lDHTDhHz.srhqm.cn
http://y5jFr8wA.srhqm.cn
http://80YQE746.srhqm.cn
http://EOYctmvm.srhqm.cn
http://DmeWaOF0.srhqm.cn
http://eWCuYxgW.srhqm.cn
http://5z93hlEz.srhqm.cn
http://oQFS7F3P.srhqm.cn
http://Vf9Bujd3.srhqm.cn
http://9cSZN8U0.srhqm.cn
http://XtvU0uxF.srhqm.cn
http://lApw0udW.srhqm.cn
http://mldnnMYO.srhqm.cn
http://1EwTtyIm.srhqm.cn
http://oGI2iPEZ.srhqm.cn
http://wLIrSOJx.srhqm.cn
http://www.dtcms.com/a/370785.html

相关文章:

  • 前端上传切片优化以及实现
  • 自适应滤波器:Ch1 正交性原理->维纳-霍夫方程
  • 1.5、机器学习-回归算法
  • 【基础-单选】UIAbility实例创建完成时触发的回调
  • 【YOLOv11】5.安装PyCharm
  • 从技术架构、接入路径、应用场景全梳理的智慧地产开源了
  • Javaweb 14.4 Vue3 视图渲染技术
  • 算法与数据结构实战技巧:从复杂度分析到数学优化
  • clang(clangd)与arm-linux-gcc、ARMGCC、ICCARM(IAR)、C51编译器的兼容性
  • 计算机视觉(八):开运算和闭运算
  • 工业显示器在地铁电力监控与运维中的应用
  • 集成学习 —— 梯度提升树GBDT、XGBoost
  • c++八股文1
  • CAD:注释
  • C++ 并发编程指南 并发设计模式:Actor vs. CSP (生活场景版)
  • LeetCode 468. 验证IP地址 - 详细解析
  • OpenLayers常用控件 -- 章节六:全屏控件教程
  • 7.网络虚拟化
  • 基于树莓派与Jetson Nano集群的实验边缘设备上视觉语言模型(VLMs)的性能评估与实践探索
  • AI工具深度测评与选型指南 - 文本生成与处理类
  • 【Proteus仿真】定时器控制系列仿真——LED小灯闪烁/流水灯/LED灯带控制/LED小灯实现二进制
  • 十三、计算机领域英语
  • 设计模式Design Patterns:组合Composite、命令Command、策略Strategy
  • 【Mysql-installer-community-8.0.26.0】Mysql 社区版(8.0.26.0) 在Window 系统的默认安装配置
  • 【STM32HAL-----NRF24L01】
  • cocos2d. 3.17.2 c++如何实现下载断点续传zip压缩包带进度条
  • gcloud cli 使用 impersonate模拟 服务帐号
  • leetcode 3495. 使数组元素都变为零的最少操作次数-C语言
  • 把装配想象成移动物体的问题
  • mac-intel操作系统go-stock项目(股票分析工具)安装与配置指南