锐化图像CDN优化器
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/sharp-image-cdn-optimizer 到你的 AI 助手中。
技能介绍
要解决的问题
现代 Web 应用的图片资源往往直接落在对象存储或 CDN 后面。服务端如果只做「原样吐出」而不做格式转换、尺寸裁剪和缓存策略控制,就会带来两类问题:一是移动端下载大量未经压缩的 JPEG/PNG,带宽成本和首屏时间双双上升;二是 CDN 边缘节点因缺少 Cache-Control 与 Vary 等响应头,可能把不同尺寸、不同格式的响应互相复用,造成图片错乱或缓存命中率下降。
核心能力与工作方式
这个技能围绕 Sharp(libvips 的 Node.js bindings)构建了一条轻量的实时图像处理链路。运行时不依赖预生成静态资源,而是在请求进入时按参数完成转码和裁剪,并通过 CDN 感知的缓存头把结果交给边缘节点缓存。
关键步骤包括:
- 使用
sharp()加载源图,根据请求的width、height、fit参数执行裁剪与缩放。 - 并行输出 AVIF 与 WebP 两种现代格式,避免单一格式在客户端不支持时回退到体积过大的 JPEG。
- 基于源图尺寸与目标尺寸自动生成
srcset,让浏览器按device-pixel-ratio和视口宽度选择合适档位。 - 抽取低质量图像占位(LQIP),通常以 16px 左右的极小尺寸 + 高压缩率编码,配合 CSS 背景渐进加载。
- 为每种变体写入独立
Vary头(如Vary: Accept, Width),防止 CDN 把不同格式或不同宽度的响应串用。
适用边界与注意点
这个方案只适用于服务端或边缘运行时能执行 Node-API 的环境。上游模块要求 Node.js ^18.17.0 或 >= 20.3.0,也可运行在 Deno 与 Bun 上。如果部署在完全静态的 CDN 上,又没有服务端函数介入,则无法实现动态转码与 LQIP 生成。
Sharp 本身是原生模块,冷启动会加载 libvips 二进制,冷路径耗时显著高于纯 JavaScript 方案。生产环境建议把同一 URL + 同一参数组合的结果缓存在边缘节点,避免每次回源都重新编码。
此外,AVIF 编码在低配 CPU 上开销较大,高并发场景需要关注线程池配置,否则可能成为请求队列的瓶颈。
使用场景
- 维护一个 Node.js 图片服务,需要按请求参数实时输出 AVIF 与 WebP,并在边缘节点缓存结果,避免回源重复编码
- 优化移动端商城的商品图,需要根据设备宽度生成 srcset 多档位,并写入 Vary 头防止不同尺寸互相覆盖
- 为资讯站的图片加载做模糊渐进效果,需要在服务端抽取 16px 左右的 LQIP 缩略图供 CSS 背景使用
- 把对象存储里的原始图接入 CDN,需要在 Node 服务中统一处理裁剪、格式协商和缓存头,降低回源压力
适合人员
- 负责电商前端性能的工程师,需要把商品图改造成 AVIF/WebP 自适应格式以降低移动端流量
- 维护 Node.js BFF 服务的后端开发者,需要统一接管图片裁剪与格式协商逻辑,不再依赖业务方各自实现
- 管理图片 CDN 的 SRE,需要为不同尺寸和格式组合配置正确的 Vary 与 Cache-Control 策略,避免缓存击穿
- 搭建技术博客图片流水线的独立开发者,需要一键生成 srcset 和 LQIP,让文章页获得渐进加载体验