UNPKG

@mora/tinypng

Version:

基于 tinypng 封装的一个支持 `nodejs`、`命令行`和`webpack`的图片压缩工具

53 lines (52 loc) 2.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var webpack_sources_1 = require("webpack-sources"); var tinypng_1 = require("./tinypng"); var helper_1 = require("./helper"); var TinypngWebpackPlugin = (function () { function TinypngWebpackPlugin(options) { this.options = options; options = helper_1.getConfig(options); if (!options.tokens || !Array.isArray(options.tokens) || options.tokens.length === 0) throw new Error('No tokens option'); this.tp = new tinypng_1.default(options); this.filter = options.filter || function (m) { return m.rawRequest && /\.(png|jpg|jpeg|svg)$/i.test(m.resource); }; } TinypngWebpackPlugin.prototype.apply = function (compiler) { var self = this; compiler.plugin('compilation', function (compilation) { compilation.plugin('optimize-assets', function (assets, callback) { var optimizeFiles = []; this.modules.forEach(function (m) { var moduleAssets = Object.keys(m.assets); if (moduleAssets.length === 1 && self.filter(m)) { optimizeFiles.push({ rawRequest: m.rawRequest, assetKey: moduleAssets[0], asset: m.assets[moduleAssets[0]] }); } }); helper_1.runProgressTasks(optimizeFiles.map(function (file) { return function (done) { self.tp.tiny(file.asset.source()) .then(function (buffer) { compilation.assets[file.assetKey] = new webpack_sources_1.RawSource(buffer); done(file.rawRequest); }) .catch(function (e) { compilation.errors.push(e instanceof Error ? e : new Error(JSON.stringify(e))); done(file.rawRequest); }); return file.rawRequest; }; }), callback, { indent: '', quiet: self.options.quiet }); }); }); }; return TinypngWebpackPlugin; }()); exports.default = TinypngWebpackPlugin;