fengketrade/doc/frontend-deployment-guide.md
2025-10-20 15:29:15 +08:00

579 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Shopro 前端项目部署指南
## 概述
本文档描述如何将 Shopro uni-app 前端项目打包并部署到生产环境 `https://app.fengketrade.com`
## 环境配置
### 生产环境配置已完成 ✅
`.env` 文件已配置:
```env
# 正式环境接口域名
SHOPRO_BASE_URL = https://app.fengketrade.com
# 开发环境接口域名
SHOPRO_DEV_BASE_URL = https://app.fengketrade.com
# 开发环境运行端口
SHOPRO_DEV_PORT = 3000
# 接口地址前缀
SHOPRO_API_PATH = /addons/shopro/
```
## 打包方法
### 方法一:使用 HBuilderX 打包(推荐)
这是 uni-app 官方推荐的打包方式,最稳定可靠。
#### 步骤 1: 准备 HBuilderX
1. **下载 HBuilderX**
- 官网https://www.dcloud.io/hbuilderx.html
- 选择"正式版" → "标准版"即可
2. **安装必要插件**
- 启动 HBuilderX
- 工具 → 插件安装 → 搜索"uni-app编译"
- 安装"uni-app (Vue3)"编译器
#### 步骤 2: 打开项目
1. 文件 → 打开目录
2. 选择:`/Users/billy/Code/fengketrade.com/frontend`
3. 等待项目加载完成
#### 步骤 3: H5 打包
1. **发行到 H5**
- 发行 → 网站-H5手机版
- 或者点击菜单:发行 → 网站-PC Web或App适用于宽屏应用
2. **配置打包选项**
```
网站标题:风刻商城
网站域名https://app.fengketrade.com
路由模式hash推荐或 history
```
3. **点击"发行"**
- 等待编译完成
- 控制台会显示编译进度
4. **查看打包结果**
```
打包目录:/Users/billy/Code/fengketrade.com/frontend/unpackage/dist/build/h5
```
#### 步骤 4: 部署到服务器
```bash
cd /Users/billy/Code/fengketrade.com/frontend
# 压缩打包文件(排除 macOS 元数据)
tar --no-mac-metadata --no-xattrs --exclude='.DS_Store' \
-czf h5-dist.tar.gz -C unpackage/dist/build/h5 .
# 上传到服务器
scp h5-dist.tar.gz user@app.fengketrade.com:/tmp/
# 登录服务器
ssh user@app.fengketrade.com
# 解压到 Web 目录
cd /path/to/web/root
mkdir -p h5
tar -xzf /tmp/h5-dist.tar.gz -C h5/
# 设置权限
chown -R www-data:www-data h5/
chmod -R 755 h5/
```
### 方法二:使用命令行打包
如果已安装 uni-app CLI 工具,可以使用命令行打包。
#### 步骤 1: 安装 uni-app CLI
```bash
cd /Users/billy/Code/fengketrade.com/frontend
# 安装 uni-app 编译器(如果还没安装)
npm install -g @dcloudio/uvm
uvm
# 或直接安装依赖
npm install
```
#### 步骤 2: 添加构建脚本
编辑 `package.json`,添加以下脚本:
```json
{
"scripts": {
"dev:h5": "uni -p h5",
"build:h5": "uni build -p h5",
"build:h5:prod": "cross-env NODE_ENV=production uni build -p h5",
"prettier": "prettier --write \"{pages,sheep}/**/*.{js,json,tsx,css,less,scss,vue,html,md}\""
}
}
```
#### 步骤 3: 执行打包
```bash
# 开发环境打包
npm run build:h5
# 生产环境打包(压缩优化)
npm run build:h5:prod
```
#### 步骤 4: 查看打包结果
```bash
ls -lh unpackage/dist/build/h5/
```
### 方法三:快速部署脚本(自动化)
创建自动化部署脚本。
#### 创建部署脚本
```bash
cat > deploy-frontend.sh << 'EOF'
#!/bin/bash
# 前端自动化部署脚本
# 作者: Billy
# 日期: 2025-01-17
set -e
echo "=== 前端部署脚本 ==="
# 配置
PROJECT_DIR="/Users/billy/Code/fengketrade.com/frontend"
BUILD_DIR="$PROJECT_DIR/unpackage/dist/build/h5"
SERVER_USER="your_user"
SERVER_HOST="app.fengketrade.com"
SERVER_PATH="/var/www/html/h5"
BACKUP_DIR="/var/www/backup"
# 颜色输出
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo -e "${YELLOW}步骤 1: 检查环境...${NC}"
cd "$PROJECT_DIR"
if [ ! -d "node_modules" ]; then
echo -e "${YELLOW}安装依赖...${NC}"
npm install
fi
echo -e "${GREEN}✓ 环境检查完成${NC}"
echo -e "${YELLOW}步骤 2: 清理旧文件...${NC}"
rm -rf unpackage/dist/build/h5
echo -e "${YELLOW}步骤 3: 开始打包...${NC}"
# 如果有 HBuilderX CLI
if command -v cli &> /dev/null; then
cli publish --platform h5 --project "$PROJECT_DIR"
# 或使用 npm
elif [ -f "package.json" ]; then
npm run build:h5:prod || npm run build:h5
else
echo -e "${RED}✗ 找不到构建工具,请使用 HBuilderX 手动打包${NC}"
exit 1
fi
echo -e "${GREEN}✓ 打包完成${NC}"
echo -e "${YELLOW}步骤 4: 压缩文件...${NC}"
cd "$PROJECT_DIR"
tar --no-mac-metadata --no-xattrs --exclude='.DS_Store' \
-czf h5-dist-$(date +%Y%m%d-%H%M%S).tar.gz -C "$BUILD_DIR" .
ARCHIVE_NAME=$(ls -t h5-dist-*.tar.gz | head -1)
echo -e "${GREEN}✓ 压缩完成: $ARCHIVE_NAME${NC}"
echo -e "${YELLOW}步骤 5: 上传到服务器...${NC}"
scp "$ARCHIVE_NAME" "$SERVER_USER@$SERVER_HOST:/tmp/"
echo -e "${YELLOW}步骤 6: 部署到服务器...${NC}"
ssh "$SERVER_USER@$SERVER_HOST" << ENDSSH
set -e
# 创建备份
if [ -d "$SERVER_PATH" ]; then
echo "备份当前版本..."
sudo mkdir -p "$BACKUP_DIR"
sudo tar -czf "$BACKUP_DIR/h5-backup-\$(date +%Y%m%d-%H%M%S).tar.gz" \
-C "$SERVER_PATH" . || true
fi
# 解压新版本
echo "部署新版本..."
sudo mkdir -p "$SERVER_PATH"
sudo tar -xzf "/tmp/$ARCHIVE_NAME" -C "$SERVER_PATH"
# 设置权限
sudo chown -R www-data:www-data "$SERVER_PATH"
sudo chmod -R 755 "$SERVER_PATH"
# 清理临时文件
rm -f "/tmp/$ARCHIVE_NAME"
echo "部署完成!"
ENDSSH
echo -e "${GREEN}=== 部署成功!===${NC}"
echo -e "${GREEN}访问地址: https://app.fengketrade.com/h5${NC}"
# 清理本地临时文件
rm -f "$ARCHIVE_NAME"
EOF
chmod +x deploy-frontend.sh
```
#### 使用部署脚本
```bash
# 修改脚本中的服务器配置
vim deploy-frontend.sh
# 执行部署
./deploy-frontend.sh
```
## 部署后配置
### Nginx 配置
#### H5 项目配置
```nginx
# /etc/nginx/sites-available/app.fengketrade.com
server {
listen 80;
listen 443 ssl http2;
server_name app.fengketrade.com;
# SSL 证书配置
ssl_certificate /path/to/ssl/cert.pem;
ssl_certificate_key /path/to/ssl/key.pem;
# 强制 HTTPS
if ($scheme != "https") {
return 301 https://$server_name$request_uri;
}
# H5 前端
location /h5 {
alias /var/www/html/h5;
index index.html;
# 解决 Vue Router history 模式 404
try_files $uri $uri/ /h5/index.html;
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# HTML 不缓存
location ~* \.html$ {
expires -1;
add_header Cache-Control "no-cache, no-store, must-revalidate";
}
}
# API 代理到 PHP 后端
location /addons/shopro {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 建行测试页面
location /ccblife-demo.html {
alias /var/www/html/public/ccblife-demo.html;
}
# 静态资源
location /static {
alias /var/www/html/public;
}
}
```
#### 重启 Nginx
```bash
# 测试配置
sudo nginx -t
# 重启服务
sudo systemctl reload nginx
```
### Apache 配置(如果使用 Apache
```apache
<VirtualHost *:443>
ServerName app.fengketrade.com
DocumentRoot /var/www/html
# SSL 配置
SSLEngine on
SSLCertificateFile /path/to/ssl/cert.pem
SSLCertificateKeyFile /path/to/ssl/key.pem
# H5 前端
Alias /h5 /var/www/html/h5
<Directory /var/www/html/h5>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
# Vue Router history 模式
RewriteEngine On
RewriteBase /h5
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /h5/index.html [L]
</Directory>
# 静态资源缓存
<FilesMatch "\.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
# HTML 不缓存
<FilesMatch "\.html$">
Header set Cache-Control "no-cache, no-store, must-revalidate"
</FilesMatch>
</VirtualHost>
```
## 部署检查清单
### 打包前检查
- [ ] ✅ `.env` 文件配置正确(生产环境域名)
- [ ] 检查 `manifest.json` 配置
- [ ] 移除开发环境的 console.log
- [ ] 移除调试工具(如 vconsole
- [ ] 检查建行生活模块是否正确集成
### 打包检查
```bash
# 检查打包文件大小
du -sh unpackage/dist/build/h5
# 检查关键文件是否存在
ls -lh unpackage/dist/build/h5/index.html
ls -lh unpackage/dist/build/h5/static/
# 检查是否有 source map生产环境应该移除
find unpackage/dist/build/h5 -name "*.map"
```
### 部署后检查
```bash
# 1. 检查文件是否上传成功
ssh user@app.fengketrade.com "ls -lh /var/www/html/h5"
# 2. 检查权限
ssh user@app.fengketrade.com "ls -ld /var/www/html/h5"
# 3. 测试访问
curl -I https://app.fengketrade.com/h5/
# 4. 检查 API 接口
curl https://app.fengketrade.com/addons/shopro/ccbtest
```
### 功能测试
- [ ] 访问首页是否正常
- [ ] API 接口是否可以调用
- [ ] 建行生活模块是否正常
- [ ] 支付功能是否正常
- [ ] 图片资源是否加载
- [ ] 移动端适配是否正常
## 快速部署命令
### 本地到服务器一键部署
```bash
cd /Users/billy/Code/fengketrade.com/frontend
# 1. 打包(使用 HBuilderX 或命令行)
# HBuilderX: 发行 → 网站-H5手机版
# 2. 压缩
tar --no-mac-metadata --no-xattrs --exclude='.DS_Store' \
-czf h5-$(date +%Y%m%d-%H%M%S).tar.gz \
-C unpackage/dist/build/h5 .
# 3. 上传
ARCHIVE=$(ls -t h5-*.tar.gz | head -1)
scp $ARCHIVE user@app.fengketrade.com:/tmp/
# 4. 部署(在服务器上执行)
ssh user@app.fengketrade.com << 'EOF'
ARCHIVE=$(ls -t /tmp/h5-*.tar.gz | head -1)
sudo mkdir -p /var/www/html/h5
sudo tar -xzf $ARCHIVE -C /var/www/html/h5
sudo chown -R www-data:www-data /var/www/html/h5
sudo chmod -R 755 /var/www/html/h5
rm -f $ARCHIVE
echo "部署完成!"
EOF
# 5. 测试
curl -I https://app.fengketrade.com/h5/
```
## 回滚方案
### 快速回滚
```bash
# 在服务器上执行
cd /var/www/backup
# 查看备份
ls -lht h5-backup-*.tar.gz | head -5
# 回滚到指定版本
BACKUP_FILE="h5-backup-20250117-143000.tar.gz"
sudo rm -rf /var/www/html/h5/*
sudo tar -xzf $BACKUP_FILE -C /var/www/html/h5
sudo systemctl reload nginx
echo "已回滚到: $BACKUP_FILE"
```
## 性能优化
### 打包优化
1. **启用 Gzip 压缩**(在 `vite.config.js`
```javascript
import viteCompression from 'vite-plugin-compression';
export default {
plugins: [
viteCompression({
verbose: true,
disable: false,
threshold: 10240,
algorithm: 'gzip',
ext: '.gz'
})
]
}
```
2. **代码分割**
- uni-app 会自动进行代码分割
- 按页面分包加载
3. **图片优化**
- 压缩图片资源
- 使用 WebP 格式
- 启用懒加载
### CDN 配置
修改 `.env`
```env
# 使用 CDN 加速静态资源
SHOPRO_STATIC_URL = https://cdn.fengketrade.com
```
## 常见问题
### Q: 打包后页面空白?
**原因**: 路径配置错误
**解决**:
```javascript
// manifest.json 中检查
{
"h5": {
"router": {
"mode": "hash", // 推荐使用 hash 模式
"base": "/h5/" // 根据实际部署路径调整
}
}
}
```
### Q: API 请求 404
**原因**: 接口地址配置错误
**解决**: 检查 `.env` 中的 `SHOPRO_BASE_URL`
### Q: 静态资源 404
**原因**: Nginx 配置问题
**解决**: 确保 Nginx 配置正确映射静态资源路径
### Q: 打包文件太大?
**解决**:
1. 移除无用的依赖
2. 启用代码压缩
3. 使用 CDN 加载大文件
4. 按需引入组件
## 监控和维护
### 访问日志
```bash
# Nginx 访问日志
sudo tail -f /var/log/nginx/access.log | grep "GET /h5"
# 错误日志
sudo tail -f /var/log/nginx/error.log
```
### 性能监控
使用浏览器开发者工具:
1. Network - 查看资源加载时间
2. Performance - 分析页面性能
3. Lighthouse - 综合评分
---
*文档版本: 1.0.0*
*最后更新: 2025-01-17*
*作者: Billy*