Skip to content

Latest commit

 

History

History
828 lines (606 loc) · 19.6 KB

File metadata and controls

828 lines (606 loc) · 19.6 KB

react-native-advanced-flatlist NPM 发布指南

本指南提供了手动和自动化两种方法来发布这个 React Native 组件到 npm,包括用于简化发布工作流程的高级自动化发布系统。

目录

前置要求

  1. Node.js 和 npm: 确保已安装 Node.js(版本 14 或更高)
  2. npm 账户: 在 npmjs.com 创建账户
  3. Git: 用于版本控制和仓库管理
  4. Git 远程仓库: 正确配置并具有推送权限

初始设置

1. 登录 npm

npm login
# 输入你的 npm 用户名、密码和邮箱

2. 验证登录

npm whoami
# 应该显示你的 npm 用户名

3. 检查包名可用性

npm view react-native-advanced-flatlist
# 如果包不存在,你会收到错误(这是好的!)

🚀 自动化发布系统(推荐)

本项目包含一个完整的自动化发布脚本,可处理版本管理、构建、测试、Git 操作和 NPM 发布,具有高级错误处理和回滚功能。

✨ 功能特性

  • 🚀 交互式版本选择 - 在 patch、minor 或 major 发布之间选择
  • 全面的预检查 - Git 状态、NPM 认证、依赖项、网络连接
  • 🔨 自动构建和测试 - 清理、编译、代码检查、类型检查和测试
  • 📦 包验证 - 发布前确保包的完整性
  • 🔄 Git 操作 - 自动提交、打标签和推送
  • 📤 NPM 发布 - 发布到 registry 并验证
  • 🎯 错误处理 - 失败时的回滚功能
  • 📝 详细日志 - 完整的发布过程审计记录
  • 🧪 试运行模式 - 在不进行实际更改的情况下测试流程

快速开始

交互式发布(推荐)

npm run release

这将:

  1. 运行所有预检查
  2. 构建和测试项目
  3. 提示您选择版本类型(patch/minor/major)
  4. 显示版本变更并询问确认
  5. 处理所有 Git 操作
  6. 发布到 NPM
  7. 验证发布成功

自动化发布命令

# 试运行模式(无实际更改)
npm run release:dry

# 直接版本发布
npm run release:patch-auto    # Patch 版本 (1.0.0 → 1.0.1)
npm run release:minor-auto    # Minor 版本 (1.0.0 → 1.1.0)
npm run release:major-auto    # Major 版本 (1.0.0 → 2.0.0)

# 传统简单命令
npm run release patch         # Patch 发布 - Bug 修复
npm run release minor         # Minor 发布 - 新功能
npm run release major         # Major 发布 - 破坏性变更

高级选项

# 带选项的直接脚本执行
node scripts/release.js [选项]

选项:
  --dry-run, -d     试运行模式(无实际更改)
  --version, -v     指定版本类型 (patch|minor|major)
  --skip-tests, -s  跳过测试执行
  --help, -h        显示帮助信息

示例

# 试运行的交互式发布
node scripts/release.js --dry-run

# 自动化 patch 发布
node scripts/release.js --version patch

# 跳过测试的 minor 发布
node scripts/release.js --version minor --skip-tests

# 跳过测试的 major 版本试运行
node scripts/release.js -d -v major -s

流程概览

1. 预检查

  • ✅ Git 工作树状态(警告未提交的更改)
  • ✅ 当前 Git 分支验证(推荐 main/master)
  • ✅ NPM 认证状态
  • ✅ 依赖项安装和健康检查
  • ✅ 到 NPM registry 的网络连接

2. 构建和测试

  • 🧹 清理之前的构建产物
  • 🔍 TypeScript 类型检查
  • 📋 ESLint 代码质量检查(尝试自动修复)
  • 🔨 项目编译
  • 🧪 测试执行(如果未跳过)
  • 📦 包完整性验证

3. 版本管理

  • 📊 显示当前版本
  • 🎯 交互式或自动化版本类型选择
  • 📈 计算并预览新版本
  • ✅ 用户确认版本更新
  • 📝 更新 package.json

4. Git 操作

  • 💾 提交版本更改
  • 🏷️ 创建版本标签(v1.0.0 格式)
  • ⬆️ 推送提交和标签到远程

5. NPM 发布

  • 📤 发布包到 NPM registry
  • ⏳ 等待 registry 传播
  • ✅ 验证发布成功

错误处理和回滚

自动化脚本包含全面的错误处理:

  • 失败时自动回滚(尽可能)
  • 版本回滚 - 恢复 package.json 更改
  • Git 回滚 - 删除提交和标签
  • 详细错误日志 - release.log 中的完整审计记录
  • 优雅失败 - 带有有用错误信息的干净退出

日志记录

所有发布操作都记录到 release.log,包含:

  • 所有操作的时间戳
  • 逐步执行详情
  • 错误信息和堆栈跟踪
  • 发布持续时间和摘要

手动发布步骤

对于那些喜欢手动控制或需要了解底层流程的人,这里是逐步的手动方法。

发布前检查清单

1. 验证包配置

检查你的 package.json 文件:

{
  "name": "react-native-advanced-flatlist",
  "version": "1.0.0",
  "main": "lib/index.js",
  "types": "lib/index.d.ts",
  "files": [
    "lib/",
    "src/",
    "README.md",
    "LICENSE"
  ]
}

2. 代码验证

# 确保所有代码已提交
git status

# 确保你在正确的分支上(最好是 main/master)
git branch

# 验证你已登录 npm
npm whoami

3. 构建和验证(必需 ✅)

# 清理旧的构建文件(推荐)
npm run clean

# 重新构建项目(必需!)
npm run build
# 这会将 TypeScript 编译为 JavaScript + 类型定义

4. 包内容验证(强烈推荐 ⭐)

# 预览将发布的内容而不创建实际文件
npm run publish:check
#
npm pack --dry-run

# 这可以帮助你:
# - 验证文件列表是否正确
# - 检查包大小
# - 确认 .npmignore 配置
# - 避免发布错误的内容

5. 本地测试(可选)

cd example
npm install
npm link ../
# 发布前本地测试你的包

发布步骤

步骤 1: 版本管理

选择适当的版本更新:

# 用于 bug 修复 (1.0.1 → 1.0.2)
npm version patch

# 用于新功能 (1.0.1 → 1.1.0)
npm version minor

# 用于破坏性变更 (1.0.1 → 2.0.0)
npm version major

# 或手动编辑 package.json 中的版本

步骤 2: 发布到 npm

# 再次确认你已登录
npm whoami

# 确保是最新构建
npm run build

# 发布包
npm publish
# 你的包将发布到 npm

步骤 3: 发布后验证

# 验证发布成功
npm view react-native-advanced-flatlist

# 测试安装
npm install react-native-advanced-flatlist

步骤 4: Git 操作

# 推送版本标签到 git
git push --tags

# 推送代码更改
git push

GitHub 仓库设置

步骤 1: 初始化 Git 仓库

git init
git add .
git commit -m "Initial commit: React Native Advanced FlatList v1.0.0"

步骤 2: 创建 GitHub 仓库

  1. 进入 github.com
  2. 点击 "New repository"
  3. 仓库名称:react-native-advanced-flatlist
  4. 描述:"一个强大的 React Native FlatList 组件,支持分页、刷新、选择和加载状态"
  5. 设为 Public
  6. 不要使用 README 初始化(我们已经有了)
  7. 点击 "Create repository"

步骤 3: 连接本地仓库到 GitHub

git remote add origin https://github.com/yourusername/react-native-advanced-flatlist.git
git branch -M main
git push -u origin main

版本管理

语义化版本(SemVer)

遵循语义化版本:

  • Major (1.0.0 → 2.0.0): 破坏性变更
  • Minor (1.0.0 → 1.1.0): 新功能,向后兼容
  • Patch (1.0.0 → 1.0.1): Bug 修复,向后兼容

可用脚本

当前用于版本管理的 package.json 脚本:

{
  "scripts": {
    "release": "node scripts/release.js",
    "release:dry": "node scripts/release.js --dry-run",
    "release:patch-auto": "node scripts/release.js --version patch",
    "release:minor-auto": "node scripts/release.js --version minor",
    "release:major-auto": "node scripts/release.js --version major",
    "release:patch": "npm version patch && npm publish",
    "release:minor": "npm version minor && npm publish",
    "release:major": "npm version major && npm publish"
  }
}

故障排除

常见 npm 发布错误

403 Forbidden: 包名已存在

  • 解决方案:更改包名或联系所有者

402 Payment Required: 包名被保留

  • 解决方案:选择不同的名称

ENEEDAUTH: 未登录

  • 解决方案:运行 npm login

常见 Git 错误

Permission denied: SSH 密钥问题

  • 解决方案:使用 HTTPS URL 或设置 SSH 密钥

Repository not found: URL 错误

  • 解决方案:验证仓库 URL

自动化发布脚本问题

Working directory not clean: 有未提交的更改

  • 解决方案:提交或暂存你的更改

Build failed: TypeScript 编译错误

  • 解决方案:发布前修复 TypeScript 错误

Tests failed: 测试套件失败

  • 解决方案:修复失败的测试或更新测试配置

常见发布错误

1. 忘记构建

# ❌ 错误方法 - 使用旧的构建文件
npm publish

# ✅ 正确方法 - 新鲜构建
npm run build
npm publish

2. 包含不必要的文件

# 使用 npm pack --dry-run 检查文件包含
npm pack --dry-run

# 不应该包含:
# ❌ node_modules/
# ❌ .git/
# ❌ 测试文件
# ❌ .env 文件

# 应该包含:
# ✅ lib/ (编译文件)
# ✅ src/ (源文件)
# ✅ README.md
# ✅ package.json

3. 版本号问题

# ❌ 忘记更新版本
npm publish  # 会失败:版本已存在

# ✅ 正确的工作流程
npm version patch
npm publish

包验证命令

# 检查下载统计(发布后)
npm view react-native-advanced-flatlist downloads

# 检查包依赖
npm view react-native-advanced-flatlist dependencies

# 检查谁依赖你的包
npm view react-native-advanced-flatlist dependents

获取帮助

对于自动化发布脚本:

node scripts/release.js --help

检查详细日志:

cat release.log

最佳实践

开发工作流程

  1. 始终先测试 - 使用 npm run release:dry 验证流程
  2. 干净的工作树 - 发布前提交更改
  3. 审查更改 - 使用 npm run pack-test 检查将发布的内容
  4. 监控发布 - 验证包出现在 npmjs.com 上
  5. 保留日志 - 查看 release.log 中的任何警告或问题

版本管理

  1. 使用语义化版本 - 遵循 semver 版本选择指南
  2. 标记发布 - 使用 Git 标签进行版本管理
  3. 更新文档 - 保持 README 和 CHANGELOG 最新

测试和质量

  1. 发布前始终测试 - 使用 npm pack 并本地测试
  2. 保持 .npmignore 更新 - 不要发布不必要的文件
  3. 写好提交信息 - 用于版本跟踪
  4. 监控下载量 - 定期检查 npm 统计

自动化

  1. 首选自动化发布 - 使用 npm run release 保持一致性
  2. 使用试运行模式 - 执行前测试发布
  3. 审查自动化日志 - 检查 release.log 中的问题

安全注意事项

账户安全

  1. 启用 2FA - 使用双因素认证保护你的 npm 账户
  2. 使用自动化令牌 - 在 CI/CD 管道中使用令牌而非密码
  3. 作用域包 - 考虑使用作用域包(@yourname/package)

🔑 NPM 自动化令牌配置(绕过 2FA)

要启用完全自动化的发布而无需每次进行 2FA 验证,你必须配置一个启用了"绕过 2FA"选项的 NPM 自动化令牌。

步骤 1:创建细粒度访问令牌

  1. 访问 https://www.npmjs.com/settings/YOUR_USERNAME/tokens
  2. 点击 "Generate New Token""Granular Access Token"

步骤 2:配置令牌设置

设置 推荐值
Token name(令牌名称) auto-publish
Description(描述) 用于自动化发布
⚠️ Bypass two-factor authentication (2FA)(绕过双因素认证) 必须勾选此项
Allowed IP ranges(允许的 IP 范围) (可选)留空表示任何 IP
Permissions(权限) Read and write
Select packages(选择包) All packages 或特定包
Expiration Date(过期日期) 设置合理的过期时间(如 1 年)

步骤 3:生成并保存令牌

  1. 点击 "Generate token"
  2. 重要:立即复制令牌 - 它只会显示一次!
  3. 令牌格式:npm_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

步骤 4:在系统中配置令牌

选项 A:全局配置(推荐)

# 为你的用户全局设置令牌
npm config set //registry.npmjs.org/:_authToken=npm_YOUR_TOKEN_HERE

这会将令牌保存到 ~/.npmrc(Windows 上是 C:\Users\USERNAME\.npmrc)。

选项 B:项目级配置

在项目根目录创建 .npmrc 文件:

//registry.npmjs.org/:_authToken=${NPM_TOKEN}

然后设置环境变量:

# Windows PowerShell
$env:NPM_TOKEN="npm_YOUR_TOKEN_HERE"

# Windows CMD
set NPM_TOKEN=npm_YOUR_TOKEN_HERE

# Linux/Mac
export NPM_TOKEN=npm_YOUR_TOKEN_HERE

选项 C:CI/CD 环境

对于 GitHub Actions,将令牌添加为仓库密钥:

# .github/workflows/publish.yml
- name: Publish to npm
  run: npm publish
  env:
    NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

步骤 5:验证令牌配置

# 验证认证
npm whoami

# 应该输出你的 npm 用户名

令牌问题故障排除

错误:"401 Unauthorized"

原因:令牌无效、已过期或未勾选"绕过 2FA"。

解决方案

  1. 在 npmjs.com 上删除旧令牌
  2. 创建新令牌并勾选 ✅ "Bypass two-factor authentication (2FA)"
  3. 重新配置新令牌

错误:"403 Forbidden - Two-factor authentication required"

原因:创建令牌时未勾选"绕过 2FA"选项。

解决方案

  1. 访问 https://www.npmjs.com/settings/YOUR_USERNAME/tokens
  2. 删除有问题的令牌
  3. 创建新的细粒度访问令牌
  4. 重要:勾选 ✅ "Bypass two-factor authentication (2FA)"
  5. 重新配置新令牌

错误:"Access token expired or revoked"

原因:令牌已过期或被手动撤销。

解决方案

  1. 在 npmjs.com 上生成新令牌
  2. 更新 .npmrc 文件中的令牌

自动化令牌安全最佳实践

  1. 设置过期日期 - 不要使用永不过期的令牌
  2. 限制包作用域 - 如果可能,将令牌限制为特定包
  3. 使用 IP 限制 - 如果部署 IP 是静态的,添加允许的 IP 范围
  4. 定期轮换令牌 - 定期更换令牌
  5. 永不提交令牌 - 如果 .npmrc 包含令牌,将其添加到 .gitignore
  6. 使用环境变量 - 首选 ${NPM_TOKEN} 模式而非硬编码令牌

当前令牌状态

在此检查你的令牌状态:https://www.npmjs.com/settings/stark2018/tokens

令牌名称 创建时间 过期时间 绕过 2FA
auto-publish 2025年12月24日 2026年3月24日 ✅ 已启用

代码安全

  1. 审查依赖 - 定期审计依赖项的漏洞
  2. 永不暴露凭据 - 脚本永不暴露 NPM 凭据
  3. 使用试运行验证 - 所有操作都可以在试运行模式下审查

发布安全

  1. 回滚功能 - 最小化部分发布的风险
  2. 全面日志 - 为所有操作提供审计记录
  3. 仓库权限 - Git 操作需要适当的权限

发布后任务

更新包信息

用正确的 GitHub URL 更新你的 package.json

{
  "repository": {
    "type": "git",
    "url": "https://github.com/yourusername/react-native-advanced-flatlist.git"
  },
  "bugs": {
    "url": "https://github.com/yourusername/react-native-advanced-flatlist/issues"
  },
  "homepage": "https://github.com/yourusername/react-native-advanced-flatlist#readme"
}

创建 GitHub Release

  1. 进入你的 GitHub 仓库
  2. 点击 "Releases" → "Create a new release"
  3. 标签版本:v1.0.0
  4. 发布标题:v1.0.0 - 首次发布
  5. 描述:从 CHANGELOG.md 复制
  6. 点击 "Publish release"

文档和推广

添加 README 徽章

将这些徽章添加到你的 README.md:

[![npm version](https://badge.fury.io/js/react-native-advanced-flatlist.svg)](https://badge.fury.io/js/react-native-advanced-flatlist)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg)](http://www.typescriptlang.org/)

创建可视化文档

  • 创建演示 GIF/截图
  • 添加组件运行时的可视化示例
  • 在 README 中包含代码示例

推广你的包

  • 在 Twitter 上分享
  • 在 Reddit 上分享(r/reactnative)
  • 在 React Native 社区论坛发帖
  • 添加到 awesome-react-native 列表
  • 写关于你的包的博客文章

维护

定期任务

  1. 更新依赖 - 保持依赖项最新
  2. 监控问题 - 回应 GitHub issues 和 npm 反馈
  3. 安全更新 - 及时处理安全漏洞
  4. 文档 - 随新功能更新文档
  5. 审查自动化 - 定期检查发布脚本性能

版本管理

  • Patch (1.0.1): Bug 修复,向后兼容
  • Minor (1.1.0): 新功能,向后兼容
  • Major (2.0.0): 破坏性变更

成功指标

跟踪你的包成功情况:

  1. npm 下载量: 检查每周/每月下载量
  2. GitHub stars: 监控仓库星标
  3. Issues/PRs: 社区参与度
  4. Dependents: 其他使用你的包的包

废弃流程

如果需要废弃一个版本:

# 废弃特定版本
npm deprecate react-native-advanced-flatlist@1.0.0 "此版本存在安全漏洞"

# 废弃所有版本
npm deprecate react-native-advanced-flatlist "包不再维护"

成功检查清单

  • 包构建成功(npm run build
  • 所有文件包含在构建中(npm run pack-test
  • README 内容完整
  • 版本号正确
  • Git 仓库干净并已打标签
  • npm 登录成功(npm whoami
  • 包发布成功
  • 安装测试通过(npm install package-name
  • 文档链接有效
  • GitHub release 已创建(如适用)
  • 自动化脚本已测试(npm run release:dry

文件结构参考

你发布的包将包含:

react-native-advanced-flatlist/
├── lib/                    # 编译后的 JavaScript 和 TypeScript 定义
│   ├── index.js
│   ├── index.d.ts
│   ├── AdvancedFlatList.js
│   └── AdvancedFlatList.d.ts
├── src/                    # 源 TypeScript 文件
│   ├── index.ts
│   └── AdvancedFlatList.tsx
├── scripts/                # 发布自动化
│   └── release.js
├── package.json
├── README.md
├── CHANGELOG.md
└── LICENSE

快速参考

最常用命令

# 自动化发布(推荐)
npm run release

# 测试发布流程
npm run release:dry

# 快速 patch 发布
npm run release:patch-auto

# 手动发布
npm version patch
npm publish

# 获取帮助
node scripts/release.js --help

祝你包发布顺利! 🚀

如有自动化发布系统的问题,请检查 release.log 文件或使用 --dry-run 进行故障排除。

下一步

  1. 考虑添加全面的测试
  2. 设置 CI/CD 管道(GitHub Actions)
  3. 添加更多使用示例
  4. 创建视频教程
  5. 写技术博客文章
  6. 参与 React Native 社区讨论

你的包现已上线,可供 React Native 社区使用!🚀


未来发布的快速开始:

# 进行你的更改
git add .
git commit -m "你的更改"

# 发布(选择适当的版本类型)
npm run release

自动化脚本会处理其余一切!