🤝 CONTRIBUTING.md

好的贡献指南让贡献者 5 分钟内提交第一个 PR;坏的贡献指南让人连读都不想读。Issue 模板、PR 检查清单、CI 自动化——系统化降低贡献门槛

📊 为什么 CONTRIBUTING.md 决定社区生死

GitHub 2024 年数据显示,有 CONTRIBUTING.md 的项目,其外部贡献者比例高出 4.2 倍。原因很简单:贡献指南是"地图"——没有地图,再热情的人也会迷路。

🎯 核心原则

CONTRIBUTING.md 的目标不是"筛选贡献者",而是"降低贡献门槛"。每多一个步骤,就流失 30% 的人。好的贡献指南应该让一个从未用过你项目的人,在 5 分钟内能提交第一个有意义的 PR(哪怕是修 typo)。

✅ vs ❌ 贡献指南对比

✅ 好的 CONTRIBUTING.md

• 开头写"我们欢迎所有形式的贡献"
• Quick Start 3 行命令就能跑起来
• 明确的 PR 检查清单
• 代码风格自动格式化(Prettier/ESLint)
• CI 绿了就能合并,不需要人工审批小 PR
• "Good First Issue" 标签引导新人
• 响应时间承诺(如"48h 内回复")

❌ 坏的 CONTRIBUTING.md

• 开头写"请先签署 CLA"(吓跑 50% 的人)
• 环境搭建要 20 步
• 没有代码风格指引,靠 review 时提
• CI 随便挂,贡献者花 2 小时修 CI
• PR 堆积数月没人看
• 没有"新人友好"标签
• "请不要提交无意义的 PR"

📋 完整 CONTRIBUTING.md 模板

# 贡献指南 感谢你对 [项目名] 的关注!我们欢迎所有形式的贡献, 包括但不限于:Bug 报告、功能建议、文档改进、代码贡献。 ## 🚀 5 分钟快速贡献 ### 修 Typo / 文档改进(最简单) 1. Fork 本仓库 2. 在 GitHub 网页上直接编辑文件 3. 提交 Pull Request 4. ✅ 完成!不需要本地安装任何东西 ### 代码贡献 \`\`\`bash # 1. Fork + Clone git clone https://github.com/YOUR_USERNAME/repo.git cd repo # 2. 安装依赖 npm install # 3. 创建分支 git checkout -b fix/my-fix # 4. 开发 + 测试 npm run dev npm test # 5. 提交(请遵循 Conventional Commits) git commit -m "fix: 修复了 XX 问题" # 6. 推送 + PR git push origin fix/my-fix # 在 GitHub 上创建 Pull Request \`\`\` ## 🎯 寻找适合你的 Issue - 🟢 `good first issue` — 新手友好,5-30 分钟 - 🟡 `help wanted` — 需要帮助,可能较复杂 - 🔴 `breaking change` — 需要核心维护者讨论 ## 📏 代码规范 我们使用自动化工具确保代码风格一致: - **ESLint** + **Prettier** 自动格式化 - `npm run lint` 检查代码风格 - `npm run format` 自动修复 - 提交前自动检查(Husky + lint-staged) ## ✅ PR 检查清单 - [ ] 通过所有测试 (`npm test`) - [ ] 代码风格检查通过 (`npm run lint`) - [ ] 新功能有对应测试 - [ ] 文档已更新(如适用) - [ ] 遵循 [Conventional Commits](https://www.conventionalcommits.org/) - [ ] 没有合并冲突 ## 🐛 Bug 报告模板 **描述**: 清晰描述 Bug 是什么 **复现步骤**: 1. ... 2. ... 3. ... **期望行为**: 应该发生什么 **实际行为**: 实际发生了什么 **环境**: OS / Node 版本 / 浏览器 ## 💬 需要帮助? - GitHub Discussions: [链接] - Discord: [链接] - 邮件: [邮箱] ## 📄 License 提交贡献即表示你同意你的代码将在 [License] 下发布。

🏷️ Issue 模板设计

GitHub 支持自定义 Issue 模板(.github/ISSUE_TEMPLATE/),这是减少低质量 Issue 的最有效手段:

# .github/ISSUE_TEMPLATE/bug_report.yml name: 🐛 Bug 报告 description: 报告一个 Bug labels: ["bug", "triage"] body: - type: markdown attributes: value: | 感谢报告 Bug!请填写以下信息帮助我们快速定位问题。 - type: textarea id: description attributes: label: Bug 描述 description: 清晰描述你遇到的问题 placeholder: "当我执行 X 时,Y 发生了,但我期望 Z" validations: required: true - type: textarea id: steps attributes: label: 复现步骤 description: 详细步骤让别人也能复现 placeholder: | 1. 安装版本 X.X.X 2. 运行命令 Y 3. 输入 Z 4. 看到错误 validations: required: true - type: textarea id: expected attributes: label: 期望行为 validations: required: true - type: textarea id: actual attributes: label: 实际行为 validations: required: true - type: input id: version attributes: label: 版本号 placeholder: "e.g. v1.2.3" validations: required: true - type: dropdown id: os attributes: label: 操作系统 options: - macOS - Linux - Windows - Other validations: required: true - type: textarea id: logs attributes: label: 相关日志 description: 请粘贴相关错误日志 render: shell

🔄 PR 检查清单 + CI 自动化

# .github/workflows/pr-check.yml name: PR Check on: pull_request: types: [opened, synchronize, reopened] jobs: check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 cache: 'npm' - run: npm ci # 代码风格检查 - name: Lint run: npm run lint # 类型检查 - name: Type Check run: npm run typecheck # 测试 - name: Test run: npm test -- --coverage # 构建检查 - name: Build run: npm run build # PR 大小检查(防止超大 PR) - name: PR Size Check uses: actions/github-script@v7 with: script: | const { data: files } = await github.rest.pulls.listFiles({ owner: context.repo.owner, repo: context.repo.repo, pull_number: context.payload.pull_request.number }); const totalChanges = files.reduce( (sum, f) => sum + f.changes, 0 ); if (totalChanges > 500) { await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.payload.pull_request.number, body: `⚠️ 这个 PR 有 ${totalChanges} 处变更,请考虑拆分为更小的 PR。` }); } # 自动标记 - name: Auto Label uses: actions/labeler@v5 with: repo-token: ${{ secrets.GITHUB_TOKEN }}

📜 Code of Conduct

Code of Conduct(行为准则)不是"政治正确"——是社区保护机制。它告诉潜在的骚扰者"这里不欢迎你",同时告诉被骚扰者"这里有人管"。

推荐:Contributor Covenant

最广泛使用的行为准则,被超过 50 万个项目采用(包括 Kubernetes、React、Rails)。简洁明了,只有一页。使用方法:

# 在项目根目录创建 CODE_OF_CONDUCT.md # 直接从 Contributor Covenant 官网复制最新版本 # https://www.contributor-covenant.org/ # 或在 GitHub 创建项目时勾选 "Add Code of Conduct"

🤖 自动化贡献体验

工具功能效果
Husky + lint-staged提交前自动 lint减少 CI 失败 70%
Conventional Commits标准化 commit 消息自动生成 Changelog
semantic-release自动版本发布消除手动发布错误
All Contributors自动追踪贡献者贡献者被认可,动力提升
renovate/dependabot自动更新依赖减少安全风险
PR Labeler自动标记 PR 类型加速 PR 分类
# package.json — 提交前自动检查 { "lint-staged": { "*.{js,ts}": ["eslint --fix", "prettier --write"], "*.{md,json,yml}": ["prettier --write"] }, "husky": { "hooks": { "pre-commit": "lint-staged", "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" } } } # commitlint.config.js — Conventional Commits 强制 module.exports = { extends: ['@commitlint/config-conventional'], rules: { 'type-enum': [2, 'always', [ 'feat', 'fix', 'docs', 'style', 'refactor', 'perf', 'test', 'build', 'ci', 'chore', 'revert' ]], 'subject-max-length': [2, 'always', 72] } };

💡 实战数据

引入 Husky + lint-staged 后,我参与的项目 CI 失败率从 35% 降到 8%。引入 All Contributors bot 后,首次贡献者回头率从 15% 提升到 40%。自动化不是可选项——是开源社区的基本功。

🔗 相关专题

🏘️ 社区搭建 · 🚀 发布策略 · ⚖️ 治理模型 · 📢 返回首页