# xinxin-app
**Repository Path**: chen_jialin123/xinxin-app
## Basic Information
- **Project Name**: xinxin-app
- **Description**: xinxinca-app
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 2
- **Created**: 2026-08-12
- **Last Updated**: 2026-08-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Expo App + Express.js
## 目录结构规范(严格遵循)
当前仓库是一个 monorepo(基于 pnpm 的 workspace)
- Expo 代码在 client 目录,Express.js 代码在 server 目录
- 本模板默认无 Tab Bar,可按需改造
├── client/ # React Native 前端代码
│ ├── app/ # Expo Router 路由目录(仅路由配置)
│ │ ├── _layout.tsx # 根布局文件(必需,务必阅读)
│ │ └── index.tsx # 首页
│ ├── screens/ # 页面实现目录(与 app/ 路由对应)
│ │ └── demo/ # 示例页面
│ │ └── index.tsx
│ ├── components/ # 可复用组件
│ │ └── Screen.tsx # 页面容器组件(必用)
│ ├── hooks/ # 自定义 Hooks
│ ├── contexts/ # React Context 代码
│ ├── utils/ # 工具函数
│ ├── assets/ # 静态资源
| └── package.json # Expo 应用 package.json
├── server/ # 服务端代码根目录 (Express.js)
| ├── src/
│ │ └── index.ts # 服务端入口文件
| └── package.json # 服务端 package.json
├── package.json
├── .cozeproj # 预置脚手架脚本(禁止修改)
└── .coze # 配置文件(禁止修改)
## 样式方案
基于 tailwindcss 进行样式开发(底层基于 Uniwind)
写法示例:
```tsx
```
```tsx
Hello World
```
Uniwind 官方文档:https://docs.uniwind.dev/llms.txt
## 如何进行静态校验(TSC + ESLint)
```bash
# 对 client 和 server 目录同时进行校验
pnpm -w lint:all
# 对 client 目录进行校验
pnpm -w lint:client
# 对 server 目录进行校验
pnpm -w lint:server
```
## 如何修改主题模式(跟随系统、固定暗色、固定亮色)
默认为跟随系统,如果用户明确指定为“暗色”或“亮色”,需要修改 `client/components/ColorSchemeUpdater.tsx` 的 `DEFAULT_THEME` 变量为合适的值
## 如何定制主题 design tokens
当前项目的**设计系统**基于 tailwindcss 实现,核心入口文件为 `client/global.css`,如果需要定制主题,应该**阅读并修改 `client/global.css` 文件**
## 路由及 Tab Bar 实现规范
### 方案一:无 Tab Bar(Stack 导航)
适用于线性流程应用,采用简化的目录结构:
```
client/app/
├── _layout.tsx # 根布局(Stack 导航配置)
├── index.tsx # 应用入口
├── detail.tsx # 详情页(通过 params 传递数据)
└── +not-found.tsx # 404 页面
```
**根布局配置** `client/app/_layout.tsx`:
以下仅为代码片段供写法参考
```tsx
```
**应用入口** `client/app/index.tsx`:
```tsx
export { default } from "@/screens/home";
```
> **禁止事项**:无 Tab Bar 场景下,不得创建 `(tabs)` 目录。
### 方案二:有 Tab Bar(Tabs 导航)
采用路由分组实现底部导航栏:
```
client/app/
├── _layout.tsx # 根布局
├── (tabs)/
│ ├── _layout.tsx # Tab 导航配置
│ ├── index.tsx # 默认 Tab(必须存在)
│ ├── discover.tsx # 发现页
│ └── profile.tsx # 个人中心
├── detail.tsx # Tab 外的独立页面(通过 params 传递数据)
└── +not-found.tsx
```
> **⚠️ [CRITICAL]**: `app/index.tsx` 优先级高于 `(tabs)/index.tsx`,会导致首页无 Tab Bar。**当有(tabs)/index.tsx时必须删除 `app/index.tsx`**。
**根布局配置** `client/app/_layout.tsx`:
以下仅为代码片段供写法参考
```tsx
```
**应用入口** `client/app/(tabs)/index.tsx`:
```tsx
export { default } from "@/screens/home";
```
**Tab 布局配置** `client/app/(tabs)/_layout.tsx`:
```tsx
import { Tabs } from 'expo-router';
import { Platform } from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { FontAwesome6 } from '@expo/vector-icons';
import { useCSSVariable } from 'uniwind';
export default function TabLayout() {
const insets = useSafeAreaInsets();
const [background, muted, accent, border] = useCSSVariable([
'--color-background',
'--color-muted',
'--color-accent',
'--color-border',
]) as string[];
let tabBarStyle = {
backgroundColor: background,
borderTopWidth: 1,
borderTopColor: border,
};
// 用于修复 Web 上高度异常的问题(这个 if 逻辑必须添加)
if (Platform.OS === 'web') {
tabBarStyle = {
...tabBarStyle,
height: 'auto',
}
}
return (
{/* name 必须与文件名完全一致 */}
(
),
}}
/>
(
),
}}
/>
(
),
}}
/>
);
}
```
**Tab 页面文件** `client/app/(tabs)/index.tsx`:
```tsx
export { default } from "@/screens/home";
```
### 注意事项
在改动 `client/app/_layout.tsx` 前,必须先阅读该文件,再进行修改操作
以下是需要保留的重要逻辑
- 保留 global.css 引入(tailwindcss 生效的关键)
- 保留 Provider 的使用
## 依赖管理与模块导入规范
### 依赖安装
**禁止**使用 `npm` 或 `yarn`,按目录区分安装命令:
| 目录 | 安装命令 | 说明 |
|------|----------|------|
| `client/` | `npx expo install ` | Expo 会自动选择与 SDK 兼容的版本 |
| `server/` | `pnpm add ` | 使用 pnpm 管理后端依赖 |
```bash
# client 目录(Expo 项目)
cd client && npx expo install expo-camera expo-image-picker
# server 目录(Express 项目)
cd server && pnpm add axios cors
```
**网络问题处理**:`npx expo install` 可能因网络原因失败,失败时重试 2 次,仍失败则改用 `pnpm add` 安装
## Expo 开发规范
### 路径别名
Expo 配置了 `@/` 路径别名指向 `client/` 目录:
```tsx
// 正确
import { Screen } from '@/components/Screen';
// 避免相对路径
import { Screen } from '../../../components/Screen';
```
## 本地开发
`coze dev`:用来首次启动前后端服务,也可以用来重启前后端服务(该命令会先尝试杀掉占用端口的进程,再启动服务)