BiliKit Feed

B 站首页换成手机 App 的个性化推荐流。零框架纯原生实现(无 React/Vue、gzip 约 29KB)+ 窗口化虚拟化,约束 DOM、封面与预览媒体的常驻资源。视频默认开新标签页,也可选当前页或底部抽屉;封面悬停「真视频」秒开预览(MSE,接近原生 App)。需配合 BiliKit Core(登录 / 设置)。

Zoznam verzií skriptu, ktorých kód bol aktualizovaný. Zobraziť všetky verzie.

  • v0.3.23 20.07.2026

    feat: default to new tabs with Safari history flattening

  • v0.3.22 20.07.2026

    feat: bound drawer lifecycle and restore feed returns

  • v0.3.21 20.07.2026

    fix: harden drawer history and resource cleanup

  • v0.3.20 09.07.2026

    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]

  • v0.3.20 09.07.2026

    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 换新对象则自然清空(符合预期)。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.3.19 09.07.2026

    fix(feed): 封面 isolation:isolate 改回常驻——按需增删会 churn 合成层致邻卡遮罩露缝;Feed 0.3.18→0.3.19

    0.3.17 为省合成面把 isolation 改成「仅挂

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.3.18 09.07.2026

    feat(no-login): 默认开启 + 一次性知情提示 + 退出登录直通登录;新增 BiliKit logo 与 @icon

    免登录(Core 0.5.21→0.5.22):

    • defaultEnabled 改 true——仅未登录时激活(已登录在 ckMd5 处即让路,零影响), 无痕/未登录浏览打开即 1080p,无需每次手动开。无痕存不住页面侧开关、@grant none 无法用 GM 存储跨会话,故唯一可行解是把默认值设对,用一次性披露弹框换取透明。
    • 首次激活底部弹一次性提示(关闭功能 / 我要登录 / 忽略);不覆盖用户显式关闭。
    • 顶栏「退出登录」与提示「我要登录」重定向到登录页(gourl 登录后回跳当前页), 只清假 cookie、不关免登录——用户是要登录一次,功能应保留给下次未登录时。

    Logo(Feed 0.3.17→0.3.18,让图标随 GreasyFork 下发):

    • 新增 assets/logo.svg(方案A 扁平双色:粉底 + 白电视 + 蓝播放键,重心对中)。
    • icon.ts 从 svg 生成自包含 data-URI → Core/Feed 两脚本 @icon(离线可见、单一事实来源)。
    • README 顶部居中展示。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.3.17 09.07.2026

    perf(feed): isolation:isolate 改为按需(仅封面挂

    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]

  • v0.3.16 09.07.2026

    feat(feed): 新增「网页推荐」数据源 + 源切换器(并入右下角 FAB,手机=App/电脑=Web);Feed 0.3.13→0.3.16

    • web 推荐流:wbi 签名 + cookie 打 x/web-interface/wbi/index/top/feed/rcmd,normalizeWeb 归一到同一 FeedCard; 原始数字(view/duration秒/pubdate)经 fmtCount/fmtDuration/fmtDate 转成与 app 流一致的显示串;fresh_idx 递增翻页。
    • web 端「我不想看」:走 /x/web-interface/feedback/dislike(cookie+csrf,固定 reason 内容不感兴趣=1/不想看此UP主=4, 需 track_id),FeedCard 加 source/trackId、actions 按 source 分派 app/web 两套接口。
    • 源切换器并入 FAB:默认显当前源图标,hover/触屏展竖向胶囊选择,选完即 refreshFeed(复用手动刷新的全套重置, 切换不泄漏——视频预览 MSE/objectURL、activeOrder、observer 均随 clearAll 正确拆除)。

    Co-Authored-By: Claude Fable 5 [email protected]

  • v0.3.13 07.07.2026

    fix(feed): 预览视频露缝且移开不恢复——封面加 isolation:isolate 建层叠上下文修 WebKit #77572;Feed 0.3.12→0.3.13

    Co-Authored-By: Claude Fable 5 [email protected]

  • v0.3.12 07.07.2026

    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) 收窄触发范围。

    Co-Authored-By: Claude Fable 5 [email protected]

  • v0.3.9 07.07.2026

    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]

  • v0.3.8 07.07.2026

    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

    Co-Authored-By: Claude Sonnet 5 [email protected]

  • v0.3.4 07.07.2026

    fix(feed): 卡片 hover 浮起时封面圆角露缝——给合成子层补同款 border-radius(深色尤明显);Feed 0.3.3→0.3.4

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.3.3 04.07.2026

    feat: 「关于」页显示 Feed 版本;Feed 版本同样单一源并上报(Core 0.5.8→0.5.9 / Feed 0.3.2→0.3.3)

    • Feed 启动时把自身版本写进 localStorage(bilikit:feed.version),Core 的「关于」页据心跳 判在装/未装后显示「Feed vX.Y.Z」或「未安装」(避免读到卸载后残留的旧版本号)。
    • src/feed/version.ts:Feed 版本单一事实来源,与 Core 的 src/core/version.ts 对称—— vite.feed.config 的 @version 与运行时上报都读它,发版只改一行。
    • 「关于」页版本行精简为「Core vX.Y.Z / Feed vX.Y.Z」两行。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.3.2 03.07.2026

    feat(core): 全站抽屉——「打开方式」移入 Core、全站视频点击生效;Core 0.4.7→0.5.0 / Feed 0.3.1→0.3.2

    「打开方式」从 Feed 解耦、上移到 Core:全站(首页 / 搜索 / 收藏 / 历史 / 别人空间…)点视频 都按它在 底部抽屉 / 网页全屏抽屉 / 新标签 / 当前页 打开,不跳走、不丢当前列表。

    • 抽屉从 Feed 迁到 Core(src/core/drawer.ts,自带 CSS、不依赖 Feed);Feed 卡片加 data-bvid、不再自管视频打开(保留头像→空间 + 兜底)。新增「全站抽屉」拦截器(document 捕获阶段委托点击,命中视频链接才接管,非视频/修饰键放行)。
    • 面板「打开方式」并入「播放」分组,删掉多余的独立「全站抽屉」模块项,文案改全站语义。
    • 修「跨子域打开揭幕很晚」:iframe 发揭幕信号 targetOrigin 改 '*'(原 location.origin 在 search/space 子域父页不匹配、被浏览器丢弃 → 只能等 6s 兜底)。
    • 删掉抽屉滑动关闭手势(跨源 iframe 抓不到滚动、行为不一致);关闭改 点缝 / 按钮 / Esc。
    • 三 agent 并行审查后硬化:重开同视频不再卡 6s(换视频才重载、同视频秒揭幕)、resolve 命中 判定更稳、isVideoUrl 收紧、清理死导出与 Feed 失效抽屉 CSS。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.3.1 03.07.2026

    feat(feed): 抽屉「网页全屏」打开方式 + 首帧揭幕(回应 #2)

    Issue #2 提到「抽屉能否默认网页全屏、更沉浸」,本次实现:

    • 打开方式新增「抽屉 · 网页全屏」:抽屉打开后由 iframe 内 Core 点一次 B 站原生「网页全屏」按钮,播放器铺满抽屉、隐去评论与推荐。
    • 「隐藏切换过程」开关(默认开,仅网页全屏时显示):加载遮罩留到播放器 铺满后再撤,全程看不到「普通页 → 切满」过渡;关则尽早显示、会瞥见切换。
    • 抽屉揭幕时机从 iframe load 改到「首帧就绪」(readyState≥2 / loadeddata / canplay),赶在真正开播/出声之前撤遮罩——揭幕即见首帧、声音不先于画面。
    • Core 侧把网页全屏点击 + 首帧检测两处轮询合并为单循环,网页全屏按钮 只点一次(防再点把全屏切回去、来回横跳)。
    • 打开方式 / 封面预览 面板文案精简:标签砍短、底部说明逐项对比。

    Feed 0.3.0→0.3.1 / Core 0.4.2→0.4.3

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.3.0 03.07.2026

    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):

    • src/lib/wbi.ts:web wbi 签名(nav 密钥按天缓存,失败不长缓存以免整会话失效)。
    • src/feed/play-url.ts:wbi playurl 取 dash 最低清 AVC 轨(含 PCDN→upos 去化 + 镜像) 与 durl 回退;仅缓存成功结果,瞬时失败自愈。
    • src/feed/mse-preview.ts:MediaSource/ManagedMediaSource 通用;sidx 精确分段;连续 按需补拉、总字节封顶 8MB(内存有界,loop 复播);dispose 拆除、看门狗回退 durl。
    • src/feed/video-preview.ts:真视频/雪碧图/关闭 三态;hover 500ms 防误触、平滑淡出、 时长转「当前/总时长」;窗口化移除卡片经 teardown 彻底拆除(杜绝 zombie 补拉/泄漏)。
    • src/feed/feed.ts:teardownCard 接窗口化移除;grid 宽变 ResizeObserver 作废布局缓存。
    • 三 agent 并行代码审查后的修复:MSE 泄漏/内存封顶/补拉游标/负缓存/竞态等。

    Core(0.4.2):

    • src/core/panel.ts:新增「封面预览」面板项(真视频/雪碧图/关闭)。
    • src/modules/no-track:埋点拦截默认不再拦 x/web-goblin(那是反爬校验,拦掉会让首页 陷入重载循环——测试中实测发现)。

    探针实测原生 hover(diag/home-hover-probe)→ 调研文档 docs/RESEARCH-mse-preview.md。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.2.2 03.07.2026

    perf(feed): 滚动帧零 layout + 干掉 1Hz 后台空转,Feed 0.2.1→0.2.2

    1 render() 缓存列数/行高/gridTop(量到真卡后落缓存),并加窗口早退

    (startIdx/endIdx/totalRows 皆未变则整帧返回)——纯滚动的绝大多数帧 不再 getComputedStyle + offsetHeight + BCR。gridTop 改从 topSpacer 量, 顺带修正未装 Core 提示条撑高时的锚点偏移。

    2 主题深浅改事件驱动(MutationObserver 盯 class),取代每秒一次

    getComputedStyle;心跳 1s→5s(Core 阈值 15s)。

    3 preconnect 去掉 data.bilibili.com(Core 埋点拦截已短路该域)。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.2.1 03.07.2026

    docs(feed): 主打「零框架/零依赖」性能卖点,bump 0.2.0→0.2.1

    Feed 无 React/Vue 等任何运行时框架,纯原生 TS + DOM 手写、gzip 仅 ~16KB, 虚拟化为自写几何计算。把这一性能卖点写进 @description、README、 GreasyFork 描述文档,并重建 dist/ 供 GreasyFork 同步发新版。

    Co-Authored-By: Claude Opus 4.8 [email protected]

  • v0.2.0 02.07.2026