UNPKG

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
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`); }, }; }