# 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