Sharp
基于 libvips 的高性能 Node.js 图像处理库,用于调整尺寸、转换格式、合成和优化图片。
项目概述
Sharp 为 Node.js、Deno 和 Bun 应用提供流式、高性能的图像处理能力。它常用于生成响应式图片、缩略图、社交分享图、上传预览以及 JPEG、PNG、WebP、GIF、AVIF、TIFF 等格式之间的转换。
Sharp 是面向服务端 JavaScript 运行时的高性能图像处理库,核心建立在 libvips 之上,并通过 Node-API 提供链式 JavaScript 接口。它可以读取文件、Buffer 或 Stream,完成缩放、裁剪、旋转、颜色处理、格式转换、图层合成和元数据控制,再输出到文件、Buffer 或 Stream。官方当前稳定版为 0.35.3,要求 Node.js 20.9.0 以上,也可运行于支持 Node-API v9 的 Deno 与 Bun。
主要特点
Sharp 将 libvips 的高性能处理流水线包装成适合 JavaScript 服务端应用的 API。
高性能流水线
依托 libvips 的按需、流式处理模型,在调整大型图片尺寸时通常能保持较低的内存占用和较高吞吐量。
现代格式转换
支持 JPEG、PNG、WebP、GIF、AVIF、TIFF 等常用输入输出格式,可统一站点图片交付策略。
灵活的缩放与裁剪
提供 cover、contain、fill、inside、outside 等适配方式,以及位置、智能裁剪和防止放大等选项。
图层合成
可把图片、SVG 或文字叠加到主图,并使用多种 Blend Mode 生成水印、徽章和社交分享图。
颜色与图像操作
内置旋转、翻转、模糊、锐化、灰度、色调、Gamma、阈值和通道操作等处理能力。
文件、Buffer 与 Stream
输入输出形式适合本地文件、HTTP 上传、对象存储、消息队列和无服务器函数等多种数据流。
元数据控制
可读取尺寸、格式、方向和色彩信息,并决定移除、保留或修改 EXIF、ICC 等元数据。
跨平台预构建二进制
官方为常见 macOS、Linux、Windows 平台和 CPU 架构提供预构建包,通常无需本地编译 libvips。
适用场景
从用户上传到静态站点构建,凡是需要批量、实时处理图片的服务端流程都值得评估 Sharp。
图片上传服务
校正方向、限制尺寸、移除敏感元数据,并为头像、封面和商品图生成多个规格。
响应式图片管线
批量输出不同宽度与 WebP、AVIF 等格式,配合 picture 和 srcset 降低页面传输体积。
静态站点与框架构建
为 Next.js、Gatsby、Astro 或自定义构建脚本预生成缩略图、占位图和开放图谱图片。
电商与内容平台
规范用户来源不一的商品图、文章配图和素材库文件,保证尺寸、比例和编码质量一致。
动态图片 API
根据 URL 参数即时缩放、裁剪、加水印或转换格式,并把结果缓存到 CDN 或对象存储。
批量媒体迁移
通过队列或离线脚本重新编码旧素材、生成衍生版本,并汇总尺寸和格式元数据。
优点与注意事项
技术选型不仅要看能力,也要理解它带来的团队成本。
主要优点
Sharp 擅长的地方
- 基于 libvips,适合高吞吐和大批量图像处理
- 链式 API 清晰,容易组合缩放、转换、合成和输出步骤
- 覆盖 WebP、AVIF 等现代网页图片格式
- 支持文件、Buffer 和 Stream,便于接入不同存储系统
- 常见平台提供预构建二进制,安装体验相对直接
- TypeScript 类型完善,并可在 Node.js、Deno 与 Bun 中使用
需要注意
采用前应考虑的问题
Sharp 不是纯 JavaScript 包。容器、无服务器平台和跨架构部署必须确保目标操作系统、CPU 与 libc 对应的二进制被正确安装和打包。
0.35.x 要求 Node.js 20.9.0 以上;从旧版 Sharp 或 Node.js 18 升级前,需要先检查运行环境与 CI 镜像。
上传图片可能包含超大尺寸、异常元数据或解压炸弹,应限制文件体积、像素数、格式、超时和处理并发。
默认输出转换为 sRGB 并移除包括 ICC Profile 在内的元数据;摄影、印刷或版权场景应明确使用保留元数据的 API。
多页 GIF、WebP 或 TIFF 需要使用 animated、pages 等选项,否则可能只处理首帧或得到不符合预期的输出。
Sharp 会按既定流水线执行部分操作,例如合成前会先处理输入图;复杂管线应查阅各 API 的顺序说明并加入像素级测试。
高并发任务会消耗 CPU 与原生内存,应结合容器限制调整应用队列、sharp.concurrency() 和 sharp.cache()。
quality 数值不能在不同编码器之间直接等价比较,应使用真实素材评估清晰度、文件体积、透明度和色差。
快速开始
安装 Sharp,生成一张适合网页展示的 WebP 缩略图,并扩展到 Buffer 与批量处理场景。
bashnpm install sharp
# 确认当前运行时满足 Node.js 20.9.0 以上
node --versiontypescriptimport sharp from "sharp";
await sharp("input.jpg")
.rotate()
.resize(800, 450, {
fit: "cover",
position: "attention",
withoutEnlargement: true,
})
.webp({ quality: 82 })
.toFile("output.webp");typescriptimport sharp from "sharp";
export async function createAvatar(input: Buffer) {
const image = sharp(input, {
limitInputPixels: 40_000_000,
failOn: "warning",
});
const metadata = await image.metadata();
const output = await image
.rotate()
.resize(256, 256, { fit: "cover" })
.webp({ quality: 80 })
.toBuffer();
return { output, source: metadata };
}typescriptimport sharp from "sharp";
const source = await sharp("hero.jpg").rotate().toBuffer();
const widths = [480, 960, 1440];
await Promise.all(
widths.map((width) =>
sharp(source)
.resize({ width, withoutEnlargement: true })
.avif({ quality: 55 })
.toFile(`public/hero-${width}.avif`),
),
);bashnpm run lint
npm run typecheck
npm test
# 用真实图片覆盖 JPEG、PNG、WebP、AVIF、透明通道、EXIF 方向和动画帧
# 在目标 Linux/容器环境安装依赖并执行一次完整处理流程下一步:生产环境应限制输入像素、文件大小和并发数,并用真实图片集合测试内存峰值、方向、色彩空间、动画帧和异常文件。
类似项目
这些项目可承载 Sharp,或提供不同侧重点的图像处理与构建能力。
Node.js
基于 V8、用于服务器、命令行工具和网络应用的跨平台 JavaScript 运行时。
查看项目Next.js
基于 React 的全栈 Web 框架,覆盖渲染、路由和部署。
查看项目Gatsby
基于 React 和 GraphQL 数据层、面向内容网站的静态与混合渲染框架。
查看项目Astro
面向内容网站的 Web 框架,默认发送更少的客户端 JavaScript。
查看项目Vite
新一代前端构建工具,提供快速开发服务器和优化构建。
查看项目Bun
集运行时、包管理器、测试与打包工具于一体的工具链。
查看项目Deno
默认支持 TypeScript 的安全 JavaScript、TypeScript 运行时。
查看项目Vercel Functions
与 Web 框架和 Vercel 部署流程深度集成的托管 Serverless 计算服务。
查看项目Netlify Functions
与 Netlify Web 部署、预览和平台事件紧密集成的托管 Serverless Functions。
查看项目Jimp
纯 JavaScript 图像处理库,安装和跨平台使用简单,适合基础操作与较轻负载。
访问官网ImageMagick
成熟的命令行和库级图像处理套件,格式与操作覆盖广泛。
访问官网Squoosh
以 WebAssembly 编码器为核心的图片压缩工具与组件集合,可在浏览器中运行。
访问官网Sharp vs Jimp
Sharp 与 Jimp 都能在 JavaScript 应用中调整尺寸、裁剪和转换图片,但技术路线不同:Sharp 通过原生 libvips 追求服务端吞吐量和现代格式支持,Jimp 采用纯 JavaScript 实现,跨平台安装更简单,也更适合不便加载原生模块的环境。
| 比较维度 | Sharp | Jimp |
|---|---|---|
| 实现方式 | Node-API + libvips 原生库 | 纯 JavaScript |
| 性能取向 | 高吞吐、低内存的服务端处理 | 易用性与可移植性优先 |
| 安装部署 | 需要平台对应的原生二进制 | 通常不需要原生依赖 |
| 格式覆盖 | JPEG、PNG、WebP、GIF、AVIF、TIFF 等 | 常用格式为主,能力取决于插件 |
| 处理模型 | 链式、按需的 libvips 流水线 | 在 JavaScript 中解码和操作像素 |
| 大型图片 | 更适合生产级批量与并发任务 | 需要关注执行时间与内存 |
| 运行环境 | 支持 Node-API v9 的服务端运行时 | 纯 JavaScript 支持范围通常更宽 |
| 许可证 | Apache-2.0 | MIT |
| 更适合 | 图片服务、构建管线和媒体平台 | 脚本、教学、轻量处理和原生模块受限环境 |
生产图片服务、静态站点构建或大量现代格式转换通常优先选择 Sharp;如果部署环境不能加载原生模块、处理量较小,或更看重纯 JavaScript 的可移植性,可以评估 Jimp。无论选择哪一个,都应使用真实素材比较速度、内存、输出质量和部署复杂度。
资料核验
版本、维护信息与本页采用的官方资料来源。
npm 官方元数据核验的 Sharp 稳定版为 0.35.3,要求 Node.js 20.9.0 以上,采用 Apache-2.0 许可证,并要求 libvips 8.18.3 以上。官方文档说明它也支持提供 Node-API v9 的 Deno 与 Bun;官方仓库未归档,核验时最近一次公开提交发生于北京时间 2026 年 8 月 14 日。
官方仓库未归档,核验时最近可见的代码活动日期为 2026 年 8 月 14 日。该状态表示项目近期仍有公开维护活动,不代表固定发布频率或长期支持承诺。