vite-plugin-cloud-upload
Version:
A Vite plugin to automatically upload build assets to cloud storage (Tencent Cloud COS & Aliyun OSS).
51 lines (50 loc) • 1.97 kB
JavaScript
import { resolve } from 'node:path';
import pLimit from 'p-limit';
import { normalizePrefix, scanLocal, deleteLocalFile } from './utils.js';
import { createProvider } from './provider-factory.js';
/** 并发上传所有任务 */
async function uploadAll(provider, opts, tasks) {
const limit = pLimit(opts.concurrency ?? 6);
let finished = 0;
const total = tasks.length;
opts.onProgress?.(total, finished);
await Promise.allSettled(tasks.map((task) => limit(async () => {
try {
await provider.upload(task);
opts.onUploaded?.(task);
if (opts.deleteLocalAfterUpload)
deleteLocalFile(task.localPath);
}
catch (e) {
opts.onFailed?.(task, e);
}
finished++;
opts.onProgress?.(total, finished);
})));
}
/** 插件工厂 */
export default function cloudUploadPlugin(opts) {
return {
name: 'vite-plugin-cloud-upload',
apply: 'build',
closeBundle: async () => {
const root = resolve(process.cwd(), opts.outDir || 'dist');
const prefix = normalizePrefix(opts.keyPrefix);
const provider = createProvider(opts);
/* 1. 可选:清远程 */
if (opts.cleanRemote && provider.cleanRemote)
await provider.cleanRemote(prefix);
/* 2. 扫描本地 */
const tasks = scanLocal({ root, recursive: opts.recursive ?? true, include: opts.include, prefix });
if (!tasks.length) {
console.log(`[${provider.name}] 没有需要上传的文件`);
return;
}
/* 3. 上传 */
console.log(`[${provider.name}] 开始上传 ${tasks.length} 个文件 ...`);
const t0 = Date.now();
await uploadAll(provider, opts, tasks);
console.log(`[${provider.name}] 全部处理完成!耗时 ${Date.now() - t0} ms`);
},
};
}