100 lines
3.0 KiB
JavaScript
100 lines
3.0 KiB
JavaScript
// 静态生成构建脚本
|
||
const fs = require('fs');
|
||
const path = require('path');
|
||
const { execSync } = require('child_process');
|
||
|
||
// CDN基础URL
|
||
const CDN_BASE_URL = 'https://cdn.web.0rui.cn/';
|
||
|
||
// 输出目录
|
||
const OUTPUT_DIR = path.resolve(__dirname, '../.output/public');
|
||
|
||
// 执行静态生成
|
||
console.log('开始执行静态生成...');
|
||
try {
|
||
// 执行nuxt generate命令
|
||
execSync('npm run generate', { stdio: 'inherit' });
|
||
console.log('静态生成完成!');
|
||
|
||
// 检查输出目录是否存在
|
||
if (!fs.existsSync(OUTPUT_DIR)) {
|
||
console.error('错误:输出目录不存在!');
|
||
process.exit(1);
|
||
}
|
||
|
||
console.log('开始处理HTML文件中的图片路径...');
|
||
|
||
// 递归处理目录中的所有HTML文件
|
||
processDirectory(OUTPUT_DIR);
|
||
|
||
console.log('所有HTML文件处理完成!');
|
||
console.log(`静态网站已生成到: ${OUTPUT_DIR}`);
|
||
console.log('可以使用 npm run preview 预览生成的静态网站');
|
||
} catch (error) {
|
||
console.error('构建过程中发生错误:', error);
|
||
process.exit(1);
|
||
}
|
||
|
||
/**
|
||
* 递归处理目录中的所有HTML文件
|
||
* @param {string} dir 目录路径
|
||
*/
|
||
function processDirectory(dir) {
|
||
const files = fs.readdirSync(dir);
|
||
|
||
for (const file of files) {
|
||
const filePath = path.join(dir, file);
|
||
const stat = fs.statSync(filePath);
|
||
|
||
if (stat.isDirectory()) {
|
||
// 递归处理子目录
|
||
processDirectory(filePath);
|
||
} else if (file.endsWith('.html')) {
|
||
// 处理HTML文件
|
||
processHtmlFile(filePath);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 处理HTML文件中的图片路径
|
||
* @param {string} filePath HTML文件路径
|
||
*/
|
||
function processHtmlFile(filePath) {
|
||
console.log(`处理文件: ${path.relative(OUTPUT_DIR, filePath)}`);
|
||
|
||
let content = fs.readFileSync(filePath, 'utf8');
|
||
|
||
// 替换HTML中的图片路径
|
||
// 匹配 src="public/img/xxx.png" 模式
|
||
content = content.replace(/src=\"(public\/img\/[^\"]+)\"/g, (match, p1) => {
|
||
return `src=\"${CDN_BASE_URL}${p1.replace('public/', '')}\"`;
|
||
});
|
||
|
||
// 匹配 src=\"/public/img/xxx.png\" 模式
|
||
content = content.replace(/src=\"(\/public\/img\/[^\"]+)\"/g, (match, p1) => {
|
||
return `src=\"${CDN_BASE_URL}${p1.replace('/public/', '')}\"`;
|
||
});
|
||
|
||
// 匹配 src=\"/img/xxx.png\" 模式
|
||
content = content.replace(/src=\"(\/img\/[^\"]+)\"/g, (match, p1) => {
|
||
return `src=\"${CDN_BASE_URL}${p1.replace('/img/', '')}\"`;
|
||
});
|
||
|
||
// 匹配 src=\"img/xxx.png\" 模式
|
||
content = content.replace(/src=\"(img\/[^\"]+)\"/g, (match, p1) => {
|
||
return `src=\"${CDN_BASE_URL}${p1.replace('img/', '')}\"`;
|
||
});
|
||
|
||
// 移除_nuxt前缀的图片路径
|
||
content = content.replace(/src=\"\/_nuxt\/img\/([^\"]+)\"/g, (match, p1) => {
|
||
return `src=\"${CDN_BASE_URL}${p1}\"`;
|
||
});
|
||
|
||
// 匹配 src="/_nuxt/assets/images/xxx.png" 模式
|
||
content = content.replace(/src=\"\/_nuxt\/assets\/images\/([^\"]+)\"/g, (match, p1) => {
|
||
return `src=\"${CDN_BASE_URL}${p1}\"`;
|
||
});
|
||
|
||
fs.writeFileSync(filePath, content, 'utf8');
|
||
} |