前端工程师

把发布这件事,做成基础设施

维护 @guohanmin 包生态——一个 pnpm/Turborepo monorepo、它所依赖的私有 npm 源,以及搭在两者之上的内部工具。

pnpm add @guohanmin/storage
个仓内 package
10
个仓内 package
个已发布到私有源
5
个已发布到私有源
个已上线的内部应用
3
个已上线的内部应用

项目

实际在跑的东西

SDK Monorepo

pnpm workspacesTurborepoBiomeChangesets

一个 pnpm/Turborepo monorepo,装着 @guohanmin 这个 scope 下的所有包。logger、storage、http、encryptor、utils 对外发布;biome-config、ts-config、tsdown-config、vitest-config、commitlint-config 只在仓内共享,被所有包和应用依赖。

10 个包 · lefthook pre-commit 拦截 · 源码只写英文

npm-registry-worker

Cloudflare WorkersD1R2

跑在 Cloudflare Workers + D1 + R2 上的私有 npm 源,专门服务 @guohanmin 这个 scope。monorepo 里每一次 pnpm publish-packages,都先落到这里,再被任何 package.json 引用到。

撑起整套生态的安装环节

设计语言复刻

TanStack StartTailwind CSS v4Cloudflare Pages

把 Vercel 的 Geist 设计语言拆解后搬进 Tailwind v4:ink/canvas 灰阶、双套圆角语义、绑在 data-theme 上的深色模式。现在是三个内部应用共用的一套 token 层,这个站点也在用。

site / npmjs / typedoc 共用

实验室

同一套 token,实时可调

DESIGN-vercel.md 定义了两套圆角:营销 CTA 用 pill,导航和应用控件用 6px 方角。挑一个按钮样式和形状试试。

Variant
Shape

选择通过 @guohanmin/storage 持久化——刷新页面也不会丢。

动态

最近的提交

直接取自这个 monorepo 自己的 git 历史——不用另外维护一个博客。

  1. 2026-09-132a11e8a更新发布命令
  2. 2026-09-13955a8ccnpmja&typedoc
  3. 2026-09-136dc1d78storage升到1.0.0
  4. 2026-09-139f9729f添加storage库并升级logger到1.0.0
  5. 2026-09-121bcdadb添加logger库
  6. 2026-09-111f8f5e2深浅主题
  7. 2026-09-1125fc4d3http&typedoc
  8. 2026-09-11032ab05添加加密包
  9. 2026-09-1124efd43项目初始化
  10. 2026-09-114ff172fInitial commit

关于

这套 stack 是为了什么

这个 monorepo 把前端基础设施当产品来做:每个包用 Changesets 走版本管理,每次提交都过 Biome 和 lefthook 的 pre-commit 检查,每个应用用同一种方式部署到 Cloudflare Pages。

TypeScriptTanStack Start / RouterTailwind CSS v4pnpm + TurborepoCloudflare Workers / Pages / D1 / R2BiomeChangesetsVitest
npm scope @guohanmin私有源托管在 GitLab Packages 上