var OSS = require('ali-oss') var path = require('path') var fs = require('fs') class MyWebpackPlugin { constructor(opts) { this._opts = opts } apply(compiler) { // 插入钩子函数 compiler.hooks.afterEmit.tapAsync({ name: 'UploadToOssPlugin' }, (compilation, done) => { this.client = new OSS(this._opts.ossOption) this.getTotalFiles('dist').then((files) => { this.handleFile(files).then(() => { done() }) }) }) } getSubFiles(dir) { return new Promise((reslove, reject) => { fs.readdir(dir, function(err, files) { reslove(files) }) }) } async getTotalFiles(dir) { const subfiles = await this.getSubFiles(dir) const files = [] const len = subfiles.length const ret = [] for (let i = 0; i < len; i++) { const f = subfiles[i] const fpath = `${dir}/${f}` var stat = fs.lstatSync(fpath) if (!stat.isDirectory()) { ret.push(fpath) } else { const fsubs = await this.getTotalFiles(fpath) const size = fsubs.length for (let k = 0; k < size; k++) { ret.push(fsubs[k]) } } } return ret } async handleFile(files) { let i = 0 const len = files.length for (; i < len; i++) { const fpath = files[i] if (path.extname(fpath) != '.map') { await this.uploadOss(files[i]) } } } async uploadOss(src) { const fpath = src.substr(4) // 去掉前面的dist console.log('uploading ' + fpath) var ret = await this.client.put(this._opts.cdnpath + fpath, src, { timeout: 2000000 }) // console.log(ass+'->' + ret.url); let i = 0 while (!ret) { if (i++ > 3) { reject(`uploading ${src} error!`) return } ret = await this.client.put(this._opts.cdnpath + fpath, dist, { timeout: 2000000 }) } console.log(ret.url) return ret } } module.exports = MyWebpackPlugin