# 前端架构约定与回归清单(tools/ Web 界面) > 2026-07 网页框架化重构产物。本文档固化 tools/ 目录的模块化约定, > 所有新增页面/模块必须遵循;同时提供改动后的回归验证清单。 ## 1. 架构总览 - **托管方式**:Web 资源不嵌入固件,由 `tools/serve.bat`(`python -m http.server 8080`)本地托管; 浏览器跨源调用 ESP32 REST API(路由表见 `main/server/wifi_ota.cpp` kHttpRoutes)。 改动 web 文件无需重编译固件。 - **零构建**:原生 ES Modules,无打包器/无 CDN 依赖;页面必须经 http 访问(ES module 有 file:// CORS 限制)。 ### 页面薄入口范式 每个页面 = HTML(纯结构,无内联 script/style/事件)+ 单个 `type="module"` 入口: | 页面 | 入口 | 说明 | |---|---|---| | index.html | js/app.js + js/ota/console-mode.js + js/ble_ota.js | OTA 控制台(WiFi/BLE 双通道,三入口历史原因保留) | | motor.html | js/motor/main.js | 电机控制台(独立 seed 主题,见 §4) | | can.html | js/can.js | CAN 工具 | | can_monitor.html | js/can_monitor.js | CAN 接收监控 | ### JS 分层 ``` js/ ├── common/ 跨页面公共层:base-url(IP存取) / toast / log / polling / connection / utils ├── ota/ OTA 状态机与上传流程(高风险区,见 §5) ├── ble/ BLE OTA 传输时序(高风险区,见 §5) ├── can/ CAN 子系统(dbc 为基础层,导出共享 state/el) ├── motor/ 电机控制台 └── *.js 页面入口(薄装配层) ``` ## 2. 缓存戳约定(强制) - **JS 间 import 一律不带 `?v=`**——同一模块带不同 query 会被浏览器实例化两次, 导致模块级单例(state/toast 去抖等)分裂。 - 版本戳只出现在 HTML 的 `