Live2D 看板娘 — 代码审核日志
审核时间: 2026-07-12
项目路径: D:\my-blog\technical
预览地址: http://127.0.0.1:8080(cd public && python -m http.server 8080)
当前架构
1 | live2d-widgets v1.0.1 |
注入文件
source/_data/body-end.swig
各脚本段审核
段一:fetch 拦截 + console 抑制(行 327-373) ✅
console.warn/console.error覆写,过滤hit_areas/D_REF/_$NP关键词model_list.json请求拦截,返回三人列表sagiri/index.json请求拦截,重定向到本地/js/model/sagiri/index.jsonsagiri/voice/*.wav请求拦截,重定向 CDN 路径到本地路径- 结论:逻辑正确,无 bug
小建议:Array.prototype.join.call(arguments, ' ') 在 console 传入对象参数时会丢失信息,可改进但不影响功能。
段二:Audio 音量 + 冷却 + 模型隔离(行 376-445) ✅
window.__lv2AudioHooked防 PJAX 重复覆写modelOf(url)根据 URL 中的模型名判断归属stopOthers(model)切换模型时暂停并重置上一个模型的 Audioplay()覆写实现 7 秒冷却(每个模型独立计时)ended/pause事件清理liveAudios跟踪数组- 结论:语音串扰、重复触发、7s 冷却均已解决
确认:modelOf 用 /umaru/ /sagiri/ /chino/ 匹配,CDN 和本地路径均兼容。
段三:错误抑制 + initWidget(行 448-477) ⚠️
window.addEventListener('error', ...)capture 阶段拦截 Cubism2 运行时异常- 过滤条件:
_$NP/D_REF/null+ 文件名live2d.min.js initWidget()加载看板娘,cdnPath指向 yzs CDN- 结论:功能有效,但有一个优先级隐患
运算符优先级问题(行 452):
1 | m.indexOf('_$NP') !== -1 || m.indexOf('D_REF') !== -1 |
&& 优先级高于 ||,当前等价于:
1 | (m 包含 '_$NP') → 拦截 |
实际上能拦住 hitTest 报错(消息同时含 null 和 hitTest),但建议加括号或直接加上 hitTest 关键词。
段四:鼠标拖尾(行 479-483) ⚠️ 微小瑕疵
- 第 479 行和 481 行有重复的
<!-- 鼠标拖尾粒子 -->注释 - 不影响功能,删一个即可
解决清单
| 问题 | 状态 | 方案 |
|---|---|---|
| 语音串扰(小埋→纱雾) | ✅ 已解决 | stopOthers() 切换模型时静音 |
| 重复触发语音 | ✅ 已解决 | play() 覆写 + 7s 冷却 |
| hitTest 报错 | ✅ 已解决 | console 过滤 + error 事件拦截 |
| 模型列表过多 | ✅ 已解决 | fetch 拦截 model_list.json |
| 纱雾无 B 站语音 | ✅ 已解决 | fetch 拦截 sagiri voice → 本地 |
| PJAX 兼容 | ✅ 已解决 | __lv2AudioHooked 守卫 |
| MSR 音量 | ✅ 已解决 | audio.volume = 0.3 |
| 看板娘尺寸 | ✅ 已解决 | #waifu { transform: scale(0.42) } |
启动命令
1 | # 重新生成 |
然后浏览器打开 http://127.0.0.1:8080