前端工程化实践:Monorepo与Lerna管理

前端工程化实践中,Monorepo(单仓库)管理和Lerna是两种流行的方式,用于大型项目或组件库的组织和版本管理。

2500G计算机入门到高级架构师开发资料超级大礼包免费送!

Monorepo简介

Monorepo(单仓库)是指在一个Git仓库中管理多个相关项目的开发方式。这种方式的优点在于:

集中式管理:所有项目都在一个仓库中,方便代码共享、版本同步和协同开发。
模块化:可以创建独立的模块,方便复用和维护。
统一的CI/CD:一次配置,全仓库生效,简化持续集成和部署流程。
更好的依赖管理:可以更容易地管理项目间的依赖关系。

Lerna简介

Lerna是一个命令行工具,用于在Monorepo中管理多包项目。它提供了版本管理和发布功能,使得在单个仓库中管理多个npm包变得简单。

Lerna的核心概念有:
  • Packages:Monorepo中的独立npm包。
  • Versions:每个包可以有自己的版本,可以是固定的或共享的。
  • Bootstrapping:初始化所有包的依赖关系,确保每个包都能正常工作。
  • Publishing:发布包到npm,可以是逐个包发布,也可以是批量发布。

安装Lerna

首先,确保安装Node.js和npm。然后,在项目根目录安装Lerna:

npm install --save-dev lerna
# 或
yarn add --dev lerna

初始化Lerna项目

在项目根目录运行以下命令初始化Lerna:

npx lerna init

这将创建一个lerna.json配置文件和一个packages目录,用于存放各个包。

创建和管理包

在packages目录下创建新包:

mkdir packages/my-package
cd packages/my-package
npm init -y
# 或
yarn init -y

在包内编写代码,例如index.js和package.json。

使用Lerna命令

Bootstrap:初始化所有包的依赖关系。

  npx lerna bootstrap

Add:在包之间添加依赖。

  npx lerna add @scope/my-package

Publish:发布包到npm。

  npx lerna publish

List:查看项目中的包。

  npx lerna ls

Lerna配置

lerna.json中,可以配置Lerna的行为,例如:

{"version": "independent", // 或 "fixed""packages": ["packages/*"],"command": {"publish": {"ignore": ["**/node_modules/**"]}}
}
  • version:指定版本策略,可以是fixed(所有包共享同一版本号)或independent(每个包有自己的版本号)。
  • packages:指定包含包的目录路径。
  • command.publish.ignore:在发布时忽略的文件或目录。

性能优化

  • 独立版本:使用independent版本策略,可以单独发布每个包,避免不必要的发布。
  • Selective Publishing:使用–since或–scope参数,只发布更改的包。
  • Workspaces:配合Yarn Workspaces使用,减少安装时间和磁盘空间占用。

Lerna的高级特性

异步操作和锁定

Lerna支持异步操作,这在处理大型项目时非常有用。在lerna.json中设置concurrency属性可以限制并发执行的任务数量,防止资源过度消耗。

{"concurrency": 4
}

Lerna还使用npm的package-lock.json或yarn.lock文件来确保每次安装时的依赖一致性。当lerna bootstrap执行时,它会按照文件中的锁定版本安装依赖,保证所有开发者在本地构建时使用相同的依赖版本。

自定义脚本

Lerna允许在lerna.json中定义自定义脚本,以便在项目中执行特定任务。例如,创建一个预发布脚本:

{"scripts": {"prepublishOnly": "tsc"}
}

这将在发布包之前运行TypeScript编译器。

工作流集成

Lerna可以与常见的CI/CD工具(如Jenkins、CircleCI、GitHub Actions等)集成,实现自动化测试、构建和发布。在.gitlab-ci.yml、.travis.yml或其他CI配置文件中,配置相应的Lerna命令。

例如,在GitHub Actions中:

name: CIon:push:branches: [ main ]jobs:build-and-test:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Install Dependenciesrun: npm ci- name: Bootstrap Lernarun: npm run bootstrap- name: Run Testsrun: npm test- name: Publishif: startsWith(github.ref, 'refs/tags')run: npx lerna publish from-git --yes

Monorepo的最佳实践

  • 清晰的模块划分:确保每个包都有明确的边界和用途,避免过度耦合。
  • 版本策略:根据项目需求选择固定或独立版本策略。
  • 合理的依赖管理:避免循环依赖,合理控制公共依赖。
  • 文档和说明:为每个包提供清晰的README和API文档,方便其他开发者使用。
  • 持续集成:集成自动化测试、代码质量检查和构建过程。
  • 代码审查:确保代码质量和遵循团队规范。
  • 定期清理:定期评估和删除不再使用的包。

其他Monorepo管理工具

除了Lerna,还有其他一些工具可以用于Monorepo管理,每个工具都有其特点和适用场景:

Yarn Workspaces

Yarn的Workspaces特性直接内置在包管理器中,无需额外的命令行工具。它允许在一个仓库中管理多个依赖,并自动解决跨包依赖。Workspaces适合那些主要使用Yarn作为包管理器的项目。

Rush (Pika)

Rush是Microsoft开发的一个Monorepo管理工具,专注于速度和可扩展性。Rush使用自定义的依赖解析算法,支持多项目和多包类型,包括TypeScript、JavaScript、C++等。Rush还提供了丰富的命令行工具和配置选项。

Nx ( Nrwl.io)

Nx 是一个开源的Monorepo管理工具,最初为Angular项目设计,但现在支持多种框架和技术,如React、Vue、Node.js等。Nx 提供了一整套工作流工具,包括代码生成、测试、性能分析和并行构建。它还支持微前端架构。

Monorepo的挑战

虽然Monorepo有许多优点,但也存在一些挑战:

  • 版本冲突:在大型项目中,管理不同包的版本可能会变得复杂。
  • 构建时间:随着项目规模的增长,构建和测试的时间可能显著增加。
  • 学习曲线:新成员可能需要更多时间来熟悉Monorepo的结构和工作流程。
  • 依赖管理:解决跨包依赖和避免循环依赖可能需要额外的注意。

选择Monorepo还是Polyrepo?

选择Monorepo还是Polyrepo(多仓库)取决于项目需求、团队规模和偏好。Monorepo适合需要频繁共享代码和组件的大型项目,而Polyrepo则适用于小项目或需要独立开发和发布的组件。

在做出决定时,应考虑以下因素:

  • 代码共享:如果项目间有很多共享代码,Monorepo可能是更好的选择。
  • 团队协作:如果团队需要紧密合作,Monorepo可以简化协同开发。
  • 构建时间:如果项目很大,Monorepo可能导致较长的构建时间。
  • 项目独立性:如果项目彼此独立,Polyrepo可能更合适。

2500G计算机入门到高级架构师开发资料超级大礼包免费送!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web入门练手案例(二)

下面是一下web入门案例和实现的代码,带有部分注释,倘若代码中有任何问题或疑问,欢迎留言交流~ 数字变色Logo 案例描述 “Logo”是“商标”的英文说法,是企业最基本的视觉识别形象,通过商标的推广可以让消费者了解企…

第一个Rust程序

在安装好Rust以后,我们就可以编写程序了。 首先,我们执行下面的命令,尽量让你的rust版本和我的版本相同,或者比我的版本大。 zhangdapengzhangdapeng:~$ cargo --version cargo 1.78.0 (54d8815d0 2024-03-26) zhangdapengzhangd…

C语言(指针)2

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记&#x…

听说SOLIDWORKS科研版可以节约研发成本?

近几年来,政府越来越重视科研带动产业,绩效优良的产业技术研究院对于国家和地区的学术成果转化、技术创新、产业发展等具有不可忽视的促进和带动作用。研究院会承担众多新产业的基础研究工作,而常规的基础研究需要长期的积累,每个…

JAVA毕业设计141—基于Java+Springboot+Vue的物业管理系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的物业管理系统(源代码数据库)141 一、系统介绍 本项目前后端分离,分为管理员、员工、用户三种角色(角色权限可自行分配) 1、用户: …

Nginx详解:高性能HTTP和反向代理服务器

Nginx详解:高性能HTTP和反向代理服务器 一、引言 Nginx(发音为“engine x”)是一个开源的高性能HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。由于其出色的性能和稳定性,Nginx已经成为互联网上最受欢迎的…

asp.net结课作业中遇到的问题解决4

目录 1、vs2019每次运行一次项目之后,样式表的格式就算在vs2019上改变了,在浏览器中显示的还是以前的样式,所以应该如何修改 2、如何实现选择下拉框之后,显示所选择的这个类型的书籍的名称 3、如何实现点击首页显示的书籍&#…

高清模拟视频采集卡CVBS四合一信号采集设备解析

介绍一款新产品——LCC261高清视频采集与编解码一体化采集卡。这款高品质的产品拥有卓越的性能表现和丰富多样的功能特性,能够满足广大用户对于高清视频采集、处理以及传输的需求。 首先,让我们来了解一下LCC261的基本信息。它是一款基于灵卡技术研发的高…

Shell三剑客之sed

前言: Shell三剑客是grep、sed和awk三个工具的简称,因功能强大,使用方便且使用频率高,因此被戏称为三剑客,熟练使用这三个工具可以极大地提升运维效率。 sed是一个流编辑器,用于对文本进行编辑、替换、删除等操作。sed…

LeetCode2095删除链表的中间节点

题目描述 给你一个链表的头节点 head 。删除 链表的 中间节点 ,并返回修改后的链表的头节点 head 。长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点(下标从 0 开始),其中 ⌊x⌋ 表示小于或等于 x 的最大整数。对于 n 1、…

深入探索Android签名机制:从v1到v3的演进之旅

引言 在Android开发的世界中,APK的签名机制是确保应用安全性的关键环节。随着技术的不断进步,Android签名机制也经历了从v1到v3的演进。本文将带你深入了解Android签名机制的演变过程,揭示每个版本背后的技术细节,并探讨它们对开…

浅谈下MYSQL表设计的几条规则

作为后端开发人员,避免不了和数据库打交道,可是我们怎么能够设计出高效,可维护,可扩展的数据库设计呢,在这里我总结了几个点,供大家参考。 在写之前,可能需要重复下数据库设计的范式原则&#…

docker-compose.yml文件详解

创建 docker-compose.yml 文件是使用 Docker Compose 管理多容器应用的第一步。这个 YAML 格式的文件详细描述了服务、网络和卷等组件以及它们之间的关系。下面是对一个典型 docker-compose.yml 文件结构的详解: 基本结构 一个基本的 docker-compose.yml 文件通常…

水雨情监测系统—实时监测水位信息

TH-SW3水雨情监测系统是一种专门用于实时监测和收集水文气象数据的自动化系统。它能够实时获取区域内降雨和水情数据,并将其存储到数据库中进行分析处理,从而为防汛指挥人员提供及时准确的信息服务。 水雨情监测系统的主要功能包括实时监测水位、流速、流…

C++类与对象基础探秘系列(二)

目录 类的6个默认成员函数 构造函数 构造函数的概念 构造函数的特性 析构函数 析构函数的概念 析构函数的特性 拷贝构造函数 拷贝构造函数的概念 拷贝构造函数的特性 赋值运算符重载 运算符重载 赋值运算符重载 const成员 const修饰类的成员函数 取地址及const取地址操作…

MySQL文档_下载

可能需要:MySQL下载–》更新版本–》迁移数据库到MySQL 以下都不重要【只要确定好需要安装版本,找到对应的版本下载,安装,设置即可】 下载、安装: Determine whether MySQL runs and is supported on your platform…

iCloud如何高效利用:提升苹果生态体验

iCloud如何高效利用:提升苹果生态体验 引言 iCloud是苹果公司提供的云服务,它允许用户在苹果设备之间无缝同步数据和内容。随着数字化生活的不断发展,有效地管理和利用iCloud对于提高工作效率和生活质量变得越来越重要。本文将详细介绍如何…

Debian12安装后更换为国内镜像源,切换root用户,解决用户名不在sudoers文件中此事将被报告

选择Debian作为编程开发最佳Linux的理由: Debian是面向程序员的最古老,最出色的Linux发行版之一。Debian提供了具有.deb软件包管理兼容性的超稳定发行版。Debian为程序员提供了许多最新功能。因此,它具有一个特殊的编程空间。Debian是开发人员…

弥合孤岛:克服构建 DevOps 文化的挑战

持续变革正在发生软件开发行业。DevOps 因其对自动化、协作和持续改进的关注而成为优化软件交付并弥合开发和运营团队之间鸿沟的重要方法。然而,过渡到真正的 DevOps 文化并非没有挑战。本文探讨了您在追求 DevOps 时可能面临的障碍并提供了解决方案。 01 了解 Dev…

数据结构 顺序表1

1. 何为顺序表: 顺序表是一种线性数据结构,是由一组地址连续的存储单元依次存储数据元素的结构,通常采用数组来实现。顺序表的特点是可以随机存取其中的任何一个元素,并且支持在任意位置上进行插入和删除操作。在顺序表中&#xf…