48 lines
1.5 KiB
JavaScript
48 lines
1.5 KiB
JavaScript
import imagemin from 'imagemin';
|
|
import imageminMozjpeg from 'imagemin-mozjpeg';
|
|
import imageminOptipng from 'imagemin-optipng';
|
|
import imageminWebp from 'imagemin-webp';
|
|
import imageminAvif from 'imagemin-avif';
|
|
import path from 'path';
|
|
|
|
const source = path.join(process.cwd(), 'public/images/*.{jpg,png}');
|
|
const destinationOptimized = path.join(process.cwd(), 'public/images-optimized');
|
|
const destinationWebP = path.join(process.cwd(), 'public/images-optimized/webp');
|
|
const destinationAvif = path.join(process.cwd(), 'public/images-optimized/avif');
|
|
|
|
(async () => {
|
|
try {
|
|
// Optimize JPEG / PNG
|
|
const filesOptimized = await imagemin([source], {
|
|
destination: destinationOptimized,
|
|
plugins: [
|
|
imageminMozjpeg({ quality: 90 }),
|
|
imageminOptipng({ optimizationLevel: 3 }),
|
|
],
|
|
});
|
|
|
|
console.log('JPEG/PNG optimized:', filesOptimized.map(f => f.destinationPath));
|
|
|
|
// Convert to WebP
|
|
const filesWebP = await imagemin([source], {
|
|
destination: destinationWebP,
|
|
plugins: [
|
|
imageminWebp({ quality: 80 }),
|
|
],
|
|
});
|
|
console.log('Converted to WebP:', filesWebP.map(f => f.destinationPath));
|
|
|
|
// Convert to AVIF
|
|
const filesAvif = await imagemin([source], {
|
|
destination: destinationAvif,
|
|
plugins: [
|
|
imageminAvif({ quality: 50 }),
|
|
],
|
|
});
|
|
console.log('Converted to AVIF:', filesAvif.map(f => f.destinationPath));
|
|
|
|
} catch (error) {
|
|
console.error('Error optimizing images:', error);
|
|
}
|
|
})();
|