Monorepo 是什么?前端项目的多模块管理终极方案

news2025/4/18 20:57:55

前言

你是否曾经维护过多个前端项目?是否在多个项目之间来回复制粘贴组件,工具函数?是否经常被"组件更新没同步","构建时间太长","依赖版本冲突"等问题困扰?

这些问题都指向一个关键点: 项目结构和管理方式

今天,我来聊聊一种非常火但又容易被忽略的架构方式: Monorepo,并通过实例告诉它为什么在前端大型项目中越来越重要

一、背景与演进

1.1多仓(Multi-repo)时代的痛点
早期的前端项目采用(一个项目一个仓库)的方式(Multi-repo)管理: 
  • 组件复用困难:公共组件或工具库需要再npm发布后才能被其他项目引用,迭代慢,体验差

  • 版本不一致,各项目间的依赖版本容易错乱,调试和排查成本高

  • CI/CD流程重复: 每个仓库都要单独配置流水线,维护成本高 

  • 分支管理复杂: 多个仓库多分支,跨仓库同步和合并麻烦

1.2 Monorepo的兴起 

为了解决上述痛点,Google,Facebook,Twitter等大厂在内部率先实践了Monorepo(Monolithic Repository)----将多模块,多应用统一放在一个Git仓库中管理,随着社区工具的成熟,前端也迎来了Monorepo的浪潮

二 Monorepo的核心概念

Monorepo: 将多个相关或相关的项目(子包,组件库,服务端代码,前端应用等)放在同一个版本库中,通过工作区或仓库配置一并管理

主要特征: 

1.单一的Git仓库: 所有代码,文档,配置文件都在一个仓库下; 
2.多package: 通过子目录(通常是packges/或modules/)区分不同项目
3.统一依赖管理: 一个跟package.json+锁文件(pnpm-lock.yaml.yarn.lock),所有子包共用; 
4.自动本地链接: 子包之间可以本地互相引用,无需发布到npm 

三. Monorepo 带来的核心价值 

依赖一致性   单一锁文件保证所有包使用相同版本,避免环境下跑,线上不跑

实时模拟共享, 修改组件库或工具库后,子项目可立刻引用最新代码,提升开发体验

统一 CI/CD   一套流水线即可跑所有测试,构建,发布,易于维护

按需构建  结合Turborepo等,可对改动包记性增量构建,节省资源

集中发布  Leran/Changesets可自动检测变更包并发布到npm  

四. Monorepo简介及其与包管理工具(npm,yarn,pnpm)之间的联系 

包管理工具是用来管理项目依赖,发布包,安装依赖的工具,它们都提供了对工作区(workspace)的支持,允许在单个代码库中管理多个项目或包,这种工作区支持在单个代码库中同时开发,测试和管理读个相关的项目,而无需使用多个独立的代码仓库

关系: 

这些包管理工具与Monorepo的关系在于它们可以为monorepo提供依赖安装和依赖管理的支持,借助自身对workspace的支持,允许在monorepo中不同子项目之间共享依赖项,并提供一种管理这些共享依赖项的方式,这可以简化依赖项管理和构建过程,并提高开发效率 

五. Monorepo生态 

Monore只是一个管理概念,实际上它并不代表某项具体的技术,更不是所谓的框架,开发人员要根据不同场景,不同研发习惯,使用相应的技术手段或者工具,来达到或者完善它的整个流程,从而达到更好的开发和管理体验

目前前端领域的Monorepo生态有一个很显著的特点就是只有库,而没有大一统的框架或者完整的构建系统来支持,目前工具形态上像是传统的Cmake那样的辅助工具,而不是像Gradle(构建语言+生态链)或Cargo(包管理器自身集成)那样统一的方式,可能未来的趋势是像nx或者turborepo这样的库要往完整的框架发展,或者包管理器自身就逐步支持相应的功能,不需要过多的三方依赖,以下介绍一下生态中的核心技术:  

包管理方案
  1. npm
    npm 在v7才支持了workspaces,属于终于能用上了但是并不好用的情况,重点是比较慢,通常无法兼容存量的monorepo应用,出来的时间太晚了,不能像yarn支持自定义nohoist以应对某些依赖被hoist到monorepo root导致的问题,也没有做到像pnpm 以link的方式共享依赖,能显著的减少磁盘占用,除了npm自带之外没有其他优点 

  2. Yarn
    最早支持 workspaces 模式的包管理器,配合 lerna 占据了大部分 monorepo,在比较长的一段时间里是 monorepo 的事实标准,缺点是 yarn 的共享包才会提升到 root node_modules 下,其他非共享库都会每个地方留一份,占用空间比较多,还有提升到 root 这一行为也会带来兼容性问题(有些包的 require 方式比较 hack)
     

    yarn berry(2 ~ 3)

    比较新的点就是 pnp 模式,pnp 模式是为了解决 node_modules 臃肿、复杂度过高的问题而来的,但是比较激进,所以很难支持现有的项目。不过 yarn 3 基本上把各个包管理的功能都支持了(nodeLinker 配置),从功能上可以算是最多,比较复杂,概念好多。吸收了部分竞争对手的优点,并开辟了许多有趣的功能特性。

  3. pnpm 

    全称是 “Performant NPM”,即高性能的 npm。

    如它在官方文档介绍的所说:“Saving disk space and boosting installation speed”,Pnpm 是一个能够提高安装速度、节省磁盘空间的包管理工具,并天然支持 Monorepo 的解决方案。除此之外,它也解决了很多令人诟病的问题,其中,比较经典的就是 Phantom dependencies(幻影依赖)。

    pnpm 的优势:

  4. 安装依赖速度快,软/硬链接结合

  5. 安装过的依赖缓存全局复用,缓存逻辑基于文件块,不同版本的依赖可以只缓存 diff

  6. 自身支持 workspaces 相关

六、主流 Monorepo 工具链

6.1 pnpm+Workspaces
  • 安装速度快,磁盘占用少: 基于硬链接和全局缓存 
  • 配置简单: 只需根目录创建pnpm-workspace.yaml

# pnpm-workspace.yaml
packages:
  - 'packages/*'
  - 'libs/*'

6.2 Yarn Workspaces 

与pnpm类似,需在根package.json中添加:

{

    "private":true,

     "workspaces":["packages/*","libs/*"]

}

常与Lerna配合,管理版本发布

6.3 Lerna 
  •  早期最流行的Monorepo管理工具 
  • 功能:管理多个包的版本,发布,依赖分析
  • 可与npm,Yarn,pnpm结合使用
6.4 Turborepo 
  • Vercel 出品,专注构建加速

  • 增量构建构建缓存、并行执行任务

  • 支持多语言、多框架

7.总结

  • Monorepo将多个子项目统一到一个仓库,实现依赖一致,模块共享,构建加速
  • 工具选型: pnpm+Work 轻量高效; Turborepo构建优化; Lerna/Changesets自动发布 
  • 实践要点:明确模块边界,配置增量构建,自动化CI/CD,合理版本策略 

如果你管理多个前端项目,组件库或者正在探索微前段和微服务,Monorepo将是你提升开发效率和团队协作的最佳实践!  

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

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

相关文章

强化学习算法系列(五):最主流的算法框架——Actor-Critic算法框架

强化学习算法 (一)动态规划方法——策略迭代算法(PI)和值迭代算法(VI) (二)Model-Free类方法——蒙特卡洛算法(MC)和时序差分算法(TD) (三)基于动作值的算法——Sarsa算法与Q-Learning算法 (四…

设计模式(结构型)-桥接模式

目录 摘要 定义 类图 角色 具体实现 优缺点 优点 缺点 使用场景 使用案例 JDBC 和桥接模式 总结 摘要 在软件开发领域,随着系统规模和复杂性的不断攀升,如何设计出具有良好扩展性、灵活性以及可维护性的软件架构成为关键挑战。桥接模式作为一…

【MySQL】MySQL数据库 —— 简单认识

目录 1. 数据库的介绍 1.1 什么是数据库 1.2 数据库和数据结构之间关系 2. 数据库分类 2.1 关系型数据库(RDBMS) 2.2 非关系型数据库 2.3 区别 一些行内名词简单解释: 3. 关于mysql 主要学什么 4. MySQL中重要的概念 4.1 概念 4…

RNN - 语言模型

语言模型 给定文本序列 x 1 , … , x T x_1, \ldots, x_T x1​,…,xT​,语言模型的目标是估计联合概率 p ( x 1 , … , x T ) p(x_1, \ldots, x_T) p(x1​,…,xT​)它的应用包括 做预训练模型(eg BERT,GPT-3)生成本文&#xff…

过拟合、归一化、正则化、鞍点

过拟合 过拟合的本质原因往往是因为模型具备方差很大的权重参数。 定义一个有4个特征的输入,特征向量为,定义一个模型,其只有4个参数,表示为。当模型过拟合时,这四个权重参数的方差会很大,可以假设为。当经过这个模型后…

【python画图】:从入门到精通绘制完美柱状图

目录 Python数据可视化:从入门到精通绘制完美柱状图一、基础篇:快速绘制柱状图1.1 使用Matplotlib基础绘制1.2 使用Pandas快速绘图 二、进阶篇:专业级柱状图定制2.1 多系列柱状图2.2 堆叠柱状图2.3 水平柱状图 三、专业参数速查表Matplotlib …

基础知识:离线安装docker、docker compose

(1)离线安装docker 确认版本:Ubuntu 18.04 LTS - bionic 确认架构:X86_64 lsb_release -a uname -a 官方指南:https://docs.docker.com/engine/install/ 选择Ubuntu,发现页面上最低是Ubuntu20.04, 不要紧

畅游Diffusion数字人(27):解读字节跳动提出主题定制视频生成技术Phantom

畅游Diffusion数字人(0):专栏文章导航 前言:主题定制视频生成,特别是zero-shot主题定制视频生成,一直是当前领域的一个难点,之前的方法效果很差。字节跳动提出了一个技术主题定制视频生成技术Phantom,效果相比于之前的技术进步非常显著。这篇博客详细解读一下这一工作。 …

《Adaptive Layer-skipping in Pre-trained LLMs》- 论文笔记

作者:Xuan Luo, Weizhi Wang, Xifeng Yan Department of Computer Science, UC Santa Barbara xuan_luoucsb.edu, weizhiwangucsb.edu, xyancs.ucsb.edu 1. 引言与动机 1.1 背景 LLM 的成功与挑战: 大型语言模型 (LLMs) 在翻译、代码生成、推理等任务上取得巨大成…

微信小程序实现table样式,自带合并行合并列

微信小程序在代码编写过程好像不支持原生table的使用&#xff0c;在开发过程中偶尔又得需要拿table来展示。 1.table效果展示 1.wxml <view class"table-container"><view class"table"><view class"table-row"><view cla…

电脑的品牌和配置

我的笔记本是2020年买的&#xff0c;之前的订单找不到了&#xff0c;就知道是联想&#xff0c;不清楚具体的配置。 本文来源&#xff1a;腾讯元宝 检查系统信息&#xff08;Windows&#xff09; 这通常是 ​​联想&#xff08;Lenovo&#xff09;​​ 的型号代码。 81XV 是联想…

Redis面试——常用命令

一、String &#xff08;1&#xff09;设置值相关命令 1.1.1 SET 功能&#xff1a;设置一个键值对&#xff0c;如果键已存在则覆盖旧值语法&#xff1a; SET key value [EX seconds] [PX milliseconds] [NX|XX]EX seconds&#xff1a;设置键的过期时间为 seconds 秒 PX milli…

Swin-Transformer-UNet改进:融合Global-Local Spatial Attention (GLSA) 模块详解

目录 1.模块概述 2.swinUNet网络 3. 完整代码 1.模块概述 Global-Local Spatial Attention (GLSA) 是一种先进的注意力机制模块,专为计算机视觉任务设计,能够同时捕捉全局上下文信息和局部细节特征。 该模块通过创新的双分支结构和自适应融合机制,显著提升了特征表示能…

ubuntu 向右拖动窗口后消失了、找不到了

这是目前单显示器的设置&#xff0c;因为实际只有1个显示器&#xff0c;之前的设置如下图所示&#xff0c;有2个显示器&#xff0c;一个主显示器&#xff0c;一个23寸的显示器 ubuntu 22.04 系统 今天在操作窗口时&#xff0c;向右一滑&#xff0c;发现这个窗口再也不显示了、找…

2025最新版微软GraphRAG 2.0.0本地部署教程:基于Ollama快速构建知识图谱

一、前言 微软近期发布了知识图谱工具 GraphRAG 2.0.0&#xff0c;支持基于本地大模型&#xff08;Ollama&#xff09;快速构建知识图谱&#xff0c;显著提升了RAG&#xff08;检索增强生成&#xff09;的效果。本文手把手教你如何从零部署&#xff0c;并附踩坑记录和性能实测…

libevent服务器附带qt界面开发(附带源码)

本章是入门章节&#xff0c;讲解如何实现一个附带界面的服务器&#xff0c;后续会完善与优化 使用qt编译libevent源码演示视频qt的一些知识 1.主要功能有登录界面 2.基于libevent实现的服务器的业务功能 使用qt编译libevent 下载这个&#xff0c;其他版本也可以 主要是github上…

智能体数据分析

数据概览&#xff1a; 展示智能体的累计对话次数、累计对话用户数、对话满意度、累计曝光次数。数据分析&#xff1a; 统计对话分析、流量分析、用户分析、行为分析数据指标&#xff0c;帮助开发者完成精准的全面分析。 ps&#xff1a;数据T1更新&#xff0c;当日12点更新前一天…

STM32(M4)入门: 概述、keil5安装与模板建立(价值 3w + 的嵌入式开发指南)

前言&#xff1a;本教程内容源自信盈达教培资料&#xff0c;价值3w&#xff0c;使用的是信盈达的405开发版&#xff0c;涵盖面很广&#xff0c;流程清晰&#xff0c;学完保证能从新手入门到小高手&#xff0c;软件方面可以无基础学习&#xff0c;硬件学习支持两种模式&#xff…

采用若依vue 快速开发系统功能模块

文章目录 运行若依项目 科室管理科室查询-后端代码实现科室查询-前端代码实现科室名称状态搜索科室删除-后端代码实现科室删除-前端代码实现科室新增-后端代码实现科室新增-前端代码实现科室修改-后端代码实现前端代码实现角色权限实现 运行若依项目 运行redis 创建数据库 修改…

HTML:表格数据展示区

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>人员信息表</title><link rel"styl…