lingrui-web/scripts/build-static.js

100 lines
3.0 KiB
JavaScript
Raw Normal View History

// 静态生成构建脚本
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');
}