0%

2026-07-12-live2d-代码审核日志

Live2D 看板娘 — 代码审核日志

审核时间: 2026-07-12
项目路径: D:\my-blog\technical
预览地址: http://127.0.0.1:8080cd public && python -m http.server 8080


当前架构

1
2
3
4
5
6
7
live2d-widgets v1.0.1
├─ cdnPath: yzs CDN(模型文件从 CDN 加载,语音路径解析正常)
├─ model_list.json → fetch 拦截 → 只返回 ["umaru", "sagiri", "chino"]
├─ sagiri/index.json → fetch 拦截 → 本地版本(含 B 站语音引用)
├─ sagiri/voice/*.wav → fetch 拦截 → 本地文件(24 句)
├─ umaru 语音 → CDN 直连(34 句原声)
└─ chino → CDN 直连(无语音)

注入文件

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.json
  • sagiri/voice/*.wav 请求拦截,重定向 CDN 路径到本地路径
  • 结论:逻辑正确,无 bug

小建议Array.prototype.join.call(arguments, ' ') 在 console 传入对象参数时会丢失信息,可改进但不影响功能。

段二:Audio 音量 + 冷却 + 模型隔离(行 376-445) ✅

  • window.__lv2AudioHooked 防 PJAX 重复覆写
  • modelOf(url) 根据 URL 中的模型名判断归属
  • stopOthers(model) 切换模型时暂停并重置上一个模型的 Audio
  • play() 覆写实现 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
2
m.indexOf('_$NP') !== -1 || m.indexOf('D_REF') !== -1 
|| m.indexOf('null') !== -1 && e.filename && e.filename.indexOf('live2d.min.js') !== -1

&& 优先级高于 ||,当前等价于:

1
2
3
(m 包含 '_$NP') → 拦截
(m 包含 'D_REF') → 拦截
(m 包含 'null' 且文件名是 live2d.min.js) → 拦截

实际上能拦住 hitTest 报错(消息同时含 nullhitTest),但建议加括号或直接加上 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
2
3
4
5
6
7
# 重新生成
cd D:\my-blog\technical
npx hexo generate

# 启动预览
cd public
python -m http.server 8080

然后浏览器打开 http://127.0.0.1:8080