44 lines
1.2 KiB
TypeScript
44 lines
1.2 KiB
TypeScript
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
|
|
}
|