首页 > 其他分享 >Monorepo:一仓统天下,揭秘现代开发的高效代码管理模式

Monorepo:一仓统天下,揭秘现代开发的高效代码管理模式

时间:2024-09-19 21:51:09浏览次数:11  
标签:Monorepo 一仓统 项目 代码 揭秘 API 共享 monorepo

一句话文学:

说清楚2个问题:
1.什么是monorepo.
2.monorepo都有哪几种代码结构模式
代码王国图


很久以前,在一个名叫代码王国的地方,程序员们都在自己的小屋里忙着写代码。他们各自拥有自己的工具箱(代码库),但每次要分享工具或者联合工作时,就得穿过迷宫般的文件夹,传递代码包裹,甚至为了保证互不冲突,得手动小心翼翼地合并每个人的工具箱。这不仅浪费时间,还经常导致工具冲突。

直到有一天,智慧的工程师们发现了一个传说中的工具箱管理方式,叫做monorepo。这个神奇的方式让所有的工具箱都被放进了同一个大仓库里。每个人仍然可以独立使用自己的工具,但如果他们需要其他人帮助时,只需在这个大仓库里轻轻一点,就能共享彼此的工具,并且确保版本一致,不再有冲突。于是,代码王国的效率提升了,每个人都过上了高效快乐的开发生活。

什么是 Monorepo?

Monorepo(单一代码仓库)是一种管理代码库的方式,即将多个项目或包存放在同一个仓库中进行管理,而不是为每个项目创建独立的代码仓库。这种方式尤其适用于有多个相互依赖的项目,或需要共享代码库的场景。

Monorepo 适用的最佳场景

  1. 共享代码逻辑

    • 如果你的多个项目(例如:前端、后台、移动端)之间有大量共享的代码逻辑,使用 monorepo 能简化这些逻辑的管理。通过这种方式,代码的修改只需在一个地方进行,所有项目都能同步得到更新。
  2. 跨团队协作

    • 不同团队可能负责不同的项目,但它们之间存在紧密的依赖关系。Monorepo 可以确保团队之间的工作保持一致,减少沟通成本,提高协同效率。
  3. 版本控制和依赖管理

    • 多个项目之间的版本和依赖管理可以通过工具(如 Lerna 或 Yarn Workspaces)在 monorepo 中自动处理,不用手动去管理各个项目的版本兼容问题。

Monorepo 在大前端中的应用

在大前端项目中,monorepo 尤其适合以下几种情况

  1. PC 前端和 API 服务

    • 假如你的 PC 前端和 API 服务都依赖于同一个数据模型或工具库,将它们放在同一个 monorepo 仓库中,可以确保模型和工具库的更新是同步的,避免版本差异带来的问题。
  2. 跨平台开发(如 UniApp、React Native 等)

    • 你的团队可能同时在开发 PC Web、移动 Web、UniApp 或 React Native 项目,它们共享相同的 UI 组件库或者业务逻辑。通过 monorepo,可以让这些共享的部分一次性更新,所有平台都能使用最新的版本,保持一致性。
  3. 组件库共享

    • 如果你正在开发一个跨多个项目使用的组件库,比如前端的按钮、输入框等 UI 组件,monorepo 可以让所有项目直接从同一个地方拉取这些组件,并确保组件库的更新能快速被各个项目应用。
  4. 统一的 CI/CD 管理

    • 使用 monorepo,你可以在一个地方统一设置持续集成和持续部署(CI/CD),从而让多个项目可以同步发布版本。这对于维护复杂的前端系统尤其有用。

什么时候不适用 Monorepo?

  • 完全独立的项目: 如果你的不同项目几乎没有任何共享的依赖或代码,且开发周期完全独立,那么每个项目分开管理(即多仓库 polyrepo)可能是更好的选择,避免不必要的复杂性。

小总结

Monorepo 就像是一个巨大的工具库,适合那些需要频繁共享工具、保持版本一致的项目,尤其在大前端开发中,它可以在跨平台、多项目和跨团队的协作中大展拳脚。PC 项目、API 服务、移动端项目(如 UniApp)都可以在这种方式下受益,通过高效的代码共享和管理机制,确保项目之间的稳定性和开发体验的提升。

几种常见的代码结构设计模式

1. 平铺结构 (Flat Structure)

这是最常见的 Monorepo 结构,所有的项目都在根目录的 packages 文件夹下。每个项目可以是独立的应用、库或者服务,依赖共享时可以通过工具(如 Yarn WorkspacesLerna)进行管理。

结构示例:

/monorepo
  /packages
    /frontend
    /backend
    /shared-lib

使用工具:
通过 Yarn Workspaces 管理依赖关系。

Yarn Workspaces 配置示例: 在根目录的 package.json 中配置 workspaces

{
  "private": true,
  "workspaces": [
    "packages/*"
  ]
}

项目间共享代码:

shared-lib 中:

// packages/shared-lib/index.js
export const greet = () => console.log("Hello from shared library!");

frontend 中使用 shared-lib

// packages/frontend/index.js
import { greet } from 'shared-lib';

greet(); // 输出 "Hello from shared library!"
2. 按功能分层 (Layered Structure)

这种结构将代码按功能模块划分,每个模块可能包含多个服务和应用。例如,你可以有前端、后端和数据库等模块,每个模块再包含具体的实现项目。

结构示例:

/monorepo
  /apps
    /web-app
    /mobile-app
  /services
    /api-service
    /auth-service
  /libs
    /utils
    /ui-components

特点:

  • apps 文件夹存放最终用户使用的应用,如前端或移动端应用。
  • services 文件夹存放后端服务和 API。
  • libs 存放可被 appsservices 共享的库。

代码示例:

ui-components 中:

// libs/ui-components/Button.js
export const Button = () => `<button>Click me</button>`;

web-app 中使用组件:

// apps/web-app/index.js
import { Button } from 'ui-components';

document.body.innerHTML = Button();
3. 按项目类型分离 (Separated by Project Type)

这种模式根据项目类型(如前端、后端、数据库)进行分离,每种类型的项目放在不同的文件夹中。这种方式有助于将技术栈分开管理。

结构示例:

/monorepo
  /frontend
    /react-app
    /vue-app
  /backend
    /node-service
    /python-service
  /database
    /mysql-scripts

特点:

  • 清晰分离前后端项目。
  • 适合使用不同技术栈的团队合作。

代码示例:

node-service 中:

// backend/node-service/server.js
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hello from Node.js service!'));
app.listen(3000);

react-app 中请求 node-service

// frontend/react-app/index.js
fetch('http://localhost:3000')
  .then(response => response.text())
  .then(data => console.log(data)); // 输出 "Hello from Node.js service!"
4. 工具/核心库集中管理 (Centralized Tools/Core Libraries)

这种模式集中管理项目使用的工具和核心库,适合需要在多个项目间共享大量工具、配置或者核心逻辑的情况。例如,一个团队的前端和后端服务可能依赖同一个工具库或者配置文件。

结构示例:

/monorepo
  /core
    /config
    /tools
  /projects
    /project-a
    /project-b

代码示例:

core/config 中配置环境变量:

// core/config/env.js
export const API_URL = "https://api.example.com";

project-aproject-b 中共享配置:

// projects/project-a/index.js
import { API_URL } from 'core/config/env';
console.log(`Project A API URL: ${API_URL}`);
// projects/project-b/index.js
import { API_URL } from 'core/config/env';
console.log(`Project B API URL: ${API_URL}`);

拓展:Monorepo 常用工具

  • Yarn Workspaces:用于管理 Monorepo 的依赖,自动处理依赖之间的链接。
  • Lerna:用于管理 Monorepo 项目中的版本发布、依赖关系以及包管理。
  • Nx:一个基于构建系统的 Monorepo 管理工具,支持多个框架如 React、Angular 等。
  • Turborepo:一个专为现代前端项目打造的 Monorepo 工具,提供极致的构建速度和管理功能。

总结

Monorepo 为多个项目提供了统一的代码管理方式,适用于需要共享代码、工具和配置的场景。通过不同的代码设计模式,开发者可以根据项目的规模和需求,灵活地选择最适合的结构。无论是前端、后端、API 服务还是跨平台应用,Monorepo 都能提升协作效率并简化版本管理。

标签:Monorepo,一仓统,项目,代码,揭秘,API,共享,monorepo
From: https://blog.csdn.net/qq_14811655/article/details/142370527

相关文章

  • Python高手之路:揭秘列表的高级操作技巧
    引言列表的高级操作不仅能够提升代码的可读性和执行效率,还能让我们的程序更加灵活多变。无论是在日常开发还是数据分析任务中,掌握这些技巧都将使你如虎添翼。接下来,让我们从最基础的概念出发,一步步深入了解列表的高级操作吧!基础语法介绍首先,我们需要明确几个核心概念:列......
  • 揭秘:一行代码搞定.Net API高并发的烦恼!
            高并发下的接口请求重复提交问题在.Net开发中,我们经常遇到用户疯狂点击同一按钮,或者服务响应慢时重复发送请求,导致数据重复添加或混乱。这不仅浪费资源,更会得到错误的业务结果。如何高效解决这一普遍问题呢?        常规方案使用分布式锁 面对这问题......
  • 提升校园办公效率!智慧校园办公管理系统日程管理揭秘
    智慧校园办公管理系统中的日程管理功能旨在为师生及行政人员提供高效便捷的日程安排与管理服务。它从个人日程管理、协作日程管理以及日程监控三个方向,对智慧校园中的日程做了全面覆盖。在个人日程方面,系统允许用户轻松创建、编辑和删除自己的日程条目,并支持设置多种提醒方式,确保用......
  • 高并发流量杀手锏:揭秘秒杀系统背后的削峰技术!
    Hello,大家好,我是你们的老朋友小米!今天我们来聊聊秒杀场景下的“削峰填谷”策略,尤其是如何应对那一瞬间的流量暴增。相信大家对“秒杀”这个词已经不陌生了,特别是当你看中的商品突然降价,手指快点,商品就能秒到手!可是,背后这流量可不是闹着玩的。流量爆发时,系统如果没有处理好,很容易崩......
  • 为什么有些公司规定所有接口都用POST?揭秘背后的逻辑
    在API设计中,选择正确的HTTP方法对于确保接口的语义正确性、安全性和可维护性至关重要。你可能会遇到一些公司规定所有接口都使用POST方法,这种做法背后有着一系列的考虑。本文将探讨为什么有些公司会做出这样的规定,并分析其背后的逻辑。HTTP方法的语义在HTTP协议中,常见的方法有GET、......
  • Python高手之路:揭秘列表的高级操作技巧
    引言列表的高级操作不仅能够提升代码的可读性和执行效率,还能让我们的程序更加灵活多变。无论是在日常开发还是数据分析任务中,掌握这些技巧都将使你如虎添翼。接下来,让我们从最基础的概念出发,一步步深入了解列表的高级操作吧!基础语法介绍首先,我们需要明确几个核心概念:列表推导......
  • Canvas简历编辑器-Monorepo+Rspack工程实践
    Canvas简历编辑器-Monorepo+Rspack工程实践在之前我们围绕Canvas聊了很多代码设计层面的东西,在这里我们聊一下工程实践。在之前的文中我也提到过,因为是本着学习的态度以及对技术的好奇心来做的,所以除了一些工具类的库例如 ArcoDesign、ResizeObserve、Jest 等包之外,关于数据结......
  • 揭秘最为知名的黑客工具之一: Netcat!适用安全测试、渗透测试、黑客攻击!
    在网络安全领域,黑客工具一直备受关注。它们既可以被用于攻击,也可以用于防御。本文将为大家揭秘一款知名的黑客工具:Netcat。1、Netcat是什么?Netcat被誉为“网络的瑞士军刀”,简称为nc,是一个功能丰富的网络工具。最早是一个简单的TCP/IP工具,用于在网络上传输数据。随着时间的推......
  • 使用pnpm、monorepo 来构建 vue + 独立组件库项目
    新建项目使用pnpm进行安装pnpmcreatevue@latest在根目录下创建pnpm-workerspace.yaml文件packages:-'components/**'此处,components为根目录中的components文件夹,他是独立于我们项目的一个组件库,不包含在src内,此时目录结构如下:root-components-node_modules......
  • 如何打造动漫天堂?宇宙动漫网站设计与实现,Java SpringBoot Vue技术揭秘
    ✍✍计算机毕业编程指导师**⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java、Python、微信小程序、大数据实战项目集⚡⚡文末......