@mora/tinypng
Version:
基于 tinypng 封装的一个支持 `nodejs`、`命令行`和`webpack`的图片压缩工具
53 lines (52 loc) • 2.35 kB
JavaScript
;
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;