Monorepo设计思路(Speeches)

2023-11-09 21:59

本文主要是介绍Monorepo设计思路(Speeches),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先言

This article is a speech

结构设计

位置作用
libs/*提供基础能力、框架、sdk、组件库等
apps/*业务应用(微前端子应用、整体应用)
核心,所有基础能力为业务服务
templates/*各种模板
utils/*赋能工具
.../*更多分类…

驱动模式

基础能力 - libs

领域范围
  1. sdk:埋点 / 环境变量 / 请求方法 / 高层封装工具等等…
  2. 组件库:表单 / 联动组件 / 复杂组件等等…
  3. 框架:业务自洽性,必要的黑盒、限制,缺省配置,收敛等…
  4. 等等…
技术范围
  1. tsc 、rollup、webpack 等打包工具
  2. 框架(swc 、esbuild、mfsu 等)
  3. 组件库的依赖
  4. 等等…
如何丝滑
支持 monorepo 引用热更新

monorepo redirect 思路定位到 src 源码支持热更新

解耦、可复用
  1. 多抽离,多分层
  2. 明确上下级链路调用、依赖关系
  3. 长远发展视角设计,向前兼容
解多重依赖

有几种定位依赖的策略、做法:

事项解法
重要依赖唯一定位框架帮助重定位重要 dep 位置,保持唯一性。
react / react-dom / react-router / react-router-dom / antd 等 alias 唯一定位,防多 hooks 问题
peerDeps 定位因为依赖会先用他文件夹内的 devDeps,违背了 npm 依赖的思维。
需不需要定位依赖的 peerDeps 解掉这个问题?
dependenciesMeta 定位重定位还是 dependenciesMeta 模拟真实 npm 包的行为?
建议重定位
其他符合场景的定位还需要定位哪些?
根据场景来

核心业务 - apps

全部场景覆盖。

领域范围
  1. 微前端设计

    i. 基座

    ii. 子应用:一个 平台 / 页面 作为子应用,能随处找坑插入,独立部署,独立工作流

  2. 不光是微前端

    i. 搭配 nginx / 网关 / cdn / nodejs 等实现非微前端应用的项目

技术范围
  1. qiankun
  2. react 、react-dom 等业务依赖
  3. 自由发挥、限制…
如何丝滑
减少不必要的代码
  1. 减少微前端初始化 runtime 、入口配置代码。如 umi 中间层
  2. 减少配置。默认好用,缺省最优,收敛、抽象配置方法到 lib 里。
  3. 减少依赖。如抽取组件来解,umi all in one 的思路等
初始化容易
  1. 让新项目 create 的轻且易,生成文件思路不限,如 cli 从云拉取 template 的最新版本 npm 依赖,再做必要的替换。
  2. 考虑 微前端、非微前端、组件库 等等多场景更好

其他支持 - templates / utils / …

领域范围

用 workspace dir 来分类的原则,存放你需要分类的事物。

如:

  1. eslint-config / plugin
  2. template
  3. 适应你场景需要的提效工具…
好处

在一套协作、发布流里,互相引用方便,可以同时更新发布,版本一致性等

坏处

东西多了造成冗余

顶层 - root

领域范围
分类解法
全局脚本发布脚本、规范化脚本、依赖操作脚本等
全局配置1. eslint / prettier / editorconfig 等是否需要一统?
一统后子项目无需再配,不一统自由度更高,可设计继承
2. tsconfig.base.json 等可最大程度复用的配置,多写点继承,少 copy
3. changesets / turbo 等等…
技术范围
  1. changesets 发布流
  2. turborepo / pnpm filter 构建流
  3. zx 等常用支持工具
如何丝滑
配置收敛多少

根据场景来,比如有组件库的 tsconfig.base ,有业务项目用的 tsconfig.app,多玩继承。

必要的全局依赖

评估好哪些需要提升到全局,好处是只升级一处就可以,否则要跑到无数子项目 package.json 里去打苦工。
比如从以下视角出发价值判断:

  1. 开发依赖rimrafzxchalk 等开发用依赖提升风险小,收益高
  2. 组件库等antdicons 库、业务依赖 等业务生产依赖提升需思考,但业务项目可以自己再装自己的,需斟酌。
  3. 核心依赖reactreact-dom 等,是否需要提升?根据情况来
  4. 应用经验lodash 等库,常年不变动,放心提升
选择总 lock 还是分 lock

pnpm lock file 可以在全局,也可以在单独项目中。

位置好处坏处
全局 lock最大程度复用,节省空间,安装速度快,一次即可搞定 all 项目安装了一些不必要的依赖,每次提交影响全局 lock 文件起冲突
(好在 pnpm 处理 lock 文件的能力很强大,可以不提交 lock 找机会集中去 update)
分项目 lock互相改动依赖不影响其他人,不会起冲突依赖复用性差,每个项目都要执行 install script hook ,core-jsswc等大量库都有这个环节,速度奇慢无比
(pnpm 有选项来缓存 script 的结果,但第一次是否忍)

在本文的设计场景中,因存在先置依赖,需要直接用产物,所以只能取全局 lock ,在 install 结束后,要预构建出必要的支持产物,再启动 app 中的 project。

构建流

每个 app 的 package.json#name 都遵守统一的格式,如:@scope/project-${app-id}

在构建时根据 id 注入环境变量,执行 turbo 最优顺序构建时,按照 name 格式拼接起来作为 --scope 值即可定点完成任务。

注:如果是自动 trigger 类的 cicd ,可以通过 webhook 等 api 识别 merge 进来的文件在哪个 path 下解,比如可以把 app id 也作为文件夹名,看看 change 到了哪个文件夹就知道哪个 app 要 build 了。

发布流

注意 changesets 还是会给 private: true 的子包( 比如 app 业务项目要限制 )生成 CHANGELOG 文件的,只有加入到 changeset 配置文件的 ignore 列表里才不会有这个冗余情况。

这里可以在发布的先置阶段,用 workspace 工具扫描然后自动填到 ignore 列表里来解。

设计思考

结构合理、庞大性

trade off。

把框架放在仓库是否冗余了,去掉?
  • :运行 app 不用先构建出来框架的产物了
  • :不能即时得到最新变动 、fix 的收益
把全部 libs 分到其他 monorepo 仓库?
  • :纯业务仓库,领域清真
  • :要从 npm 下载,没有 workspace:* 的即时引用,即时修改的敏捷开发好处了,当然分离多少是个 trade off。

仓库庞大性

trade off。

支持派
  1. 都放在一起,业务领域一览无疑,不用到处跳 repo,交接、新人学习成本低,互相复用真爽
  2. 即时改动,即时热更新,可以享受到最新的变动
  3. depth=1 ,删除分支,静态资源提前上云 等减小仓库体积
  4. facebook 等厂均是单仓主干开发
反对派
  1. 冗余成本
  2. 随着发展仓库体积增大,拉取速度慢
  3. 业务领域不清晰,混杂不清真

资源分享

pnpm
  • 为什么使用pnpm可以光速建立好用的monorepo(比yarn/lerna效率高)

  • pnpm monorepo之多组件实例和peerDependencies困境回溯

  • pnpm monorepo的技术选型临界点(Critical adoption)

changesets
  • monorepo工作流基础之changesets打开与进阶(Speeches)

  • vary (自动扫描将 private: true 的包名添加到 changeset 配置文件 ignore 中的工具)

turborepo
  • 使用Turborepo进行复杂拓扑关系的monorepo最优构建

  • Turborepo的进阶构建技巧和是与非

以上。

这篇关于Monorepo设计思路(Speeches)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/378680

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

三相直流无刷电机(BLDC)控制算法实现:BLDC有感启动算法思路分析

一枚从事路径规划算法、运动控制算法、BLDC/FOC电机控制算法、工控、物联网工程师,爱吃土豆。如有需要技术交流或者需要方案帮助、需求:以下为联系方式—V 方案1:通过霍尔传感器IO中断触发换相 1.1 整体执行思路 霍尔传感器U、V、W三相通过IO+EXIT中断的方式进行霍尔传感器数据的读取。将IO口配置为上升沿+下降沿中断触发的方式。当霍尔传感器信号发生发生信号的变化就会触发中断在中断

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

开题报告中的研究方法设计:AI能帮你做什么?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 大家都准备开题报告了吗?研究方法部分是不是已经让你头疼到抓狂? 别急,这可是大多数人都会遇到的难题!尤其是研究方法设计这一块,选定性还是定量,怎么搞才能符合老师的要求? 每次到这儿,头脑一片空白。 好消息是,现在AI工具火得一塌糊涂,比如ChatGPT,居然能帮你在研究方法这块儿上出点主意。是不