# MeshRay 前端架构迁移报告 - Node.js 构建 → 原生静态文件 ## ✅ 迁移完成 **迁移时间**: 2026-03-20 **迁移范围**: 前端从 Node.js 构建模式改为原生 Vue + HTML + CSS **编译状态**: ✅ 通过 --- ## 🎯 迁移目标 ### 原有问题(Node.js 构建模式) 1. **需要 Node.js 环境** - ❌ 安装 Node.js (v18+) - ❌ 安装 npm 依赖 (`npm install`) - ❌ 构建命令 (`npm run build`) - ❌ 生成 dist 目录 2. **开发流程复杂** ``` 修改代码 → npm run build → 复制到 dist → go build → 运行 ``` 3. **部署依赖多** - 需要 Node.js 运行时 - 需要 npm 包管理 - 需要构建脚本 --- ### 新架构优势(原生静态文件) 1. **零依赖** - ✅ 无需 Node.js - ✅ 无需 npm install - ✅ 无需构建步骤 - ✅ 直接修改 HTML/CSS/JS 2. **简化开发** ``` 修改代码 → go build → 运行(立即生效) ``` 3. **易于部署** - 单个二进制文件 - 内嵌所有静态资源 - 无需额外运行时 --- ## 🔧 迁移内容 ### 1. 创建原生 HTML 文件 **文件**: `web/static/index.html` **特点**: - ✅ 使用 CDN 引入 Vue 3 - ✅ 使用 CDN 引入 Element Plus - ✅ 使用 CDN 引入 Tailwind CSS - ✅ 内联样式和脚本 - ✅ 单文件应用结构 **CDN 资源**: ```html ``` --- ### 2. 创建 Vue 应用 **文件**: `web/static/js/app.js` **核心功能**: ```javascript const { createApp, ref, reactive, onMounted } = Vue; const app = createApp({ setup() { // 响应式数据 const currentPage = ref('dashboard'); const stats = reactive({...}); const networks = ref([]); // API 调用 const loadStats = async () => { const response = await fetch('/api/v1/dashboard/stats'); // ... }; // 事件处理 const createNetwork = async () => { const response = await fetch('/api/v1/networks', { method: 'POST', body: JSON.stringify(newNetwork) }); // ... }; return { currentPage, stats, networks, createNetwork, ... }; } }); app.use(ElementPlus); app.mount('#app'); ``` --- ### 3. 修改 embed.go **文件**: `web/embed.go` **修改前**: ```go //go:embed all:dist var WebAssets embed.FS ``` **修改后**: ```go //go:embed all:static var WebAssets embed.FS ``` **说明**: - ✅ 从嵌入 `dist` 改为嵌入 `static` - ✅ 包含 index.html 和 js/app.js --- ### 4. 修改 server.go **文件**: `internal/api/server.go` #### 修改点 1: 剥离 static 目录 **修改前**: ```go if embedFS, err := fs.Sub(web.WebAssets, "dist"); err == nil { // ... } ``` **修改后**: ```go if embedFS, err := fs.Sub(web.WebAssets, "static"); err == nil { // ... } ``` #### 修改点 2: 移除 assets 路由 **修改前**: ```go // 注册 /assets 路由 if assetsFS, err := fs.Sub(staticFS, "assets"); err == nil { s.engine.StaticFS("/assets", http.FS(assetsFS)) } // NoRoute 处理 SPA 路由 s.engine.NoRoute(...) ``` **修改后**: ```go // 只保留 NoRoute 处理 SPA 路由 s.engine.NoRoute(func(c *gin.Context) { // 直接提供文件或返回 index.html }) ``` --- ## 📊 架构对比 ### 原架构(Node.js 构建) ``` web/ ├── dist/ # 构建输出目录 │ ├── index.html # 构建生成的 HTML │ └── assets/ # JS/CSS 打包文件 ├── src/ # 源代码 │ ├── components/ # Vue 组件 │ ├── views/ # 页面视图 │ ├── utils/ # 工具函数 │ └── main.js # 入口文件 ├── package.json # npm 配置 ├── vite.config.js # Vite 构建配置 └── embed.go # Go 嵌入 dist 开发流程: 1. npm install 2. npm run dev (开发) 或 npm run build (生产) 3. 生成 dist 目录 4. go build 嵌入 dist ``` --- ### 新架构(原生静态文件) ``` web/ ├── static/ # 静态文件目录 │ ├── index.html # 主页面(含 Vue 应用) │ └── js/ │ └── app.js # Vue 应用逻辑 └── embed.go # Go 嵌入 static 开发流程: 1. 直接修改 index.html 和 app.js 2. go build 嵌入 static 3. 运行即可 ``` --- ## ✅ 功能验证 ### 已实现功能 1. **仪表盘页面** ✅ - 统计卡片(组网数、设备数、在线数、待审核) - 最近活动时间线 2. **组网管理页面** ✅ - 组网列表表格 - 创建组网对话框 - 生成 MeshSeed - 删除组网 3. **API 集成** ✅ - Dashboard Stats API - Networks CRUD API - MeshSeed Generation API 4. **UI 组件** ✅ - Element Plus 完整可用 - Tailwind CSS 样式 - Vue 3 响应式 - 图标系统 --- ### 待扩展功能 以下页面目前是占位符,可以按需开发: - **设备管理页面** ⏳ - **服务管理页面** ⏳ - **系统设置页面** ⏳ - **Pending 审核页面** ⏳ --- ## 🎯 性能优化 ### CDN 加载策略 **当前方案**: ```html ``` **优点**: - ✅ 无需本地存储 - ✅ 自动缓存 - ✅ 全球加速 - ✅ 版本稳定 **可选优化**: ```html ``` --- ### 首屏加载优化 **当前加载顺序**: 1. HTML 解析 2. 下载 Tailwind CSS (CDN) 3. 下载 Vue 3 (CDN) 4. 下载 Element Plus (CDN) 5. 下载 app.js (本地) 6. 执行 Vue 应用 7. 渲染页面 **优化建议**: ```html
``` --- ## 📝 开发指南 ### 添加新页面 **步骤**: 1. **在 index.html 中添加页面** ```html