# SPA Preview Server
基于 Express 的单页应用(SPA)预览服务器,支持环境变量配置、API 反向代理和增强的路由处理。
## 功能特性
- 🔧 **环境变量配置** - 通过 `.env` 文件管理所有配置
- 📁 **静态文件服务** - 可配置的静态文件目录
- 🔄 **API 反向代理** - 支持 API 请求代理到后端服务
- 🛣️ **SPA 路由支持** - 智能的客户端路由回退机制
- 🌐 **CORS 支持** - 可配置的跨域资源共享
- 📝 **增强日志** - 多级别日志记录和彩色输出
- ⚡ **缓存优化** - 生产环境静态资源缓存
## 快速开始
### 1. 安装依赖
```bash
pnpm install
```
### 2. 配置环境变量
#### 方法一:使用配置向导(推荐)
```bash
# 运行交互式配置向导
pnpm config
# 或者
node src/utils/cli-config.js
```
#### 方法二:手动配置
复制 `.env.example` 文件为 `.env` 并根据需要修改配置:
```bash
cp .env.example .env
```
### 3. 启动服务器
```bash
# 开发模式
pnpm dev
# 或直接运行
node src/server.js
```
## 环境变量配置
### 服务器配置
| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| `PORT` | `5173` | 服务器端口 |
| `HOST` | `0.0.0.0` | 服务器主机地址 |
### 静态文件配置
| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| `PUBLIC_DIR` | `public` | 静态文件目录 |
| `FALLBACK_FILE` | `index.html` | SPA 回退文件 |
### API 代理配置
| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| `API_TARGET` | `` | API 代理目标地址(如:`http://localhost:3000`) |
| `API_PREFIX` | `/api` | API 路由前缀 |
| `API_PROXY_MODE` | `prefix` | API 代理模式:
`prefix` - 路径替换模式,移除前缀后转发
`include` - 路径包含模式,保留完整路径转发 |
### 开发配置
| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| `DEV_MODE` | `true` | 开发模式开关 |
| `LOG_LEVEL` | `info` | 日志级别(`debug`, `info`, `warn`, `error`) |
### CORS 配置
| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| `CORS_ENABLED` | `true` | 启用 CORS |
| `CORS_ORIGIN` | `*` | 允许的源(多个用逗号分隔) |
### SPA 路由配置
| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| `SPA_FALLBACK_ENABLED` | `true` | 启用 SPA 路由回退 |
| `SPA_EXCLUDE_EXTENSIONS` | `.js,.css,.png,...` | 排除的文件扩展名 |
## 配置工具
### 交互式配置向导
项目提供了一个交互式配置向导,帮助您轻松管理环境变量:
```bash
# 启动配置向导
pnpm config
```
配置向导功能:
- 🔍 **自动检测现有配置** - 读取并显示当前 `.env` 文件
- ✅ **配置验证** - 实时验证配置值的有效性
- 📋 **配置摘要** - 清晰显示所有配置项
- 💾 **自动保存** - 生成 `.env` 和 `.env.example` 文件
- 🎨 **彩色输出** - 友好的命令行界面
### 配置验证
配置工具会自动验证以下项目:
- 端口号范围(1-65535)
- 主机地址格式
- API 目标 URL 格式
- 日志级别有效性
- CORS 源地址格式
## 使用示例
### 基本 SPA 部署
1. 将构建好的 SPA 文件放入 `public` 目录
2. 启动服务器
3. 访问 `http://localhost:5173`
### 配置 API 代理
在 `.env` 文件中配置:
```env
API_TARGET=http://localhost:3000
API_PREFIX=/api
```
这样,所有 `/api/*` 的请求都会被代理到 `http://localhost:3000/*`。
### 自定义 CORS
```env
CORS_ORIGIN=http://localhost:3000,https://example.com
```
### 调试模式
```env
LOG_LEVEL=debug
DEV_MODE=true
```
## SPA 路由处理
服务器会智能处理 SPA 路由:
1. **静态文件请求** - 直接提供文件服务
2. **API 请求** - 代理到配置的后端服务
3. **SPA 路由** - 返回 `index.html` 让客户端路由处理
### 路由排除规则
以下类型的请求不会触发 SPA 回退:
- 带有文件扩展名的请求(如 `.js`, `.css`, `.png` 等)
- API 路由请求(以 `API_PREFIX` 开头)
### 自定义排除扩展名
```env
SPA_EXCLUDE_EXTENSIONS=.js,.css,.png,.jpg,.svg,.ico,.woff,.woff2
```
## 生产环境部署
### 环境变量配置
```env
DEV_MODE=false
LOG_LEVEL=warn
CORS_ORIGIN=https://yourdomain.com
```
### 使用 PM2 部署
```bash
# 安装 PM2
npm install -g pm2
# 启动应用
pm2 start src/server.js --name spa-preview
# 查看状态
pm2 status
# 查看日志
pm2 logs spa-preview
```
### Docker 部署
创建 `Dockerfile`:
```dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 5173
CMD ["node", "src/server.js"]
```
## 故障排除
### 常见问题
1. **端口被占用**
```bash
# 查看端口占用
lsof -i :5173
# 修改端口
echo "PORT=5174" >> .env
```
2. **API 代理不工作**
- 检查 `API_TARGET` 是否正确配置
- 确认后端服务正在运行
- 查看调试日志:`LOG_LEVEL=debug`
3. **SPA 路由 404**
- 确认 `SPA_FALLBACK_ENABLED=true`
- 检查 `public/index.html` 是否存在
- 查看排除扩展名配置
### 调试技巧
启用详细日志:
```env
LOG_LEVEL=debug
```
这将显示:
- 代理请求详情
- SPA 回退处理
- 文件服务信息
## 开发
### 项目结构
```
apps/spa-preview/
├── .env # 环境变量配置
├── .env.example # 配置模板
├── .gitignore # Git 忽略文件
├── package.json # 项目配置
├── README.md # 项目文档
├── public/ # 静态文件目录
│ └── .gitkeep
└── src/
├── server.js # 主服务器文件
└── utils/ # 工具函数
```
### 贡献指南
1. Fork 项目
2. 创建功能分支
3. 提交更改
4. 推送到分支
5. 创建 Pull Request
## 许可证
MIT License