1,安装依赖
yarn add imagemin imagemin-jpegtran imagemin-pngquant
2,代码示例 minImage.mjs (关于mjs)
import imagemin from 'imagemin'
import imageminJpegtran from 'imagemin-jpegtran'
import imageminPngquant from 'imagemin-pngquant'
// 单个文件压缩
const files = await imagemin(['./input.png'], {
destination: './output.png',
plugins: [
imageminJpegtran(),
imageminPngquant({
quality: [0.6, 0.8]
})
]
})
// 多文件压缩,图片多了会短暂卡死。
const files = await imagemin(['inputdir/*.{jpg,png}'], {
destination: 'images/outputdir',
plugins: [
imageminJpegtran(),
imageminPngquant({
quality: [0.6, 0.8]
})
]
})
// files
//=> [{data: <Buffer 89 50 4e …>, sourcePath: './input.png', destinationPath: './output.png'}, …]
Tips:批量压缩时,会大量消耗内存,并假死。所以尽量选择逐个压缩的方式。
为了批量压缩,可以使用递归方式批量处理。
minImage.mjs
import fs from 'fs'
import imagemin from 'imagemin'
import imageminJpegtran from 'imagemin-jpegtran'
import imageminPngquant from 'imagemin-pngquant'
const pictures = readDirSync('./inputdir/')
const outputdir= './outputdir/'
await min(0)
console.log('全部完成')
// 递归压缩图片
async function min(index) {
const item = pictures[index]
if (!item) {
return
}
await imagemin([item], {
destination: outputdir,
plugins: [
imageminJpegtran(),
imageminPngquant({
quality: [0.6, 0.8]
})
]
});
if (index < pictures.length - 2) {
index++
await min(index)
}
}
// 读取目录中的所有文件路径
function readDirSync(path, list) {
if (!fs.existsSync(path)) {
return list
}
const pa = fs.readdirSync(path);
pa.forEach(function (ele) {
const fullPath = PATH.join(path, ele)
const info = fs.statSync(fullPath)
if (info.isDirectory()) {
readDirSync(fullPath, list);
} else {
list.push(fullPath)
}
})
return list
}