vue-next 源码阅读笔记: 项目结构 monorepo 风格

lerna.png

vue-next 采用的 monorepo 的风格

Monorepo(monolithic repository) 开源项目代码管理的一种方式,他解决了传统的 multirepo(one-repository-per-module)的一些痛点。能更好的管理大型的前端开源项目。

monorepo VS multirepo

multirepo 管理方式,也就是传统做法,按项目大模块拆分为多个代码库,然后在主仓库再去依赖其他子仓库,每当子模块有更新,就需要通知主模块更新。
于是就出现很多问题:

  • issue 管理混乱,经常有在 core repo 提 module 问题的。就是我有问题,但是我不知道在那个仓库提 issue
  • changelog 不好管理,每当有更新,依赖之间的修改复杂。

monorepo 管理方式:将一个项目的核心模块全部都放在一个仓库下,每个 module 单独发布,但使用与该 repo 统一的版本号(例如 React, Angular, Babel, Google)。
优点:

  • issue 和 PR 都集中到该 repo,就不会出现有问题找不到提 issue 的仓库
  • changelog 可以之间从整个仓库中梳理清楚,提炼出来
  • 模块之间的联系更清晰,调试开发更方便,不需要npm link

缺点:

  • 项目体积太大
  • 对构建工具和项目的组织能力有更高的要求

总结:
multirepo 对子仓库的管控更灵活,又可以有多样化的结构,不同的打包工具,不同的风格,依赖,版本管理,测试。但从趋势来说,google,babel,facebook 都选择 monorepo,就足以说明一切了。monorepo 有更好的工作流,更好的沟通方式,更好的版本控制,带来的效益是远远超过了缺点的。

典型的 monorepo

每个 module 都在 packages 下有自己的目录仓库, 都有自己的依赖项(package.json),能够作为独立的 npm package 发布,所有源码放在一起维护

vue
├── packages # 项目分包
│   ├── template-explorer
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   ├── index.ts
│   └── vue
│       ├── api-extractor.json
│       ├── dist
│       │   └── vue.global.js
│       ├── index.js
│       ├── package.json
│       ├── README.md
│       ├── src
│       │   └── index.ts
│       └── __tests__
│           └── index.spec.ts
├── tsconfig.json
├── .eslintrc
├── node_modules
└── package.json

lerna: monorepo 的生成管理工具

Lerna 是 monorepo 的流程工具,方便于生成,开发,发布,更新开源仓库的方案

怎么使用?

mkdir lerna-repo &&  cd  lerna-repo
npm install -D lerna
npx lerna init
tree .
# lerna-repo/
#    ├── lerna.json  # lerna 配置文件
#    ├── packages  # 模块
#    └──  package.json
npx lerna create @vue/core # 创建子模块 core
npx lerna create @vue/runtime # 创建子模块 runtime
tree .
# lerna-repo/
#     ├── lerna.json
#     ├── package.json
#     └── packages
#         ├── core
#         │   ├── lib
#         │   │   └── core.js
#         │   ├── package.json
#         │   ├── README.md
#         │   └── __tests__
#         │       └── core.test.js
#         └── runtime
#             ├── lib
#             │   └── runtime.js
#             ├── package.json
#             ├── README.md
#             └── __tests__
#                 └── runtime.test.js
npx lerna version # 打版本
npx lerna public # 一键发布

支持 yarn 的 workspaces 模式:
结合 yarn 的 workspaces 你可以更友好的管理你的项目依赖关系
yarn workspaces

分析 vue-next 的目录结构

.
├── packages # 源码目录
│   ├── compiler-core
│   ├── compiler-dom
│   ├── reactivity
│   ├── runtime-core
│   ├── runtime-dom
│   ├── runtime-test
│   ├── server-renderer
│   ├── shared
│   ├── template-explorer
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   ├── index.ts
│   │   │   └── options.ts
│   │   └── style.css
│   └── vue
│       ├── api-extractor.json
│       ├── dist
│       │   └── vue.global.js
│       ├── index.js
│       ├── package.json
│       ├── README.md
│       ├── src
│       │   └── index.ts
│       └── __tests__
│           └── index.spec.ts
├── scripts # 构建脚本目录
│   ├── bootstrap.js
│   ├── build.js
│   ├── dev.js
│   ├── utils.js
│   └── verifyCommit.js
│
├── api-extractor.json #    TypeScript 的API提取和分析工具 api-extractor 的配置文件
├── jest.config.js # JavaScript 测试框架 jest 的配置文件
├── lerna.json #    JavaScript 多 package 项目管理工具 lerna 的配置文件
├── package.json # npm 配置文件
├── rollup.config.js # JavaScript 模块打包器 rollup 的配置文件
├── README.md # 项目介绍
├── tsconfig.json #     TypeScript 配置文件
└── yarn.lock
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 前言 Lerna是一个管理多个Node模块的工具,已经被很多著名模块使用:Babel,React,Jest等 Mo...
    黑曼巴yk阅读 621评论 0 0
  • 开发中我们经常会遇到这样的情况:项目越来越大,一些通用的模块我们希望将他抽离出来作为单独的项目,以便其他项目也可以...
    feil0n9wan9阅读 19,872评论 0 24
  • 33、JS中的本地存储 把一些信息存储在当前浏览器指定域下的某一个地方(存储到物理硬盘中)1、不能跨浏览器传输:在...
    萌妹撒阅读 2,067评论 0 2
  • npm 包管理器的常用命令 测试环境为node>=8.1.3&&npm>=5.0.3 1, 安装命令 //全局安装...
    13122阅读 2,886评论 0 2
  • 原文:Google Git-Repo (Android)多仓库项目管理 前言 如果不是 Android dev 可...
    Rocko阅读 6,679评论 1 6