import sharp from 'sharp' const DEFAULT_SHARP_CONCURRENCY = 1 const MAX_SHARP_CONCURRENCY = 2 const SHARP_CACHE_MEMORY_MB = 128 const SHARP_CACHE_ITEMS = 64 function readConcurrency(): number { const configured = Number.parseInt(process.env.SHARP_CONCURRENCY || '', 10) if (!Number.isFinite(configured)) { return DEFAULT_SHARP_CONCURRENCY } return Math.max(1, Math.min(MAX_SHARP_CONCURRENCY, configured)) } let configured = false /** * Sharp 的原生解码/编码内存不受 Node old-space 完全约束。 * 生产应用与 Next.js 共用一个容器,因此默认只允许一个 Sharp 任务, * 并关闭磁盘缓存、限制内存缓存,避免并发图片请求把宿主机推入 OOM。 */ export function configureSharpRuntime(): void { if (configured) { return } // 测试或极简运行时可能只提供 sharp() 工厂,没有全局调优方法; // 这时保留原有行为,不让配置本身阻断业务。 if (typeof sharp.concurrency !== 'function' || typeof sharp.cache !== 'function') { configured = true return } sharp.concurrency(readConcurrency()) sharp.cache({ memory: SHARP_CACHE_MEMORY_MB, items: SHARP_CACHE_ITEMS, files: 0, }) configured = true }