frontend-build-prod.sh 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #!/bin/bash
  2. # Tolan前端生产环境打包脚本
  3. # 用于将React项目打包成生产环境的静态文件
  4. set -e # 遇到错误时退出
  5. echo "=========================================="
  6. echo "📦 Tolan前端生产环境打包"
  7. echo "=========================================="
  8. # 项目根目录
  9. PROJECT_ROOT=$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")
  10. FRONTEND_DIR="$PROJECT_ROOT/frontend"
  11. echo "📁 项目根目录: $PROJECT_ROOT"
  12. echo "🎨 前端目录: $FRONTEND_DIR"
  13. # 检查前端目录
  14. if [ ! -d "$FRONTEND_DIR" ]; then
  15. echo "❌ 前端目录不存在: $FRONTEND_DIR"
  16. exit 1
  17. fi
  18. # 进入前端目录
  19. cd "$FRONTEND_DIR"
  20. echo "📂 当前目录: $(pwd)"
  21. # 检查package.json
  22. if [ ! -f "package.json" ]; then
  23. echo "❌ package.json不存在,请确认是否为有效的前端项目"
  24. exit 1
  25. fi
  26. echo "✅ 发现package.json,开始打包流程..."
  27. # 检查Node.js和npm
  28. echo "🔍 检查环境..."
  29. if ! command -v node &> /dev/null; then
  30. echo "❌ 未找到Node.js,请先安装"
  31. exit 1
  32. fi
  33. if ! command -v npm &> /dev/null; then
  34. echo "❌ 未找到npm,请先安装"
  35. exit 1
  36. fi
  37. NODE_VERSION=$(node --version)
  38. NPM_VERSION=$(npm --version)
  39. echo "✅ Node.js版本: $NODE_VERSION"
  40. echo "✅ npm版本: $NPM_VERSION"
  41. # 检查环境配置文件
  42. echo "🔧 检查环境配置..."
  43. # 使用production.env作为生产环境配置
  44. if [ -f "production.env" ]; then
  45. echo "✅ 发现生产环境配置文件: production.env"
  46. # 复制为标准的.env.production文件名
  47. cp production.env .env.production
  48. echo "📋 已复制为.env.production"
  49. else
  50. echo "⚠️ 未找到production.env,将使用默认配置"
  51. fi
  52. # 清理之前的构建文件
  53. echo "🧹 清理之前的构建文件..."
  54. if [ -d "build" ]; then
  55. rm -rf build
  56. echo "✅ 已清理build目录"
  57. fi
  58. # 安装依赖
  59. echo "📦 安装依赖包..."
  60. npm ci --only=production || npm install
  61. # 设置构建时间戳
  62. export REACT_APP_BUILD_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
  63. echo "⏰ 构建时间: $REACT_APP_BUILD_TIME"
  64. # 开始构建
  65. echo "🏗️ 开始生产环境构建..."
  66. echo "----------------------------------------"
  67. # 设置生产环境变量
  68. export NODE_ENV=production
  69. export GENERATE_SOURCEMAP=false
  70. export INLINE_RUNTIME_CHUNK=false
  71. # 执行构建
  72. npm run build
  73. echo "----------------------------------------"
  74. # 检查构建结果
  75. if [ -d "build" ]; then
  76. BUILD_SIZE=$(du -sh build | cut -f1)
  77. FILE_COUNT=$(find build -type f | wc -l)
  78. echo "✅ 构建成功完成!"
  79. echo "📊 构建结果:"
  80. echo " - 构建目录: build/"
  81. echo " - 总大小: $BUILD_SIZE"
  82. echo " - 文件数量: $FILE_COUNT"
  83. echo ""
  84. # 显示主要文件
  85. echo "📋 主要构建文件:"
  86. if [ -f "build/index.html" ]; then
  87. echo " ✅ index.html"
  88. fi
  89. if [ -d "build/static/js" ]; then
  90. JS_FILES=$(find build/static/js -name "*.js" | wc -l)
  91. echo " ✅ JavaScript文件: $JS_FILES 个"
  92. fi
  93. if [ -d "build/static/css" ]; then
  94. CSS_FILES=$(find build/static/css -name "*.css" | wc -l)
  95. echo " ✅ CSS文件: $CSS_FILES 个"
  96. fi
  97. else
  98. echo "❌ 构建失败,未找到build目录"
  99. exit 1
  100. fi
  101. echo ""
  102. echo "=========================================="
  103. echo "🎉 前端打包完成!"
  104. echo "📁 构建目录: $FRONTEND_DIR/build"
  105. echo "🚀 可用于生产环境部署"
  106. echo "=========================================="
  107. echo ""
  108. echo "📋 后续步骤:"
  109. echo "1. 将build目录内容部署到Web服务器"
  110. echo "2. 配置Web服务器处理单页应用路由"
  111. echo "3. 确保WebSocket连接地址正确"
  112. echo ""
  113. echo "💡 本地预览构建结果:"
  114. echo " cd $FRONTEND_DIR && npm run serve"