组件、Hook、命名、提交、目录的核心代码风格规范
这些规则在
CLAUDE.md/AGENTS.md中定义,违反视为代码错误,CodeReview 不通过。
const Portal = (props: PortalProps) => {
// ...
};❌ 不允许函数声明:
function Portal(props: PortalProps) {}interface,每个字段必须有注释interface PortalProps {
/** 是否在容器不存在时自动创建 */
autoCreate?: boolean;
/** 传送门内容 */
children: ReactNode;
/** 容器 ID 或 CSS 选择器 */
container: string | HTMLElement;
}注释要解释意图,而不是重复 TS 类型。
const Portal = (props: PortalProps) => {
const { autoCreate = false, children, container } = props;
// ...
};❌ 禁止:
const Portal = ({ autoCreate, children }: PortalProps) => {};理由:
const Portal = (props: PortalProps) => {
function findTargetElement() {
// ...
}
// ...
};理由:清晰的执行意图、避免闭包污染、栈追踪更友好。
useCallback —— 禁止使用useCallback 不应该出现在 React 组件代码中。理由:
useCallback 是过度优化;React.memo 解决;useMemo —— 仅允许两种场景其他都禁止。判断标准是「这个 memo 拿掉会不会让代码变慢到用户可感知」——回答不出来就是不该写。
react-hooks/exhaustive-deps —— 默认禁止 disable仅在以下条件同时满足时可禁用:
禁用必须放在文件顶部:
/* eslint-disable react-hooks/exhaustive-deps */useState vs useRef| 用途 | 选择 |
|---|---|
| 影响渲染 | useState |
| 不影响渲染(命令式 / 生命周期 / 可变状态) | useRef |
不要混用。如果一个值变化频繁但不应触发重绘(如鼠标位置追踪),用 useRef。
useEffect 必须有明确意图Effect 表示:
读到 Effect 时其目的必须显而易见,副作用必须本地化,创建的资源必须有 cleanup。
不要用 Effect 去模拟「事件回调」或「派生状态」——前者放到 handler,后者直接在 render 里算。
所有包统一使用 @skyroc/* scope。包名与目录的映射规则见 命名规范;代码内部的命名风格如下:
| 类别 | 风格 | 示例 |
|---|---|---|
| 包名 | @skyroc/<kebab-case> | @skyroc/web-ui |
| 文件 | kebab-case.ts | use-table.ts |
| 组件文件 | PascalCase.tsx | AdminLayout.tsx |
| 组件 | PascalCase | <AdminLayout /> |
| Hook | useXxx 驼峰 | useAdminState |
| Types | PascalCase | UserInfo |
| 常量 | UPPER_SNAKE_CASE | DEFAULT_THEME_COLOR |
详见 命名规范。
| 项 | 约定 |
|---|---|
interface vs type | 数据结构 / props 用 interface;联合 / 工具类型用 type |
import type | 启用 verbatimModuleSyntax,强制 |
| 全局命名空间 | Api.*、Router.*、App.*、Theme.*,不要重复 import |
| 严格度 | 全仓库 strict + noUncheckedIndexedAccess |
禁用 any | 工具未禁,但 review 不放过 |
新代码该放进哪个平台目录,见 平台优先目录 与 新建包流程 的决策树。包内部的结构则强烈建议统一成:
<pkg>/
├── src/
│ ├── index.ts # 主入口
│ ├── <subentry>.ts # 子入口(如有)
│ ├── components/ # 组件
│ ├── hooks/ # hooks
│ ├── utils/ # 工具
│ └── types/ # 类型
├── __tests__/
├── README.md
├── package.json
└── tsconfig.json遵循 Conventional Commits(<type>(<scope>): <subject>),用 pnpm commit 走交互式表单生成。type 取值表、scope 写法、changelog 与发版流程见 Git 提交与发版。
partitionByNewline: true);console.log(scripts 包豁免,logger 包用 console.* 是实现)。| 优先级 | 内容 |
|---|---|
| 1(最高) | 用户直接指令 |
| 2 | CLAUDE.md / AGENTS.md / Project Rules |
| 3 | 本文档 |
| 4 | 工具默认行为 |
底层冲突以本文档为准;本文档与项目 Rules 冲突以 Rules 为准。
Last updated on