Files
jiangmingzhao-daily-report/frontend/deploy.js

158 lines
3.8 KiB
JavaScript
Raw Normal View History

#!/usr/bin/env node
/**
* 前端部署脚本 - 自动化部署Vue应用
*/
const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');
// ANSI颜色代码
const colors = {
reset: '\x1b[0m',
red: '\x1b[31m',
green: '\x1b[32m',
yellow: '\x1b[33m',
blue: '\x1b[34m',
magenta: '\x1b[35m',
cyan: '\x1b[36m'
};
function log(message, color = 'reset') {
console.log(`${colors[color]}${message}${colors.reset}`);
}
function runCommand(command, description) {
log(`\n${'='.repeat(50)}`, 'cyan');
log(`执行: ${description}`, 'cyan');
log(`命令: ${command}`, 'cyan');
log(`${'='.repeat(50)}`, 'cyan');
try {
const output = execSync(command, {
stdio: 'inherit',
encoding: 'utf-8',
cwd: process.cwd()
});
log(`${description} - 成功`, 'green');
return true;
} catch (error) {
log(`${description} - 失败`, 'red');
log(`错误: ${error.message}`, 'red');
return false;
}
}
function checkFile(filePath, description) {
if (fs.existsSync(filePath)) {
log(`${description} - 存在`, 'green');
return true;
} else {
log(`${description} - 不存在`, 'red');
return false;
}
}
function deploy() {
log('🚀 开始部署企业级日报系统前端...', 'magenta');
// 1. 检查Node.js版本
if (!runCommand('node --version', '检查Node.js版本')) {
return false;
}
// 2. 检查npm版本
if (!runCommand('npm --version', '检查npm版本')) {
return false;
}
// 3. 检查package.json
if (!checkFile('package.json', '检查package.json文件')) {
return false;
}
// 4. 安装依赖
log('\n📦 安装项目依赖...', 'yellow');
if (!runCommand('npm install', '安装npm依赖')) {
return false;
}
// 5. 代码检查
log('\n🔍 执行代码检查...', 'yellow');
if (!runCommand('npm run lint', '代码检查和格式化')) {
log('⚠️ 代码检查失败,但继续部署...', 'yellow');
}
// 6. 构建生产版本
log('\n🏗 构建生产版本...', 'yellow');
if (!runCommand('npm run build', '构建生产版本')) {
return false;
}
// 7. 检查构建结果
if (!checkFile('dist', '检查构建输出目录')) {
return false;
}
// 8. 显示构建统计
log('\n📊 构建统计信息:', 'cyan');
try {
const distPath = path.join(process.cwd(), 'dist');
const files = fs.readdirSync(distPath, { withFileTypes: true });
files.forEach(file => {
if (file.isFile()) {
const filePath = path.join(distPath, file.name);
const stats = fs.statSync(filePath);
const size = (stats.size / 1024).toFixed(2);
log(` - ${file.name}: ${size} KB`, 'blue');
}
});
} catch (error) {
log('无法读取构建统计信息', 'yellow');
}
log('\n🎉 前端部署完成!', 'green');
log('\n📋 部署信息:', 'cyan');
log('- 构建输出: ./dist/', 'cyan');
log('- 开发服务器: npm run serve', 'cyan');
log('- 生产构建: npm run build', 'cyan');
log('- 代码检查: npm run lint', 'cyan');
log('\n🌐 部署到服务器:', 'cyan');
log('1. 将 dist/ 目录上传到Web服务器', 'cyan');
log('2. 配置Nginx反向代理到后端API', 'cyan');
log('3. 确保API地址配置正确', 'cyan');
return true;
}
// 主函数
async function main() {
try {
const success = deploy();
process.exit(success ? 0 : 1);
} catch (error) {
log(`\n\n❌ 部署失败: ${error.message}`, 'red');
process.exit(1);
}
}
// 处理中断信号
process.on('SIGINT', () => {
log('\n\n⚠ 部署被用户中断', 'yellow');
process.exit(1);
});
process.on('SIGTERM', () => {
log('\n\n⚠ 部署被系统终止', 'yellow');
process.exit(1);
});
// 运行主函数
if (require.main === module) {
main();
}
module.exports = { deploy };