B 站首页换成手机 App 的个性化推荐流。零框架纯原生实现(无 React/Vue、gzip 约 29KB)+ 窗口化虚拟化,约束 DOM、封面与预览媒体的常驻资源。视频默认开新标签页,也可选当前页或底部抽屉;封面悬停「真视频」秒开预览(MSE,接近原生 App)。需配合 BiliKit Core(登录 / 设置)。
Bunlar bu scriptin güncellenmiş kod versiyonlarıdır. Bütün versiyonları göster.
feat: default to new tabs with Safari history flattening
feat: bound drawer lifecycle and restore feed returns
fix: harden drawer history and resource cleanup
fix(build): icon.ts 内联 SVG 去掉 node:* 依赖——修 tsc typecheck CI 失败
icon.ts 原用 readFileSync 读 assets/logo.svg,引入了 node:fs/url/path;但 typecheck 的 tsconfig 是纯浏览器类型(types:[]、未装 @types/node),而 vite.config.ts 在 include 里会顺 import 把 icon.ts 拉进检查 → TS2307 找不到 node:* 模块。改为把(极少变动的)SVG 内联进 icon.ts、 不再读文件,零新依赖、不污染 src 浏览器类型。assets/logo.svg 仍作展示用规范文件,改 logo 两处同步。
Co-Authored-By: Claude Opus 4.8 [email protected]
fix(feed): 「不想看」标记态存进 FeedCard——卡片窗口化卸载重建后不再丢失变回普通卡;Feed 0.3.19→0.3.20
dislike 原本只改 DOM(.disliked class + 闭包 lastRid),卡片划出虚拟化窗口卸载、划回 重建时按原始数据重绘 → 标记态丢失、变回普通卡。改为把标记态写进 FeedCard (disliked/dislikedRid/dislikedLbl,随 items[] 存活):makeCard 收到的正是 items[i] 同一 对象引用,故点击处理改 c 即改数据;重建时据此恢复模糊浮层/文案/撤销,lastRid 也从数据恢复。 刷新 feed 换新对象则自然清空(符合预期)。
fix(feed): 封面 isolation:isolate 改回常驻——按需增删会 churn 合成层致邻卡遮罩露缝;Feed 0.3.18→0.3.19
0.3.17 为省合成面把 isolation 改成「仅挂 预览时加 .hasvp」,但动态开关层叠上下文 会在建/拆层那一瞬 churn 合成层,触发 WebKit overlap testing 把右侧邻卡的遮罩(播放/弹幕图标) 顶得上下位移、露缝(与 hover 用 transform 晃邻卡同源)。改回常驻在 .bk-feed-cover(0.3.16 及之前的已知无缝实现),删掉 .hasvp 增删逻辑。每张封面常驻一层叠上下文的图形开销可接受。
feat(no-login): 默认开启 + 一次性知情提示 + 退出登录直通登录;新增 BiliKit logo 与 @icon
免登录(Core 0.5.21→0.5.22):
Logo(Feed 0.3.17→0.3.18,让图标随 GreasyFork 下发):
perf(feed): isolation:isolate 改为按需(仅封面挂 预览时)而非每张常驻,省合成面;Feed 0.3.16→0.3.17
footprint A/B 实测:内存主要是 B站重型 SPA 自身(原生地板 ~1.6GB 峰值且随用爬),BiliKit 净增 ~+300MB (峰值 +550MB)、非泄漏非视频(media 仅 5-50MB)。能榨的只有合成面这点:isolation 从每张封面常驻收窄到 仅有视频预览时才加(无视频时封面图靠自身 border-radius 就够),减少常驻层叠上下文/合成面。 视频露缝修复(WebKit #77572)不受影响:hasvp 在建 video 前加、拆 video 时才撤,视频存续期间 isolation 始终在。
同时收录内存侧测探针 tools/bilikit-mem-probe.user.js(独立调试脚本,不进构建)。
Co-Authored-By: Claude Fable 5 [email protected]
feat(feed): 新增「网页推荐」数据源 + 源切换器(并入右下角 FAB,手机=App/电脑=Web);Feed 0.3.13→0.3.16
fix(feed): 预览视频露缝且移开不恢复——封面加 isolation:isolate 建层叠上下文修 WebKit #77572;Feed 0.3.12→0.3.13
是媒体硬件合成层、无视元素 border-radius,overflow:hidden+圆角容器裁不住它而露缝; 又因 stop() 保留 video 供秒回放,视频层常驻不走,缝就一直留着(移开也不恢复)。 isolation:isolate 建独立层叠上下文即让 Safari 正确裁剪;不用 -webkit-mask(会每帧重刷视频进遮罩缓冲、增功耗)。
fix(feed): 修「划过卡片,邻卡遮罩文字跟着晃/露缝」——hover 浮起改用 top 偏移替代 transform;Feed 0.3.9→0.3.12
真凶:hover 的 transform 让本卡建/拆合成层,WebKit 重叠测试把「被 hover 大投影碰到、绘制顺序在后」 的邻卡内容连带提升/降回;网格列宽是 1fr 分数像素,文字在普通绘制与合成层上亚像素栅格化不同,那一瞬 就肉眼可见地动一下(圆角露缝同根)。改走 top:-4px(纯绘制偏移、不建层),机制上拆掉「邻卡被牵连」路径。
顺带:锚点滚动补偿改用 offsetTop 而非 getBoundingClientRect(后者受 transform 污染); 三点菜单提层用 :has(.more-wrap:hover) 收窄触发范围。
perf(feed): 封面 AVIF/WEBP 协商(同步懒加载/卸载)+ decoding=async + hover 预览并发数硬上限;Feed 0.3.8→0.3.9
参考 BewlyCat 思路但重新校验实现:其 URL 拼法(直接加 .avif 后缀)实测对真实 CDN 404, 改用验证生效的 @{w}w_{h}h_1c.{format} 缩放+格式参数(640x360 JPEG 比原图省 81%,AVIF 再省 45%)
fix(core): 抽屉 iframe 销毁顺序补 contentWindow.close()(参考 BewlyCat 踩坑记录: 先移出 DOM 会导致 contentWindow 提前变 null、close() 从未真正生效);Core 0.5.20→0.5.21
Co-Authored-By: Claude Sonnet 5 [email protected]
feat(feed): 卡片新增「稍后再看」「我不想看」(反馈到 B 站推荐接口 + 本地模糊撤销浮层);Feed 0.3.4→0.3.8
fix(core): 去掉抽屉「用力甩偶发露白」的历史补丁——多轮排查确认为 iOS/macOS Safari 对 iframe 原生文档滚动的平台级限制,标准 CSS 手法均无效(详见 issue #4),保留死代码不如不留; site-drawer 放行卡片操作控件(.bk-feed-noopen),不再被误判成「点视频」接管;Core 0.5.19→0.5.20
fix(feed): 卡片 hover 浮起时封面圆角露缝——给合成子层补同款 border-radius(深色尤明显);Feed 0.3.3→0.3.4
feat: 「关于」页显示 Feed 版本;Feed 版本同样单一源并上报(Core 0.5.8→0.5.9 / Feed 0.3.2→0.3.3)
feat(core): 全站抽屉——「打开方式」移入 Core、全站视频点击生效;Core 0.4.7→0.5.0 / Feed 0.3.1→0.3.2
「打开方式」从 Feed 解耦、上移到 Core:全站(首页 / 搜索 / 收藏 / 历史 / 别人空间…)点视频 都按它在 底部抽屉 / 网页全屏抽屉 / 新标签 / 当前页 打开,不跳走、不丢当前列表。
feat(feed): 抽屉「网页全屏」打开方式 + 首帧揭幕(回应 #2)
Issue #2 提到「抽屉能否默认网页全屏、更沉浸」,本次实现:
Feed 0.3.0→0.3.1 / Core 0.4.2→0.4.3
feat: 封面「真视频」秒开预览 (MSE);Feed 0.2.2→0.3.0 / Core 0.4.1→0.4.2
hover 封面用 MSE 只取 init + 头几秒 dash 分段边播边补,起播接近手机 App 原生, 热门冷门都覆盖。关键:分段字节走浏览器 fetch(原生同法,bilivideo 对本源放行 CORS、冷门也回 206),绕开 CDN 对 GM 请求的反爬 403;GM 仅作兜底。
Feed(0.3.0):
Core(0.4.2):
探针实测原生 hover(diag/home-hover-probe)→ 调研文档 docs/RESEARCH-mse-preview.md。
perf(feed): 滚动帧零 layout + 干掉 1Hz 后台空转,Feed 0.2.1→0.2.2
(startIdx/endIdx/totalRows 皆未变则整帧返回)——纯滚动的绝大多数帧 不再 getComputedStyle + offsetHeight + BCR。gridTop 改从 topSpacer 量, 顺带修正未装 Core 提示条撑高时的锚点偏移。
getComputedStyle;心跳 1s→5s(Core 阈值 15s)。
docs(feed): 主打「零框架/零依赖」性能卖点,bump 0.2.0→0.2.1
Feed 无 React/Vue 等任何运行时框架,纯原生 TS + DOM 手写、gzip 仅 ~16KB, 虚拟化为自写几何计算。把这一性能卖点写进 @description、README、 GreasyFork 描述文档,并重建 dist/ 供 GreasyFork 同步发新版。