import typescript from '@rollup/plugin-typescript'; import terser from '@rollup/plugin-terser'; import { copyFileSync, existsSync, mkdirSync } from 'fs'; import { dirname, resolve } from 'path'; const ROOT = process.cwd(); const DIST_DIR = resolve(ROOT, 'dist'); const BACKEND_DIR = resolve(ROOT, '../src/main/resources/static/sdk'); const ASSETS = [ { src: resolve(ROOT, 'assets/launcher-logo.png'), name: 'launcher-logo.png' }, { src: resolve(ROOT, 'assets/marked.min.js'), name: 'marked.min.js' }, ]; const BUNDLE_FILES = ['chatbot-sdk.js', 'chatbot-sdk.min.js']; /** 将构建产物与静态资源复制到指定目录 */ function copyFiles(srcFiles, targetDir, label) { if (!existsSync(targetDir)) mkdirSync(targetDir, { recursive: true }); for (const { src, name } of srcFiles) { if (!existsSync(src)) { console.warn(`[copy-assets] 未找到 ${src},跳过`); continue; } copyFileSync(src, resolve(targetDir, name)); } console.log(`[copy-assets] 已复制 ${label} 到 ${targetDir}`); } /** Rollup 插件:构建结束后同步产物与 logo 到后端静态资源目录 */ function copyAssets() { return { name: 'copy-assets', closeBundle() { // 1. 复制 logo 到 dist(便于独立分发) copyFiles( ASSETS.map(a => ({ src: a.src, name: a.name })), DIST_DIR, 'logo 到 dist' ); // 2. 复制 logo + JS 产物到后端 static/sdk/ const backendAssets = [ ...ASSETS.map(a => ({ src: a.src, name: a.name })), ...BUNDLE_FILES.map(name => ({ src: resolve(DIST_DIR, name), name })), ]; copyFiles(backendAssets, BACKEND_DIR, 'SDK 产物与 logo 到后端 static/sdk'); }, }; } export default { input: 'src/index.ts', output: [ { file: 'dist/chatbot-sdk.js', format: 'iife', name: 'ChatbotSDK', sourcemap: false, }, { file: 'dist/chatbot-sdk.min.js', format: 'iife', name: 'ChatbotSDK', sourcemap: false, plugins: [terser()], }, ], plugins: [ typescript({ tsconfig: './tsconfig.json', declaration: false, declarationDir: undefined, sourceMap: false, }), copyAssets(), ], };