Loading...
Loading...
Compare original and translation side by side
| Official FSD | This Skill (Next.js) |
|---|---|
| |
| |
| Separate routing layer | Next.js file-based routing ( |
src/app/layout.tsxpage.tsxpage.tsx@/views| 官方FSD | 本方案(适配Next.js) |
|---|---|
| |
| |
| 独立的路由层 | Next.js 基于文件的路由( |
src/app/layout.tsxpage.tsxpage.tsx@/viewssrc/app/src/app/src/app/layout.tsxpage.tsxsrc/app/src/app/src/app/src/app/layout.tsxpage.tsxsrc/app//src/views/src/app//src/views/src/app/featuresapp┌─────────────────┐
│ app │ ← Can import from all layers below
├─────────────────┤
│ views │ ← Can import: widgets, features, entities, shared
├─────────────────┤
│ widgets │ ← Can import: features, entities, shared
├─────────────────┤
│ features │ ← Can import: entities, shared
├─────────────────┤
│ entities │ ← Can import: shared only
├─────────────────┤
│ shared │ ← Cannot import from any FSD layer
└─────────────────┘featuresapp┌─────────────────┐
│ app │ ← 可导入所有下层模块
├─────────────────┤
│ views │ ← 可导入:widgets、features、entities、shared
├─────────────────┤
│ widgets │ ← 可导入:features、entities、shared
├─────────────────┤
│ features │ ← 可导入:entities、shared
├─────────────────┤
│ entities │ ← 仅可导入:shared
├─────────────────┤
│ shared │ ← 不可导入任何FSD分层模块
└─────────────────┘src/app/layout.tsxpage.tsxpage.tsx@/viewssrc/views/src/app/layout.tsxpage.tsxpage.tsx@/viewssrc/views/views/dashboardwidgets/headerfeatures/authentities/userindex.tsexport * fromviews/dashboardwidgets/headerfeatures/authentities/userindex.tsexport * fromcomponentshookstypesutilsapiuilibconfigi18nroutescomponentshookstypesutilsapiuilibconfigi18nroutes| Target | Convention | Example |
|---|---|---|
| Folders, slices | kebab-case | |
| Component files | kebab-case | |
| Hook files | camelCase | |
| Store files | camelCase | |
| Function/API collections | camelCase | |
| 目标 | 规范 | 示例 |
|---|---|---|
| 文件夹、切片 | kebab-case | |
| 组件文件 | kebab-case | |
| Hook文件 | camelCase | |
| 状态管理文件 | camelCase | |
| 函数/API集合 | camelCase | |
src/app/src/app/my-nextjs-app/
├── src/
│ ├── app/ # Next.js routing + FSD App layer
│ │ ├── layout.tsx
│ │ ├── page.tsx
│ │ ├── dashboard/page.tsx
│ │ ├── providers/
│ │ └── styles/
│ ├── views/
│ ├── widgets/
│ ├── features/
│ ├── entities/
│ └── shared/
│ ├── ui/
│ ├── lib/
│ └── api/
└── package.json// src/app/dashboard/page.tsx
import { DashboardView } from '@/views/dashboard';
export default function DashboardPage() {
return <DashboardView />;
}src/app/src/app/my-nextjs-app/
├── src/
│ ├── app/ # Next.js路由 + FSD App层
│ │ ├── layout.tsx
│ │ ├── page.tsx
│ │ ├── dashboard/page.tsx
│ │ ├── providers/
│ │ └── styles/
│ ├── views/
│ ├── widgets/
│ ├── features/
│ ├── entities/
│ └── shared/
│ ├── ui/
│ ├── lib/
│ └── api/
└── package.json// src/app/dashboard/page.tsx
import { DashboardView } from '@/views/dashboard';
export default function DashboardPage() {
return <DashboardView />;
}mkdir -p src/{app,views,widgets,features,entities,shared}
mkdir -p src/app/{providers,styles,config}
mkdir -p src/shared/{ui,lib,api,config}mkdir -p src/{app,views,widgets,features,entities,shared}
mkdir -p src/app/{providers,styles,config}
mkdir -p src/shared/{ui,lib,api,config}entities/{name}/model/entities/{name}/api/index.tsentities/{name}/model/entities/{name}/api/index.tsfeatures/{name}/features/{name}/widgets/{name}/widgets/{name}/views/{name}/views/{name}/page.tsx@/views/{slice}page.tsx@/views/{slice}index.ts// ✅ Correct
import { LoginForm } from '@/features/auth';
// ❌ Wrong (deep import)
import { LoginForm } from '@/features/auth/ui/LoginForm';index.ts// ✅ 正确写法
import { LoginForm } from '@/features/auth';
// ❌ 错误写法(深层导入)
import { LoginForm } from '@/features/auth/ui/LoginForm';index.tsexport * fromtypes.tsutils.tscomponents/features/product-searchfeatures/search-bar-componentindex.tsexport * fromtypes.tsutils.tscomponents/features/product-searchfeatures/search-bar-componenttsconfig.json.nextnpm installtsconfig.json.nextnpm install{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/app/*": ["src/app/*"],
"@/views/*": ["src/views/*"],
"@/widgets/*": ["src/widgets/*"],
"@/features/*": ["src/features/*"],
"@/entities/*": ["src/entities/*"],
"@/shared/*": ["src/shared/*"]
}
},
"include": ["src"]
}{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/app/*": ["src/app/*"],
"@/views/*": ["src/views/*"],
"@/widgets/*": ["src/widgets/*"],
"@/features/*": ["src/features/*"],
"@/entities/*": ["src/entities/*"],
"@/shared/*": ["src/shared/*"]
}
},
"include": ["src"]
}'no-restricted-imports': ['error', {
patterns: [{
group: ['@/views/*', '@/widgets/*'],
message: 'Features cannot import from views or widgets',
}],
}]'no-restricted-imports': ['error', {
patterns: [{
group: ['@/views/*', '@/widgets/*'],
message: 'Features cannot import from views or widgets',
}],
}]