@icebreakers/monorepo 3.1.17 → 3.2.0

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.
Files changed (193) hide show
  1. package/README.md +9 -0
  2. package/dist/cli.cjs +43 -27
  3. package/dist/cli.mjs +33 -15
  4. package/dist/index.cjs +25 -6
  5. package/dist/index.d.cts +56 -37
  6. package/dist/index.d.mts +56 -37
  7. package/dist/index.mjs +2 -2
  8. package/dist/{upgrade-BAwEMf4L.mjs → upgrade-CXX-ziub.mjs} +156 -175
  9. package/dist/{upgrade-Cw-ACn0l.cjs → upgrade-DuK9YfNz.cjs} +160 -192
  10. package/package.json +6 -11
  11. package/resources/skills/icebreakers-monorepo-cli/SKILL.md +43 -0
  12. package/resources/skills/icebreakers-monorepo-cli/references/commands.md +75 -0
  13. package/resources/skills/icebreakers-monorepo-cli/references/config.md +63 -0
  14. package/resources/skills/icebreakers-monorepo-cli/references/templates.md +21 -0
  15. package/assets/.changeset/config.json +0 -16
  16. package/assets/.dockerignore +0 -44
  17. package/assets/.editorconfig +0 -12
  18. package/assets/.gitattributes +0 -218
  19. package/assets/.github/FUNDING.yml +0 -4
  20. package/assets/.github/ISSUE_TEMPLATE/bug_report.yml +0 -71
  21. package/assets/.github/ISSUE_TEMPLATE/config.yml +0 -17
  22. package/assets/.github/workflows/ci.yml +0 -62
  23. package/assets/.github/workflows/release.yml +0 -57
  24. package/assets/.husky/commit-msg +0 -4
  25. package/assets/.husky/pre-commit +0 -4
  26. package/assets/.vscode/extensions.json +0 -6
  27. package/assets/.vscode/settings.json +0 -172
  28. package/assets/CODE_OF_CONDUCT.md +0 -128
  29. package/assets/CONTRIBUTING.md +0 -3
  30. package/assets/Dockerfile +0 -27
  31. package/assets/SECURITY.md +0 -21
  32. package/assets/commitlint.config.ts +0 -3
  33. package/assets/eslint.config.js +0 -7
  34. package/assets/gitignore +0 -38
  35. package/assets/lint-staged.config.js +0 -11
  36. package/assets/monorepo.config.ts +0 -22
  37. package/assets/netlify.toml +0 -14
  38. package/assets/package.json +0 -88
  39. package/assets/pnpm-workspace.yaml +0 -10
  40. package/assets/renovate.json +0 -28
  41. package/assets/stylelint.config.js +0 -3
  42. package/assets/tsconfig.json +0 -51
  43. package/assets/turbo.json +0 -74
  44. package/assets/vitest.config.ts +0 -123
  45. package/templates/apps/cli/bin/index.js +0 -2
  46. package/templates/apps/cli/dev/index.ts +0 -2
  47. package/templates/apps/cli/gitignore +0 -2
  48. package/templates/apps/cli/package.json +0 -35
  49. package/templates/apps/cli/src/cli.ts +0 -4
  50. package/templates/apps/cli/src/index.ts +0 -15
  51. package/templates/apps/cli/tsconfig.json +0 -7
  52. package/templates/apps/cli/tsup.config.ts +0 -13
  53. package/templates/apps/client/eslint.config.js +0 -12
  54. package/templates/apps/client/gitignore +0 -28
  55. package/templates/apps/client/index.html +0 -13
  56. package/templates/apps/client/package.json +0 -52
  57. package/templates/apps/client/public/vite.svg +0 -1
  58. package/templates/apps/client/src/App.vue +0 -11
  59. package/templates/apps/client/src/main.ts +0 -16
  60. package/templates/apps/client/src/pages/index.vue +0 -357
  61. package/templates/apps/client/src/query-keys.ts +0 -4
  62. package/templates/apps/client/src/router/index.ts +0 -13
  63. package/templates/apps/client/src/stores/i18n.ts +0 -24
  64. package/templates/apps/client/src/stores/index.ts +0 -15
  65. package/templates/apps/client/src/style.css +0 -1
  66. package/templates/apps/client/src/trpc/index.ts +0 -10
  67. package/templates/apps/client/src/vite-env.d.ts +0 -2
  68. package/templates/apps/client/tsconfig.app.json +0 -28
  69. package/templates/apps/client/tsconfig.json +0 -8
  70. package/templates/apps/client/tsconfig.node.json +0 -25
  71. package/templates/apps/client/tsconfig.worker.json +0 -11
  72. package/templates/apps/client/vite.config.ts +0 -57
  73. package/templates/apps/client/worker/app.ts +0 -24
  74. package/templates/apps/client/worker/config.ts +0 -1
  75. package/templates/apps/client/worker/fetch-entry.ts +0 -5
  76. package/templates/apps/client/worker/node-entry.ts +0 -13
  77. package/templates/apps/client/worker/trpc-router.ts +0 -24
  78. package/templates/apps/client/wrangler.jsonc +0 -24
  79. package/templates/apps/server/gitignore +0 -2
  80. package/templates/apps/server/package.json +0 -60
  81. package/templates/apps/server/src/app.ts +0 -191
  82. package/templates/apps/server/src/config.ts +0 -1
  83. package/templates/apps/server/src/fetch-entry.ts +0 -5
  84. package/templates/apps/server/src/node-entry.ts +0 -13
  85. package/templates/apps/server/test/index.test.ts +0 -14
  86. package/templates/apps/server/tsconfig.json +0 -24
  87. package/templates/apps/server/tsup.config.ts +0 -13
  88. package/templates/apps/server/vitest.config.ts +0 -15
  89. package/templates/apps/server/wrangler.jsonc +0 -18
  90. package/templates/apps/website/.vitepress/config.ts +0 -93
  91. package/templates/apps/website/.vitepress/theme/index.ts +0 -4
  92. package/templates/apps/website/.vitepress/theme/tailwind.css +0 -1
  93. package/templates/apps/website/gitignore +0 -1
  94. package/templates/apps/website/index.md +0 -127
  95. package/templates/apps/website/monorepo/index.md +0 -46
  96. package/templates/apps/website/monorepo/manage.md +0 -126
  97. package/templates/apps/website/monorepo/publish.md +0 -142
  98. package/templates/apps/website/package.json +0 -39
  99. package/templates/apps/website/public/logo.jpg +0 -0
  100. package/templates/apps/website/thinking.md +0 -88
  101. package/templates/apps/website/tools/changeset.md +0 -87
  102. package/templates/apps/website/tools/husky.md +0 -108
  103. package/templates/apps/website/tools/lint-staged.md +0 -79
  104. package/templates/apps/website/tools/pnpm.md +0 -100
  105. package/templates/apps/website/tools/renovate.md +0 -91
  106. package/templates/apps/website/tools/turborepo.md +0 -149
  107. package/templates/apps/website/why/assets/npm-dt.svg +0 -15
  108. package/templates/apps/website/why/assets/npm-ts.svg +0 -19
  109. package/templates/apps/website/why/examples/0.npm-basic-package/index.js +0 -10
  110. package/templates/apps/website/why/examples/0.npm-basic-package/package.json +0 -11
  111. package/templates/apps/website/why/examples/1.npm-basic-package/index.cjs +0 -12
  112. package/templates/apps/website/why/examples/1.npm-basic-package/index.d.ts +0 -1
  113. package/templates/apps/website/why/examples/1.npm-basic-package/index.js +0 -8
  114. package/templates/apps/website/why/examples/1.npm-basic-package/package.json +0 -19
  115. package/templates/apps/website/why/examples/2.npm-basic-package/README.md +0 -1
  116. package/templates/apps/website/why/examples/2.npm-basic-package/package-lock.json +0 -30
  117. package/templates/apps/website/why/examples/2.npm-basic-package/package.json +0 -35
  118. package/templates/apps/website/why/examples/2.npm-basic-package/rename-ext.js +0 -24
  119. package/templates/apps/website/why/examples/2.npm-basic-package/src/index.ts +0 -8
  120. package/templates/apps/website/why/examples/2.npm-basic-package/tsconfig.cjs.json +0 -8
  121. package/templates/apps/website/why/examples/2.npm-basic-package/tsconfig.esm.json +0 -7
  122. package/templates/apps/website/why/examples/2.npm-basic-package/tsconfig.json +0 -18
  123. package/templates/apps/website/why/examples/3.npm-basic-package/README.md +0 -1
  124. package/templates/apps/website/why/examples/3.npm-basic-package/build.config.ts +0 -24
  125. package/templates/apps/website/why/examples/3.npm-basic-package/package-lock.json +0 -3661
  126. package/templates/apps/website/why/examples/3.npm-basic-package/package.json +0 -32
  127. package/templates/apps/website/why/examples/3.npm-basic-package/src/index.ts +0 -8
  128. package/templates/apps/website/why/examples/3.npm-basic-package/tsconfig.json +0 -16
  129. package/templates/apps/website/why/examples/3.npm-basic-package/tsup.config.ts +0 -16
  130. package/templates/apps/website/why/examples/usage-cjs/cjs.cjs +0 -4
  131. package/templates/apps/website/why/examples/usage-cjs/esm.mjs +0 -4
  132. package/templates/apps/website/why/examples/usage-cjs/index.js +0 -12
  133. package/templates/apps/website/why/examples/usage-cjs/package-lock.json +0 -42
  134. package/templates/apps/website/why/examples/usage-cjs/package.json +0 -20
  135. package/templates/apps/website/why/examples/usage-esm/cjs.cjs +0 -4
  136. package/templates/apps/website/why/examples/usage-esm/createRequire.js +0 -7
  137. package/templates/apps/website/why/examples/usage-esm/esm.mjs +0 -4
  138. package/templates/apps/website/why/examples/usage-esm/index.js +0 -8
  139. package/templates/apps/website/why/examples/usage-esm/package-lock.json +0 -42
  140. package/templates/apps/website/why/examples/usage-esm/package.json +0 -21
  141. package/templates/apps/website/why/how-to-reuse-js-code.md +0 -250
  142. package/templates/apps/website/why/index.md +0 -1
  143. package/templates/apps/website/why/js-cjs-mjs.md +0 -99
  144. package/templates/apps/website/why/js-keywords.md +0 -132
  145. package/templates/apps/website/why/modern/bundlers.md +0 -79
  146. package/templates/apps/website/why/modern/dts.md +0 -93
  147. package/templates/apps/website/why/modern/esm-vs-cjs.md +0 -84
  148. package/templates/apps/website/why/modern/index.md +0 -55
  149. package/templates/apps/website/why/modern/package-entry-points.md +0 -128
  150. package/templates/apps/website/why/modern/typescript.md +0 -155
  151. package/templates/apps/website/why/publish-basic-npm-package.md +0 -146
  152. package/templates/apps/website/why/what-is-npm-package.md +0 -162
  153. package/templates/packages/tsdown-template/package.json +0 -47
  154. package/templates/packages/tsdown-template/src/index.ts +0 -5
  155. package/templates/packages/tsdown-template/test/index.test.ts +0 -11
  156. package/templates/packages/tsdown-template/tsconfig.json +0 -15
  157. package/templates/packages/tsdown-template/tsdown.config.ts +0 -9
  158. package/templates/packages/tsdown-template/vitest.config.ts +0 -15
  159. package/templates/packages/tsup-template/build.config.ts +0 -24
  160. package/templates/packages/tsup-template/package.json +0 -48
  161. package/templates/packages/tsup-template/src/index.ts +0 -12
  162. package/templates/packages/tsup-template/test/index.test.ts +0 -18
  163. package/templates/packages/tsup-template/tsconfig.json +0 -15
  164. package/templates/packages/tsup-template/tsup.config.ts +0 -18
  165. package/templates/packages/tsup-template/vitest.config.ts +0 -15
  166. package/templates/packages/unbuild-template/build.config.ts +0 -24
  167. package/templates/packages/unbuild-template/package.json +0 -48
  168. package/templates/packages/unbuild-template/src/index.ts +0 -9
  169. package/templates/packages/unbuild-template/src/utils.ts +0 -3
  170. package/templates/packages/unbuild-template/test/index.test.ts +0 -18
  171. package/templates/packages/unbuild-template/tsconfig.json +0 -15
  172. package/templates/packages/unbuild-template/vitest.config.ts +0 -15
  173. package/templates/packages/vue-lib-template/eslint.config.js +0 -12
  174. package/templates/packages/vue-lib-template/gitignore +0 -1
  175. package/templates/packages/vue-lib-template/index.html +0 -13
  176. package/templates/packages/vue-lib-template/lib/HelloWorld.vue +0 -21
  177. package/templates/packages/vue-lib-template/lib/index.ts +0 -3
  178. package/templates/packages/vue-lib-template/package.json +0 -61
  179. package/templates/packages/vue-lib-template/src/App.vue +0 -9
  180. package/templates/packages/vue-lib-template/src/main.ts +0 -8
  181. package/templates/packages/vue-lib-template/src/pages/index.vue +0 -7
  182. package/templates/packages/vue-lib-template/src/router/index.ts +0 -11
  183. package/templates/packages/vue-lib-template/src/style.css +0 -1
  184. package/templates/packages/vue-lib-template/src/vite-env.d.ts +0 -2
  185. package/templates/packages/vue-lib-template/test/index.test.ts +0 -13
  186. package/templates/packages/vue-lib-template/tsconfig.app.json +0 -30
  187. package/templates/packages/vue-lib-template/tsconfig.json +0 -14
  188. package/templates/packages/vue-lib-template/tsconfig.node.json +0 -25
  189. package/templates/packages/vue-lib-template/tsconfig.test.json +0 -40
  190. package/templates/packages/vue-lib-template/vite.config.ts +0 -54
  191. package/templates/packages/vue-lib-template/vite.shared.config.ts +0 -13
  192. package/templates/packages/vue-lib-template/vitest.config.ts +0 -13
  193. /package/{assets/LICENSE → LICENSE} +0 -0
@@ -1,100 +0,0 @@
1
- # pnpm
2
-
3
- ## 1. 什么是 pnpm?
4
-
5
- **pnpm** 是一种 Node.js 的包管理器(类似于 **npm** 和 **yarn**)。
6
- 名字里的 **p** 代表 **Performant(高性能)**,也有人说是 **“poor man's npm”** 😂。
7
-
8
- 它的核心特点是:
9
-
10
- - 使用 **硬链接 + 符号链接** 的方式来存储依赖。
11
- - 避免不同项目重复下载相同的依赖,大大节省磁盘空间。
12
- - 更快的安装速度。
13
-
14
- ## 2. pnpm 有什么用?
15
-
16
- ### 🚀 性能和空间优势
17
-
18
- - **npm/yarn**:每个项目都要复制一份完整的依赖到 `node_modules`。
19
- - **pnpm**:把所有依赖放在一个全局的 **内容可寻址存储(content-addressable store)**,项目里只是通过符号链接指向。
20
-
21
- 结果就是:
22
-
23
- - 相同的依赖只会存一份。
24
- - 安装速度更快,磁盘占用更小。
25
-
26
- ### 📦 严格的依赖隔离
27
-
28
- - 在 `npm` 或 `yarn` 中,`node_modules` 会形成一个“扁平化”结构,有时可能让项目误依赖到不是自己声明的包(幽灵依赖问题)。
29
- - **pnpm** 使用符号链接保持严格的依赖树,避免隐式依赖。
30
- 👉 如果你的 `package.json` 里没声明,就无法直接引用。
31
-
32
- ### 🛠 Monorepo 支持更好
33
-
34
- - `pnpm` 原生支持 monorepo 管理(工作空间 `pnpm-workspace.yaml`)。
35
- - 比如在一个仓库里有多个子包,`pnpm` 可以高效地安装和链接它们,代替 Lerna、Yarn workspaces 等工具。
36
-
37
- ### 🌍 与 npm 生态完全兼容
38
-
39
- - `pnpm` 底层还是调用 npm registry,所以和 npm 包生态 **100%兼容**。
40
- - 使用方式也和 `npm` 很接近,学习成本低。
41
-
42
- ## 3. 如何使用 pnpm?
43
-
44
- ### 安装 pnpm
45
-
46
- ```bash
47
- npm install -g pnpm
48
- ```
49
-
50
- ### 常用命令对照
51
-
52
- | 操作 | npm | pnpm |
53
- | ---------- | ------------------ | ---------------- |
54
- | 安装依赖 | `npm install` | `pnpm install` |
55
- | 安装某个包 | `npm install xx` | `pnpm add xx` |
56
- | 移除某个包 | `npm uninstall xx` | `pnpm remove xx` |
57
- | 更新依赖 | `npm update` | `pnpm update` |
58
- | 初始化项目 | `npm init` | `pnpm init` |
59
-
60
- ### Monorepo 示例
61
-
62
- 创建 `pnpm-workspace.yaml`:
63
-
64
- ```yaml
65
- packages:
66
- - 'packages/*'
67
- - 'apps/*'
68
- ```
69
-
70
- 这样 `pnpm` 会自动管理多个子项目的依赖和链接。
71
-
72
- ## 总结
73
-
74
- - **pnpm 是一种更快、更省空间、更严格的包管理器**。
75
- - 核心优势:
76
- 1. **磁盘节省**(共享依赖存储)。
77
- 2. **安装速度快**。
78
- 3. **严格依赖管理**,避免幽灵依赖。
79
- 4. **原生支持 monorepo**。
80
-
81
- ## npm vs Yarn vs pnpm 对比表
82
-
83
- | 特性 / 工具 | **npm** | **Yarn** | **pnpm** |
84
- | ----------------- | -------------------------------- | ----------------------------- | -------------------------------------- |
85
- | **生态兼容性** | ✅ 官方,100% 兼容 npm registry | ✅ 兼容 npm registry | ✅ 兼容 npm registry |
86
- | **安装速度** | ⏳ 较慢(尤其是全量安装时) | 🚀 比 npm 快,缓存优化 | ⚡ 非常快(硬链接 + 全局存储机制) |
87
- | **磁盘空间占用** | 📦 高,每个项目一份完整依赖 | 📦 中等,有缓存但依赖重复存储 | 🪶 很低,共享依赖存储,节省大量空间 |
88
- | **依赖结构** | 扁平化,可能产生“幽灵依赖” | 扁平化,依旧可能有幽灵依赖 | 严格隔离,避免幽灵依赖 |
89
- | **Monorepo 支持** | 🚫 无原生支持,需要 Lerna 等工具 | ⚠️ Yarn Workspaces 支持 | ✅ 原生支持 Workspaces,管理更高效 |
90
- | **命令兼容性** | 标准 npm 命令 | 大部分与 npm 相似 | 基本兼容,部分命令略有不同(如 `add`) |
91
- | **锁文件** | `package-lock.json` | `yarn.lock` | `pnpm-lock.yaml` |
92
- | **稳定性** | ✅ 官方维护,稳定性高 | ✅ 较成熟,社区维护 | ✅ 越来越流行,性能最佳 |
93
- | **学习成本** | ⭐⭐ 最低 | ⭐⭐ 略有差异(命令相似) | ⭐⭐⭐ 略高,但上手简单 |
94
- | **适用场景** | 小型项目,或默认环境 | 中大型项目,需要更快安装 | 中大型/Monorepo 项目,重视性能和空间 |
95
-
96
- ## 对比总结
97
-
98
- - **npm**:默认选择,生态最广,适合一般小型项目。
99
- - **Yarn**:性能较优,适合需要加快依赖安装的团队。
100
- - **pnpm**:性能最好、磁盘最省、依赖最严格,特别适合 **大型项目** 和 **monorepo** 场景。
@@ -1,91 +0,0 @@
1
- # Renovate
2
-
3
- ## 1. 什么是 Renovate?
4
-
5
- **Renovate** 是一个开源的 **依赖更新自动化工具**。
6
- 它能帮你在项目中自动检测过期的依赖,并通过 PR(Pull Request)的形式提交更新建议。
7
-
8
- 👉 简单来说:
9
-
10
- - 你不需要手动检查 `package.json`、`requirements.txt` 等文件里的依赖是否过期。
11
- - Renovate 会帮你自动发现并发起更新。
12
-
13
- ## 2. Renovate 有什么用?
14
-
15
- ### 🚀 核心价值
16
-
17
- 1. **自动化依赖升级**
18
- - 自动扫描项目依赖(支持 Node.js、Python、Java、Go、Docker 等)。
19
- - 自动检测新版本。
20
- - 自动提交 PR。
21
-
22
- 2. **降低维护成本**
23
- - 避免依赖长期不升级,导致一次性大版本升级困难。
24
- - 减少安全漏洞(及时更新安全补丁版本)。
25
-
26
- 3. **可控性强**
27
- - 你可以配置哪些依赖自动升级,哪些只做提醒。
28
- - 可以选择自动合并 **patch/minor** 版本更新,而 **major** 版本需要人工 review。
29
-
30
- 4. **支持 Monorepo**
31
- - 非常适合 monorepo 项目,能分别更新各个子包的依赖。
32
-
33
- ## 3. Renovate 怎么用?
34
-
35
- ### 方式一:作为 GitHub App
36
-
37
- 1. 打开 [Renovate GitHub App](https://github.com/apps/renovate) 并安装到你的仓库。
38
- 2. 它会自动在项目根目录生成一个配置文件 `renovate.json`(或 `renovate.json5`)。
39
- 3. Renovate 就会定期检查依赖,并创建 PR。
40
-
41
- ### 方式二:自托管
42
-
43
- 如果你不想用 GitHub App,可以自己部署 Renovate(适用于 GitLab、Bitbucket 等环境)。
44
-
45
- ```bash
46
- npx renovate
47
- ```
48
-
49
- ### 配置示例
50
-
51
- 在项目根目录添加 `renovate.json`:
52
-
53
- ```json
54
- {
55
- "extends": ["config:base"],
56
- "packageRules": [
57
- {
58
- "matchUpdateTypes": ["minor", "patch"],
59
- "automerge": true
60
- },
61
- {
62
- "matchUpdateTypes": ["major"],
63
- "automerge": false
64
- }
65
- ]
66
- }
67
- ```
68
-
69
- 解释:
70
-
71
- - 使用基础配置 `"extends": ["config:base"]`。
72
- - **minor/patch 更新** 自动合并。
73
- - **major 更新** 需要人工 review。
74
-
75
- ### 实际效果
76
-
77
- - Renovate 会创建类似这样的 PR:
78
- - `chore(deps): update dependency react from 18.2.0 to 18.3.0`
79
- - `fix(deps): update dependency lodash from 4.17.20 to 4.17.21`
80
-
81
- - 你可以选择直接合并,或者再测试后手动处理。
82
-
83
- ## 4. 总结
84
-
85
- - **Renovate = 自动依赖升级管家**。
86
- - 主要用途:**自动检测依赖更新、自动生成 PR、降低维护成本**。
87
- - 使用方式:安装 GitHub App(最简单),或者自托管运行。
88
- - 适用场景:
89
- - 需要长期维护的项目。
90
- - 对安全性敏感的项目(及时更新补丁)。
91
- - Monorepo 项目,依赖多而复杂。
@@ -1,149 +0,0 @@
1
- # Turborepo
2
-
3
- ## 1. 什么是 Turborepo?
4
-
5
- **Turborepo** 是由 **Vercel** 推出的一个 **高性能 JavaScript/TypeScript monorepo 构建系统**。
6
-
7
- 它的定位类似于 **NX / Bazel**,但更轻量、更贴合前端生态。
8
- 主要解决 **monorepo(多包/多项目仓库)** 下的构建、缓存和任务调度问题。
9
-
10
- 👉 通俗说:
11
- 在一个仓库里有多个应用和包,**Turborepo 可以帮你高效管理它们的依赖、构建、测试和发布**。
12
-
13
- ## 2. Turborepo 有什么用?
14
-
15
- ### 🚀 性能优化
16
-
17
- - **增量构建**:只重新构建改动过的包,而不是全量重建。
18
- - **智能缓存**:构建结果会缓存,本地和 CI/CD 环境可以共享(比如用远程缓存)。
19
- - **任务并行化**:最大化利用 CPU 核心,减少构建时间。
20
-
21
- ### 📦 Monorepo 管理
22
-
23
- - 可以在一个仓库中维护多个项目(比如 `apps/` 下是应用,`packages/` 下是共享组件或工具)。
24
- - 内置工作区(workspace)支持,自动管理依赖关系。
25
-
26
- ### 🛠 灵活的任务编排
27
-
28
- - 你可以定义 `build`、`test`、`lint` 等任务,Turborepo 会根据依赖关系和缓存情况决定执行策略。
29
-
30
- ### 🌍 和 Vercel 深度集成
31
-
32
- - 在 Vercel 平台上可以直接利用远程缓存,加速 CI/CD。
33
-
34
- ## 3. Turborepo 怎么用?
35
-
36
- ### 安装
37
-
38
- 全局安装(可选):
39
-
40
- ```bash
41
- npm install turbo --global
42
- ```
43
-
44
- 在项目中初始化:
45
-
46
- ```bash
47
- npx create-turbo@latest
48
- ```
49
-
50
- 这会生成一个 monorepo 结构,比如:
51
-
52
- ```
53
- .
54
- ├── apps
55
- │ ├── web # 前端应用
56
- │ └── docs # 文档应用
57
- └── packages
58
- ├── ui # UI 组件库
59
- └── config # 配置共享包
60
- ```
61
-
62
- ### 配置 `turbo.json`
63
-
64
- 核心配置文件,放在仓库根目录:
65
-
66
- ```json
67
- {
68
- "$schema": "https://turbo.build/schema.json",
69
- "pipeline": {
70
- "build": {
71
- "dependsOn": ["^build"],
72
- "outputs": ["dist/**", ".next/**"]
73
- },
74
- "lint": {},
75
- "test": {
76
- "dependsOn": ["build"]
77
- }
78
- }
79
- }
80
- ```
81
-
82
- 解释:
83
-
84
- - `build` 任务依赖于上游包的 `build`。
85
- - 缓存 `dist/**` 或 `.next/**` 输出目录。
86
- - `test` 依赖于 `build`。
87
-
88
- ### 运行命令
89
-
90
- 在根目录执行:
91
-
92
- ```bash
93
- turbo run build
94
- ```
95
-
96
- 👉 Turborepo 会:
97
-
98
- - 找到所有定义了 `build` 脚本的项目。
99
- - 根据依赖关系决定执行顺序。
100
- - 如果缓存可用,直接跳过执行,秒完成。
101
-
102
- 同理:
103
-
104
- ```bash
105
- turbo run lint
106
- turbo run test
107
- ```
108
-
109
- ### 远程缓存(可选)
110
-
111
- 如果团队协作或 CI/CD,需要共享缓存:
112
-
113
- ```bash
114
- npx turbo login
115
- npx turbo link
116
- ```
117
-
118
- 这样不同开发者、CI 都可以复用缓存,进一步加速。
119
-
120
- ## 4. 总结
121
-
122
- - **Turborepo = 高性能 monorepo 构建工具**。
123
- - **核心优势**:缓存、增量构建、并行执行、依赖感知。
124
- - **适用场景**:
125
- - 大型 monorepo(多个应用 + 包)。
126
- - 需要快速构建和测试的团队。
127
- - 想用 Vercel 部署的项目。
128
-
129
- 好的 👍,我来帮你把 **Turborepo、Lerna、Nx** 三个常见 **Monorepo 管理工具**做一个对比表。
130
-
131
- ## Turborepo vs Lerna vs Nx
132
-
133
- | 特性 / 工具 | **Turborepo** | **Lerna** | **Nx** |
134
- | ----------------- | ---------------------------------------- | ------------------------------------------- | ----------------------------------------------- |
135
- | **定位** | 高性能构建系统,专注缓存、并行和增量构建 | 最早的 JS monorepo 工具,专注版本管理和发布 | 企业级开发平台,集成构建、测试、代码生成等功能 |
136
- | **核心优势** | ⚡ 高速缓存(本地 & 远程)、并行任务执行 | 📦 包版本管理(独立/统一模式)、发布到 npm | 🛠 丰富的插件生态、代码生成器、强大的依赖图分析 |
137
- | **依赖管理** | 基于 pnpm/yarn/npm workspaces | 基于 npm/yarn workspaces | 内置强依赖图(project graph)管理 |
138
- | **构建/缓存机制** | ✅ 智能缓存 & 增量构建 | ❌ 无缓存机制 | ✅ 强大缓存 & 增量构建(类似 Bazel) |
139
- | **任务编排** | pipeline 模式(`turbo.json`) | 简单顺序执行 | 高度可配置任务调度器(依赖感知) |
140
- | **语言支持** | 主要是 JS/TS 生态 | 主要是 JS/TS 生态 | 多语言支持(JS/TS/Go/Rust/Python 等) |
141
- | **学习成本** | ⭐⭐ 低(配置简洁,前端友好) | ⭐⭐ 低(老牌工具,功能单一) | ⭐⭐⭐ 高(功能多,配置复杂) |
142
- | **社区活跃度** | 🚀 高(Vercel 维护,发展迅速) | ⚠️ 中等(已过巅峰,更多用于发布流程) | 🚀 高(企业应用广泛,社区和插件丰富) |
143
- | **适合场景** | 前端/全栈项目,追求构建速度 & CI/CD 效率 | 多包库发布(如 npm 包集合项目) | 大型企业级 monorepo,跨语言/跨团队复杂项目 |
144
-
145
- ## 对比总结
146
-
147
- - **Turborepo**:主打 **快**,缓存和增量构建体验非常好,适合前端/全栈团队。
148
- - **Lerna**:更像是 **版本管理/发包工具**,现在多和 pnpm/Yarn Workspaces 搭配,用于管理 npm 包版本和发布。
149
- - **Nx**:功能最全,适合大型团队,有可视化依赖图、代码生成、跨语言支持,但学习曲线较陡。
@@ -1,15 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!-- Generator: Adobe Illustrator 23.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
- <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4
- viewBox="0 0 256 256" style="enable-background:new 0 0 256 256;" xml:space="preserve">
5
- <style type="text/css">
6
- .st0{fill:#3178C6;}
7
- .st1{fill:#FFFFFF;}
8
- </style>
9
- <rect class="st0" width="256" height="256"/>
10
- <rect x="6" y="6" class="st1" width="244" height="244"/>
11
- <path class="st0" d="M41.8,111.5c8.6-1.6,19.9-2.5,31.8-2.5c19.7,0,32.6,4.2,42.6,13c10.8,9.4,17.6,24.5,17.6,46
12
- c0,23.4-7.3,39.5-17.3,49.5c-11,10.7-27.6,15.8-48,15.8c-12.2,0-20.8-0.9-26.7-1.8V111.5z M65.4,211.2c2,0.5,5.2,0.5,8.2,0.5
13
- c21.3,0.2,35.2-13.6,35.2-42.7c0.2-25.4-12.5-38.8-32.7-38.8c-5.2,0-8.6,0.5-10.6,1.1V211.2z"/>
14
- <path class="st0" d="M169.4,134.7h-32.2v-22.8h92.3v22.8h-32.8V232h-27.3V134.7z"/>
15
- </svg>
@@ -1,19 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!-- Generator: Adobe Illustrator 23.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
- <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4
- viewBox="0 0 256 256" style="enable-background:new 0 0 256 256;" xml:space="preserve">
5
- <style type="text/css">
6
- .st0{fill:#3178C6;}
7
- .st1{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
8
- </style>
9
- <rect class="st0" width="256" height="256"/>
10
- <path class="st1" d="M150.5,200.5v27.6c4.5,2.3,9.8,4,15.9,5.2s12.6,1.7,19.4,1.7c6.6,0,12.9-0.6,18.9-1.9s11.2-3.4,15.7-6.3
11
- c4.5-2.9,8-6.7,10.7-11.4c2.6-4.7,3.9-10.5,3.9-17.4c0-5-0.7-9.4-2.2-13.2s-3.7-7.1-6.5-10.1c-2.8-2.9-6.2-5.6-10.1-7.9
12
- c-3.9-2.3-8.4-4.5-13.3-6.6c-3.6-1.5-6.9-2.9-9.8-4.4c-2.9-1.4-5.3-2.8-7.3-4.3c-2-1.5-3.6-3-4.7-4.7s-1.6-3.5-1.6-5.6
13
- c0-1.9,0.5-3.6,1.5-5.1s2.4-2.8,4.1-3.9c1.8-1.1,4-1.9,6.6-2.5c2.6-0.6,5.5-0.9,8.6-0.9c2.3,0,4.7,0.2,7.3,0.5
14
- c2.6,0.3,5.1,0.9,7.7,1.6c2.6,0.7,5.1,1.6,7.6,2.7c2.4,1.1,4.7,2.4,6.8,3.8v-25.8c-4.2-1.6-8.8-2.8-13.8-3.6s-10.7-1.2-17.1-1.2
15
- c-6.6,0-12.8,0.7-18.7,2.1c-5.9,1.4-11,3.6-15.5,6.6c-4.5,3-8,6.8-10.6,11.4c-2.6,4.6-3.9,10.2-3.9,16.6c0,8.2,2.4,15.2,7.1,21.1
16
- c4.8,5.8,12,10.7,21.6,14.8c3.8,1.6,7.3,3.1,10.6,4.6c3.3,1.5,6.1,3,8.5,4.7s4.3,3.4,5.7,5.3s2.1,4.1,2.1,6.5c0,1.8-0.4,3.4-1.3,5
17
- c-0.9,1.5-2.2,2.8-3.9,4s-3.9,2-6.6,2.6s-5.7,0.9-9.2,0.9c-6,0-11.9-1.1-17.8-3.2C161,207.8,155.5,204.7,150.5,200.5L150.5,200.5z
18
- M104.5,131.7H140V109H41v22.7h35.3V233h28.1V131.7z"/>
19
- </svg>
@@ -1,10 +0,0 @@
1
- /* eslint-disable no-console */
2
- console.log(`load ${__filename}`)
3
-
4
- function sayHello() {
5
- console.log('hello world')
6
- }
7
-
8
- module.exports = {
9
- sayHello,
10
- }
@@ -1,11 +0,0 @@
1
- {
2
- "name": "icebreaker-npm-basic-package",
3
- "version": "1.0.0",
4
- "description": "",
5
- "author": "",
6
- "license": "ISC",
7
- "main": "index.js",
8
- "scripts": {
9
- "start": "node ."
10
- }
11
- }
@@ -1,12 +0,0 @@
1
- /* eslint-disable no-console */
2
- console.log(`cjs load ${__filename}`)
3
-
4
- function sayHello() {
5
- const message = 'hello world cjs'
6
- console.log(message)
7
- return message
8
- }
9
-
10
- module.exports = {
11
- sayHello,
12
- }
@@ -1 +0,0 @@
1
- export const sayHello: () => string
@@ -1,8 +0,0 @@
1
- /* eslint-disable no-console */
2
- console.log(`esm load ${import.meta.filename}`)
3
-
4
- export function sayHello() {
5
- const message = 'hello world esm'
6
- console.log(message)
7
- return message
8
- }
@@ -1,19 +0,0 @@
1
- {
2
- "name": "icebreaker-npm-basic-package-multiple-exports",
3
- "type": "module",
4
- "version": "0.0.0",
5
- "description": "",
6
- "author": "",
7
- "license": "ISC",
8
- "exports": {
9
- ".": {
10
- "types": "./index.d.ts",
11
- "import": "./index.js",
12
- "require": "./index.cjs"
13
- }
14
- },
15
- "scripts": {
16
- "start:cjs": "node ./index.cjs",
17
- "start:esm": "node ./index.js"
18
- }
19
- }
@@ -1 +0,0 @@
1
- https://monorepo.icebreaker.top/
@@ -1,30 +0,0 @@
1
- {
2
- "name": "icebreaker-npm-basic-package",
3
- "version": "1.0.2",
4
- "lockfileVersion": 3,
5
- "requires": true,
6
- "packages": {
7
- "": {
8
- "name": "icebreaker-npm-basic-package",
9
- "version": "1.0.2",
10
- "license": "ISC",
11
- "devDependencies": {
12
- "typescript": "^5.8.3"
13
- }
14
- },
15
- "node_modules/typescript": {
16
- "version": "5.8.3",
17
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
18
- "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
19
- "dev": true,
20
- "license": "Apache-2.0",
21
- "bin": {
22
- "tsc": "bin/tsc",
23
- "tsserver": "bin/tsserver"
24
- },
25
- "engines": {
26
- "node": ">=14.17"
27
- }
28
- }
29
- }
30
- }
@@ -1,35 +0,0 @@
1
- {
2
- "name": "icebreaker-npm-basic-package",
3
- "type": "module",
4
- "version": "1.0.5",
5
- "description": "",
6
- "author": "",
7
- "license": "ISC",
8
- "exports": {
9
- ".": {
10
- "import": {
11
- "types": "./dist/esm/index.d.ts",
12
- "default": "./dist/esm/index.js"
13
- },
14
- "require": {
15
- "types": "./dist/cjs/index.d.ts",
16
- "default": "./dist/cjs/index.cjs"
17
- }
18
- }
19
- },
20
- "files": [
21
- "dist"
22
- ],
23
- "scripts": {
24
- "build:cjs": "tsc --project tsconfig.cjs.json && node rename-ext.js dist/cjs .js .cjs && node rename-ext.js dist/cjs .js.map .cjs.map",
25
- "build:esm": "tsc --project tsconfig.esm.json",
26
- "build": "npm run build:cjs && npm run build:esm",
27
- "_debug:cjs": "node dist/cjs/index.js",
28
- "debug:esm": "node dist/esm/index.js",
29
- "debug": "tsx src/index.ts"
30
- },
31
- "devDependencies": {
32
- "tsx": "^4.19.4",
33
- "typescript": "^5.8.3"
34
- }
35
- }
@@ -1,24 +0,0 @@
1
- // rename-ext.js
2
- import fs from 'node:fs'
3
- import path from 'node:path'
4
- import process from 'node:process'
5
-
6
- const [dir, fromExt, toExt] = process.argv.slice(2)
7
-
8
- function renameFilesRecursively(currentPath) {
9
- const entries = fs.readdirSync(currentPath, { withFileTypes: true })
10
-
11
- for (const entry of entries) {
12
- const fullPath = path.join(currentPath, entry.name)
13
-
14
- if (entry.isDirectory()) {
15
- renameFilesRecursively(fullPath)
16
- }
17
- else if (entry.isFile() && entry.name.endsWith(fromExt)) {
18
- const newPath = fullPath.slice(0, -fromExt.length) + toExt
19
- fs.renameSync(fullPath, newPath)
20
- }
21
- }
22
- }
23
-
24
- renameFilesRecursively(dir)
@@ -1,8 +0,0 @@
1
- /* eslint-disable no-console */
2
- export function sayHello() {
3
- const message = 'hello world typescript'
4
- console.log(message)
5
- return message
6
- }
7
-
8
- console.log(`load package icebreaker-npm-basic-package`)
@@ -1,8 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "module": "commonjs",
5
- "moduleResolution": "node10",
6
- "outDir": "./dist/cjs"
7
- }
8
- }
@@ -1,7 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "module": "ESNext",
5
- "outDir": "./dist/esm"
6
- }
7
- }
@@ -1,18 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2020",
4
- "rootDir": "./src",
5
- "module": "ESNext",
6
- "moduleResolution": "bundler",
7
- "resolveJsonModule": true,
8
- "strict": true,
9
- "declaration": true,
10
- "declarationMap": true,
11
- "outDir": "./dist", // 具体格式的 tsconfig 会覆盖
12
- "sourceMap": true,
13
- "esModuleInterop": true,
14
- "forceConsistentCasingInFileNames": true,
15
- "skipLibCheck": true
16
- },
17
- "include": ["src"]
18
- }
@@ -1 +0,0 @@
1
- https://monorepo.icebreaker.top/
@@ -1,24 +0,0 @@
1
- import path from 'node:path'
2
- import { defineBuildConfig } from 'unbuild'
3
-
4
- export default defineBuildConfig({
5
- // entries: ['./src/index', './src/cli'],
6
- rollup: {
7
- // 内联,相当于 nodeResolve
8
- inlineDependencies: true,
9
- // cjs
10
- emitCJS: true,
11
- // 添加 cjs 注入
12
- cjsBridge: true,
13
- dts: {
14
- // https://github.com/unjs/unbuild/issues/135
15
- respectExternal: false,
16
- },
17
- },
18
- alias: {
19
- // 别名
20
- '@': path.resolve(__dirname, './src'),
21
- },
22
- // dts
23
- declaration: true,
24
- })