91 lines
2.0 KiB
JavaScript
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
|