移动/游戏
新建 Expo 应用时如何规划目录结构(Expo…
在脚手架或布局一个全新的 Expo 项目(使用 Expo Router)时,决定各类文件应放在哪里。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
新建 Expo 应用时如何规划目录结构(通用
解决思路
- 仅用于全新项目:若应用已有目录布局,遵循其现有约定,不要移动文件;不确定项目是否为新项目时,先询问再动任何文件。
- 将应用代码放在 src/ 下,与配置文件分离;Expo Router 同时支持 app/ 和 src/app/,切换时移动文件夹并重启打包器;默认模板在 tsconfig.json 中把 @/* 别名指向 ./src/*。
- 保持 src/app 仅存放路由:其中每个文件都会成为一条路由,其他内容一律放到同级文件夹中。
- 把可复用的通用 UI(button、card、table)放在 src/components/,每个组件一个具名导出;文件名用 kebab-case(如 bar-chart.tsx),与默认 create-expo-app 模板一致。
- 当组件变大时,为它单独建文件夹,根文件为 index.tsx,并把其私有子组件就近放在旁边,导入路径(@/components/table)保持不变。
- 把复杂且不复用的屏幕 UI 放在 src/screens/,让每个路由文件只渲染对应屏幕(如 import { Home } from "@/screens/home"; export default function HomeScreen() { return <Home />; }),路由文件只处理路由相关逻辑(如读取 URL 参数)。
- 把屏幕的私有组件就近放在其文件夹内(screens/home/components/);同一屏幕可被多条路由复用。
- 在 app/ 中的文件追加 +api 后缀即可成为服务端 API 路由;把所有 API 路由归到 app/api/ 下(如 /api/user、/api/settings),避免与同名页面路由冲突。
- 把共享的服务端专用辅助代码放在 src/server/;服务端代码运行在类 Node 环境,可读取密钥环境变量(process.env.X,而非仅 EXPO_PUBLIC_*)。
- 考虑用 ESLint 规则把 +api 文件和 server/ 与仅前端的检查隔离。
- 平台差异较小时用 Platform.select / Platform.OS;差异较大时拆分为平台文件(如 bar-chart.tsx + bar-chart.web.tsx),导入时不带扩展名(@/components/bar-chart),由 Metro 按目标平台选择。
- 平台变体之间 props 必须完全一致;必须始终提供一个无平台扩展名的默认文件,若组件仅支持单平台则让其成为 no-op;支持的扩展名有 .ios、.android、.native、.web。
- 样式:把 StyleSheet.create({ ... }) 对象放在组件文件底部,而不是单独的 .styles 文件。
- 测试:把 format-date.test.ts 放在 format-date.ts 旁边(优于单独的 __tests__/ 文件夹),便于一眼看出被测文件。
- AI 与配置文件放在仓库根目录:AGENTS.md / CLAUDE.md,项目技能放在 .claude/ 下;其他配置与资源留在 src/ 之外:app.json / app.config.ts、eas.json、package.json、assets/、scripts/。
适用边界 · 注意事项
- 不要用于已有既定目录结构的现有应用——绝不为了套用此结构而重构现有应用。
- 不确定项目是否为新项目时,不要移动任何文件,先询问。
- 不要把非路由文件放进 src/app(每个文件都会成为路由),也不要把服务端代码与前端代码混在一起。