Files
whale-town-front/docs/web_deployment_guide.md
moyin a05bac6f05 docs:添加完整的项目文档体系
- 添加Web部署完整指南和更新日志
- 创建网络管理器配置文档
- 完善项目设置和测试指南
- 添加API更新日志和清理总结
- 更新脚本使用说明文档
2025-12-25 23:09:59 +08:00

553 lines
13 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.
# Web部署完整指南
**版本**: 1.0.0
**更新时间**: 2025-12-25
**适用于**: Godot 4.5+ 项目
## 📋 目录
1. [导出准备](#导出准备)
2. [Godot编辑器配置](#godot编辑器配置)
3. [自动化导出脚本](#自动化导出脚本)
4. [本地测试](#本地测试)
5. [生产环境部署](#生产环境部署)
6. [服务器配置](#服务器配置)
7. [性能优化](#性能优化)
8. [常见问题解决](#常见问题解决)
---
## 🚀 导出准备
### 系统要求
- Godot 4.5+
- Python 3.x用于本地测试服务器
- Web服务器Apache/Nginx/IIS等
### 项目结构检查
确保项目结构完整:
```
whaleTown/
├── assets/ # 游戏资源
├── core/ # 核心系统
├── scenes/ # 场景文件
├── scripts/ # 脚本文件
├── docs/ # 文档
├── build/ # 导出目录(自动创建)
└── project.godot # 项目配置
```
---
## ⚙️ Godot编辑器配置
### 1. 下载导出模板
1. 打开Godot编辑器
2. 点击 `Project``Export...`
3. 点击 `Manage Export Templates...`
4. 点击 `Download and Install` 下载Godot 4.5导出模板
5. 等待下载完成
### 2. 创建Web导出预设
1. 在Export窗口中点击 `Add...`
2. 选择 `Web` 平台
3. 配置以下设置:
#### 基本设置
```
Name: Web
Export Path: build/web/index.html
Runnable: ✓ 启用
Dedicated Server: ✗ 禁用
```
#### Web选项
```
Variant: release
Vram Texture Compression: ✓ 启用
Export Type: Regular
Custom HTML Shell: res://assets/web/custom_shell.html
Head Include: (留空,已在自定义模板中配置)
```
#### 高级选项
```
Custom HTML Shell: res://assets/web/custom_shell.html
Progressive Web App: ✓ 启用(可选)
Icon 144x144: res://icon.svg
Icon 180x180: res://icon.svg
Icon 512x512: res://icon.svg
```
### 3. 项目设置优化
`Project Settings` 中配置:
#### 渲染设置
```
Rendering > Renderer:
- Rendering Method: gl_compatibility
- Rendering Method Mobile: gl_compatibility
Rendering > Textures:
- VRAM Compression > Import ETC2 ASTC: ✓
```
#### 网络设置
```
Network > SSL:
- Certificates Bundle: (如果需要HTTPS API调用)
```
---
## 🔧 自动化导出脚本
### Windows批处理脚本
创建 `scripts/build_web.bat`
```batch
@echo off
setlocal enabledelayedexpansion
echo ========================================
echo 鲸鱼镇 Web版本导出工具
echo ========================================
echo.
REM 配置变量
set "PROJECT_NAME=whaleTown"
set "BUILD_DIR=build\web"
set "GODOT_PATH=C:\Program Files\Godot\Godot.exe"
set "EXPORT_PRESET=Web"
REM 检查Godot是否存在
if not exist "%GODOT_PATH%" (
echo [错误] 未找到Godot可执行文件: %GODOT_PATH%
echo 请修改脚本中的GODOT_PATH变量
pause
exit /b 1
)
REM 创建构建目录
echo [信息] 创建构建目录...
if not exist "build" mkdir "build"
if not exist "%BUILD_DIR%" mkdir "%BUILD_DIR%"
REM 清理旧文件
echo [信息] 清理旧的导出文件...
if exist "%BUILD_DIR%\*" del /q "%BUILD_DIR%\*"
REM 导出项目
echo [信息] 开始导出Web版本...
echo 导出路径: %BUILD_DIR%\index.html
echo.
"%GODOT_PATH%" --headless --export-release "%EXPORT_PRESET%" "%BUILD_DIR%\index.html"
if %ERRORLEVEL% neq 0 (
echo [错误] 导出失败!错误代码: %ERRORLEVEL%
pause
exit /b %ERRORLEVEL%
)
REM 复制额外文件
echo [信息] 复制配置文件...
copy "web\*.json" "%BUILD_DIR%\" >nul 2>&1
copy "web\*.ico" "%BUILD_DIR%\" >nul 2>&1
REM 生成部署信息
echo [信息] 生成部署信息...
echo {> "%BUILD_DIR%\deploy_info.json"
echo "project": "%PROJECT_NAME%",>> "%BUILD_DIR%\deploy_info.json"
echo "version": "1.0.0",>> "%BUILD_DIR%\deploy_info.json"
echo "build_time": "%date% %time%",>> "%BUILD_DIR%\deploy_info.json"
echo "platform": "web">> "%BUILD_DIR%\deploy_info.json"
echo }>> "%BUILD_DIR%\deploy_info.json"
echo.
echo ========================================
echo 导出完成!
echo ========================================
echo 导出位置: %BUILD_DIR%\
echo 文件大小:
for %%f in ("%BUILD_DIR%\*") do echo %%~nxf: %%~zf bytes
echo.
echo 下一步:
echo 1. 运行 scripts\serve_web.bat 进行本地测试
echo 2. 将 %BUILD_DIR%\ 目录上传到Web服务器
echo.
pause
```
### 本地测试服务器脚本
创建 `scripts/serve_web.bat`
```batch
@echo off
setlocal enabledelayedexpansion
echo ========================================
echo 鲸鱼镇 本地Web服务器
echo ========================================
echo.
set "BUILD_DIR=build\web"
set "PORT=8000"
REM 检查导出文件
if not exist "%BUILD_DIR%\index.html" (
echo [错误] 未找到Web导出文件
echo 请先运行 scripts\build_web.bat 导出项目
echo.
pause
exit /b 1
)
REM 检查Python
python --version >nul 2>&1
if %ERRORLEVEL% neq 0 (
echo [错误] 未找到Python
echo 请安装Python 3.x: https://python.org
echo.
pause
exit /b 1
)
REM 显示文件信息
echo [信息] Web文件信息:
for %%f in ("%BUILD_DIR%\*") do (
set "size=%%~zf"
set /a "size_mb=!size!/1024/1024"
echo %%~nxf: !size_mb! MB
)
echo.
echo [信息] 启动本地服务器...
echo 端口: %PORT%
echo 目录: %BUILD_DIR%
echo.
echo ========================================
echo 在浏览器中访问: http://localhost:%PORT%
echo 按 Ctrl+C 停止服务器
echo ========================================
echo.
REM 切换到构建目录并启动服务器
cd "%BUILD_DIR%"
python -m http.server %PORT%
echo.
echo 服务器已停止
pause
```
### Linux/macOS脚本
创建 `scripts/build_web.sh`
```bash
#!/bin/bash
echo "========================================"
echo " 鲸鱼镇 Web版本导出工具"
echo "========================================"
echo
# 配置变量
PROJECT_NAME="whaleTown"
BUILD_DIR="build/web"
GODOT_PATH="/usr/local/bin/godot" # 根据实际安装路径修改
EXPORT_PRESET="Web"
# 检查Godot
if [ ! -f "$GODOT_PATH" ]; then
echo "[错误] 未找到Godot: $GODOT_PATH"
echo "请修改脚本中的GODOT_PATH变量"
exit 1
fi
# 创建构建目录
echo "[信息] 创建构建目录..."
mkdir -p "$BUILD_DIR"
# 清理旧文件
echo "[信息] 清理旧文件..."
rm -f "$BUILD_DIR"/*
# 导出项目
echo "[信息] 开始导出Web版本..."
"$GODOT_PATH" --headless --export-release "$EXPORT_PRESET" "$BUILD_DIR/index.html"
if [ $? -ne 0 ]; then
echo "[错误] 导出失败!"
exit 1
fi
# 生成部署信息
echo "[信息] 生成部署信息..."
cat > "$BUILD_DIR/deploy_info.json" << EOF
{
"project": "$PROJECT_NAME",
"version": "1.0.0",
"build_time": "$(date)",
"platform": "web"
}
EOF
echo
echo "========================================"
echo " 导出完成!"
echo "========================================"
echo "导出位置: $BUILD_DIR/"
echo
echo "下一步:"
echo "1. 运行 scripts/serve_web.sh 进行本地测试"
echo "2. 将 $BUILD_DIR/ 目录上传到Web服务器"
echo
```
---
## 🌐 生产环境部署
### 1. 文件上传清单
确保上传以下文件到Web服务器
```
build/web/
├── index.html # 主HTML文件
├── index.js # JavaScript引导文件
├── index.wasm # WebAssembly主文件
├── index.pck # Godot资源包
├── index.worker.js # Web Worker文件
├── favicon.ico # 网站图标
└── deploy_info.json # 部署信息(可选)
```
### 2. 目录权限设置
```bash
# Linux服务器权限设置
chmod 644 build/web/*
chmod 755 build/web/
```
### 3. 域名配置
- 确保域名正确解析到服务器
- 配置SSL证书推荐使用Let's Encrypt
- 设置CDN加速可选
---
## 🔧 服务器配置
### Apache配置 (.htaccess)
```apache
# MIME类型配置
AddType application/wasm .wasm
AddType application/octet-stream .pck
AddType application/javascript .js
# 启用压缩
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/javascript application/wasm
AddOutputFilterByType DEFLATE application/json application/xml
</IfModule>
# 缓存控制
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType application/wasm "access plus 1 month"
ExpiresByType application/octet-stream "access plus 1 month"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/html "access plus 1 hour"
</IfModule>
# CORS配置如果需要
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
Header set Access-Control-Allow-Headers "Content-Type, Authorization"
# SharedArrayBuffer支持
Header set Cross-Origin-Embedder-Policy "require-corp"
Header set Cross-Origin-Opener-Policy "same-origin"
</IfModule>
# 安全配置
<IfModule mod_headers.c>
Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options DENY
Header always set X-XSS-Protection "1; mode=block"
</IfModule>
```
### Nginx配置
```nginx
server {
listen 80;
listen 443 ssl http2;
server_name yourdomain.com;
# SSL配置
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
root /var/www/whaletown/build/web;
index index.html;
# MIME类型
location ~* \.wasm$ {
add_header Content-Type application/wasm;
expires 1M;
add_header Cache-Control "public, immutable";
}
location ~* \.pck$ {
add_header Content-Type application/octet-stream;
expires 1M;
add_header Cache-Control "public, immutable";
}
location ~* \.js$ {
add_header Content-Type application/javascript;
expires 1w;
}
# 压缩配置
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types
text/html
text/css
application/javascript
application/wasm
application/json;
# CORS配置
add_header Access-Control-Allow-Origin "*" always;
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always;
add_header Access-Control-Allow-Headers "Content-Type, Authorization" always;
# SharedArrayBuffer支持
add_header Cross-Origin-Embedder-Policy "require-corp" always;
add_header Cross-Origin-Opener-Policy "same-origin" always;
# 安全头
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options DENY always;
add_header X-XSS-Protection "1; mode=block" always;
# 主页面
location / {
try_files $uri $uri/ /index.html;
}
# API代理如果需要
location /api/ {
proxy_pass https://whaletownend.xinghangee.icu/;
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;
}
}
```
---
## ⚡ 性能优化
### 1. 资源优化
- **纹理压缩**: 启用VRAM纹理压缩
- **音频压缩**: 使用OGG格式调整比特率
- **模型优化**: 减少多边形数量优化LOD
### 2. 代码优化
```gdscript
# 在Web平台禁用不必要的功能
func _ready():
if OS.has_feature("web"):
# 禁用文件系统操作
# 优化渲染设置
get_viewport().render_target_update_mode = Viewport.UPDATE_WHEN_VISIBLE
```
### 3. 加载优化
- 使用资源预加载
- 实现渐进式加载
- 显示加载进度
---
## 🐛 常见问题解决
### 1. SharedArrayBuffer错误
**问题**: 控制台显示SharedArrayBuffer相关错误
**解决**: 配置正确的HTTP头
```
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
```
### 2. 文件加载失败
**问题**: WASM或PCK文件加载失败
**解决**:
- 检查MIME类型配置
- 确保文件路径正确
- 检查服务器权限
### 3. API请求失败
**问题**: 网络请求被CORS阻止
**解决**:
- 配置服务器CORS头
- 使用API代理
- 检查API服务器配置
### 4. 性能问题
**问题**: Web版本运行缓慢
**解决**:
- 启用WebGL2
- 优化资源大小
- 使用性能分析工具
### 5. 音频问题
**问题**: 音频无法播放
**解决**:
- 用户交互后才能播放音频
- 使用Web兼容的音频格式
- 检查浏览器音频策略
---
## 📊 部署检查清单
### 导出前检查
- [ ] Godot导出模板已安装
- [ ] Web导出预设已配置
- [ ] 项目设置已优化
- [ ] 资源文件已压缩
### 部署前检查
- [ ] 所有文件已上传
- [ ] 服务器MIME类型已配置
- [ ] CORS设置已配置
- [ ] SSL证书已安装
### 部署后测试
- [ ] 页面正常加载
- [ ] 游戏功能正常
- [ ] 网络请求正常
- [ ] 音频播放正常
- [ ] 移动端兼容性
---
## 📞 技术支持
如果遇到问题,请检查:
1. 浏览器开发者工具的控制台错误
2. 网络请求是否成功
3. 服务器配置是否正确
4. Godot版本是否兼容
**更新日志**: 查看 `docs/web_deployment_changelog.md`