返回项目目录
开发工具精选项目

Sharp

基于 libvips 的高性能 Node.js 图像处理库,用于调整尺寸、转换格式、合成和优化图片。

主要语言C++ / JavaScript
开源许可Apache-2.0
项目类型开发工具
维护状态活跃维护
OVERVIEW

项目概述

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。

当前版本0.35.3
运行时要求Node.js ≥ 20.9.0
核心引擎libvips ≥ 8.18.3
FEATURES

主要特点

Sharp 将 libvips 的高性能处理流水线包装成适合 JavaScript 服务端应用的 API。

01

高性能流水线

依托 libvips 的按需、流式处理模型,在调整大型图片尺寸时通常能保持较低的内存占用和较高吞吐量。

02

现代格式转换

支持 JPEG、PNG、WebP、GIF、AVIF、TIFF 等常用输入输出格式,可统一站点图片交付策略。

03

灵活的缩放与裁剪

提供 cover、contain、fill、inside、outside 等适配方式,以及位置、智能裁剪和防止放大等选项。

04

图层合成

可把图片、SVG 或文字叠加到主图,并使用多种 Blend Mode 生成水印、徽章和社交分享图。

05

颜色与图像操作

内置旋转、翻转、模糊、锐化、灰度、色调、Gamma、阈值和通道操作等处理能力。

06

文件、Buffer 与 Stream

输入输出形式适合本地文件、HTTP 上传、对象存储、消息队列和无服务器函数等多种数据流。

07

元数据控制

可读取尺寸、格式、方向和色彩信息,并决定移除、保留或修改 EXIF、ICC 等元数据。

08

跨平台预构建二进制

官方为常见 macOS、Linux、Windows 平台和 CPU 架构提供预构建包,通常无需本地编译 libvips。

USE CASES

适用场景

从用户上传到静态站点构建,凡是需要批量、实时处理图片的服务端流程都值得评估 Sharp。

图片上传服务

校正方向、限制尺寸、移除敏感元数据,并为头像、封面和商品图生成多个规格。

响应式图片管线

批量输出不同宽度与 WebP、AVIF 等格式,配合 picture 和 srcset 降低页面传输体积。

静态站点与框架构建

为 Next.js、Gatsby、Astro 或自定义构建脚本预生成缩略图、占位图和开放图谱图片。

电商与内容平台

规范用户来源不一的商品图、文章配图和素材库文件,保证尺寸、比例和编码质量一致。

动态图片 API

根据 URL 参数即时缩放、裁剪、加水印或转换格式,并把结果缓存到 CDN 或对象存储。

批量媒体迁移

通过队列或离线脚本重新编码旧素材、生成衍生版本,并汇总尺寸和格式元数据。

EVALUATION

优点与注意事项

技术选型不仅要看能力,也要理解它带来的团队成本。

主要优点

Sharp 擅长的地方

  • 基于 libvips,适合高吞吐和大批量图像处理
  • 链式 API 清晰,容易组合缩放、转换、合成和输出步骤
  • 覆盖 WebP、AVIF 等现代网页图片格式
  • 支持文件、Buffer 和 Stream,便于接入不同存储系统
  • 常见平台提供预构建二进制,安装体验相对直接
  • TypeScript 类型完善,并可在 Node.js、Deno 与 Bun 中使用

需要注意

采用前应考虑的问题

包含原生二进制依赖

Sharp 不是纯 JavaScript 包。容器、无服务器平台和跨架构部署必须确保目标操作系统、CPU 与 libc 对应的二进制被正确安装和打包。

Node.js 版本门槛

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 数值不能在不同编码器之间直接等价比较,应使用真实素材评估清晰度、文件体积、透明度和色差。

QUICK START

快速开始

安装 Sharp,生成一张适合网页展示的 WebP 缩略图,并扩展到 Buffer 与批量处理场景。

1安装 Sharp
bash
npm install sharp

# 确认当前运行时满足 Node.js 20.9.0 以上
node --version
2生成 WebP 缩略图
typescript
import sharp from "sharp";

await sharp("input.jpg")
  .rotate()
  .resize(800, 450, {
    fit: "cover",
    position: "attention",
    withoutEnlargement: true,
  })
  .webp({ quality: 82 })
  .toFile("output.webp");
3处理上传的 Buffer
typescript
import 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 };
}
4生成多个响应式规格
typescript
import 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`),
  ),
);
5检查图片处理结果
bash
npm run lint
npm run typecheck
npm test

# 用真实图片覆盖 JPEG、PNG、WebP、AVIF、透明通道、EXIF 方向和动画帧
# 在目标 Linux/容器环境安装依赖并执行一次完整处理流程

下一步:生产环境应限制输入像素、文件大小和并发数,并用真实图片集合测试内存峰值、方向、色彩空间、动画帧和异常文件。

ALTERNATIVES

类似项目

这些项目可承载 Sharp,或提供不同侧重点的图像处理与构建能力。

COMPARISON

Sharp vs Jimp

Sharp 与 Jimp 都能在 JavaScript 应用中调整尺寸、裁剪和转换图片,但技术路线不同:Sharp 通过原生 libvips 追求服务端吞吐量和现代格式支持,Jimp 采用纯 JavaScript 实现,跨平台安装更简单,也更适合不便加载原生模块的环境。

比较维度SharpJimp
实现方式Node-API + libvips 原生库纯 JavaScript
性能取向高吞吐、低内存的服务端处理易用性与可移植性优先
安装部署需要平台对应的原生二进制通常不需要原生依赖
格式覆盖JPEG、PNG、WebP、GIF、AVIF、TIFF 等常用格式为主,能力取决于插件
处理模型链式、按需的 libvips 流水线在 JavaScript 中解码和操作像素
大型图片更适合生产级批量与并发任务需要关注执行时间与内存
运行环境支持 Node-API v9 的服务端运行时纯 JavaScript 支持范围通常更宽
许可证Apache-2.0MIT
更适合图片服务、构建管线和媒体平台脚本、教学、轻量处理和原生模块受限环境
如何选择

生产图片服务、静态站点构建或大量现代格式转换通常优先选择 Sharp;如果部署环境不能加载原生模块、处理量较小,或更看重纯 JavaScript 的可移植性,可以评估 Jimp。无论选择哪一个,都应使用真实素材比较速度、内存、输出质量和部署复杂度。

VERIFICATION

资料核验

版本、维护信息与本页采用的官方资料来源。

最后核验2026 年 8 月 20 日
核验版本Sharp 0.35.3 / libvips ≥ 8.18.3
内容维护Lovell Fuller / Sharp contributors
项目维护状态活跃维护

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 年 7 月 26 日 · 最近可见代码活动:2026 年 8 月 14 日

官方仓库未归档,核验时最近可见的代码活动日期为 2026 年 8 月 14 日。该状态表示项目近期仍有公开维护活动,不代表固定发布频率或长期支持承诺。

查看官方仓库