211 lines
5.6 KiB
Markdown
211 lines
5.6 KiB
Markdown
# FSD前端架构设计技能
|
||
|
||
`前端架构` `Feature-Sliced Design` `Codex` `React` `代码组织`
|
||
|
||
# Codex 的 Feature-Sliced Design 技能(v2.1)
|
||
|
||
本技能帮助 Codex 将 Feature-Sliced Design(FSD)v2.1 架构方法论应用于前端项目。
|
||
|
||
## v2.1 新增内容
|
||
|
||
**核心更新**:**"页面优先"**方法。
|
||
|
||
- 在需要复用之前,将代码保留在使用它的地方。
|
||
- 从 `pages` 和 `widgets` 开始;仅在真正复用时才提取到 `features` 或 `entities`。
|
||
- 提升内聚性,简化重构,加快开发速度。
|
||
|
||
## 本技能包含的内容
|
||
|
||
- 6 个活跃 FSD 层(`app`、`pages`、`widgets`、`features`、`entities`、`shared`)的完整指南
|
||
- **v2.1 新增**:"页面优先"代码放置策略
|
||
- **v2.1 新增**:实体间跨导入的公共 API(`@x` 符号)
|
||
- **v2.1 新增**:`shared` 中感知应用的代码
|
||
- 层/切片/片段的组织规则
|
||
- 公共 API 模式与最佳实践
|
||
- React、Redux、React Query 和 Next.js 示例
|
||
- 需要避免的反模式(包括过早提取)
|
||
- 从 v2.0 迁移到 v2.1 的策略
|
||
- 正确放置代码的决策框架
|
||
- Steiger 架构 lint 工具集成
|
||
|
||
## 安装
|
||
|
||
### 为 Codex 本地安装
|
||
|
||
1. 创建自定义技能目录:
|
||
```bash
|
||
mkdir -p ~/.codex/skills
|
||
```
|
||
|
||
2. 复制为单个技能文件:
|
||
```bash
|
||
cp SKILL.md ~/.codex/skills/feature-sliced-design.md
|
||
```
|
||
|
||
3. 或复制为技能文件夹:
|
||
```bash
|
||
mkdir -p ~/.codex/skills/feature-sliced-design
|
||
cp SKILL.md ~/.codex/skills/feature-sliced-design/
|
||
cp -r agents ~/.codex/skills/feature-sliced-design/
|
||
```
|
||
|
||
### 替代方法
|
||
|
||
将 `feature-sliced-design-skill` 文件夹放置在项目根目录,并指定 Codex 使用它。
|
||
|
||
## 使用方式
|
||
|
||
在以下情况下,该技能将自动触发:
|
||
|
||
- 提及"FSD"、"Feature-Sliced Design"或"feature sliced"
|
||
- 创建新的前端结构
|
||
- 重构现有代码
|
||
- 讨论架构或代码组织方式
|
||
- 询问某段代码应该放在哪里
|
||
- 解决跨导入或依赖问题
|
||
- 拆解功能或组件
|
||
|
||
## 使用示例
|
||
|
||
### 示例 1:创建新功能(v2.1 方式)
|
||
```
|
||
用户:"创建一个个人资料编辑表单"
|
||
Codex:我将把它放在 pages/profile/,因为它只在这个页面使用。
|
||
如果之后需要复用,我们可以将其移动到 features/。
|
||
```
|
||
|
||
### 示例 2:使用页面优先方式重构
|
||
```
|
||
用户:"我在 features/ 中有一个 UserProfile 组件,但它只在一个页面上使用"
|
||
Codex:在 v2.1 中,它应该移回 pages/。features 应包含可复用的交互逻辑。
|
||
```
|
||
|
||
### 示例 3:项目初始化
|
||
```
|
||
用户:"帮我搭建一个使用 FSD v2.1 的新 React 项目"
|
||
Codex:[创建结构、配置路径别名、解释页面优先原则]
|
||
```
|
||
|
||
### 示例 4:跨导入
|
||
```
|
||
用户:"实体 User 需要引用 Order"
|
||
Codex:使用 @x 符号在实体之间进行显式跨导入。
|
||
```
|
||
|
||
## v2.1 核心概念
|
||
|
||
### 页面优先方法
|
||
```
|
||
1. 从 pages/ 开始,将代码保留在使用它的位置附近。
|
||
2. 仅在真正复用时才提取到 features/entities。
|
||
3. 不要预测未来的复用需求;等待真实的重复出现。
|
||
```
|
||
|
||
### 层结构
|
||
```
|
||
app/ <- 应用初始化
|
||
pages/ <- 包含自身逻辑的页面
|
||
widgets/ <- 包含自身逻辑的复合 UI 块
|
||
features/ <- 可复用的业务交互
|
||
entities/ <- 可复用的业务实体
|
||
shared/ <- 基础设施与感知应用的共享代码
|
||
```
|
||
|
||
**注意**:`processes/` 层在 v2.1 中已废弃。
|
||
|
||
### 导入规则
|
||
模块只能从更低层级导入:
|
||
- `features/` -> `entities/`、`shared/`
|
||
- `entities/` 不得从 `features/` 导入
|
||
|
||
### 公共 API
|
||
每个切片应通过 `index.ts` 暴露公共 API:
|
||
```typescript
|
||
// features/auth/index.ts
|
||
export { LoginForm } from './ui/LoginForm';
|
||
export { useAuth } from './model/useAuth';
|
||
```
|
||
|
||
## 典型项目结构
|
||
|
||
```text
|
||
src/
|
||
├── app/
|
||
├── pages/
|
||
├── widgets/
|
||
├── features/
|
||
├── entities/
|
||
└── shared/
|
||
```
|
||
|
||
## 支持的技术栈
|
||
|
||
- React
|
||
- Vue
|
||
- Angular
|
||
- Svelte
|
||
- Next.js
|
||
- Redux / Redux Toolkit
|
||
- React Query
|
||
- MobX
|
||
- TypeScript
|
||
- Vite
|
||
- Create React App
|
||
|
||
## 附加工具
|
||
|
||
### Steiger——FSD 架构 lint 工具
|
||
|
||
[Steiger](https://github.com/feature-sliced/steiger) 是验证 FSD 规则的官方工具:
|
||
|
||
```bash
|
||
npm install -D @feature-sliced/steiger
|
||
npx steiger src
|
||
```
|
||
|
||
检查内容包括:
|
||
- 导入规则违反
|
||
- 公共 API 使用情况
|
||
- 跨导入违规
|
||
- 层结构一致性
|
||
|
||
## 资源
|
||
|
||
- [FSD 官方文档](https://feature-sliced.design/)
|
||
- [FSD 文档仓库](https://github.com/feature-sliced/documentation)
|
||
- [Steiger lint 工具](https://github.com/feature-sliced/steiger)
|
||
- [FSD 示例](https://feature-sliced.design/examples)
|
||
|
||
## 从 FSD v2.0 迁移到 v2.1
|
||
|
||
迁移是非破坏性的,可以逐步进行:
|
||
|
||
1. 审查现有代码。
|
||
2. 将页面专属逻辑移回 `pages/`。
|
||
3. 将 widget 专属逻辑保留在 `widgets/`。
|
||
4. 在 `features/` 和 `entities/` 中只保留真正可复用的逻辑。
|
||
5. 在 `shared` 中更新基础设施和应用级常量。
|
||
6. 移除已废弃的 `processes/` 用法。
|
||
|
||
## 故障排查
|
||
|
||
### 技能未激活
|
||
- 确认文件/文件夹位于预期的技能目录中。
|
||
- 确认命名正确。
|
||
- 重启 Codex。
|
||
|
||
### 不确定代码应放在哪里
|
||
询问 Codex:"在 FSD 中,[代码描述] 应该放在哪里?"
|
||
|
||
### 导入规则违反
|
||
该技能应能识别违规并提出修复方案。
|
||
|
||
## 许可证
|
||
|
||
本技能基于 Feature-Sliced Design 官方文档,可自由使用。
|
||
|
||
---
|
||
|
||
**重要**:本技能遵循 FSD v2.1 和"页面优先"方法。请将其视为实用指南,而非一成不变的规则。
|
||
|
||
**黄金法则(v2.1)**:从 `pages/widgets` 开始;仅当真正的复用需求出现时,才提取到 `features/entities`。 |