UNPKG

@10yun/cv-js-utils

Version:

常用 js-utils 工具类库

62 lines (51 loc) 1.87 kB
// const url = require('url'); // const u = require('underscore'); class WebpackAliyunOss { doWithWebpack(compiler) { var me = this; compiler.hooks.emit.tapAsync('WebpackAliyunOss', function (compilation, callback) { var publicPath = url.parse(compiler.options.output.publicPath); if (!publicPath.protocol || !publicPath.hostname) { return callback(new Error('Webpack配置文件中: "output.publicPath"必须设置为域名,例如: https://domain.com/path/')); } // var files = u.filter(u.keys(compilation.assets), me.options.filter); let assetsArr = Object.keys(compilation.assets); var files = assetsArr.filter(me.options.filter); if (files.length === 0) { return callback(); } this.upload(files.shift(), me.options.retry).then(function () { console.log('[WebpackAliyunOss FINISHED]', 'All Completed'); callback(); }).catch(function (e) { console.log('[WebpackAliyunOss FAILED]', e); return callback(e); }); }); } upload(file, times) { var me = this; var target = url.resolve(url.format(publicPath), file); var key = url.parse(target).pathname; var source = compilation.assets[file].source(); var body = Buffer.isBuffer(source) ? source : new Buffer(source, 'utf8'); return me.client.put(key, body, { timeout: 30 * 1000 }).then(function () { console.log('[WebpackAliyunOss SUCCESS]:', key); var next = files.shift(); if (next) { return upload(next, me.options.retry); } }, function (e) { if (times === 0) { throw new Error('[WebpackAliyunOss ERROR]: ', e); } else { console.log('[WebpackAliyunOss retry]:', times, key); return upload(file, --times); } }); } } module.exports = WebpackAliyunOss;