monorepo (Monolithic Repository) pnpm rush

文章目录

参考资料

  1. 为什么 pnpm+monorepo 是组件库项目的最佳实践
  2. ytb
  3. b站

monorepo 概念

在 Monorepo 模式中,所有相关的项目和组件都被存储在一个统一的代码仓库中,而不是分散在多个独立的代码仓库中,这些项目之间还可能会有依赖关系。

pnpm

  1. pnpm 支持 monorepo 模式的工作机制叫做 workspace(工作空间)。
  2. 在代码仓的根目录下存有 pnpm-workspace.yaml 文件指定哪些目录作为独立的工作空间,这个工作空间可以理解为一个子模块或者 npm 包。
  3. pnpm 通过目录下 package.json 文件的 name 字段来识别仓库内的包与模块的。

rush

参考资料

  1. 官方文档 https://rushjs.io/zh-cn/pages/maintainer/setup_new_repo/
  2. 视频 https://www.youtube.com/watch?v=m9wbfr8vfDk

创建

javascript 复制代码
npm install -g @microsoft/rush

创建一个空目录 0201_monorepo 
然后 cd 0201_monorepo 
~/my-repo$ rush init
  • rush.json Rush 内主要的配置文件
javascript 复制代码
{
  "rushVersion": "5.61.0",
  "npmVersion": "7.5.0",
  "nodeSupportedVersionRange": "[12.0.0, 16.0.0)",
  "packageManager": "npm",
  "projects": [
    {
      "packageName": "@my-org/project-1",
      "projectFolder": "projects/project-1"
    },
    {
      "packageName": "@my-org/project-2",
      "projectFolder": "projects/project-2"
    }
  ]
}
  • projects

    类型: 数组

    描述: 这是一个包含所有子项目的数组。每个项目都会有自己的 package.json 文件,并且它们都必须在 rush.json 中列出。Rush 会基于此数组来管理依赖、构建和发布等操作。
    每个项目对象需要包含以下字段:

    packageName: 项目的包名,通常是 NPM 包名(例如 @my-org/project-1)。

    projectFolder: 项目文件夹路径,相对于 Monorepo 根目录。例如,projects/project-1。

  • shouldPublish 指定项目是否应该被发布到 npm registry

  • projectFolder 项目在 monorepo 中的相对路径

  • decoupledLocalDependencies 声明项目的本地依赖(其他 monorepo 内的项目)

  • tags 为项目添加标签,用于分类和过滤

    支持通过标签筛选项目(如 rush build --to tag:live-agency )

  • subspaceName 项目所属的子空间名称

命令

rush -h

rush:这是 Rush.js 的主要命令行工具,负责管理 monorepo 中的多个项目的生命周期任务(如构建、安装依赖、发布等)。

rushx:这是一个快捷工具,帮助你执行 npm run <script> 脚本命令,它会处理 monorepo 中多个子项目的环境和依赖关系,确保命令能够正确地运行在合适的项目目录中。是一个简化工具,用于在 monorepo 中运行各个子项目的 npm 脚本。它可以让你在根目录中方便地执行不同子项目的脚本 。rushx test --to project-a # 运行 project-a 中的 test 脚本

补充知识

  • node

    • node 是执行 JavaScript 代码的引擎。它可以用来运行你的 JavaScript 文件,特别是那些在服务器端运行的代码。
    • node index.js:直接运行 index.js 文件。
  • tsc 命令

    • 全称:TypeScript Compiler(TypeScript 编译器)
    • 作用:把 TypeScript (.ts) 文件编译成 JavaScript (.js) 文件。
    • 常见用法:tsc index.ts 会把 index.ts 编译成 index.js
    • 安装方式:
      • 全局安装:npm install -g typescript
      • 项目内安装:npm install typescript --save-dev
  • npm

    • npm(Node Package Manager)是 Node.js 的官方包管理工具。
    • 主要用于
      • 安装和管理依赖包
      • 管理项目中的依赖(通过 package.json)
      • 运行在项目中定义的脚本(通过 npm run)
  • npx

    • 全称:Node Package Execute(节点包执行器)
    • 作用:npx 是 npm 5.2+ 版本开始引入的工具,它是用来执行 Node 包的命令。临时运行某个 npm 包,无需全局或本地安装,自动下载并执行没有全局安装的包
    • 场景:运行一次性工具或脚本(比如创建项目、执行某些命令行工具)。
    • 用法举例:npx create-react-app my-app
    • npx tsc通常情况下,我们会通过 npx 来运行 TypeScript 编译器,这样即使你没有全局安装 TypeScript,npx 也会自动帮你执行。
  • npx tsc

    • 使用 tsconfig.json 配置文件:如果在当前目录下有 tsconfig.json 文件,npx tsc 会按照该配置文件中的规则来编译 TypeScript 文件。tsconfig.json 文件指定了要编译的文件、输出目录、编译选项等。
    • 如果没有 tsconfig.json 文件:如果没有 tsconfig.json 文件,npx tsc 会默认编译当前目录下的所有 .ts 文件并生成对应的 .js 文件(通常会在当前目录下)。
  • npm run 为什么能启动项目?

    • 原理:npm run 会执行 package.json 里的 scripts 里定义的命令。
相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95273 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大4 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师4 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学4 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端