当前位置: 首页 > 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://www.xdnf.cn/news/1478269.html

相关文章:

  • MyBatis Example模式SQL注入风险
  • C#中一段程序类比博图
  • 【完整源码+数据集+部署教程】水培植物病害检测系统源码和数据集:改进yolo11-AKConv
  • 从 JDK 1.8 切换到 JDK 21 时遇到 NoProviderFoundException 该如何解决?
  • 【科研成果速递-IJGIS】如何描述与分类移动对象的时空模式?一个新的分类框架与体系!
  • JDBC操作数据库所需要的组件
  • 《Kubernetes 构建 MySQL MGR 集群实战教程》
  • 使用Spring Boot DevTools快速重启功能
  • Python爬虫实战:研究Event Handling机制,构建在线教育平台的课程数据采集和分析系统
  • 使用 YAML 自动化 Azure DevOps 管道
  • browser-use 的三种启动方式详解
  • Android Framework智能座舱面试题
  • 【Python自动化】 21.2 Pandas 读取 Excel 时的 dtype 参数完全指南
  • 贪心算法应用:DNA自组装问题详解
  • Flask论坛与个人中心页面开发教程完整详细版
  • 【LeetCode 热题 100】49. 字母异位词分组
  • Windows 11 手动下载安装配置 uv、配置国内源
  • 固定资产管理系统(vue+Springboot+mybatis)
  • 行为式验证码技术解析:滑块拼图、语序选词与智能无感知
  • Vllm-0.10.1:vllm bench serve参数说明
  • 【完整源码+数据集+部署教程】农作物病害检测系统源码和数据集:改进yolo11-HSFPN
  • Flutter常用库集锦
  • Webpack热更新(HMR)底层原理详解
  • 基于定制开发开源AI智能名片S2B2C商城小程序的DMP平台离线文件上传功能优化研究
  • RK3568 Trust
  • 进程间通信(IPC)方式
  • AgentScope 1.0深度解析:技术架构、使用教程与多智能体开发实践
  • 跟着开题报告学答辩!《 Access学情分析系统的设计与实现》开题答辩实录分享!
  • Linux系统编程守护进程(36)
  • Linux笔记---TCP套接字编程