ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

深入解析 Puck 贡献指南:从环境搭建到发布流程的完整参与路线

深入解析 Puck 贡献指南:从环境搭建到发布流程的完整参与路线 深入解析 Puck 贡献指南从环境搭建到发布流程的完整参与路线【免费下载链接】puckThe visual editor for React.项目地址: https://gitcode.com/GitHub_Trending/puc/puckPuck 是一个基于 React 的开源可视化编辑器其贡献指南CONTRIBUTING.md涵盖了从问题报告、议题标签体系、代码贡献规范到发布机制的全流程。本文以该指南为骨架结合仓库中的实际源码、配置文件与工具脚本为你梳理一条从“第一次提 Issue”到“代码合入 main 并触发 canary 发布”的完整参与路线帮助社区贡献者包括 Agent 与自动化工具快速理解 Puck 的开发协作约定与工程化约束。参与前的项目概览Puck 的技术栈与仓库结构Puck 目前仍处于重度开发阶段贡献指南开篇便强调贡献指南的设计初衷是在社区参与热情与项目自身愿景方向之间取得平衡。理解这一点有助于贡献者预期——并非所有 PR 都会被立即接纳而是需要符合项目的既定路线。从 package.json 与 lerna.json 可以确认 Puck 的核心技术栈与工程组织方式TypeScript核心包与所有应用均使用 TypeScript 编写且贡献指南明确要求避免使用anyCSS Modules样式采用 CSS Modules 方案并遵循 SUIT CSS 命名规范Turborepo根目录 turbo.json 定义了build、lint、test、dev等任务的依赖关系与缓存策略Yarn Workspaces根 package.json 通过workspaces: [apps/*, recipes/*, packages/*]声明 monorepo 工作区Next.js用于apps/demo演示应用与apps/docs文档站。仓库布局上packages/存放可发布的 npm 包如packages/coreapps/存放应用recipes/提供基于create-puck-app的可运行脚手架模板。这种分层让贡献者可以“只跑自己关心的项目”而不必构建整个 monorepo——这正是贡献指南“Rather than running the entire monorepo, its quicker to run the project you need”的落地前提。报告 Bug 与请求新功能贡献指南规定Bug 与功能请求一律通过 GitHub Issues 提交且在新建 Issue 之前必须先检索是否已存在重复问题。为避免 Issues 被无关讨论淹没指南明确划定了沟通渠道问题与功能请求→ GitHub Issues疑问与求助→ GitHub Discussions 或 Discord 的#chat/#help频道。这一分流策略直接对应了 Puck 团队对 backlog 的治理方式Issues 只承载可追踪、可分配的工作项而开放性问题则在讨论区消化从而保证议题列表始终是“待办池”而非“论坛”。理解 LabelsPuck 的 Backlog 治理体系Puck 使用三类标签管理 backlog贡献者在挑选任务前应当先理解这套语义。状态标签Status labels标签含义ready该 ticket 已有完整描述可以开始动手in triage已被 Puck 团队查看正在确定下一步可能长期停留在此状态直到团队处理blocked被其他 ticket 阻塞依赖关系应在评论区说明类型标签Type labels类型标签统一使用type:前缀包括type: bugtype: featuretype: docstype: performancetype: test其他标签good first issue适合新贡献者入手的任务是第一次参与 Puck 的推荐起点opinions wanted团队正在征集意见欢迎在评论区参与讨论。对于贡献者而言ready标签是最重要的信号指南明确警告针对没有ready标签的 Issue 提交 PR存在“过早实现而被拒绝”的风险。因此挑选任务的第一步应该是筛选good first issueready双重标记的 ticket。代码贡献时机何时可以或不可以提交 PR贡献指南对“什么时候该动手写代码”给出了非常具体的决策规则认领已有 Issue必须尊重ready状态标签。针对未标记ready的 Issue 提交 PR很可能被判定为“过早”而拒绝。自己上报的 Bug如果你通过 Issue 上报了 Bug 并有修复方案不需要等待ready标签即可提交修复。自己的功能请求可以为自己的功能请求提出解决方案但未经充分讨论的方案可能被拒绝。无对应 Issue小型修复可能被接受但较大的改动可能被拒绝或要求先展开讨论。从 README.md 可知 Puck 已积累了大量社区组件配置示例如packages/core下的RichTextEditor、DropZone、LayerTree等模块社区贡献的代码需要与这些既有实现保持一致的 API 风格与工程规范。这套“先讨论、后实现”的节奏本质上是在保护公共 API 的稳定性——这正是指南末尾“Public APIs”专项审查的由来。搭建开发环境克隆、安装与启动 demo环境准备Puck 的开发环境依赖如下均已在根 package.json 中锁定Node.js 20.0.0见engines字段Yarn 1.22.19packageManager字段指定Turborepo 2.xdevDependencies中的turbo。安装依赖yarn该命令基于根目录的workspaces配置一次性安装所有子包依赖并通过resolutions字段统一锁定存在安全告警的传递依赖如yaml、tar、form-data等见根 package.json。启动 demo 应用贡献指南推荐在 demo 应用的上下文中开发cd apps/demo yarn devapps/demo的 package.json 显示其dev脚本为next dev且直接依赖puckeditor/core: *workspace 通配版本因此对packages/core的改动会通过 Yarn Workspaces 的符号链接即时反映到 demo 中无需手动 link。这正是“只跑需要的项目”这一建议的技术前提。如果需要构建整个 monorepo 或运行全部测试也可以在仓库根目录执行yarn build # turbo run build yarn test # turbo run test yarn lint # turbo run lint其中 turbo.json 为build任务声明了dependsOn: [^build]先构建依赖再构建自身与输出缓存.next/**、dist/**dev任务则关闭缓存并标记为persistent适合长驻进程。demo 应用的结构速览apps/demo/config/下是 Puck 的组件配置示例例如 Button 组件 展示了ComponentConfigButtonProps的标准写法——通过fields声明label、href、variant三个字段及其类型text / radio通过defaultProps提供默认值通过render返回真实 DOM。而 Heading 组件 则展示了textarea、select、radio等更丰富的字段类型组合以及withLayout高阶组件包装的用法。新贡献者在开发自定义组件时这些示例就是最直接的“代码规范样板”。代码风格TypeScript、CSS 与提交信息TypeScript 约定避免使用any核心包 packages/core/package.json 的lint脚本为eslint **/*.ts*根目录 eslint.config.mjs 继承了eslint-config-custom其内容见 packages/eslint-config-custom/index.mjs该配置基于eslint-config-next与eslint-config-turbo并显式关闭了部分 react-hooks 新规则以保持与迁移前行为一致测试欢迎但不强制复杂代码可能会被要求补充测试。核心包使用 Jesttest: jest见 packages/core/package.json测试用例分布在packages/core/lib/__tests__/、packages/core/components/*/__tests__/等目录下例如 insert-component.spec.tsx、resolve-all-data.spec.tsx可作为编写测试的风格参考。CSS 约定类名必须遵循 SUIT CSS 方法论这是puckeditor组织在所有 CSS 工作中的通用约定禁止依赖全局样式Puck 会被部署到“充满敌意的第三方环境”页面上可能存在任意第三方 CSS因此所有组件样式必须通过 CSS Modules 局部作用域隔离。这一点在 packages/core 的组件目录中体现得淋漓尽致——几乎每个组件都配有styles.module.css。提交信息约定Puck 依赖angular 风格的传统提交conventional commits来自动化发布、判定版本号递增并生成 changelogPR 必须聚焦单一 Issue这既是评审友好的要求也是发布流程的硬性约束提交者通常不需要自己写完美的提交信息——团队在合入时会对大多数 PR 做 squash 并重写提交信息需要处理多个 Issue 时拆分为多个 PR是最稳妥的做法如果熟悉 conventional commits也可以在同一 PR 内按提交拆分但团队可能要求重写提交信息。公共 API 的额外审查如果 PR 引入或修改了公共 API将受到额外的严格审查目的是避免引入破坏性变更。这在 Puck 中有着非常具体的工程体现packages/core/package.json 通过exports字段精确声明了包的对外入口.、./rsc、./internal、./puck.css、./no-external.css任何入口的增删改都构成公共 API 变更peerDependencies声明react: ^18.0.0 || ^19.0.0改动 React 版本支持范围同样是敏感变更从 packages/core/bundle 目录可以看到rsc.tsx、internal.ts、no-external.ts等多个构建入口公共 API 的改动必须同步考虑这些入口的兼容性。因此涉及公共 API 的 PR 建议先发起讨论或使用opinions wanted标签明确兼容性策略后再动手。发布机制Canary 与 Latest 双轨道贡献指南描述了两种发布轨道仓库内的脚本则为它们提供了完整的自动化实现。Canary自动每次合入 main 触发每次合并到main后会自动发布 canary 版本版本号带提交哈希后缀形如0.10.0-canary.42c24f1。其实现链路在仓库中清晰可见根 package.json 的release:canary脚本调用release:prepare执行git fetch --tags与conventional-recommended-bump -p angular计算推荐版本号后再调用node scripts/get-unstable-version canaryscripts/get-unstable-version.js 通过git rev-parse --short HEAD取当前提交短哈希拼接出${pkg.version}-canary.${stdout}例如0.23.0-canary.abc1234scripts/publish.sh 以npm publish --access public --tag $1的形式依次发布packages/core、packages/field-contentful、packages/plugin-emotion-cache、packages/plugin-heading-analyzer与packages/create-puck-app后者在发布前后会临时移除并恢复.gitignore。这意味着每个贡献者的 PR 一旦合入其代码就会进入 canary 轨道下游用户可以安装puckeditor/corecanary抢先验证。Latest手动团队判断 main 足够稳定后触发正式版本由团队在认为main分支足够稳定时手动触发。根 package.json 中与正式发布相关的脚本包括yarn release # release:prepare changelog release-commit yarn changelog # node scripts/create-changelog yarn version # lerna version --force-publish -y --no-push --no-changelog --no-git-tag-version $npm_package_version其中 scripts/create-changelog.js 使用standard-changelog基于 conventional commits 生成变更日志并将生成的条目注入 CHANGELOG.md 的!--__CHANGELOG_ENTRY__--标记处。这与贡献指南“依赖 angular 风格 conventional commits 生成 changelog”的描述完全对应——提交信息质量直接决定 changelog 的可读性这也是要求 PR 聚焦单一 Issue 的根本原因。面向贡献者的行动清单结合以上内容一份可执行的贡献路线如下提问与求助使用 GitHub Discussions 或 Discord而非 Issues挑选任务筛选带good first issue与ready标签的 Issue或认领自己上报且已确认的 Bug搭建环境yarn安装依赖cd apps/demo yarn dev启动开发环境编写代码遵守 TypeScript避免any、CSS Modules SUIT CSS不依赖全局样式约定参照 apps/demo/config/blocks 下的组件示例测试与 lint复杂逻辑补充 Jest 测试参考packages/core/lib/__tests__/并运行yarn lint提交与 PRPR 聚焦单一 Issue遵循 conventional commits涉及公共 API 时做好额外审查与讨论的准备跟进发布合入 main 后自动进入 canary 轨道可用yarn changelog视角核对变更记录是否准确。【免费下载链接】puckThe visual editor for React.项目地址: https://gitcode.com/GitHub_Trending/puc/puck创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进