@icebreakers/monorepo 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/package.json +2 -2
- package/dist/{chunk-EBATUF3S.js → chunk-SC5QBYJ5.js} +1 -1
- package/dist/cli.cjs +1 -1
- package/dist/cli.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
- package/templates/apps/cli/bin/index.js +2 -0
- package/templates/apps/cli/dev/index.ts +2 -0
- package/templates/apps/cli/package.json +32 -0
- package/templates/apps/cli/src/cli.ts +3 -0
- package/templates/apps/cli/src/index.ts +0 -0
- package/templates/apps/cli/tsconfig.json +7 -0
- package/templates/apps/cli/tsup.config.ts +13 -0
- package/templates/apps/client/eslint.config.js +12 -0
- package/templates/apps/client/index.html +13 -0
- package/templates/apps/client/package.json +44 -0
- package/templates/apps/client/public/vite.svg +1 -0
- package/templates/apps/client/src/App.vue +9 -0
- package/templates/apps/client/src/main.ts +14 -0
- package/templates/apps/client/src/pages/index.vue +67 -0
- package/templates/apps/client/src/router/index.ts +13 -0
- package/templates/apps/client/src/stores/i18n.ts +23 -0
- package/templates/apps/client/src/stores/index.ts +15 -0
- package/templates/apps/client/src/style.css +1 -0
- package/templates/apps/client/src/trpc/index.ts +10 -0
- package/templates/apps/client/src/vite-env.d.ts +2 -0
- package/templates/apps/client/tsconfig.app.json +28 -0
- package/templates/apps/client/tsconfig.json +8 -0
- package/templates/apps/client/tsconfig.node.json +25 -0
- package/templates/apps/client/tsconfig.worker.json +11 -0
- package/templates/apps/client/vite.config.ts +40 -0
- package/templates/apps/client/worker/app.ts +24 -0
- package/templates/apps/client/worker/config.ts +1 -0
- package/templates/apps/client/worker/fetch-entry.ts +5 -0
- package/templates/apps/client/worker/node-entry.ts +12 -0
- package/templates/apps/client/worker/trpc-router.ts +24 -0
- package/templates/apps/client/worker-configuration.d.ts +7688 -0
- package/templates/apps/client/wrangler.jsonc +21 -0
- package/templates/apps/server/package.json +58 -0
- package/templates/apps/server/src/app.ts +191 -0
- package/templates/apps/server/src/config.ts +1 -0
- package/templates/apps/server/src/fetch-entry.ts +5 -0
- package/templates/apps/server/src/node-entry.ts +12 -0
- package/templates/apps/server/test/index.test.ts +14 -0
- package/templates/apps/server/tsconfig.json +24 -0
- package/templates/apps/server/tsup.config.ts +13 -0
- package/templates/apps/server/vitest.config.ts +15 -0
- package/templates/apps/server/worker-configuration.d.ts +7688 -0
- package/templates/apps/server/wrangler.jsonc +18 -0
- package/templates/apps/website/.vitepress/config.ts +93 -0
- package/templates/apps/website/.vitepress/theme/index.ts +4 -0
- package/templates/apps/website/.vitepress/theme/tailwind.css +1 -0
- package/templates/apps/website/index.md +151 -0
- package/templates/apps/website/monorepo/index.md +68 -0
- package/templates/apps/website/monorepo/manage.md +60 -0
- package/templates/apps/website/monorepo/publish.md +189 -0
- package/templates/apps/website/package.json +34 -0
- package/templates/apps/website/public/logo.jpg +0 -0
- package/templates/apps/website/thinking.md +88 -0
- package/templates/apps/website/tools/changeset.md +87 -0
- package/templates/apps/website/tools/husky.md +108 -0
- package/templates/apps/website/tools/lint-staged.md +79 -0
- package/templates/apps/website/tools/pnpm.md +100 -0
- package/templates/apps/website/tools/renovate.md +91 -0
- package/templates/apps/website/tools/turborepo.md +149 -0
- package/templates/apps/website/why/assets/npm-dt.svg +15 -0
- package/templates/apps/website/why/assets/npm-ts.svg +19 -0
- package/templates/apps/website/why/examples/0.npm-basic-package/index.js +9 -0
- package/templates/apps/website/why/examples/0.npm-basic-package/package.json +11 -0
- package/templates/apps/website/why/examples/1.npm-basic-package/index.cjs +11 -0
- package/templates/apps/website/why/examples/1.npm-basic-package/index.d.ts +1 -0
- package/templates/apps/website/why/examples/1.npm-basic-package/index.js +7 -0
- package/templates/apps/website/why/examples/1.npm-basic-package/package.json +19 -0
- package/templates/apps/website/why/examples/2.npm-basic-package/README.md +1 -0
- package/templates/apps/website/why/examples/2.npm-basic-package/package-lock.json +30 -0
- package/templates/apps/website/why/examples/2.npm-basic-package/package.json +35 -0
- package/templates/apps/website/why/examples/2.npm-basic-package/rename-ext.js +24 -0
- package/templates/apps/website/why/examples/2.npm-basic-package/src/index.ts +7 -0
- package/templates/apps/website/why/examples/2.npm-basic-package/tsconfig.cjs.json +8 -0
- package/templates/apps/website/why/examples/2.npm-basic-package/tsconfig.esm.json +7 -0
- package/templates/apps/website/why/examples/2.npm-basic-package/tsconfig.json +18 -0
- package/templates/apps/website/why/examples/3.npm-basic-package/README.md +1 -0
- package/templates/apps/website/why/examples/3.npm-basic-package/build.config.ts +24 -0
- package/templates/apps/website/why/examples/3.npm-basic-package/package-lock.json +3661 -0
- package/templates/apps/website/why/examples/3.npm-basic-package/package.json +32 -0
- package/templates/apps/website/why/examples/3.npm-basic-package/src/index.ts +7 -0
- package/templates/apps/website/why/examples/3.npm-basic-package/tsconfig.json +16 -0
- package/templates/apps/website/why/examples/3.npm-basic-package/tsup.config.ts +16 -0
- package/templates/apps/website/why/examples/usage-cjs/cjs.cjs +3 -0
- package/templates/apps/website/why/examples/usage-cjs/esm.mjs +3 -0
- package/templates/apps/website/why/examples/usage-cjs/index.js +11 -0
- package/templates/apps/website/why/examples/usage-cjs/package-lock.json +42 -0
- package/templates/apps/website/why/examples/usage-cjs/package.json +20 -0
- package/templates/apps/website/why/examples/usage-esm/cjs.cjs +3 -0
- package/templates/apps/website/why/examples/usage-esm/createRequire.js +7 -0
- package/templates/apps/website/why/examples/usage-esm/esm.mjs +3 -0
- package/templates/apps/website/why/examples/usage-esm/index.js +7 -0
- package/templates/apps/website/why/examples/usage-esm/package-lock.json +42 -0
- package/templates/apps/website/why/examples/usage-esm/package.json +21 -0
- package/templates/apps/website/why/how-to-reuse-js-code.md +250 -0
- package/templates/apps/website/why/index.md +1 -0
- package/templates/apps/website/why/js-cjs-mjs.md +99 -0
- package/templates/apps/website/why/js-keywords.md +132 -0
- package/templates/apps/website/why/modern/bundlers.md +79 -0
- package/templates/apps/website/why/modern/dts.md +93 -0
- package/templates/apps/website/why/modern/esm-vs-cjs.md +84 -0
- package/templates/apps/website/why/modern/index.md +55 -0
- package/templates/apps/website/why/modern/package-entry-points.md +128 -0
- package/templates/apps/website/why/modern/typescript.md +155 -0
- package/templates/apps/website/why/publish-basic-npm-package.md +146 -0
- package/templates/apps/website/why/what-is-npm-package.md +162 -0
- package/templates/packages/tsup-template/build.config.ts +24 -0
- package/templates/packages/tsup-template/package.json +42 -0
- package/templates/packages/tsup-template/src/index.ts +12 -0
- package/templates/packages/tsup-template/test/index.test.ts +7 -0
- package/templates/packages/tsup-template/tsconfig.json +15 -0
- package/templates/packages/tsup-template/tsup.config.ts +18 -0
- package/templates/packages/tsup-template/vitest.config.ts +15 -0
- package/templates/packages/unbuild-template/build.config.ts +24 -0
- package/templates/packages/unbuild-template/package.json +42 -0
- package/templates/packages/unbuild-template/src/index.ts +9 -0
- package/templates/packages/unbuild-template/src/utils.ts +3 -0
- package/templates/packages/unbuild-template/test/index.test.ts +7 -0
- package/templates/packages/unbuild-template/tsconfig.json +15 -0
- package/templates/packages/unbuild-template/vitest.config.ts +15 -0
- package/templates/packages/vue-lib-template/eslint.config.js +12 -0
- package/templates/packages/vue-lib-template/index.html +13 -0
- package/templates/packages/vue-lib-template/lib/HelloWorld.vue +21 -0
- package/templates/packages/vue-lib-template/lib/index.ts +3 -0
- package/templates/packages/vue-lib-template/package.json +61 -0
- package/templates/packages/vue-lib-template/src/App.vue +9 -0
- package/templates/packages/vue-lib-template/src/main.ts +8 -0
- package/templates/packages/vue-lib-template/src/pages/index.vue +7 -0
- package/templates/packages/vue-lib-template/src/router/index.ts +11 -0
- package/templates/packages/vue-lib-template/src/style.css +1 -0
- package/templates/packages/vue-lib-template/src/vite-env.d.ts +2 -0
- package/templates/packages/vue-lib-template/test/index.test.ts +13 -0
- package/templates/packages/vue-lib-template/tsconfig.app.json +30 -0
- package/templates/packages/vue-lib-template/tsconfig.json +14 -0
- package/templates/packages/vue-lib-template/tsconfig.node.json +25 -0
- package/templates/packages/vue-lib-template/tsconfig.test.json +40 -0
- package/templates/packages/vue-lib-template/vite.config.ts +47 -0
- package/templates/packages/vue-lib-template/vite.shared.config.ts +13 -0
- package/templates/packages/vue-lib-template/vitest.config.ts +13 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./node_modules/wrangler/config-schema.json",
|
|
3
|
+
"name": "monorepo-service",
|
|
4
|
+
"compatibility_date": "2025-09-13",
|
|
5
|
+
"main": "./src/fetch-entry.ts",
|
|
6
|
+
"dev": {
|
|
7
|
+
"port": 8787
|
|
8
|
+
},
|
|
9
|
+
"routes": [
|
|
10
|
+
{
|
|
11
|
+
"custom_domain": true,
|
|
12
|
+
"pattern": "sls.monorepo.icebreaker.top"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"observability": {
|
|
16
|
+
"enabled": true
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import Tailwindcss from '@tailwindcss/vite'
|
|
2
|
+
import { defineConfig } from 'vitepress'
|
|
3
|
+
import { withMermaid } from 'vitepress-plugin-mermaid'
|
|
4
|
+
// https://vitepress.dev/reference/site-config
|
|
5
|
+
export default withMermaid(defineConfig({
|
|
6
|
+
outDir: '../../dist',
|
|
7
|
+
title: 'icebreaker\'s monorepo',
|
|
8
|
+
description: 'icebreaker\'s monorepo. upgrade your monorepo',
|
|
9
|
+
themeConfig: {
|
|
10
|
+
// https://vitepress.dev/reference/default-theme-config
|
|
11
|
+
nav: [
|
|
12
|
+
{ text: '使用手册', link: '/' },
|
|
13
|
+
{ text: '一些思考', link: '/thinking' },
|
|
14
|
+
],
|
|
15
|
+
socialLinks: [
|
|
16
|
+
{ icon: 'github', link: 'https://github.com/sonofmagic/monorepo-template' },
|
|
17
|
+
],
|
|
18
|
+
outline: {
|
|
19
|
+
label: '目录',
|
|
20
|
+
level: [2, 3],
|
|
21
|
+
},
|
|
22
|
+
logo: '/logo.jpg',
|
|
23
|
+
sidebar: {
|
|
24
|
+
'/': [
|
|
25
|
+
{ text: '使用手册', link: '/' },
|
|
26
|
+
{ text: '一些思考', link: 'thinking' },
|
|
27
|
+
{
|
|
28
|
+
text: 'npm 发包',
|
|
29
|
+
base: '/why/',
|
|
30
|
+
items: [
|
|
31
|
+
{ text: '如何复用 js 代码', link: '/how-to-reuse-js-code' },
|
|
32
|
+
{ text: 'JS 文件的各种后缀', link: '/js-cjs-mjs' },
|
|
33
|
+
{ text: 'CJS和ESM关键字/全局变量对比', link: '/js-keywords' },
|
|
34
|
+
{ text: '什么是 npm 包', link: '/what-is-npm-package' },
|
|
35
|
+
{ text: '如何发布 npm 包', link: '/publish-basic-npm-package' },
|
|
36
|
+
{
|
|
37
|
+
text: '改进并发布现代 npm 包',
|
|
38
|
+
link: 'index',
|
|
39
|
+
base: 'why/modern/',
|
|
40
|
+
items: [
|
|
41
|
+
{ text: 'package entry points 字段', link: '/package-entry-points' },
|
|
42
|
+
{ text: '添加 DTS', link: '/dts' },
|
|
43
|
+
{ text: 'ESM vs CJS', link: '/esm-vs-cjs' },
|
|
44
|
+
{ text: '使用 TypeScript', link: '/typescript' },
|
|
45
|
+
{ text: '使用打包器', link: '/bundlers' },
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
text: 'Monorepo',
|
|
52
|
+
base: '/monorepo/',
|
|
53
|
+
items: [
|
|
54
|
+
{ text: '为什么往 monorepo 方向演进', link: '/' },
|
|
55
|
+
{ text: '如何管理 monorepo', link: '/manage' },
|
|
56
|
+
{ text: 'monorepo 发包生成变更日志', link: '/publish' },
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
text: '相关的工具',
|
|
61
|
+
base: '/tools/',
|
|
62
|
+
items: [
|
|
63
|
+
{ text: 'pnpm', link: '/pnpm' },
|
|
64
|
+
{ text: 'turborepo', link: '/turborepo' },
|
|
65
|
+
{ text: 'changeset', link: '/changeset' },
|
|
66
|
+
{ text: 'husky', link: '/husky' },
|
|
67
|
+
{ text: 'lint-staged', link: '/lint-staged' },
|
|
68
|
+
{ text: 'renovate', link: '/renovate' },
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
editLink: {
|
|
74
|
+
pattern: 'https://github.com/sonofmagic/monorepo-template/edit/main/apps/website/:path',
|
|
75
|
+
text: '为此页提供修改建议',
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
vite: {
|
|
79
|
+
plugins: [
|
|
80
|
+
// @ts-ignore
|
|
81
|
+
Tailwindcss(),
|
|
82
|
+
],
|
|
83
|
+
// server: {
|
|
84
|
+
// hmr: {
|
|
85
|
+
// overlay: false,
|
|
86
|
+
// },
|
|
87
|
+
// },
|
|
88
|
+
},
|
|
89
|
+
mermaid: {
|
|
90
|
+
|
|
91
|
+
},
|
|
92
|
+
}),
|
|
93
|
+
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import 'tailwindcss';
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: doc
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# icebreaker's monorepo 模板
|
|
6
|
+
|
|
7
|
+
## 功能特性
|
|
8
|
+
|
|
9
|
+
- 强大的 `monorepo` 管理 (`pnpm` + `turborepo`)
|
|
10
|
+
- 单元测试框架集成 (`vitest`)
|
|
11
|
+
- 全部都是 `typescript`, 包括 `应用` `类库` 与 `cli` 工具
|
|
12
|
+
- 代码规范与质量 (`eslint` + `@icebreakers/eslint-config` + `@icebreakers/stylelint-config`)
|
|
13
|
+
- `git` 提交规范 (`husky` + `commitlint` + `lint-staged`)
|
|
14
|
+
- `pnpm` `Dockerfile` 部署模板
|
|
15
|
+
- `Github Action` 自动发布 `npm`, `github release` 包 (`changeset`)
|
|
16
|
+
- 配置文件同步升级 `npx @icebreakers/monorepo@latest`
|
|
17
|
+
|
|
18
|
+
## 如何使用?
|
|
19
|
+
|
|
20
|
+
首先,访问本模板的 [Github 地址](https://github.com/sonofmagic/monorepo-template),然后按照一下条件:
|
|
21
|
+
|
|
22
|
+
- 有 `Github` 账号的,可以登录后,点击右上角的 `Use this template` 按钮
|
|
23
|
+
|
|
24
|
+
- 没有 `Github` 账号的,可以点击 `Code` 按钮,把这个仓库的源码,或 `clone` 或下载到本地
|
|
25
|
+
|
|
26
|
+
然后在根目录 (`pnpm-workspace.yaml` 所在的位置) 执行 `pnpm i` 去安装依赖
|
|
27
|
+
|
|
28
|
+
> 要求 `Nodejs` >= 20,没有 `pnpm` 的,可以使用 `npm i -g pnpm` 来进行安装。
|
|
29
|
+
>
|
|
30
|
+
> 什么! 你不会连 [`Nodejs`](https://nodejs.org/en) 还没安装吧?
|
|
31
|
+
|
|
32
|
+
## 使用步骤
|
|
33
|
+
|
|
34
|
+
### 1. 清除不必要的代码
|
|
35
|
+
|
|
36
|
+
执行 `pnpm script:clean` 命令,可以删去大部分的初始 `repo`,只保留一个 `@icebreakers/unbuild-template` 项目作为发包打包模板。
|
|
37
|
+
|
|
38
|
+
`clean` 命令执行完成之后,再去执行 `pnpm i` 来更新 `pnpm-lock.yaml`, 并提交 `pnpm-lock.yaml` 文件来锁定 `npm` 包的版本。
|
|
39
|
+
|
|
40
|
+
### 2. 初始化文件
|
|
41
|
+
|
|
42
|
+
执行 `pnpm script:init` 命令,这个命令会批量修改你关联的配置文件,并生成一份新的 `README.md`
|
|
43
|
+
|
|
44
|
+
## 模板包介绍
|
|
45
|
+
|
|
46
|
+
默认模板被放在根目录的 `packages` 和 `apps` 这 `2` 个目录里面
|
|
47
|
+
|
|
48
|
+
### packages 目录
|
|
49
|
+
|
|
50
|
+
- `@icebreakers/tsup-template` - [`tsup`](https://www.npmjs.com/package/tsup) 打包的库模板
|
|
51
|
+
- `@icebreakers/unbuild-template` - [`unbuild`](https://www.npmjs.com/package/unbuild) 打包的库模板
|
|
52
|
+
- `@icebreakers/monorepo` - 本仓库的更新配置服务,可直接根目录执行 `npx @icebreakers/monorepo@latest` 执行远端 `cli` 命令,进行项目依赖升级同步
|
|
53
|
+
- `@icebreakers/vue-lib-template` - [`vue3`](https://vuejs.org/) 组件库模板,使用 `vite` 打包
|
|
54
|
+
|
|
55
|
+
### apps 目录
|
|
56
|
+
|
|
57
|
+
- `@icebreakers/cli` - 使用 `typescript` 编写的 `cli` 程序模板
|
|
58
|
+
- `@icebreakers/website` - 文档网站模板,使用 `vitepress` 搭建,也是 [monorepo.icebreaker.top](https://monorepo.icebreaker.top/) 的源代码
|
|
59
|
+
- `@icebreakers/server` - 使用 `hono` 搭建的服务端模板,使用 `typescript` 编写
|
|
60
|
+
- `@icebreakers/client` - `vue` 客户端模板
|
|
61
|
+
|
|
62
|
+
## 更新包的依赖
|
|
63
|
+
|
|
64
|
+
在根目录中执行 `pnpm up -rLi` 来进行包的交互式更新,下面是解释:
|
|
65
|
+
|
|
66
|
+
- `-r` : `recursive` 递归选中所有 `repo`
|
|
67
|
+
- `-L` : `latest` 更新到最新
|
|
68
|
+
- `-i` : `interactive` 交互式
|
|
69
|
+
|
|
70
|
+
## 配置自动发包
|
|
71
|
+
|
|
72
|
+
本项目使用 [changesets](https://github.com/changesets/changesets) 进行包的发布和 `changelog` 的生成
|
|
73
|
+
|
|
74
|
+
> [changesets](https://github.com/changesets/changesets) 的具体使用方式见它的文档
|
|
75
|
+
|
|
76
|
+
在使用的时候,首先你需要做一些配置:
|
|
77
|
+
|
|
78
|
+
1. 首先你需要安装 `Github App`: [changeset-bot](https://github.com/apps/changeset-bot)
|
|
79
|
+
|
|
80
|
+
2. 然后,来到你复制这个模板仓库(`repo`), 上方里的 `Settings` Tab 页面,进行 2 个操作:
|
|
81
|
+
|
|
82
|
+
### 1. 在 Github 进行 PR 和发包
|
|
83
|
+
|
|
84
|
+
选择 `Code and automation` > `Actions` > `General`
|
|
85
|
+
|
|
86
|
+
然后在右侧 `Workflow permissions` 下方选择: `Read and write permissions`
|
|
87
|
+
|
|
88
|
+
然后选中 `Allow GitHub Actions to create and approve pull requests`
|
|
89
|
+
|
|
90
|
+
最后,点击下方的保存按钮即可。
|
|
91
|
+
|
|
92
|
+
这样 `changeset` 就有权限对你进行 `PR` 和代码版本更新了!
|
|
93
|
+
|
|
94
|
+
### 2. 在 npm 发包
|
|
95
|
+
|
|
96
|
+
选择 `Security` > `Secrets and variables` > `Actions`
|
|
97
|
+
|
|
98
|
+
然后在右侧的 `Repository secrets` 设置你的 `NPM_TOKEN` 这个可以在你的 `npmjs.com` 账号中生成获取
|
|
99
|
+
|
|
100
|
+
(假如你需要单元测试代码覆盖率,你需要设置 `CODECOV_TOKEN`)
|
|
101
|
+
|
|
102
|
+
## eslint + stylelint 校验
|
|
103
|
+
|
|
104
|
+
引用到的规则参考 `https://eslint.icebreaker.top/`
|
|
105
|
+
|
|
106
|
+
[Github 地址](https://github.com/sonofmagic/eslint-config)
|
|
107
|
+
|
|
108
|
+
## 内置脚本
|
|
109
|
+
|
|
110
|
+
- `pnpm script:clean` 删去大部分的初始`repo`,只保留一个 `@icebreakers/bar` 项目作为发包打包模板
|
|
111
|
+
- `pnpm script:init` 初始化一些 `package.json` 里的字段
|
|
112
|
+
- `pnpm script:sync` 使用 `cnpm sync` 功能,把本地所有的包,同步到 [`npmmirror`](https://www.npmmirror.com/) 上,需要安装 `cnpm`
|
|
113
|
+
- `pnpm script:mirror` 使用 `cnpm` binary mirror 功能,使用国内二进制下载地址 (使用 vscode 环境变量)
|
|
114
|
+
|
|
115
|
+
## 创建新的项目
|
|
116
|
+
|
|
117
|
+
在 `monorepo` 的任意位置,打开命令行,然后执行 `npx monorepo new` 即可进入交互模式创建一个空的类库,
|
|
118
|
+
|
|
119
|
+
可通过传入 **可选**参数 `path` 进行修改, 比如 `npx monorepo new [path]`, 此时的目录就从 `foo` 变为了 `[path]`
|
|
120
|
+
|
|
121
|
+
> 命令 `new` 的别名为 `create`, 也可以使用 `npx monorepo create` 来创建新的项目
|
|
122
|
+
|
|
123
|
+
## 配置同步方式
|
|
124
|
+
|
|
125
|
+
更新 `@icebreakers/monorepo` 到最新版本,然后
|
|
126
|
+
|
|
127
|
+
在根目录下执行: `npx monorepo up`
|
|
128
|
+
|
|
129
|
+
> 假如你想直接从远端获取,可以 `npx @icebreakers/monorepo@latest up`
|
|
130
|
+
|
|
131
|
+
这个命令会把所有的文件从最新版本,对你本地进行覆盖,你可以从 `git` 暂存区把你不想要的文件剔除
|
|
132
|
+
|
|
133
|
+
### 参数
|
|
134
|
+
|
|
135
|
+
`npx monorepo up --raw`
|
|
136
|
+
|
|
137
|
+
这个命令会从全部文件中去除 `Github` 相关的文件
|
|
138
|
+
|
|
139
|
+
`npx monorepo up -i`
|
|
140
|
+
|
|
141
|
+
这个命令会进行命令行选择模式,你可以在这里对想要复制的文件进行筛选
|
|
142
|
+
|
|
143
|
+
`npx monorepo up -s`
|
|
144
|
+
|
|
145
|
+
跳过文件的新增,只保留文件的修改
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
当然你可以同时使用这多个命令
|
|
150
|
+
|
|
151
|
+
`npx monorepo up -i --raw`
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# 为什么往 monorepo 方向演进
|
|
2
|
+
|
|
3
|
+
Node.js 项目的 Git 仓库越来越倾向于采用 **Monorepo(单一代码库)** 的架构,主要原因是 **项目复杂度增加** 和 **团队协作需求提升**。
|
|
4
|
+
|
|
5
|
+
往 monorepo 方向演进的核心在于,它能够让我们,更好的做代码拆分和依赖关系的管理
|
|
6
|
+
|
|
7
|
+
## 集中管理多个模块的优势
|
|
8
|
+
|
|
9
|
+
现代 Node.js 项目通常不再是单体应用,而是由多个模块、服务、包组成,例如:
|
|
10
|
+
|
|
11
|
+
- 多个 npm 包(如 utils、core、api、cli)
|
|
12
|
+
- 多个微服务(如 auth-service、user-service)
|
|
13
|
+
- Web 与后端共存(如 frontend + backend)
|
|
14
|
+
|
|
15
|
+
**Monorepo 优点:**
|
|
16
|
+
|
|
17
|
+
| 特性 | 说明 |
|
|
18
|
+
| ---------------------- | --------------------------------------------------------- |
|
|
19
|
+
| **统一依赖管理** | 所有模块共享依赖,减少版本冲突和冗余安装 |
|
|
20
|
+
| **统一构建与发布流程** | 可以使用工具(如 TurboRepo、Nx、Lerna)管理构建/测试/发布 |
|
|
21
|
+
| **原子性提交** | 一个提交可以跨多个模块进行变更,方便追踪问题 |
|
|
22
|
+
| **简化跨模块协作** | 不需要在不同仓库之间切换和发布,仅通过本地引用即可调试 |
|
|
23
|
+
|
|
24
|
+
## 适配现代工具链的需求
|
|
25
|
+
|
|
26
|
+
Monorepo 的流行也和一些工具链的成熟有关:
|
|
27
|
+
|
|
28
|
+
- **Lerna** / **Nx** / **Turborepo**:支持模块依赖分析、并行任务执行、缓存等高级特性
|
|
29
|
+
- **PNPM workspaces** / **Yarn workspaces** / **NPM workspaces**:简化依赖和 workspace 管理
|
|
30
|
+
- **ESBuild、Vite、Babel** 等构建工具对 Monorepo 的支持逐渐增强
|
|
31
|
+
|
|
32
|
+
## 对大型团队更友好
|
|
33
|
+
|
|
34
|
+
在大型团队或企业中,Monorepo 可以带来更好的协作体验:
|
|
35
|
+
|
|
36
|
+
- 易于规范代码风格和测试策略
|
|
37
|
+
- DevOps 部署流程统一(CI/CD 更易维护)
|
|
38
|
+
- 更容易进行全局重构(如重命名公共 API)
|
|
39
|
+
|
|
40
|
+
## Facebook、Google 等大厂的示范效应
|
|
41
|
+
|
|
42
|
+
大型公司(如 Google、Facebook、Uber、Airbnb)早期就在使用 Monorepo,逐渐被开源社区效仿:
|
|
43
|
+
|
|
44
|
+
- React、Angular、NestJS 等大型 Node/TS 项目都采用 Monorepo
|
|
45
|
+
- 社区也贡献了很多相关最佳实践和工具
|
|
46
|
+
|
|
47
|
+
## 相比 Polyrepo(多个仓库)的问题
|
|
48
|
+
|
|
49
|
+
| Polyrepo 问题 | 描述 |
|
|
50
|
+
| ---------------- | ------------------------------------ |
|
|
51
|
+
| 版本依赖管理复杂 | 多个仓库依赖版本不一致会导致兼容问题 |
|
|
52
|
+
| 跨项目协作成本高 | 修改一个接口需改多个仓库并同步发布 |
|
|
53
|
+
| 重复构建和发布 | 每个项目都要重复设置 CI/CD 流程 |
|
|
54
|
+
| 脚本和工具重复 | 每个仓库需要重复维护脚本、配置等 |
|
|
55
|
+
|
|
56
|
+
## 非常适合巨石项目拆分
|
|
57
|
+
|
|
58
|
+
比如一个巨石项目,里面有 `500` 个直接依赖,可以通过把它改造成一个 `monorepo` 的方式,逐步的把依赖和逻辑拆出来,让每个包保持独立的最小化的依赖。
|
|
59
|
+
|
|
60
|
+
拆分之后,这时候可能父项目最终有 `100` 个直接共享依赖,拆分出 `20` 个子包,每个包里只有 `20` 个依赖了, 这样依赖的可维护性就好很多。
|
|
61
|
+
|
|
62
|
+
同时这样也方便进行多模块共同开发,和进行单元测试。
|
|
63
|
+
|
|
64
|
+
假如做个比喻的话,这就像,你把原先拖成一块的项目,拆分成一个一个积木,然后把积木组合起来,这个项目就能跑了。而且其中的任意模块,都是可以单独替换和发包共享的。
|
|
65
|
+
|
|
66
|
+
## 总结
|
|
67
|
+
|
|
68
|
+
在项目小的时候,Polyrepo 管理简单清晰,但随着模块增多、团队扩大,**Monorepo 提供了更高效、可维护、标准化的开发体验**,这是它越来越被 Node.js 项目采用的核心原因。
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# 如何管理 monorepo
|
|
2
|
+
|
|
3
|
+
我使用 `pnpm + turborepo` 来管理 `monorepo` 相较于传统做法(比如多个独立仓库或用 Yarn/NPM 管理 monorepo)有 **明显优势**,从性能、可维护性、协作效率到发布流程都有提升。下面是详细解释:
|
|
4
|
+
|
|
5
|
+
## 核心优势一览
|
|
6
|
+
|
|
7
|
+
### 1. **极快的依赖安装(pnpm 的硬链接 + 内容寻址)**
|
|
8
|
+
|
|
9
|
+
- `pnpm` 使用内容寻址存储,多个项目间共享 node_modules 中的依赖,不重复安装。
|
|
10
|
+
- 安装依赖速度远快于 `npm` / `yarn`,节省磁盘空间。
|
|
11
|
+
|
|
12
|
+
### 2. **智能任务调度与缓存(turborepo)**
|
|
13
|
+
|
|
14
|
+
- `turbo` 会缓存上一次的构建输出,**不变的包不会重复构建**,节省大量构建时间。
|
|
15
|
+
- 类似于 Bazel、Nx 等构建系统,但配置简单,专注于 JavaScript/TypeScript 项目。
|
|
16
|
+
|
|
17
|
+
### 3. **明确的依赖关系管理**
|
|
18
|
+
|
|
19
|
+
- `pnpm` 强制使用严格的模块隔离,不允许“幽灵依赖”(hoist 下来的间接依赖)。
|
|
20
|
+
- 每个包必须显式声明自己的依赖,减少运行时错误。
|
|
21
|
+
|
|
22
|
+
### 4. **组件复用 + 原子包发布**
|
|
23
|
+
|
|
24
|
+
- 各子包可单独开发、测试、构建,也可以发布到 NPM。
|
|
25
|
+
- 例如一个 UI 组件库(`@my/ui`)被多个应用复用,改动只需维护一个位置。
|
|
26
|
+
|
|
27
|
+
### 5. **团队协作更清晰**
|
|
28
|
+
|
|
29
|
+
- 多人负责不同 app/package 时,统一 workspace 管理避免重复工作。
|
|
30
|
+
- turbo 的 `--filter` 功能可以只运行特定 app/package 的任务,提高并行效率。
|
|
31
|
+
|
|
32
|
+
### 6. **支持渐进迁移/扩展**
|
|
33
|
+
|
|
34
|
+
- 可以从一个项目开始,逐步迁移其他项目到 monorepo。
|
|
35
|
+
- 不强制结构,灵活适配大型或微服务项目。
|
|
36
|
+
|
|
37
|
+
## 示例:构建时间对比(真实项目)
|
|
38
|
+
|
|
39
|
+
| 构建系统 | 全量构建时间 | 增量构建时间 | 备注 |
|
|
40
|
+
| ---------------------- | ------------ | ------------ | ----------------------------------- |
|
|
41
|
+
| 传统脚本 | 120s | 120s | 无缓存,每次都重建所有包 |
|
|
42
|
+
| `turbo` | 120s | **5s** | 使用缓存和依赖图优化任务调度 |
|
|
43
|
+
| `turbo + remote cache` | 120s | **2s** | 跨机器缓存(如 Vercel/Turbo Cloud) |
|
|
44
|
+
|
|
45
|
+
## 如果不用这套,你可能会遇到的问题
|
|
46
|
+
|
|
47
|
+
| 问题 | 结果 |
|
|
48
|
+
| ---------------------- | ------------------------------------------------ |
|
|
49
|
+
| 重复安装多个项目的依赖 | 时间长、磁盘大、CI 卡慢 |
|
|
50
|
+
| 每次都构建整个仓库 | 效率低,修改一个 utils 都重新构建全部 |
|
|
51
|
+
| 依赖混乱、版本冲突 | 运行时报错难调试,容易出现「在我机器上可以」问题 |
|
|
52
|
+
| 多仓库协作不方便 | 开发者切来切去,难以同步更新和版本发布 |
|
|
53
|
+
|
|
54
|
+
## 总结
|
|
55
|
+
|
|
56
|
+
**pnpm + turborepo 是现代 JS 项目的最佳实践之一,适用于微服务、组件库、多平台应用等复杂项目。**
|
|
57
|
+
|
|
58
|
+
> 如果你关注的是:**构建速度、复用率、协作效率** —— 这套方案绝对是值得投入的。
|
|
59
|
+
|
|
60
|
+
当然,这只是我自己的最佳实践,你也可以尝试其他的方案
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# monorepo 发包生成变更日志
|
|
2
|
+
|
|
3
|
+
在 `monorepo` 中发包和生成变更日志是一项关键的工作。推荐的现代做法是使用 [`changesets`](https://github.com/changesets/changesets) 专为 **monorepo 包发布** 设计的开源工具。
|
|
4
|
+
|
|
5
|
+
## changesets 是什么?
|
|
6
|
+
|
|
7
|
+
`changesets` 是一款用于:
|
|
8
|
+
|
|
9
|
+
- 记录每个变更的目的和版本影响
|
|
10
|
+
- 自动生成变更日志(`CHANGELOG.md`)
|
|
11
|
+
- 自动决定要发布哪些包,以及使用什么语义版本(`major` /`minor`/ `patch`)
|
|
12
|
+
- 与 `CI/CD` 集成实现自动发布(支持 `GitHub Actions`)
|
|
13
|
+
|
|
14
|
+
## 使用 changesets 的优势
|
|
15
|
+
|
|
16
|
+
| 优势 | 说明 |
|
|
17
|
+
| --------------- | ------------------------------------------------------------- |
|
|
18
|
+
| ✅ 精细控制 | 每次变更单独写一个 changeset 文件,明确说明影响的包和变更类型 |
|
|
19
|
+
| 📦 支持多包 | 自动识别哪些包发生了变更,以及它们的依赖是否也需要发布 |
|
|
20
|
+
| 🧾 自动生成日志 | 基于 changeset 文件生成结构清晰的 CHANGELOG.md |
|
|
21
|
+
| 🔄 自动升级版本 | 遵循 Semver 规范,自动处理包之间的依赖升级 |
|
|
22
|
+
| 🤖 CI/CD 集成 | 支持 GitHub Actions 自动创建版本 PR 并发布到 NPM |
|
|
23
|
+
|
|
24
|
+
## 如何在 monorepo 中使用 changesets(pnpm + turbo)
|
|
25
|
+
|
|
26
|
+
### 1. 安装依赖
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pnpm add -D @changesets/cli
|
|
30
|
+
pnpm changeset init
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
会生成:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
.changeset/ # 存放每次变更的 YAML 文件
|
|
37
|
+
└── cool-change.md
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
### 2. 编写 changeset
|
|
43
|
+
|
|
44
|
+
运行以下命令为一次变更创建记录:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
pnpm changeset
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
交互式输入:
|
|
51
|
+
|
|
52
|
+
- 选择受影响的包(多个)
|
|
53
|
+
- 选择版本变更类型(patch / minor / major)
|
|
54
|
+
- 输入 changelog 信息
|
|
55
|
+
|
|
56
|
+
结果示例(`.changeset/awesome-change.md`):
|
|
57
|
+
|
|
58
|
+
```md
|
|
59
|
+
---
|
|
60
|
+
"@my/utils": minor
|
|
61
|
+
"@my/ui": patch
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
feat: 新增时间工具;
|
|
65
|
+
fix: 修复 UI 按钮颜色。
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
### 3. 版本号升级 + changelog 生成
|
|
71
|
+
|
|
72
|
+
在合并变更后,运行:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
pnpm changeset version
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
它会:
|
|
79
|
+
|
|
80
|
+
- 更新每个包的 `package.json` 版本号
|
|
81
|
+
- 修改依赖包引用版本
|
|
82
|
+
- 更新每个包的 `CHANGELOG.md`
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
### 4. 发布到 NPM
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
pnpm changeset publish
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
自动:
|
|
93
|
+
|
|
94
|
+
- 发布已变更的包
|
|
95
|
+
- 忽略未变更的包
|
|
96
|
+
- 使用 monorepo 中正确的依赖版本
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
### 5. 配合 GitHub Actions 自动发布(可选)
|
|
101
|
+
|
|
102
|
+
建议使用官方提供的 `create-release` GitHub Action:
|
|
103
|
+
|
|
104
|
+
```yaml
|
|
105
|
+
name: Release
|
|
106
|
+
|
|
107
|
+
on:
|
|
108
|
+
push:
|
|
109
|
+
branches:
|
|
110
|
+
- main
|
|
111
|
+
workflow_dispatch:
|
|
112
|
+
|
|
113
|
+
concurrency: ${{ github.workflow }}-${{ github.ref }}
|
|
114
|
+
env:
|
|
115
|
+
HUSKY: 0
|
|
116
|
+
|
|
117
|
+
permissions:
|
|
118
|
+
contents: write # to create release (changesets/action)
|
|
119
|
+
issues: write # to post issue comments (changesets/action)
|
|
120
|
+
pull-requests: write # to create pull request (changesets/action)
|
|
121
|
+
id-token: write # to use OpenID Connect token for provenance (changesets/action)
|
|
122
|
+
|
|
123
|
+
jobs:
|
|
124
|
+
release:
|
|
125
|
+
name: Release
|
|
126
|
+
runs-on: ubuntu-latest
|
|
127
|
+
steps:
|
|
128
|
+
- name: Checkout Repo
|
|
129
|
+
uses: actions/checkout@v4
|
|
130
|
+
|
|
131
|
+
- uses: pnpm/action-setup@v4
|
|
132
|
+
|
|
133
|
+
- name: Setup Node.js environment
|
|
134
|
+
uses: actions/setup-node@v4
|
|
135
|
+
with:
|
|
136
|
+
node-version: 22
|
|
137
|
+
cache: pnpm
|
|
138
|
+
|
|
139
|
+
- name: Install Dependencies
|
|
140
|
+
run: pnpm i
|
|
141
|
+
|
|
142
|
+
- name: Create Release Pull Request or Publish to npm
|
|
143
|
+
id: changesets
|
|
144
|
+
uses: changesets/action@v1
|
|
145
|
+
with:
|
|
146
|
+
# This expects you to have a script called release which does a build for your packages and calls changeset publish
|
|
147
|
+
publish: pnpm publish-packages
|
|
148
|
+
env:
|
|
149
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
150
|
+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
151
|
+
npm_config_registry: https://registry.npmjs.org
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 与其他方案对比(如 lerna、手动脚本)
|
|
157
|
+
|
|
158
|
+
| 功能 | `changesets` | `lerna` | 手动脚本 |
|
|
159
|
+
| ------------- | -------------- | ------------- | -------- |
|
|
160
|
+
| 多包发布支持 | ✅ | ✅ | ❌ |
|
|
161
|
+
| 自动生成日志 | ✅ | ❌/部分支持 | ❌ |
|
|
162
|
+
| 精确控制变更 | ✅(逐条记录) | ❌ | ❌ |
|
|
163
|
+
| 现代化支持 | ✅(活跃维护) | 停滞/社区维护 | ❌ |
|
|
164
|
+
| 与 CI/CD 集成 | ✅ | 部分复杂 | ❌ |
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 示例场景
|
|
169
|
+
|
|
170
|
+
比如你在 monorepo 中改了 `@my/utils` 和 `@my/ui`,你可以:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
pnpm changeset
|
|
174
|
+
# 然后写明:utils 为 minor,ui 为 patch
|
|
175
|
+
|
|
176
|
+
pnpm changeset version
|
|
177
|
+
# 自动升级 utils 到 1.3.0,ui 到 0.1.2,并更新 changelog
|
|
178
|
+
|
|
179
|
+
pnpm changeset publish
|
|
180
|
+
# 发布到 npm
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## 总结
|
|
184
|
+
|
|
185
|
+
使用 `changesets`:
|
|
186
|
+
|
|
187
|
+
- 是 monorepo 最推荐的发包 + changelog 方案
|
|
188
|
+
- 搭配 `pnpm + turbo` 非常自然
|
|
189
|
+
- 支持团队协作、自动化流程、语义化版本管理
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@icebreakers/website",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"description": "https://monorepo.icebreaker.top source code",
|
|
6
|
+
"author": "ice breaker <1324318532@qq.com>",
|
|
7
|
+
"homepage": "https://monorepo.icebreaker.top",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/sonofmagic/monorepo-template.git",
|
|
11
|
+
"directory": "apps/website"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/sonofmagic/monorepo-template/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"dev": "vitepress dev",
|
|
19
|
+
"build": "vitepress build",
|
|
20
|
+
"preview": "vitepress preview"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@braintree/sanitize-url": "^7.1.1",
|
|
24
|
+
"@tailwindcss/vite": "^4.1.13",
|
|
25
|
+
"cytoscape": "^3.33.1",
|
|
26
|
+
"cytoscape-cose-bilkent": "^4.1.0",
|
|
27
|
+
"dayjs": "^1.11.18",
|
|
28
|
+
"debug": "^4.4.3",
|
|
29
|
+
"mermaid": "^11.12.0",
|
|
30
|
+
"tailwindcss": "^4.1.13",
|
|
31
|
+
"vitepress": "^1.6.4",
|
|
32
|
+
"vitepress-plugin-mermaid": "^2.0.17"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
Binary file
|