123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- 'use strict';
-
- const { extname } = require('path');
- const through2 = require('through2-concurrent');
- const PluginError = require('plugin-error');
- const colors = require('ansi-colors');
- const fancyLog = require('fancy-log');
- const filesize = require('filesize');
- const { round10 } = require('round10');
- const optimize = require('./optimize');
-
- const SUPPORTED_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.svg'];
- const NOOP = () => {};
-
- module.exports = options => through2.obj({
- maxConcurrency: options ? options.concurrent : null
- }, (file, enc, callback) => {
- if (file.isNull()) {
- return callback(null, file);
- }
-
- if (file.isStream()) {
- return callback(new Error('gulp-image: Streaming is not supported'));
- }
-
- const log = options && options.quiet ? NOOP : fancyLog;
- const extension = extname(file.path).toLowerCase();
-
- if (!SUPPORTED_EXTENSIONS.includes(extension)) {
- log('gulp-image: Skipping unsupported image ' + colors.blue(file.relative));
- return callback(null, file);
- }
-
- optimize(file.contents, Object.assign({
- pngquant : true,
- optipng : false,
- zopflipng : true,
- jpegRecompress : false,
- mozjpeg : true,
- guetzli : false,
- gifsicle : true,
- svgo : true
- }, options)).then(buffer => {
- const before = file.contents.length;
- const after = buffer.length;
- const diff = before - after;
- const diffPercent = round10(100 * (diff / before), -1);
-
- if (diff <= 0) {
- log(
- colors.green('- ') + file.relative + colors.gray(' ->') +
- colors.gray(' Cannot improve upon ') + colors.cyan(filesize(before))
- );
- } else {
- file.contents = buffer;
-
- log(
- colors.green('✔ ') + file.relative + colors.gray(' ->') +
- colors.gray(' before=') + colors.yellow(filesize(before)) +
- colors.gray(' after=') + colors.cyan(filesize(after)) +
- colors.gray(' reduced=') + colors.green(filesize(diff) + '(' + diffPercent + '%)')
- );
- }
-
- callback(null, file);
- }).catch(error => {
- callback(new PluginError('gulp-image', error));
- });
- });
|