跳到主要内容

Mobile 移动端部署

Mobile 移动端采用 React + Vite 技术栈,构建产物为纯静态文件,部署到服务器的 /opt/qzt-mobile/ 目录,由 Nginx 直接提供 HTTPS 静态服务。部署方式与 Admin 后台完全一致,区别仅在于静态目录与域名不同。

部署架构

┌──────────────────┐ pnpm build ┌──────────────────┐ rsync 同步 ┌──────────────────┐
│ 本地开发机 │ ────────────▶ │ 本地 dist 目录 │ ────────────▶│ 服务器 │
│ Mobile 源码 │ │ 静态文件 │ │ /opt/qzt-mobile/ │
└──────────────────┘ └──────────────────┘ └────────┬─────────┘

│ Nginx 直接提供

┌──────────────────┐
│ m.devlove │
│ code.com:443 │
└──────────────────┘

服务信息

域名m.你的域名
端口443(Nginx HTTPS)
静态目录/opt/qzt-mobile/
技术栈React + Vite
进程管理无需(Nginx 直接服务静态文件)

本地构建

环境要求

  • Node.js 18+(推荐 20 LTS)
  • pnpm(包管理器)

构建步骤

# 进入 mobile 项目根目录
cd /path/to/qzt-mobile

# 安装依赖(首次或依赖变更时)
pnpm install

# 生产构建
pnpm build

构建完成后,产物位于 dist/ 目录:

dist/
├── index.html
├── assets/
│ ├── index-[hash].js
│ ├── index-[hash].css
│ └── ...
└── ...
移动端适配

构建前确认移动端适配配置正确,包括 viewport、rem/vw 适配方案、移动端 UI 组件库(如 Ant Design Mobile)等。环境变量(如 API 地址)通过 .env.production 配置:

VITE_API_BASE_URL=https://api.你的域名

同步到服务器

使用 rsync 将 dist 目录同步到服务器静态目录:

# rsync 同步(删除旧文件,保持目录一致)
rsync -avz --delete dist/ user@你的服务器IP:/opt/qzt-mobile/

rsync 参数说明

参数说明
-a归档模式,保留权限、时间戳等
-v详细输出
-z传输时压缩
--delete删除目标目录中源目录已不存在的文件
末尾 /dist// 表示同步目录内容而非目录本身
与 Admin 共用部署模式

Mobile 与 Admin 的部署方式完全相同,仅静态目录(/opt/qzt-mobile/ vs /opt/qzt-admin/)与域名(m.你的域名 vs admin.你的域名)不同。可复用同一套部署脚本,通过变量区分。

Nginx 配置

Mobile 静态目录由 Nginx 直接服务,关键配置如下:

server {
listen 443 ssl http2;
server_name m.你的域名;

ssl_certificate /etc/letsencrypt/live/你的域名/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/你的域名/privkey.pem;

root /opt/qzt-mobile;
index index.html;

# SPA 前端路由兜底
location / {
try_files $uri $uri/ /index.html;
}

# 静态资源缓存
location /assets/ {
expires 1y;
add_header Cache-Control "public, immutable";
}

# Gzip 压缩
gzip on;
gzip_types text/css application/javascript application/json;
}

SPA 路由兜底

Mobile 采用 React Router 的 History 模式,刷新非根路径时需要 Nginx 兜底到 index.html

location / {
try_files $uri $uri/ /index.html;
}

静态资源缓存

Vite 构建的 JS/CSS 文件名带内容 hash,可设置长期缓存:

location /assets/ {
expires 1y;
add_header Cache-Control "public, immutable";
}

部署后验证

# 检查静态目录
ssh user@你的服务器IP ls /opt/qzt-mobile/

# 检查页面可访问
curl -I https://m.你的域名

# 浏览器或手机访问
# https://m.你的域名

由于是纯静态部署,rsync 同步完成后立即生效,无需重启任何服务。

一键部署脚本

#!/bin/bash
# deploy-mobile.sh
set -e

SERVER=user@你的服务器IP
REMOTE_PATH=/opt/qzt-mobile/

echo "==> 安装依赖..."
pnpm install

echo "==> 生产构建..."
pnpm build

echo "==> 同步到服务器..."
rsync -avz --delete dist/ $SERVER:$REMOTE_PATH

echo "==> 部署完成:https://m.你的域名"

通用前后端部署脚本(Admin + Mobile 合并)

由于 Admin 与 Mobile 部署方式一致,可整合为一个通用脚本:

#!/bin/bash
# deploy-static.sh <app-name>
# 用法: ./deploy-static.sh admin 或 ./deploy-static.sh mobile
set -e

APP=$1
SERVER=user@你的服务器IP

case $APP in
admin) REMOTE_PATH=/opt/qzt-admin/ ;;
mobile) REMOTE_PATH=/opt/qzt-mobile/ ;;
*) echo "Usage: $0 <admin|mobile>"; exit 1 ;;
esac

echo "==> 构建 $APP..."
pnpm install
pnpm build

echo "==> 同步到 $REMOTE_PATH..."
rsync -avz --delete dist/ $SERVER:$REMOTE_PATH

echo "==> 部署完成"

回滚

# 方式一:重新构建上一个 git commit
git checkout HEAD~1
pnpm build
rsync -avz --delete dist/ user@你的服务器IP:/opt/qzt-mobile/

# 方式二:部署前备份当前版本
ssh user@你的服务器IP "cp -r /opt/qzt-mobile /opt/qzt-mobile.bak.$(date +%Y%m%d%H%M%S)"