48 lines
1.8 KiB
JavaScript
48 lines
1.8 KiB
JavaScript
// 构建后把 src 下所有 .vue 复制到 dist,与 tsc 输出目录一致。
|
||
//
|
||
// 背景:tsc 只编译 .ts 为 dist 下的 .js,不会复制 .vue;但 dist/index.js 仍 import './DesignModeApp.vue'。
|
||
// Vite 虚拟模块会把相对路径改成绝对路径,若 dist 里没有对应 .vue 会报 Failed to resolve import。
|
||
//
|
||
// 用法:package.json 的 build 在 tsc 之后执行本脚本。
|
||
import { copyFileSync, mkdirSync, readdirSync, statSync } from 'node:fs';
|
||
import { dirname, join, relative } from 'node:path';
|
||
import { fileURLToPath } from 'node:url';
|
||
|
||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||
const pkgRoot = join(__dirname, '..');
|
||
const srcDir = join(pkgRoot, 'src');
|
||
const distDir = join(pkgRoot, 'dist');
|
||
|
||
/**
|
||
* 递归遍历目录,将每个 `.vue` 复制到 dist 中相同相对路径。
|
||
* @param {string} dir 当前正在扫描的目录(绝对路径,位于 src 下)
|
||
*/
|
||
function copyVueFiles(dir) {
|
||
for (const ent of readdirSync(dir, { withFileTypes: true })) {
|
||
const full = join(dir, ent.name);
|
||
if (ent.isDirectory()) {
|
||
copyVueFiles(full);
|
||
continue;
|
||
}
|
||
if (!ent.name.endsWith('.vue')) {
|
||
continue;
|
||
}
|
||
const rel = relative(srcDir, full);
|
||
const outPath = join(distDir, rel);
|
||
mkdirSync(dirname(outPath), { recursive: true });
|
||
copyFileSync(full, outPath);
|
||
}
|
||
}
|
||
|
||
if (!statSync(srcDir, { throwIfNoEntry: false })?.isDirectory()) {
|
||
console.error('[copy-vue-to-dist] src directory not found:', srcDir);
|
||
process.exit(1);
|
||
}
|
||
if (!statSync(distDir, { throwIfNoEntry: false })?.isDirectory()) {
|
||
console.error('[copy-vue-to-dist] dist directory not found; run tsc first:', distDir);
|
||
process.exit(1);
|
||
}
|
||
|
||
copyVueFiles(srcDir);
|
||
console.log('[copy-vue-to-dist] Copied all .vue files from src to dist.');
|