@icebreakers/monorepo-templates 0.0.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.
- package/README.md +9 -0
- package/assets/.changeset/config.json +16 -0
- package/assets/.changeset/create-icebreaker-interactive.md +5 -0
- package/assets/.changeset/monorepo-templates-package.md +5 -0
- package/assets/.changeset/skills-sync-resources.md +5 -0
- package/assets/.dockerignore +44 -0
- package/assets/.editorconfig +12 -0
- package/assets/.gitattributes +218 -0
- package/assets/.github/FUNDING.yml +4 -0
- package/assets/.github/ISSUE_TEMPLATE/bug_report.yml +71 -0
- package/assets/.github/ISSUE_TEMPLATE/config.yml +17 -0
- package/assets/.github/workflows/ci.yml +62 -0
- package/assets/.github/workflows/release.yml +57 -0
- package/assets/.husky/commit-msg +4 -0
- package/assets/.husky/pre-commit +4 -0
- package/assets/.vscode/extensions.json +6 -0
- package/assets/.vscode/settings.json +172 -0
- package/assets/CODE_OF_CONDUCT.md +128 -0
- package/assets/CONTRIBUTING.md +3 -0
- package/assets/Dockerfile +27 -0
- package/assets/LICENSE +21 -0
- package/assets/SECURITY.md +21 -0
- package/assets/commitlint.config.ts +3 -0
- package/assets/eslint.config.js +7 -0
- package/assets/gitignore +38 -0
- package/assets/lint-staged.config.js +11 -0
- package/assets/monorepo.config.ts +22 -0
- package/assets/netlify.toml +14 -0
- package/assets/package.json +88 -0
- package/assets/pnpm-workspace.yaml +11 -0
- package/assets/renovate.json +28 -0
- package/assets/stylelint.config.js +3 -0
- package/assets/tsconfig.json +51 -0
- package/assets/turbo.json +74 -0
- package/assets/vitest.config.ts +123 -0
- package/assets-data.mjs +45 -0
- package/dist/index.d.mts +37 -0
- package/dist/index.mjs +287 -0
- package/package.json +51 -0
- package/skeleton/.editorconfig +12 -0
- package/skeleton/LICENSE +21 -0
- package/skeleton/commitlint.config.ts +3 -0
- package/skeleton/eslint.config.js +7 -0
- package/skeleton/gitignore +38 -0
- package/skeleton/lint-staged.config.js +11 -0
- package/skeleton/package.json +88 -0
- package/skeleton/pnpm-workspace.yaml +11 -0
- package/skeleton/renovate.json +28 -0
- package/skeleton/stylelint.config.js +3 -0
- package/skeleton/tsconfig.json +51 -0
- package/skeleton/turbo.json +74 -0
- package/skeleton/vitest.config.ts +123 -0
- package/template-data.mjs +10 -0
- package/templates/cli/bin/index.js +2 -0
- package/templates/cli/dev/index.ts +2 -0
- package/templates/cli/gitignore +2 -0
- package/templates/cli/package.json +35 -0
- package/templates/cli/src/cli.ts +4 -0
- package/templates/cli/src/index.ts +15 -0
- package/templates/cli/tsconfig.json +7 -0
- package/templates/cli/tsup.config.ts +13 -0
- package/templates/client/eslint.config.js +12 -0
- package/templates/client/gitignore +28 -0
- package/templates/client/index.html +13 -0
- package/templates/client/package.json +52 -0
- package/templates/client/public/vite.svg +1 -0
- package/templates/client/src/App.vue +11 -0
- package/templates/client/src/main.ts +16 -0
- package/templates/client/src/pages/index.vue +357 -0
- package/templates/client/src/query-keys.ts +4 -0
- package/templates/client/src/router/index.ts +13 -0
- package/templates/client/src/stores/i18n.ts +24 -0
- package/templates/client/src/stores/index.ts +15 -0
- package/templates/client/src/style.css +1 -0
- package/templates/client/src/trpc/index.ts +10 -0
- package/templates/client/src/vite-env.d.ts +2 -0
- package/templates/client/tsconfig.app.json +28 -0
- package/templates/client/tsconfig.json +8 -0
- package/templates/client/tsconfig.node.json +25 -0
- package/templates/client/tsconfig.worker.json +11 -0
- package/templates/client/vite.config.ts +57 -0
- package/templates/client/worker/app.ts +24 -0
- package/templates/client/worker/config.ts +1 -0
- package/templates/client/worker/fetch-entry.ts +5 -0
- package/templates/client/worker/node-entry.ts +13 -0
- package/templates/client/worker/trpc-router.ts +24 -0
- package/templates/client/wrangler.jsonc +24 -0
- package/templates/server/gitignore +2 -0
- package/templates/server/package.json +60 -0
- package/templates/server/src/app.ts +191 -0
- package/templates/server/src/config.ts +1 -0
- package/templates/server/src/fetch-entry.ts +5 -0
- package/templates/server/src/node-entry.ts +13 -0
- package/templates/server/test/index.test.ts +14 -0
- package/templates/server/tsconfig.json +24 -0
- package/templates/server/tsup.config.ts +13 -0
- package/templates/server/vitest.config.ts +15 -0
- package/templates/server/wrangler.jsonc +18 -0
- package/templates/tsdown/package.json +47 -0
- package/templates/tsdown/src/index.ts +5 -0
- package/templates/tsdown/test/index.test.ts +11 -0
- package/templates/tsdown/tsconfig.json +15 -0
- package/templates/tsdown/tsdown.config.ts +9 -0
- package/templates/tsdown/vitest.config.ts +15 -0
- package/templates/tsup/build.config.ts +24 -0
- package/templates/tsup/package.json +48 -0
- package/templates/tsup/src/index.ts +12 -0
- package/templates/tsup/test/index.test.ts +18 -0
- package/templates/tsup/tsconfig.json +15 -0
- package/templates/tsup/tsup.config.ts +18 -0
- package/templates/tsup/vitest.config.ts +15 -0
- package/templates/unbuild/build.config.ts +24 -0
- package/templates/unbuild/package.json +48 -0
- package/templates/unbuild/src/index.ts +9 -0
- package/templates/unbuild/src/utils.ts +3 -0
- package/templates/unbuild/test/index.test.ts +18 -0
- package/templates/unbuild/tsconfig.json +15 -0
- package/templates/unbuild/vitest.config.ts +15 -0
- package/templates/vitepress/.vitepress/config.ts +93 -0
- package/templates/vitepress/.vitepress/theme/index.ts +4 -0
- package/templates/vitepress/.vitepress/theme/tailwind.css +1 -0
- package/templates/vitepress/gitignore +1 -0
- package/templates/vitepress/index.md +127 -0
- package/templates/vitepress/monorepo/index.md +46 -0
- package/templates/vitepress/monorepo/manage.md +129 -0
- package/templates/vitepress/monorepo/publish.md +142 -0
- package/templates/vitepress/package.json +39 -0
- package/templates/vitepress/public/logo.jpg +0 -0
- package/templates/vitepress/thinking.md +88 -0
- package/templates/vitepress/tools/changeset.md +87 -0
- package/templates/vitepress/tools/husky.md +108 -0
- package/templates/vitepress/tools/lint-staged.md +79 -0
- package/templates/vitepress/tools/pnpm.md +101 -0
- package/templates/vitepress/tools/renovate.md +91 -0
- package/templates/vitepress/tools/turborepo.md +149 -0
- package/templates/vitepress/why/assets/npm-dt.svg +15 -0
- package/templates/vitepress/why/assets/npm-ts.svg +19 -0
- package/templates/vitepress/why/examples/0.npm-basic-package/index.js +10 -0
- package/templates/vitepress/why/examples/0.npm-basic-package/package.json +11 -0
- package/templates/vitepress/why/examples/1.npm-basic-package/index.cjs +12 -0
- package/templates/vitepress/why/examples/1.npm-basic-package/index.d.ts +1 -0
- package/templates/vitepress/why/examples/1.npm-basic-package/index.js +8 -0
- package/templates/vitepress/why/examples/1.npm-basic-package/package.json +19 -0
- package/templates/vitepress/why/examples/2.npm-basic-package/README.md +1 -0
- package/templates/vitepress/why/examples/2.npm-basic-package/package-lock.json +30 -0
- package/templates/vitepress/why/examples/2.npm-basic-package/package.json +35 -0
- package/templates/vitepress/why/examples/2.npm-basic-package/rename-ext.js +24 -0
- package/templates/vitepress/why/examples/2.npm-basic-package/src/index.ts +8 -0
- package/templates/vitepress/why/examples/2.npm-basic-package/tsconfig.cjs.json +8 -0
- package/templates/vitepress/why/examples/2.npm-basic-package/tsconfig.esm.json +7 -0
- package/templates/vitepress/why/examples/2.npm-basic-package/tsconfig.json +18 -0
- package/templates/vitepress/why/examples/3.npm-basic-package/README.md +1 -0
- package/templates/vitepress/why/examples/3.npm-basic-package/build.config.ts +24 -0
- package/templates/vitepress/why/examples/3.npm-basic-package/package-lock.json +3661 -0
- package/templates/vitepress/why/examples/3.npm-basic-package/package.json +32 -0
- package/templates/vitepress/why/examples/3.npm-basic-package/src/index.ts +8 -0
- package/templates/vitepress/why/examples/3.npm-basic-package/tsconfig.json +16 -0
- package/templates/vitepress/why/examples/3.npm-basic-package/tsup.config.ts +16 -0
- package/templates/vitepress/why/examples/usage-cjs/cjs.cjs +4 -0
- package/templates/vitepress/why/examples/usage-cjs/esm.mjs +4 -0
- package/templates/vitepress/why/examples/usage-cjs/index.js +12 -0
- package/templates/vitepress/why/examples/usage-cjs/package-lock.json +42 -0
- package/templates/vitepress/why/examples/usage-cjs/package.json +20 -0
- package/templates/vitepress/why/examples/usage-esm/cjs.cjs +4 -0
- package/templates/vitepress/why/examples/usage-esm/createRequire.js +7 -0
- package/templates/vitepress/why/examples/usage-esm/esm.mjs +4 -0
- package/templates/vitepress/why/examples/usage-esm/index.js +8 -0
- package/templates/vitepress/why/examples/usage-esm/package-lock.json +42 -0
- package/templates/vitepress/why/examples/usage-esm/package.json +21 -0
- package/templates/vitepress/why/how-to-reuse-js-code.md +250 -0
- package/templates/vitepress/why/index.md +1 -0
- package/templates/vitepress/why/js-cjs-mjs.md +99 -0
- package/templates/vitepress/why/js-keywords.md +132 -0
- package/templates/vitepress/why/modern/bundlers.md +79 -0
- package/templates/vitepress/why/modern/dts.md +93 -0
- package/templates/vitepress/why/modern/esm-vs-cjs.md +84 -0
- package/templates/vitepress/why/modern/index.md +55 -0
- package/templates/vitepress/why/modern/package-entry-points.md +128 -0
- package/templates/vitepress/why/modern/typescript.md +155 -0
- package/templates/vitepress/why/publish-basic-npm-package.md +146 -0
- package/templates/vitepress/why/what-is-npm-package.md +162 -0
- package/templates/vue-lib/eslint.config.js +12 -0
- package/templates/vue-lib/gitignore +1 -0
- package/templates/vue-lib/index.html +13 -0
- package/templates/vue-lib/lib/HelloWorld.vue +21 -0
- package/templates/vue-lib/lib/index.ts +3 -0
- package/templates/vue-lib/package.json +61 -0
- package/templates/vue-lib/src/App.vue +9 -0
- package/templates/vue-lib/src/main.ts +8 -0
- package/templates/vue-lib/src/pages/index.vue +7 -0
- package/templates/vue-lib/src/router/index.ts +11 -0
- package/templates/vue-lib/src/style.css +1 -0
- package/templates/vue-lib/src/vite-env.d.ts +2 -0
- package/templates/vue-lib/test/index.test.ts +13 -0
- package/templates/vue-lib/tsconfig.app.json +30 -0
- package/templates/vue-lib/tsconfig.json +14 -0
- package/templates/vue-lib/tsconfig.node.json +25 -0
- package/templates/vue-lib/tsconfig.test.json +40 -0
- package/templates/vue-lib/vite.config.ts +54 -0
- package/templates/vue-lib/vite.shared.config.ts +13 -0
- package/templates/vue-lib/vitest.config.ts +13 -0
|
@@ -0,0 +1,39 @@
|
|
|
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": "templates/vitepress"
|
|
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
|
+
"lint": "eslint .",
|
|
22
|
+
"lint:fix": "eslint . --fix"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"vue": "^3.5.26"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@braintree/sanitize-url": "^7.1.1",
|
|
29
|
+
"@tailwindcss/vite": "^4.1.18",
|
|
30
|
+
"cytoscape": "^3.33.1",
|
|
31
|
+
"cytoscape-cose-bilkent": "^4.1.0",
|
|
32
|
+
"dayjs": "^1.11.19",
|
|
33
|
+
"debug": "^4.4.3",
|
|
34
|
+
"mermaid": "^11.12.2",
|
|
35
|
+
"tailwindcss": "^4.1.18",
|
|
36
|
+
"vitepress": "^1.6.4",
|
|
37
|
+
"vitepress-plugin-mermaid": "^2.0.17"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# 我对 monorepo 的一些思考
|
|
2
|
+
|
|
3
|
+
## 前言
|
|
4
|
+
|
|
5
|
+
最近在自己的新项目中,我创建并使用了 [monorepo-template](https://github.com/sonofmagic/monorepo-template) 模板,并不断地做了不少改进。
|
|
6
|
+
|
|
7
|
+
在此,我想借此机会分享一下这个模板的演变过程,以及我对 `monorepo` 的一些思考。
|
|
8
|
+
|
|
9
|
+
## 它的由来
|
|
10
|
+
|
|
11
|
+
为了应对越来越多的发包场景,我创建了 [npm-lib-template](https://github.com/sonofmagic/npm-lib-template) 模板
|
|
12
|
+
|
|
13
|
+
这是一个 `git` 单仓单 `npm` 包模板,使用 `rollup` 进行打包,然后再发布到 `npm` 和 `github`
|
|
14
|
+
|
|
15
|
+
然而,在后续开发中,我发现单仓库的模式在某些场景下难以应对。
|
|
16
|
+
|
|
17
|
+
例如,当需要引用其他自己的包,进行单元测试并再次发包时,这时候往往要在多个项目之间进行来回的切换更改,管理复杂度会迅速上升。
|
|
18
|
+
|
|
19
|
+
`git submodule` 也是另外一条路子,但是我对每次都要同步 `hash` 感到深恶痛绝,遂放弃 (不过某些极其特殊场景的实现,还是只能利用这个功能)。
|
|
20
|
+
|
|
21
|
+
因此,我决定要创建一个 [monorepo 项目模板](https://github.com/sonofmagic/monorepo-template) ,以应对这些需求。
|
|
22
|
+
|
|
23
|
+
## 技术选型
|
|
24
|
+
|
|
25
|
+
### 管理工具
|
|
26
|
+
|
|
27
|
+
在 `monorepo` 的管理上,我选择了 `pnpm` 和 `turborepo` 这对组合,原因很简单:它们都非常快。
|
|
28
|
+
|
|
29
|
+
- `pnpm` 又可以节省磁盘空间,又能够链接自特定的内容寻址存储库,是为快也
|
|
30
|
+
- `turborepo` 有构建缓存,是为快也 `too`.
|
|
31
|
+
|
|
32
|
+
### 语言与打包
|
|
33
|
+
|
|
34
|
+
我选择使用纯 `TypeScript` 来编写所有类库项目,并使用 `tsup` / `unbuild` 进行打包,默认输出格式为 `cjs` 和 `esm`,并利用 `package.json` 中的 `exports` 字段进行分发。
|
|
35
|
+
|
|
36
|
+
### 直接调试
|
|
37
|
+
|
|
38
|
+
在直接调试时,我抛弃了 `dist` + `sourcemap` 的调试方式,使用了 `tsx`,它非常适合调试 `TypeScript` 编写的 `CLI` 项目。
|
|
39
|
+
|
|
40
|
+
### 测试框架
|
|
41
|
+
|
|
42
|
+
测试方面,我选择了 `vitest`。
|
|
43
|
+
|
|
44
|
+
它不仅速度快,还很好地支持 `cjs`、`esm` 和 `TypeScript`,同时也适合 `monorepo` 项目。你可以利用 `turbo` 来执行单个的 `vitest` 任务,也可以利用 `vitest.workspace` 来进行多任务测试。
|
|
45
|
+
|
|
46
|
+
最初我使用的是 `jest` + `ts-jest`,但它对多格式的混合模块的支持不够理想,最终我选择了 `vitest`。
|
|
47
|
+
|
|
48
|
+
### 代码规范与质量控制
|
|
49
|
+
|
|
50
|
+
为了保持代码质量,我使用了 `eslint` 和 `stylelint`,并基于自己的配置包 `@icebreakers/eslint-config` 和 `@icebreakers/stylelint-config` 来进行代码格式化和规范化。
|
|
51
|
+
|
|
52
|
+
我还为 `.vscode` 配置了一些推荐插件和编辑器选项。
|
|
53
|
+
|
|
54
|
+
此外,通过 `husky` 添加了 `git hook`,配合 `lint-staged` 对提交的代码进行校验。与 `commitlint` 结合使用,以确保 `git` 提交信息符合规范。
|
|
55
|
+
|
|
56
|
+
### 本地引用与发包替换
|
|
57
|
+
|
|
58
|
+
利用 `publishConfig` 会在发包的时候替换 `package.json` 字段的方式,在本地包相互引用的时候,都使用 `Typescript` 源文件的方式导出,在 `publishConfig` 里定义的导出为,真正在不同环境中,指向 `dist` 中不同格式的产物地址。
|
|
59
|
+
|
|
60
|
+
通过这种方式,可以大大加速整个 `monorepo` 的开发测试速度,避免反复通过 `watch` 来构建 `dist` 和 `sourcemap`,也避免一构建出产物,对应的 `Typescript` 文件,就报错的问题。
|
|
61
|
+
|
|
62
|
+
### 发包流程
|
|
63
|
+
|
|
64
|
+
我采用了 `changesets`,它在 `monorepo` 环境下发布非常方便。功能非常的多,具体可以查看官方文档。
|
|
65
|
+
|
|
66
|
+
### Github 相关配置
|
|
67
|
+
|
|
68
|
+
在 `.github` 目录下,我提供了默认的 `CI/CD` 流程配置,以及用户提交 `issue` 时的模板。经过少量配置后,就可以实现自动发布 `npm` 包、创建 `git tag` 以及生成 `GitHub release`。
|
|
69
|
+
|
|
70
|
+
此外,模板里还有许多为 `GitHub` 显示优化的 `md` 文档。
|
|
71
|
+
|
|
72
|
+
## 部署
|
|
73
|
+
|
|
74
|
+
文档网站通过 `netlify.toml` 配置部署在 `Netlify` 上。最初我使用的是 `Vercel`,但由于**国内**访问速度的原因,最终迁移到了 `Netlify`。
|
|
75
|
+
|
|
76
|
+
而且由于我是开源项目贡献者的原因,`Netlify` 为我 `免费` 提供了 `Pro` 版本的计划 (通常这需要 `$19/per member/month`)
|
|
77
|
+
|
|
78
|
+
感谢 `Netlify`! 爱你❤️😍。
|
|
79
|
+
|
|
80
|
+
如果看到这里的哥们,你也有一定影响力的开源项目,也可以通过下方的链接申请。
|
|
81
|
+
|
|
82
|
+
https://www.netlify.com/legal/open-source-policy/
|
|
83
|
+
|
|
84
|
+
## 总结
|
|
85
|
+
|
|
86
|
+
从单仓到 `monorepo` 的转变不仅仅是对工具的选择,更是对项目管理模式的优化。通过采用合适的工具链,能够更高效地管理多包项目的同时,利用 `CI/CD` 确保代码的质量和发布的顺畅。
|
|
87
|
+
|
|
88
|
+
希望这些思考对你有所帮助,也欢迎大家提出各种建议和意见。
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Changesets
|
|
2
|
+
|
|
3
|
+
[Changesets](https://github.com/changesets/changesets)。它帮助你在 **monorepo** 或多包项目中更有条理地维护变更日志(changelog)、版本号升级策略以及自动化发布流程。
|
|
4
|
+
|
|
5
|
+
## 1. 什么是 Changeset?
|
|
6
|
+
|
|
7
|
+
- **核心思想**:每一次改动,不直接修改 `package.json` 里的版本号,而是通过写一个 `changeset` 文件(通常放在 `.changeset` 文件夹下)。
|
|
8
|
+
- **作用**:
|
|
9
|
+
- 记录每次改动影响了哪些包(哪些需要 bump 版本)。
|
|
10
|
+
- 指定改动类型(`patch`、`minor`、`major`)。
|
|
11
|
+
- 自动生成 **Changelog**。
|
|
12
|
+
- 自动修改 `package.json` 的版本号。
|
|
13
|
+
- 与 CI/CD 集成后,可以实现一键自动发版。
|
|
14
|
+
|
|
15
|
+
## 2. 如何使用 Changesets?
|
|
16
|
+
|
|
17
|
+
### 安装
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install --save-dev @changesets/cli
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 初始化
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npx changeset init
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
会生成一个 `.changeset` 文件夹,里面包含配置文件。
|
|
30
|
+
|
|
31
|
+
### 添加变更
|
|
32
|
+
|
|
33
|
+
当你完成某个功能或修复后,运行:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npx changeset
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
它会问:
|
|
40
|
+
|
|
41
|
+
1. 哪些包受影响?
|
|
42
|
+
2. 这是 **patch**(补丁)、**minor**(新功能)、还是 **major**(重大变更)?
|
|
43
|
+
3. 变更的描述是什么?
|
|
44
|
+
|
|
45
|
+
这会生成一个类似这样的文件:
|
|
46
|
+
|
|
47
|
+
```yaml
|
|
48
|
+
# .changeset/sweet-pandas-sing.md
|
|
49
|
+
---
|
|
50
|
+
my-package: patch
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
修复了登录时的 bug
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 应用版本更新
|
|
57
|
+
|
|
58
|
+
当积累了多个 changeset 后,可以执行:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npx changeset version
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
它会根据 changeset 文件:
|
|
65
|
+
|
|
66
|
+
- 更新对应包的版本号。
|
|
67
|
+
- 生成/更新 `CHANGELOG.md`。
|
|
68
|
+
|
|
69
|
+
### 发布
|
|
70
|
+
|
|
71
|
+
最后可以发布:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
npx changeset publish
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
会自动调用 `npm publish`,把包发到 npm registry。
|
|
78
|
+
|
|
79
|
+
## 3. 在 Monorepo 中的优势
|
|
80
|
+
|
|
81
|
+
- 避免多人协作时冲突:大家都往 `.changeset` 添加文件,不会直接改 `package.json`。
|
|
82
|
+
- 统一生成 changelog:自动保证每个版本的改动都被记录。
|
|
83
|
+
- 自动化发布:和 GitHub Actions 等 CI 工具结合,可在合并到主分支后自动发版。
|
|
84
|
+
|
|
85
|
+
## 总结
|
|
86
|
+
|
|
87
|
+
**Changeset 就是一个版本管理与发版工具**,它通过“先记录再统一处理”的方式,帮助 npm 包(尤其是 monorepo)保持版本升级和 changelog 的一致性与可追溯性。
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Husky
|
|
2
|
+
|
|
3
|
+
## 1. 什么是 Husky?
|
|
4
|
+
|
|
5
|
+
**Husky** 是一个用于在 **Git hooks**(如 `pre-commit`、`pre-push`、`commit-msg` 等)中运行脚本的工具。
|
|
6
|
+
它的作用是让你在提交代码前或推送代码前,自动执行一些校验、格式化或测试,从而保证代码质量和团队规范。
|
|
7
|
+
|
|
8
|
+
> 简单来说:**Husky = Git hooks 的管理工具**。
|
|
9
|
+
|
|
10
|
+
## 2. Husky 有什么用?
|
|
11
|
+
|
|
12
|
+
常见用途:
|
|
13
|
+
|
|
14
|
+
1. **代码格式化**
|
|
15
|
+
在提交前运行 `prettier --write .`,确保代码风格一致。
|
|
16
|
+
2. **Lint 检查**
|
|
17
|
+
在 `pre-commit` 时执行 `eslint`,防止有 lint 错误的代码被提交。
|
|
18
|
+
3. **运行测试**
|
|
19
|
+
在 `pre-push` 时执行 `npm test`,防止未通过测试的代码被推送。
|
|
20
|
+
4. **Commit 信息校验**
|
|
21
|
+
在 `commit-msg` hook 中使用 [commitlint](https://github.com/conventional-changelog/commitlint) 强制提交信息符合规范(如 Conventional Commits)。
|
|
22
|
+
|
|
23
|
+
## 3. 如何使用 Husky?
|
|
24
|
+
|
|
25
|
+
### 安装
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install husky --save-dev
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### 初始化
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npx husky init
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
这会生成一个 `.husky` 目录,并在里面创建 `pre-commit` 文件,默认内容可能是:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
#!/bin/sh
|
|
41
|
+
npm test
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 添加 Hook
|
|
45
|
+
|
|
46
|
+
假设你想在提交前运行 ESLint,可以这样:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npx husky add .husky/pre-commit "npm run lint"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
生成的 `.husky/pre-commit` 文件类似:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
#!/bin/sh
|
|
56
|
+
npm run lint
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 使用 commit-msg 校验提交信息
|
|
60
|
+
|
|
61
|
+
先装 commitlint:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
npm install @commitlint/{config-conventional,cli} --save-dev
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
创建配置文件 `commitlint.config.js`:
|
|
68
|
+
|
|
69
|
+
```js
|
|
70
|
+
module.exports = { extends: ['@commitlint/config-conventional'] }
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
添加 hook:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npx husky add .husky/commit-msg "npx --no-install commitlint --edit $1"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
这样,若提交信息不符合规范,会被拦截。
|
|
80
|
+
|
|
81
|
+
## 4. 和 lint-staged 搭配
|
|
82
|
+
|
|
83
|
+
通常 Husky 会和 [lint-staged](https://github.com/okonet/lint-staged) 搭配使用:
|
|
84
|
+
只检查本次改动的文件,而不是全量检查。
|
|
85
|
+
|
|
86
|
+
示例:
|
|
87
|
+
`package.json` 里加:
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"lint-staged": {
|
|
92
|
+
"*.js": "eslint --fix",
|
|
93
|
+
"*.ts": "eslint --fix"
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
然后在 `.husky/pre-commit` 文件中写:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
npx lint-staged
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 总结
|
|
105
|
+
|
|
106
|
+
- **Husky** 是一个 Git hooks 工具,用来在 commit、push 等阶段运行脚本。
|
|
107
|
+
- 主要用于 **代码质量控制**:lint、格式化、测试、commit message 校验等。
|
|
108
|
+
- 使用方式:安装 → 初始化 → 添加 hooks → 编写脚本。
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# lint-staged
|
|
2
|
+
|
|
3
|
+
## 1. 什么是 lint-staged?
|
|
4
|
+
|
|
5
|
+
**lint-staged** 是一个工具,主要功能是:
|
|
6
|
+
在 **Git 暂存区(staged)里的文件** 上运行你指定的 linters 或脚本。
|
|
7
|
+
|
|
8
|
+
👉 它和 **Husky** 搭配使用最常见:
|
|
9
|
+
|
|
10
|
+
- Husky 负责触发 Git hooks(比如 `pre-commit`)。
|
|
11
|
+
- lint-staged 负责只对 **本次提交涉及的文件** 进行检查和修复。
|
|
12
|
+
|
|
13
|
+
这样就避免了对整个项目运行 lint/format,节省时间。
|
|
14
|
+
|
|
15
|
+
## 2. lint-staged 有什么用?
|
|
16
|
+
|
|
17
|
+
- **提高性能**:只检查本次改动的文件,而不是全量跑 `eslint` 或 `prettier`。
|
|
18
|
+
- **保证提交质量**:阻止不符合规范的代码进入仓库。
|
|
19
|
+
- **常见场景**:
|
|
20
|
+
- 运行 ESLint 自动修复:`eslint --fix`
|
|
21
|
+
- 运行 Prettier 格式化:`prettier --write`
|
|
22
|
+
- 运行 TypeScript 编译检查:`tsc --noEmit`
|
|
23
|
+
- 优化图片、转换 Markdown 等自定义脚本
|
|
24
|
+
|
|
25
|
+
## 3. 如何使用 lint-staged?
|
|
26
|
+
|
|
27
|
+
### 安装
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm install lint-staged --save-dev
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 配置
|
|
34
|
+
|
|
35
|
+
lint-staged 支持在 `package.json`、`.lintstagedrc` 或 `lint-staged.config.js` 中配置。
|
|
36
|
+
|
|
37
|
+
最简单的方式:在 `package.json` 加上:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"lint-staged": {
|
|
42
|
+
"*.js": "eslint --fix",
|
|
43
|
+
"*.ts": "eslint --fix",
|
|
44
|
+
"*.{js,ts,json,css,md}": "prettier --write"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 结合 Husky
|
|
50
|
+
|
|
51
|
+
一般在 `.husky/pre-commit` 中加:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
npx lint-staged
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
这样在提交时,lint-staged 会自动处理已暂存的文件。
|
|
58
|
+
|
|
59
|
+
## 4. 示例工作流
|
|
60
|
+
|
|
61
|
+
假设你改了两个文件:
|
|
62
|
+
|
|
63
|
+
- `src/app.js`
|
|
64
|
+
- `docs/readme.md`
|
|
65
|
+
|
|
66
|
+
然后执行 `git add . && git commit -m "feat: add app"`
|
|
67
|
+
|
|
68
|
+
在 `pre-commit` hook 中,lint-staged 会只对这两个文件运行配置的命令,比如:
|
|
69
|
+
|
|
70
|
+
- `eslint --fix src/app.js`
|
|
71
|
+
- `prettier --write docs/readme.md`
|
|
72
|
+
|
|
73
|
+
最终确保这两个文件在提交之前符合规范。
|
|
74
|
+
|
|
75
|
+
## 总结
|
|
76
|
+
|
|
77
|
+
- **lint-staged = 只在 staged 文件上运行 lint/脚本的工具**。
|
|
78
|
+
- 优点:快、精准,避免全量检查。
|
|
79
|
+
- 常和 **Husky** 搭配,用于 `pre-commit`。
|
|
@@ -0,0 +1,101 @@
|
|
|
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
|
+
- 'templates/*'
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
这样 `pnpm` 会自动管理多个子项目的依赖和链接。
|
|
72
|
+
|
|
73
|
+
## 总结
|
|
74
|
+
|
|
75
|
+
- **pnpm 是一种更快、更省空间、更严格的包管理器**。
|
|
76
|
+
- 核心优势:
|
|
77
|
+
1. **磁盘节省**(共享依赖存储)。
|
|
78
|
+
2. **安装速度快**。
|
|
79
|
+
3. **严格依赖管理**,避免幽灵依赖。
|
|
80
|
+
4. **原生支持 monorepo**。
|
|
81
|
+
|
|
82
|
+
## npm vs Yarn vs pnpm 对比表
|
|
83
|
+
|
|
84
|
+
| 特性 / 工具 | **npm** | **Yarn** | **pnpm** |
|
|
85
|
+
| ----------------- | -------------------------------- | ----------------------------- | -------------------------------------- |
|
|
86
|
+
| **生态兼容性** | ✅ 官方,100% 兼容 npm registry | ✅ 兼容 npm registry | ✅ 兼容 npm registry |
|
|
87
|
+
| **安装速度** | ⏳ 较慢(尤其是全量安装时) | 🚀 比 npm 快,缓存优化 | ⚡ 非常快(硬链接 + 全局存储机制) |
|
|
88
|
+
| **磁盘空间占用** | 📦 高,每个项目一份完整依赖 | 📦 中等,有缓存但依赖重复存储 | 🪶 很低,共享依赖存储,节省大量空间 |
|
|
89
|
+
| **依赖结构** | 扁平化,可能产生“幽灵依赖” | 扁平化,依旧可能有幽灵依赖 | 严格隔离,避免幽灵依赖 |
|
|
90
|
+
| **Monorepo 支持** | 🚫 无原生支持,需要 Lerna 等工具 | ⚠️ Yarn Workspaces 支持 | ✅ 原生支持 Workspaces,管理更高效 |
|
|
91
|
+
| **命令兼容性** | 标准 npm 命令 | 大部分与 npm 相似 | 基本兼容,部分命令略有不同(如 `add`) |
|
|
92
|
+
| **锁文件** | `package-lock.json` | `yarn.lock` | `pnpm-lock.yaml` |
|
|
93
|
+
| **稳定性** | ✅ 官方维护,稳定性高 | ✅ 较成熟,社区维护 | ✅ 越来越流行,性能最佳 |
|
|
94
|
+
| **学习成本** | ⭐⭐ 最低 | ⭐⭐ 略有差异(命令相似) | ⭐⭐⭐ 略高,但上手简单 |
|
|
95
|
+
| **适用场景** | 小型项目,或默认环境 | 中大型项目,需要更快安装 | 中大型/Monorepo 项目,重视性能和空间 |
|
|
96
|
+
|
|
97
|
+
## 对比总结
|
|
98
|
+
|
|
99
|
+
- **npm**:默认选择,生态最广,适合一般小型项目。
|
|
100
|
+
- **Yarn**:性能较优,适合需要加快依赖安装的团队。
|
|
101
|
+
- **pnpm**:性能最好、磁盘最省、依赖最严格,特别适合 **大型项目** 和 **monorepo** 场景。
|
|
@@ -0,0 +1,91 @@
|
|
|
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 项目,依赖多而复杂。
|