yzxy-pc/scripts/uploadToOssPlugin.js

91 lines
2.0 KiB
JavaScript

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