mcpField
B
bulletproof-react-components

bulletproof-react-components

github.com/codewithshreyans开发043 次安装6 周前更新
代码仓库

关于 bulletproof-react-components

这项技能用九种模式指导构建和审查可复用 React 组件,涵盖 SSR、水合、渲染、Portal 和稳定状态,并提供规则、清单及详细示例。

主要功能

  1. 01涵盖 React 的九种健壮模式
  2. 02快速规则与发布前清单
  3. 03patterns.md 中的详细示例
  4. 04按固定表格呈现审查结果

适用场景

  1. 01发布前审查可复用组件
  2. 02避免服务端渲染时调用浏览器 API
  3. 03检查组件实例间的 ID 与状态

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/codewithshreyans/skills --skill bulletproof-react-components

安装后在 Claude Code 中输入/bulletproof-react-components确认已加载。

附带文件references/patterns.md

详细介绍

Bulletproof React Components

九种模式,确保 React 组件在超出理想情况的真实环境中依然可靠——SSR、水合、并发渲染、门户等。

来源:shud.in/thoughts/build-bulletproof-react-components

工作原理

  1. 编写或审查可复用的 React 组件时,请参阅下方的快速规则
  2. 查看 ./references/patterns.md,了解代码示例和详细说明
  3. 发布前逐项检查检查清单

快速规则

#模式规则
1服务端安全渲染期间绝不调用浏览器 API(localStorage、window、document)。请使用 useEffect。
2水合安全注入同步的内联 <script>,在 React 水合前设置依赖客户端的值。
3实例安全所有生成的 ID 都使用 useId()。可复用组件中绝不硬编码 ID。
4并发安全使用 React.cache() 包装服务端数据获取,以便在每个请求内去重调用。
5组合安全使用 Context 替代 React.cloneElement()——cloneElement 与 Server Components、lazy 和 memo 不兼容。
6门户安全使用 ref.current?.ownerDocument.defaultView || window 添加事件监听器,而不是全局 window。
7过渡安全使用 startTransition() 包装状态更新,以启用 View Transition API 动画。
8Activity 安全当 <Activity> 将 DOM 隐藏时,使用 useLayoutEffect 禁用 DOM 副作用(例如 <style> 标签)。
9面向未来使用 useState(() => value) 保持标识稳定。useMemo 只是性能提示——React 可能会丢弃它。

检查清单

构建可复用的 React 组件时,请确认:

  • 渲染期间不调用浏览器 API(服务端安全)
  • 客户端存储值不会出现水合闪烁(水合安全)
  • 不硬编码 ID;使用 useId()(实例安全)
  • 服务端数据获取使用 cache() 包装(并发安全)
  • 使用 Context 替代 cloneElement(组合安全)
  • 事件监听器使用 ownerDocument.defaultView(门户安全)
  • 在需要时使用 startTransition() 包装状态更新(过渡安全)
  • DOM 副作用遵循 <Activity> 的可见性(Activity 安全)
  • 稳定值使用 useState 初始化函数,而非 useMemo(面向未来)

向用户展示结果

根据这些模式审查组件时,按以下格式输出:

**Bulletproof Check: `<ComponentName>`**

| Pattern | Status | Notes |
|---------|--------|-------|
| Server-Proof | PASS/FAIL | ... |
| ... | ... | ... |

**Suggested fixes:**
1. ...

参考资料

  • ./references/patterns.md — 九种模式的详细代码示例(错误/正确)

评论

支持 Markdown