Butterfly 从 5.6.1 升到 5.7.0 的 release note 里写着一句:移除内置 APlayer/Meting 支持。升级完,aplayerInject 配置失效,layout/includes/third-party/aplayer.pug 和 plugins.yml 里的相关条目一起没了。
/music/ 有 188 个 <meting-js>,inject 里还有一个固定播放器。这些标签本身还在,脚本注入没了,页面上就是一排空的自定义元素。
按理说故事到这儿就是「升级弄坏了播放器,赶紧回滚或手写 inject」。但先测了一下基线,结果有点意外。
升级之前,其实已经是 0 个
meting-js 默认走 MetingJS 内置的后端 api.i-meto.com。它已经停止服务了,响应没有 CORS 头,浏览器的请求全部失败。也就是说,线上播放器早就一个都渲染不出来,只是没人特意去数。
主题升级不是罪魁,它只是把一块早就烂掉的地板掀开了。这个区分很重要:如果直接回滚版本,页面会回到「看起来有播放器代码、实际还是 0 个」的状态,然后继续以为它好的。
手写 inject,顺序是硬约束
修法是自己在 inject 里按顺序引:
<link rel="stylesheet" href="https://registry.npmmirror.com/aplayer/latest/files/dist/APlayer.min.css" media="print" onload="this.media='all'">
...
<script src="https://registry.npmmirror.com/aplayer/latest/files/dist/APlayer.min.js"></script>
<script>window.meting_api="https://meting-api.saop.cc/api?server=:server&type=:type&id=:id&r=:r"</script>
<script src="https://registry.npmmirror.com/meting/latest/files/dist/Meting.min.js"></script>window.meting_api 必须在 Meting.min.js 之前设置,晚一行都不生效。CSS 用 media="print" + onload 改成 all,不阻塞首屏。
pjax 胶水脚本其实是死代码
主题原来还有一段 pjax 钩子,切页时 destroyAplayer 再重建。查了一下 APlayer 1.10.1,window.aplayers 已经不再维护,那段 destroyAplayer 本来就没东西可销毁。
而 MetingJS v2 是标准自定义元素,切页时由 connectedCallback / disconnectedCallback 自己重建和销毁。所以这次的结论是不加胶水,让生命周期归元素自己管。
修完要数出来
改完实测:
- 播放器渲染数 0 → 167/188;
- pjax 往返后,页内播放器全部重建;
- 固定播放器始终是同一个 DOM 节点,播放不中断。
剩下的 21 个里,20 个是 type="album"——自建 Meting API 暂不支持这个类型,返回 400;另外 1~2 个是 188 个并发请求触发限流导致的偶发失败。两项都在 API 服务端,跟这个仓库无关,commit message 里也这么写了,没有算进「已修好」。
167/188 不是满分,但它是一个能复查的数:渲染数、pjax 往返、固定节点身份,各自都有观察点。
升级时先分清两笔账
依赖升级最贵的部分不是改配置,是你得有能力在升级前说清楚「现在到底什么样」。这次的基线只有一句话——0 个——却决定了后面所有判断:
- 如果 0 是升级造成的,就该怀疑 5.7.0 的改动,甚至回滚;
- 如果 0 是旧账,升级只是让你看见它,那就该修后端和注入顺序,而不是回滚。
顺带还清掉一段死代码。要是当时偷懒,把 destroyAplayer 原样搬进新的 inject,它也会「跑通」,只是每次切页都对着一个空数组做一遍没用的事,下一个人更看不出它为什么存在。
先把「原来是什么样」测出来,再决定「升级弄坏了什么」。
