ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

WLED Web UI 开发指南:编码规范、文件结构与构建集成

WLED Web UI 开发指南:编码规范、文件结构与构建集成 WLED Web UI 开发指南编码规范、文件结构与构建集成【免费下载链接】WLEDControl WS2812B and many more types of digital RGB LEDs with an ESP32 over WiFi!项目地址: https://gitcode.com/GitHub_Trending/wl/WLED本篇技术指南以 WLED 仓库中的 docs/web.instructions.md 为核心系统讲解 WLED 浏览器端界面wled00/data/下的全部 HTML/CSS/JS 源码的编码约定、关键文件职责、可访问性设计原则以及从源码到固件内嵌资源的完整构建链路。读完本文你将能够遵循官方规范参与 WLED 网页界面的开发与修改理解npm run build背后的压缩内联流程并知道哪些文件可以编辑、哪些文件严禁手工改动。适用范围一份仅作用于网页界面的规范文档的 YAML front-matter 明确声明了applyTo: wled00/data/**即这份编码约定只适用于 WLED 网页前端源码目录。它不约束 ESP32/ESP8266 固件侧的 C/C 代码那属于 docs/cpp.instructions.md 与 docs/esp-idf.instructions.md 的范畴。从仓库结构可以确认wled00/data/下存放着全部网页资源主界面index.htm、index.js、index.css一组settings*.htm配置页面WiFi、LED、UI、同步、时间、安全、DMX、引脚、2D 等公共脚本common.js、颜色选择器iro.js编辑器与辅助页面edit.htm、pixart/、pxmagic/、pixelforge/、cpal/实时预览、更新、欢迎页与 404 页面格式化规范统一使用 Tab 缩进文档对代码格式的要求非常简洁直接HTML 与 JavaScript 一律使用 Tab 缩进CSS 一律使用 Tab 缩进在wled00/data/下的实际源码中可以看到这一约定被严格执行——index.htm、index.js、common.js 以及 settings_ui.htm 的嵌套层级全部以 Tab 对齐。对于以自动化构建见后文为核心的 Web UI 来说统一缩进的意义在于源码经过 minifier 压缩后缩进差异会被抹平规范缩进纯粹服务于人读与diff 可读性因此保持全局一致即可。JavaScript 风格camelCase 与缩写助手函数WLED 前端 JavaScript 遵循两条核心约定函数与变量一律使用 camelCase 命名例如gId()、selectedFx、currentPreset。缩写助手函数是惯用法d代表documentgId()是getElementById()的别名。在 index.js 开头可以看到这些惯例的实例isOn、nlA、isLv、selectedFx、selectedPal、currentPreset、ledCount、maxSeg等状态变量全部采用 camelCasevar d document;的定义也与 common.js 保持了一致。函数定义同样遵循该风格如requestJson()index.js、togglePower()index.js、setBri()index.js。注意common.js与index.js各自维护了一份gId等本地助手定义。由于页面构建时会内联资源见构建集成一节这种就近定义是可行的但新增页面时应优先复用 common.js 的共享实现避免重复造轮子。关键文件地图文档给出了五类核心文件及其职责结合源码可以进一步细化文件仓库相对路径职责index.htm主界面含电源/定时器/同步/Peek/Info/Nodes 等顶栏按钮、亮度滑条、颜色面板H/S/V/K/RGB/白平衡、快速取色器与效果/调色板选择区index.js主界面的状态管理与 UI 更新requestJson状态轮询、WebSocket 通信、parseInfo/readState状态解析、主题切换、预设管理、PC 模式等settings*.htm配置页面族WiFi、LED、DMX、UI、同步、时间、安全、用户模块、2D、引脚等每个子页面对应固件侧一个 SUBPAGE 分支*.css如 index.css、style.css样式表构建时会被内联进 HTML 或打包为独立头文件common.js全站共享的助手函数任何页面都可复用从固件侧可以印证这些文件的对应关系wled_server.cpp 在根路径通过PAGE_index提供主界面第 368 行 将JS_common作为application/javascript提供第 832-870 行 则根据SUBPAGE_*枚举分发到PAGE_settings_wifi、PAGE_settings_leds、PAGE_settings_ui等对应页面。复用 common.js页面开发的第一原则文档强调只要可能就复用common.js中的共享助手而不是在页面本地脚本里重复实现工具函数。当前仓库的common.js提供了相当完整的工具集可作为新页面的现成工具箱DOM 助手common.js函数等价实现gId(c)document.getElementById(c)cE(e)document.createElement(e)gEBCN(c)document.getElementsByClassName(c)gN(s)document.getElementsByName(s)[0]类型判断与杂项common.jsisE(o)判空对象、isO(i)判普通对象、isN(n)判数字、isF(n)判浮点、isI(n)判整数、toggle(el)切换元素显隐。页面生命周期loadResources(files, init)common.js顺序加载外部 JS/CSS失败自动重试加载完成后恢复页面可见性并调用init()。这也是 settings_ui.htm 中stylehtml{visibility:hidden}/style方案的配套函数——页面在资源就绪前保持隐藏避免白屏闪烁。loadJS(FILE_URL, async, preGetV, postGetV)common.js动态加载脚本并在成功后触发GetV()。安全与输入处理值得新代码沿用esc(s)common.jsHTML 实体转义任何插入innerHTML的远程/用户内容都必须经它处理safeUrl(u)common.jsURL 清洗仅允许http(s)://协议阻断javascript:与data:注入uploadFile()common.js上传文件到/upload对 JSON 会先校验并压缩。网络与实时控制getLoc()/getURL(path)common.js处理本地文件模式file:协议时提示输入设备 IP与反向代理场景下的路径拼接connectWs(onOpen)common.js复用父窗口 WebSocket 或新建连接sendDDP(ws, start, len, colors, isESP8266)common.js通过 WebSocket 以 DDP 协议分包发送 RGB 像素数据单帧上限按平台区分ESP8266 为 172 像素其余 472 像素末尾包自动置push标志触发渲染。UI 工具tooltip()common.js为带title属性的元素生成自定义气泡提示showToast()common.js显示轻量通知makePinSelect()/unmakePinSelect()/addOption()common.js把引脚输入框渲染为带占用提示的下拉选择器并结合/json/pins接口做 GPIO 占用检查。可访问性与交互设计原则WLED Web UI 的目标运行环境是常见浏览器/平台组合桌面浏览器Mac/PC以指针鼠标交互为主触屏场景较少纯触屏设备手机、平板无鼠标可用。在此基础上文档给出了两条明确要求与一条灵活性说明尽可能对残障用户保持可用性可访问性完整键盘操作不是硬性要求——是否增加键盘快捷键应逐案决策case-by-case不做一刀切。这与嵌入式设备的资源现实相符UI 运行在 MCU 提供的精简 HTTP 服务上交互以触屏/指针为核心同时页面应尽量使用语义化元素与合理的title提示common.js的tooltip()正是为后者服务。UI 定制选项方面settings_ui.htm 暴露了主题背景图 URL、随机背景、灰度/模糊、透明度、背景色与组件颜色轮/RGB 滑条/快速取色/HEX 输入、按钮标签、预设 ID 显示等两大类可配置项页面适配能力的优先级高于激进的新交互范式。构建集成从源码到固件内嵌资源的流水线这是本规范中最重要的一节也是新开发者最容易踩坑的地方。核心约束构建脚本把wled00/data/下的文件处理成 C 头文件wled00/html_*.h、wled00/js_*.h。任何修改后都必须运行npm run build且严禁直接编辑生成的头文件。生成的头文件如html_ui.h、html_settings.h、js_common所在文件等是构建产物其内容以PROGMEM字节数组形式嵌入固件手改会在下次构建时被覆盖且容易与源码产生不一致。构建链路与依赖cdata.js使用三个 npm 依赖完成内联 → 压缩 → GZIP → 转 C 数组的流水线package.jsonweb-resource-inliner把 HTML 中引用的 CSS/JS 内联进页面html-minifier-terser压缩 HTML/JSclean-css压缩 CSS。主流程在 tools/cdata.js 的writeHtmlGzipped()与 第 162-202 行 的specToChunk()/writeChunks()中实现读取源文件并内联外部资源版本与仓库地址替换adoptVersionAndRepo()把占位符##VERSION##替换为package.json中的版本号当前为17.0.0-devV5minifyHTML/JS 经html-minifier-terserCSS 经CleanCSSGZIP以Z_BEST_COMPRESSION最高压缩比压缩zlib.gzipSync控制固件体积转字节数组hexdump()输出0x.., 0x..形式配合PAGE_xxx_length/PAGE_xxx[] PROGMEM头定义写入头文件生成构建时间戳WEB_BUILD_TIMEtools/cdata.js用于浏览器缓存失效。处理方式有三种specToChunk中的method字段gzip压缩后存为字节数组HTML 页面与大部分 JS/CSSplaintext以原始文本嵌入 C 字符串如msg.htm使用()定界符、dmxmap.htm在#ifdef WLED_ENABLE_DMX 下条件编译binary原样转字节数组如favicon.ico。输出产物映射脚本最终产出 10 个目标头文件tools/cdata.js典型映射包括源文件产物承载内容index.htmwled00/html_ui.hPAGE_indexsettings*.htmstyle.csscommon.jswled00/html_settings.hPAGE_settings*、PAGE_settingsCss、JS_commoniro.jswled00/js_iro.hJS_iro颜色选择器usermod.htm、msg.htm、update.htm、welcome.htm、liveview.htm、liveviewws2D.htm、404.htm、favicon.icowled00/html_other.hPAGE_usermod、PAGE_msg、PAGE_update等pixart/pixart.htm等wled00/html_pixart.hPAGE_pixart等固件侧 wled_server.cpp 正是通过JS_common/PAGE_settingsCss/PAGE_index等符号把这些资源直接服务给浏览器全程无需文件系统。开发工作流一次性构建npm install # 安装 web-resource-inliner 等依赖Node 20 npm run build # 执行 node tools/cdata.js生成全部 html_*.h / js_*.h监听模式频繁修改数据目录时推荐package.json的dev脚本用nodemon监视tools/与wled00/data/任一文件变化即自动重新构建npm run dev增量跳过机制isAlreadyBuilt()tools/cdata.js会比较各产物头文件与源码目录、cdata.js、package.json的 mtime全部较新则直接跳过构建输出Web UI is already built需要强制重建时传入--force/-f。自动化测试tools/cdata-test.js 使用 Node 内置node:test验证构建行为——缺失头文件时触发重建、单个文件缺失时重建、--force强制重建、任意源文件index.htm、index.js、settings_leds.htm、common.js、cdata.js、package.json变更后重建以及已构建则跳过的加速断言。执行方式npm test # 即 node --testPlatformIO 集成在固件编译流程中前端构建由 pio-scripts/build_ui.py 作为预构建步骤自动触发脚本首先检查 PATH 中是否存在node缺失则中止并提示随后执行npm ci安装锁定依赖再执行npm run build。也就是说即使你只改了一个 HTML 属性npm run build失败也会导致整个固件编译失败——这正是规范要求改完必跑构建的工程原因。修改 Web UI 的标准操作流程综合以上规范一个完整的 Web UI 修改流程如下编辑源码只修改 wled00/data 下的.htm/.js/.css遵循 Tab 缩进、camelCase 命名优先复用common.js助手对用户输入使用esc()/safeUrl()防护本地验证运行npm run build确认构建通过、产物正常生成或npm run dev持续监听固件编译通过 PlatformIO 编译构建前会自动执行npm ci npm run build禁止直接修改wled00/html_*.h、wled00/js_*.h等生成文件。小结WLED 的 Web UI 是一套源码在wled00/data/、产物在wled00/html_*.h/js_*.h的双层工程前者的可读性由 Tab 缩进、camelCase 与common.js复用约定保障后者的体积由内联、压缩、GZIP 流水线tools/cdata.js控制最终由 wled_server.cpp 以 PROGMEM 资源形式提供给浏览器。遵循 docs/web.instructions.md 的约定配合npm run build与npm test工作流即可安全、一致地参与 WLED 网页界面的开发与定制。【免费下载链接】WLEDControl WS2812B and many more types of digital RGB LEDs with an ESP32 over WiFi!项目地址: https://gitcode.com/GitHub_Trending/wl/WLED创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表