You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

optimize.js 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. 'use strict';
  2. const path = require('path');
  3. const execBuffer = require('exec-buffer');
  4. const isPng = require('is-png');
  5. const isJpg = require('is-jpg');
  6. const isGif = require('is-gif');
  7. const isSvg = require('is-svg');
  8. function optipng(buffer, args) {
  9. const params = Array.isArray(args) ? args : ['-i 1', '-strip all', '-fix', '-o7', '-force'];
  10. return execBuffer({
  11. input : buffer,
  12. bin : require('optipng-bin'),
  13. args : [...params, '-out', execBuffer.output, execBuffer.input]
  14. });
  15. }
  16. function pngquant(buffer, args) {
  17. const params = Array.isArray(args) ? args : ['--speed=1', '--force', 256];
  18. return execBuffer({
  19. input : buffer,
  20. bin : require('pngquant-bin'),
  21. args : [...params, '--output', execBuffer.output, execBuffer.input]
  22. });
  23. }
  24. function zopflipng(buffer, args) {
  25. const params = Array.isArray(args) ? args : ['-y', '--lossy_8bit', '--lossy_transparent'];
  26. return execBuffer({
  27. input : buffer,
  28. bin : require('zopflipng-bin'),
  29. args : [...params, execBuffer.input, execBuffer.output]
  30. });
  31. }
  32. function jpegRecompress(buffer, args) {
  33. const params = Array.isArray(args) ? args : ['--strip', '--quality', 'medium', '--min', 40, '--max', 80];
  34. return execBuffer({
  35. input : buffer,
  36. bin : require('jpeg-recompress-bin'),
  37. args : [...params, execBuffer.input, execBuffer.output]
  38. });
  39. }
  40. function mozjpeg(buffer, args) {
  41. const params = Array.isArray(args) ? args : ['-optimize', '-progressive'];
  42. return execBuffer({
  43. input : buffer,
  44. bin : require('mozjpeg'),
  45. args : [...params, '-outfile', execBuffer.output, execBuffer.input]
  46. });
  47. }
  48. function guetzli(buffer, args) {
  49. const params = Array.isArray(args) ? args : ['--quality', 85];
  50. return execBuffer({
  51. input : buffer,
  52. bin : require('guetzli'),
  53. args : [...params, execBuffer.input, execBuffer.output]
  54. });
  55. }
  56. function gifsicle(buffer, args) {
  57. const params = Array.isArray(args) ? args : ['--optimize'];
  58. return execBuffer({
  59. input : buffer,
  60. bin : require('gifsicle'),
  61. args : [...params, '--output', execBuffer.output, execBuffer.input]
  62. });
  63. }
  64. function svgo(buffer, args) {
  65. const params = Array.isArray(args) ? args : [];
  66. return execBuffer({
  67. input : buffer,
  68. bin : path.join(path.dirname(require.resolve('exec-buffer')), '../svgo/bin/svgo'),
  69. args : [...params, '--input', execBuffer.input, '--output', execBuffer.output]
  70. });
  71. }
  72. module.exports = function(buffer, options) {
  73. if (isJpg(buffer)) {
  74. return Promise.resolve(buffer)
  75. .then(buffer => options.jpegRecompress ? jpegRecompress(buffer, options.jpegRecompress) : buffer)
  76. .then(buffer => options.mozjpeg ? mozjpeg(buffer, options.mozjpeg) : buffer)
  77. .then(buffer => options.guetzli ? guetzli(buffer, options.guetzli) : buffer);
  78. } else if (isPng(buffer)) {
  79. return Promise.resolve(buffer)
  80. .then(buffer => options.pngquant ? pngquant(buffer, options.pngquant) : buffer)
  81. .then(buffer => options.optipng ? optipng(buffer, options.optipng) : buffer)
  82. .then(buffer => options.zopflipng ? zopflipng(buffer, options.zopflipng) : buffer);
  83. } else if (isGif(buffer)) {
  84. return Promise.resolve(buffer)
  85. .then(buffer => options.gifsicle ? gifsicle(buffer, options.gifsicle) : buffer);
  86. } else if (isSvg(buffer)) {
  87. return Promise.resolve(buffer)
  88. .then(buffer => options.svgo ? svgo(buffer, options.svgo) : buffer);
  89. }
  90. return Promise.resolve(buffer);
  91. };