一个项目快速上手react native

161 阅读6分钟

Rn-Blog - 基于 React Native 的社交博客应用

项目概述

Rn-Blog 是一个基于 React Native 和 Expo 开发的跨平台社交博客应用,用户可以在其中发布文章、分享想法、上传图片,并与其他用户互动。该项目采用现代化的技术栈,提供了完整的用户认证、内容管理和图片上传功能。

技术栈

前端技术

  • React Native 0.79.6 - 跨平台移动应用开发框架
  • Expo ~53.0.22 - React Native 开发平台,提供丰富的 API 和工具
  • TypeScript ~5.8.3 - 类型安全的 JavaScript 超集
  • Expo Router ~5.1.5 - 基于文件系统的路由解决方案
  • React 19.0.0 - 用户界面库

UI 组件库

  • Ant Design React Native ^5.4.3 - 企业级 UI 组件库
  • @ant-design/icons-react-native ^2.3.2 - 图标组件库
  • @expo/vector-icons ^14.1.0 - Expo 图标库

状态管理与数据

  • React Context API - 全局状态管理
  • AsyncStorage 2.1.2 - 本地数据持久化
  • Axios ^1.11.0 - HTTP 客户端

导航与路由

  • @react-navigation/native ^7.1.6 - 导航库
  • @react-navigation/bottom-tabs ^7.3.10 - 底部标签导航
  • react-native-safe-area-context 5.4.0 - 安全区域处理

媒体处理

  • expo-image-picker ~16.1.4 - 图片选择器
  • expo-image ~2.4.0 - 优化的图片组件
  • react-native-webview 13.13.5 - WebView 组件

后端技术

  • Node.js - 服务器运行环境
  • Express.js - Web 应用框架
  • JWT (jsonwebtoken) - 身份认证
  • bcryptjs - 密码加密
  • Multer - 文件上传处理
  • CORS - 跨域资源共享

项目启动方式

环境要求

  • Node.js 16+
  • npm 或 yarn
  • Expo CLI
  • iOS Simulator (macOS) 或 Android Emulator

安装依赖

# 安装项目依赖
npm install

# 安装模拟服务器依赖
cd mock-server
npm install

启动开发服务器

# 启动 Expo 开发服务器
npm start

# 或者直接启动特定平台
npm run ios      # 启动 iOS 模拟器
npm run android  # 启动 Android 模拟器
npm run web      # 启动 Web 版本

启动后端服务器

# 在 mock-server 目录下启动后端服务
cd mock-server
node server.js

服务器将在 http://localhost:3001 启动,提供完整的 API 服务。

项目目录结构

rn-blog/
├── app/                          # 应用主目录 (Expo Router)
│   ├── (auth)/                   # 认证相关页面
│   │   ├── _layout.tsx          # 认证布局
│   │   ├── sign_in.tsx          # 登录页面
│   │   └── sign_up.tsx          # 注册页面
│   ├── (tabs)/                   # 主应用标签页
│   │   ├── _layout.tsx          # 标签页布局
│   │   ├── add.tsx              # 发布文章页面
│   │   ├── my.tsx               # 个人中心页面
│   │   └── home/                # 首页相关
│   │       ├── _layout.tsx      # 首页布局
│   │       ├── index.tsx        # 首页主页面
│   │       ├── index_all.tsx    # 全部文章页面
│   │       └── index_follow.tsx # 关注文章页面
│   ├── detail/                   # 文章详情
│   │   └── [post_id].tsx        # 动态路由文章详情
│   ├── components/               # 应用组件
│   │   └── AvatarExample.tsx    # 头像示例组件
│   └── _layout.tsx              # 根布局
├── api/                         # API 接口层
│   ├── post.ts                  # 文章相关 API
│   ├── upload.ts                # 文件上传 API
│   └── user.ts                  # 用户相关 API
├── components/                   # 通用组件
│   ├── ui/                      # UI 组件
│   ├── ImagePicker.tsx          # 图片选择器
│   ├── ThemedText.tsx           # 主题文本组件
│   └── ThemedView.tsx           # 主题视图组件
├── context/                     # React Context
│   └── userContext.tsx          # 用户状态管理
├── hooks/                       # 自定义 Hooks
│   ├── useColorScheme.ts        # 主题色 Hook
│   └── useThemeColor.ts         # 主题颜色 Hook
├── utils/                       # 工具函数
│   ├── request/                 # 网络请求工具
│   │   └── index.ts             # Axios 配置
│   ├── avatarGenerator.ts       # 头像生成器
│   └── index.ts                 # 工具函数入口
├── types/                       # TypeScript 类型定义
│   └── response.d.ts            # API 响应类型
├── constants/                   # 常量定义
│   └── Colors.ts                # 颜色主题
├── mock-server/                 # 模拟后端服务
│   ├── server.js                # Express 服务器
│   ├── uploads/                 # 上传文件存储
│   └── package.json             # 后端依赖
├── assets/                      # 静态资源
│   ├── images/                  # 图片资源
│   └── fonts/                   # 字体文件
├── app.json                     # Expo 配置
├── package.json                 # 项目依赖配置
└── tsconfig.json                # TypeScript 配置

核心功能与逻辑

1. 用户认证系统

  • 注册/登录: 支持用户名密码注册和登录
  • JWT 认证: 使用 JWT token 进行身份验证
  • 状态管理: 通过 React Context 管理全局用户状态
  • 持久化存储: 使用 AsyncStorage 保存登录状态
// 用户认证流程
const handleLogin = async (values: any) => {
  const res = await login(values);
  setUser(res.data.data.user);
  AsyncStorage.setItem("token", res.data.data.token);
  router.back();
};

2. 文章管理系统

  • CRUD 操作: 支持文章的创建、读取、更新、删除
  • 分页加载: 实现文章列表的分页功能
  • 搜索功能: 支持按标题和内容搜索文章
  • 权限控制: 只有作者可以编辑和删除自己的文章

3. 图片上传功能

  • 图片选择: 使用 expo-image-picker 选择图片
  • 文件上传: 通过 FormData 上传到服务器
  • 图片预览: 支持上传前预览和重新选择
  • 文件管理: 服务器端管理上传的图片文件
// 图片上传逻辑
const handleUploadImage = (uri: string) => {
  const formData = new FormData();
  formData.append("image", {
    uri: uri,
    type: "image/png",
    name: "image",
  } as any);

  uploadImage(formData)
    .then((res) => {
      setImage(res.data.data.imageUrl);
      toastApi.success("上传成功");
    })
    .catch((err) => {
      toastApi.fail("上传失败");
    });
};

4. 路由与导航

  • 文件系统路由: 使用 Expo Router 实现基于文件的路由
  • 嵌套布局: 支持认证页面和主应用的嵌套布局
  • 动态路由: 支持文章详情的动态路由 [post_id].tsx
  • 标签导航: 底部标签栏导航,包含首页、发布、个人中心

5. 网络请求封装

  • Axios 配置: 统一的请求配置和拦截器
  • Token 自动添加: 请求拦截器自动添加认证 token
  • 错误处理: 统一的错误处理和响应格式化
  • 类型安全: 完整的 TypeScript 类型定义
// 网络请求配置
const request = axios.create({
  baseURL: "http://192.168.124.37:3001/api",
  timeout: 10000,
});

request.interceptors.request.use(async (config) => {
  const token = await AsyncStorage.getItem("token");
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
});

6. 主题系统

  • 深色/浅色主题: 支持系统主题自动切换
  • 主题色管理: 统一的颜色主题管理
  • 响应式设计: 适配不同屏幕尺寸

后端 API 设计

认证相关

  • POST /api/auth/register - 用户注册
  • POST /api/auth/login - 用户登录
  • GET /api/auth/me - 获取当前用户信息
  • GET /api/users/:id - 获取指定用户信息

文章相关

  • GET /api/posts - 获取文章列表(支持分页和用户筛选)
  • GET /api/posts/:id - 获取单篇文章详情
  • POST /api/posts - 创建文章(需要认证)
  • PUT /api/posts/:id - 更新文章(需要认证)
  • DELETE /api/posts/:id - 删除文章(需要认证)
  • GET /api/posts/search - 搜索文章(支持分页)

文件上传

  • POST /api/upload/image - 上传图片(需要认证)
  • DELETE /api/upload/image/:filename - 删除图片(需要认证)
  • GET /uploads/:filename - 访问上传的图片

开发特色

1. 类型安全

  • 完整的 TypeScript 类型定义
  • API 响应类型约束
  • 组件 Props 类型检查

2. 组件化设计

  • 高度可复用的 UI 组件
  • 清晰的组件职责分离
  • 统一的组件设计规范

3. 状态管理

  • 使用 React Context 进行全局状态管理
  • 本地状态与全局状态的合理分离
  • 持久化存储集成

4. 错误处理

  • 统一的错误处理机制
  • 用户友好的错误提示
  • 网络请求错误拦截

5. 性能优化

  • 图片懒加载和优化
  • 列表虚拟化(可扩展)
  • 合理的组件渲染优化

部署说明

开发环境

  1. 确保 Node.js 环境已安装
  2. 安装项目依赖:npm install
  3. 启动后端服务:cd mock-server && node server.js
  4. 启动前端服务:npm start

生产环境

  • 使用 Expo Build Service 构建应用
  • 配置生产环境 API 地址
  • 设置适当的 CORS 策略
  • 配置图片 CDN(如需要)

源码

项目源码

总结

Rn-Blog 项目展示了如何使用现代 React Native 技术栈构建一个完整的社交博客应用。项目采用了最佳实践,包括类型安全、组件化设计、状态管理和错误处理。通过 Expo 平台,开发者可以快速构建和部署跨平台应用,同时保持代码的可维护性和扩展性。

该项目适合作为学习 React Native 开发的参考项目,也可以作为实际项目的基础进行进一步开发和完善。