ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Bilibili-Evolved 高分辨率图片组件(imageResolution)深度解析:DPI 缩放下的图片源替换原理与配置指南

Bilibili-Evolved 高分辨率图片组件(imageResolution)深度解析:DPI 缩放下的图片源替换原理与配置指南 Bilibili-Evolved 高分辨率图片组件imageResolution深度解析DPI 缩放下的图片源替换原理与配置指南【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved导读「高分辨率图片」是 Bilibili-Evolved 内置的实用工具类组件其核心职责是当屏幕 DPI 缩放超过 200% 时自动将哔哩哔哩页面中按xxxw/xxxw_xxh规则裁剪缩略的图片替换为更高分辨率的图片源从而让高分屏用户获得清晰的浏览体验。本文以组件文档 image-resolution/index.md 为骨架结合源码逐层讲解其工作流程、缩放算法、两个配置选项的语义以及加载变慢、图片闪动、比例失衡等已知问题的成因与规避方法帮助你正确启用与调优该组件。一、组件定位为什么需要高分辨率图片哔哩哔哩的图片服务如头像、封面、动态配图在绝大多数场景下都会返回经过尺寸裁剪的缩略图URL 中携带形如672w_378h或96w的缩放后缀。在普通屏幕上这些缩略图足够清晰但在 Retina 屏、4K 屏等高 DPI 设备上系统会以高于 1 的逻辑像素比devicePixelRatio渲染页面缩略图被放大后就会出现明显的模糊。「高分辨率图片」组件正是针对这一痛点当屏幕 DPI 缩放超过 200%即devicePixelRatio 2时按比例放大 URL 中的尺寸参数向 CDN 请求更高分辨率的图片源。从组件元数据index.ts可以看到其默认行为组件名imageResolution显示名「高分辨率图片」归属utils实用工具标签enabledByDefault: window.devicePixelRatio 1即只要 DPR 大于 1任何高分屏默认即启用入口为startResolution选项包含scale与originalImageInArticles。二、工作原理从图片 URL 重写到底层实现2.1 哔哩哔哩图片 URL 的尺寸规则B 站图片地址中符号后的部分即为尺寸指令常见两种形态200w仅指定宽度高度按原图比例自动计算200w_112h同时指定宽度与高度。源码中的匹配正则resolution.ts正是针对这一约定const resizeRegex /(\d)Ww[Hh])?/替换时若原 URL 只有宽度则新 URL 写为${newWidth}w若宽高都有则写为${newWidth}w_${newHeight}h。当计算出的新尺寸为无穷大请求原图时则直接把...后缀整体移除等价于请求原始分辨率图片。2.2 整体流程组件入口startResolutionresolution.ts通过styledComponentEntry包装见 styled-component.ts先动态注入样式文件 fix.scss再执行主逻辑计算缩放倍率读取scale选项auto时调用getAutoScale()否则解析为数字全量扫描用document.createNodeIteratorwalk函数遍历document.body下所有元素逐一调用imageResolution处理动态监听注册allMutations基于MutationObserver见 observer.ts对后续新增节点如滚动加载的图片递归执行同样的替换保证动态内容也被覆盖。2.3 auto 缩放倍率的算法getAutoScale()resolution.ts逻辑非常简洁const getAutoScale () { if (window.devicePixelRatio 2) { return 1 } return window.devicePixelRatio / 2 }DPR ≤ 2即 200% 缩放下限之内时倍率为 1不做任何替换scale 1时入口函数直接 return见第 135-137 行避免低缩放屏幕上的无谓开销DPR 2 时取DPR / 2例如 DPR 2.5250% 缩放时请求 1.25 倍DPR 3300% 缩放时请求 1.5 倍。这与文档中250% 的缩放下会请求 1.5 倍尺寸的图片略有出入——文档示例按超出 200% 的比例理解而源码实现实际按DPR / 2计算两者在 DPR 3 时1.5 倍是一致的。以当前仓库源码为准实际倍率 devicePixelRatio / 2。2.4 图片源的三类替换通道imageResolution函数resolution.ts对每个元素同时处理三种图片来源并通过attributes监听observer.ts在属性变化时再次替换src属性img标签srcset属性响应式图片集合style.backgroundImageCSS 背景图。替换前有一系列守卫条件排除选择器#certify-img1、#certify-img2认证图片不处理含逗号的 srcset 不处理value.includes(,)时直接跳过避免破坏多候选源语法去重防抖通过data-resolution-width自定义属性记录已替换的宽度若当前宽度不大于已记录值则跳过防止重复放大导致图片被无限放大匹配失败URL 中无...w规则直接跳过。2.5 关键修复替换图片源后的尺寸比例处理文档特别提醒由于 b 站在很多地方没有设置图片维持原比例如果计算后的图片尺寸超出原图尺寸则会产生错误的比例。源码对此做了针对性处理当元素原本没有显式width/height属性时resolution.ts会按选择器类别补写属性以锁定布局.bili-avatar-img动态头像框只设置height对应 issue #2030.logo-img首页 Logowidth和height都设置对应 issue #4480其余元素只设置width由浏览器按原图比例推导高度。同时fix.scss 用 CSS 兜底修复了收藏夹封面favInfo-box与评论区航海挂件图片的宽度/对齐问题避免替换后布局错乱。三、配置选项详解组件共两个选项定义于 index.ts并通过defineOptionsMetadata注册见 define.ts。3.1scale缩放级别默认auto文档给出的取值有两类取值含义行为auto自动模式按devicePixelRatio / 2计算倍率DPR ≤ 2 时为 1不替换数字如1.2、1.5、2自定义倍率以该数字作为统一缩放倍率源码中通过parseFloat解析数字模式不受 DPR 约束适合想强制放大、或反过来手动降低缩放级别的用户。文档明确指出当自动计算出的图片尺寸超出原图尺寸、导致页面出现错误比例时可在选项中手动调低缩放级别来规避。3.2originalImageInArticles在专栏中请求原图默认false该选项针对专栏文章页开启后命中.article-detail .article-content img选择器的图片其缩放倍率被设为Infinity见 resolution.ts从而在 URL 替换时直接去掉...尺寸后缀请求原始分辨率的图片保证长文配图的最佳清晰度。代价是加载流量与时间显著增加因此默认关闭需要用户按需开启。四、已知问题与使用注意事项文档明确列出了该组件带来的副作用使用时应充分权衡加载时间变长高分辨率图片体积更大CDN 传输与解码耗时随之增加图片闪动部分浏览器中由于本质上是更换图片源src被重写后图片会重新加载出现短暂闪烁。这是源码层面setAttribute(src, ...)直接换源的必然结果无法完全消除只能通过降低倍率减少触发比例错误B 站大量位置未设置图片维持原比例object-fit等一旦放大后的尺寸超过原图尺寸会拉伸变形。应对手段有三手动调低scale、依赖 2.5 节所述的属性补写逻辑、以及fix.scss中的样式兜底DPI 判断边界DPR ≤ 2 的屏幕默认不替换auto 模式下倍率为 1因此普通 100%/125%/150%/200% 缩放下该组件实际不生效仅在超 200% 缩放时才工作。五、源码结构速查文件作用image-resolution/index.md组件使用文档本文依据image-resolution/index.ts组件元数据与选项定义image-resolution/resolution.ts核心实现URL 正则重写、DOM 遍历、MutationObserver 监听image-resolution/fix.scss替换后的布局修复样式styled-component.tsstyledComponentEntry工具动态注入样式后执行入口observer.tsattributes/allMutations观察器驱动动态内容替换结语「高分辨率图片」组件通过一套极轻量的 URL 重写机制正则匹配w/w_h后缀 → 按 DPR 计算倍率 → 重写src/srcset/backgroundImage配合 DOM 遍历与 MutationObserver在保持页面布局稳定的前提下为高分屏用户提供更清晰的图片。理解其auto倍率算法DPR / 2、originalImageInArticles的原图直取语义以及比例修复策略是正确配置该组件、规避图片闪动与比例失真问题的关键。【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表