Spaces:
Running
Running
File size: 5,070 Bytes
d0dd276 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
import fs from 'fs';
import path from 'path';
import { execSync } from 'child_process';
import { fileURLToPath } from 'url';
import crypto from 'crypto';
// 获取 __dirname 等效值
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// 确保目标目录存在
const templatesDir = path.resolve(__dirname, '../app/templates');
const assetsDir = path.resolve(templatesDir, 'assets');
// 清空目标目录
console.log('清空目标目录...');
if (fs.existsSync(assetsDir)) {
// 删除assets目录中的所有文件
const files = fs.readdirSync(assetsDir);
for (const file of files) {
const filePath = path.join(assetsDir, file);
if (fs.lstatSync(filePath).isDirectory()) {
// 如果是目录,递归删除
fs.rmSync(filePath, { recursive: true, force: true });
} else {
// 如果是文件,直接删除
fs.unlinkSync(filePath);
}
}
console.log(`已清空目录: ${assetsDir}`);
} else {
// 如果目录不存在,创建它
fs.mkdirSync(assetsDir, { recursive: true });
console.log(`已创建目录: ${assetsDir}`);
}
// 确保templates目录存在
if (!fs.existsSync(templatesDir)) {
fs.mkdirSync(templatesDir, { recursive: true });
console.log(`已创建目录: ${templatesDir}`);
}
// 构建 Vue 应用
console.log('正在构建 Vue 应用...');
execSync('npx vite build', { stdio: 'inherit' });
// 生成随机文件名
function generateRandomFileName(extension) {
// 生成16字节的随机数据并转换为十六进制字符串
const randomBytes = crypto.randomBytes(16).toString('hex');
return `${randomBytes}.${extension}`;
}
// 重命名文件并返回新文件名
function renameFileWithRandomName(directory, originalName, extension) {
// 不重命名favicon.ico文件
if (originalName === 'favicon.ico') {
return originalName;
}
const newFileName = generateRandomFileName(extension);
const oldPath = path.join(directory, originalName);
const newPath = path.join(directory, newFileName);
if (fs.existsSync(oldPath)) {
fs.renameSync(oldPath, newPath);
console.log(`文件已重命名: ${originalName} -> ${newFileName}`);
return newFileName;
} else {
console.warn(`警告: 文件 ${originalName} 不存在,无法重命名`);
return originalName;
}
}
// 查找所有资源文件
const allFiles = fs.readdirSync(assetsDir);
const jsFiles = allFiles.filter(file => file.endsWith('.js'));
const cssFiles = allFiles.filter(file => file.endsWith('.css'));
const imageFiles = allFiles.filter(file => /\.(png|jpg|jpeg|gif|svg|webp)$/.test(file));
const otherFiles = allFiles.filter(file =>
!file.endsWith('.js') &&
!file.endsWith('.css') &&
!/\.(png|jpg|jpeg|gif|svg|webp)$/.test(file) &&
file !== 'favicon.ico'
);
// 重命名所有JS文件
const jsFileMap = {};
jsFiles.forEach(file => {
const extension = path.extname(file).substring(1);
const newFileName = renameFileWithRandomName(assetsDir, file, extension);
jsFileMap[file] = newFileName;
});
// 重命名所有CSS文件
const cssFileMap = {};
cssFiles.forEach(file => {
const extension = path.extname(file).substring(1);
const newFileName = renameFileWithRandomName(assetsDir, file, extension);
cssFileMap[file] = newFileName;
});
// 重命名所有图片文件
const imageFileMap = {};
imageFiles.forEach(file => {
const extension = path.extname(file).substring(1);
const newFileName = renameFileWithRandomName(assetsDir, file, extension);
imageFileMap[file] = newFileName;
});
// 重命名其他文件
const otherFileMap = {};
otherFiles.forEach(file => {
const extension = path.extname(file).substring(1);
const newFileName = renameFileWithRandomName(assetsDir, file, extension);
otherFileMap[file] = newFileName;
});
console.log(`检测到并重命名了文件:`);
console.log(`- JS文件: ${Object.keys(jsFileMap).length} 个`);
console.log(`- CSS文件: ${Object.keys(cssFileMap).length} 个`);
console.log(`- 图片文件: ${Object.keys(imageFileMap).length} 个`);
console.log(`- 其他文件: ${Object.keys(otherFileMap).length} 个`);
// 创建一个简单的 index.html 文件,引用构建后的资源
const indexContent = `
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/assets/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Gemini API 代理服务</title>
${Object.values(jsFileMap).map(file => `<script type="module" crossorigin src="/assets/${file}"></script>`).join('\n ')}
${Object.values(cssFileMap).map(file => `<link rel="stylesheet" href="/assets/${file}">`).join('\n ')}
</head>
<body>
<div id="app"></div>
</body>
</html>
`;
// 将 index.html 写入到 app/templates 目录
const targetIndexPath = path.resolve(templatesDir, 'index.html');
fs.writeFileSync(targetIndexPath, indexContent);
console.log('构建完成!');
console.log(`- index.html 已创建到: ${targetIndexPath}`);
console.log(`- 静态资源已输出到: ${assetsDir}`); |