build.sh 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #!/bin/bash
  2. ###############################################################################
  3. # fmode-tikhub-api-customize 构建脚本
  4. #
  5. # 功能:
  6. # 1. 使用esbuild打包所有ESM模块
  7. # 2. 使用terser进行代码混淆和压缩
  8. # 3. 生成可发布到npm或CDN的dist文件
  9. # 4. 支持Deno和Node.js环境
  10. #
  11. # 使用方法:
  12. # chmod +x build.sh
  13. # ./build.sh
  14. #
  15. # 输出:
  16. # ./dist/{version}/fmode-tikhub-api-customize.js - 打包后的文件
  17. # ./dist/{version}/fmode-tikhub-api-customize.min.js - 混淆压缩后的文件
  18. ###############################################################################
  19. # 设置错误时退出
  20. set -e
  21. # 颜色输出
  22. GREEN='\033[0;32m'
  23. YELLOW='\033[1;33m'
  24. RED='\033[0;31m'
  25. NC='\033[0m' # No Color
  26. echo -e "${GREEN}==================================================${NC}"
  27. echo -e "${GREEN} fmode-tikhub-api-customize 构建脚本${NC}"
  28. echo -e "${GREEN}==================================================${NC}"
  29. # 检查是否在正确的目录
  30. if [ ! -f "package.json" ]; then
  31. echo -e "${RED}错误: package.json 不存在${NC}"
  32. echo -e "${YELLOW}请确保在 fmode-tikhub-api-customize 目录下运行此脚本${NC}"
  33. exit 1
  34. fi
  35. # 读取版本号
  36. VERSION=$(node -p "require('./package.json').version" 2>/dev/null || echo "1.0.0")
  37. if [ -z "$VERSION" ]; then
  38. echo -e "${RED}错误: 无法从 package.json 读取版本号${NC}"
  39. exit 1
  40. fi
  41. echo -e "${GREEN}版本号: ${VERSION}${NC}"
  42. # 创建dist/{version}目录
  43. DIST_DIR="dist/${VERSION}"
  44. echo -e "${YELLOW}[1/5] 创建 ${DIST_DIR} 目录...${NC}"
  45. rm -rf "${DIST_DIR}"
  46. mkdir -p "${DIST_DIR}"
  47. # 检查是否安装了依赖
  48. if [ ! -d "node_modules" ]; then
  49. echo -e "${YELLOW}[2/5] 安装依赖...${NC}"
  50. npm install
  51. else
  52. echo -e "${GREEN}[2/5] 依赖已安装,跳过...${NC}"
  53. fi
  54. # 使用esbuild打包 esm
  55. echo -e "${YELLOW}[3/5] 使用esbuild打包 ESM 格式...${NC}"
  56. npx esbuild src/mod.ts \
  57. --bundle \
  58. --format=esm \
  59. --platform=node \
  60. --target=node16 \
  61. --outfile="${DIST_DIR}/fmode-tikhub-api-customize.js" \
  62. --sourcemap \
  63. --external:express
  64. if [ $? -eq 0 ]; then
  65. echo -e "${GREEN}✓ ESM 打包成功${NC}"
  66. else
  67. echo -e "${RED}✗ ESM 打包失败${NC}"
  68. exit 1
  69. fi
  70. # 使用esbuild打包 cjs
  71. echo -e "${YELLOW}[3/5] 使用esbuild打包 CJS 格式...${NC}"
  72. npx esbuild src/mod.ts \
  73. --bundle \
  74. --format=cjs \
  75. --platform=node \
  76. --target=node16 \
  77. --outfile="${DIST_DIR}/fmode-tikhub-api-customize.cjs" \
  78. --sourcemap \
  79. --external:express
  80. if [ $? -eq 0 ]; then
  81. echo -e "${GREEN}✓ CJS 打包成功${NC}"
  82. else
  83. echo -e "${RED}✗ CJS 打包失败${NC}"
  84. exit 1
  85. fi
  86. # 使用terser压缩和混淆 ESM
  87. if command -v terser &> /dev/null; then
  88. echo -e "${YELLOW}[4/5] 使用terser压缩 ESM...${NC}"
  89. terser "${DIST_DIR}/fmode-tikhub-api-customize.js" \
  90. --compress \
  91. --mangle \
  92. --output "${DIST_DIR}/fmode-tikhub-api-customize.min.js" \
  93. --source-map "content='${DIST_DIR}/fmode-tikhub-api-customize.js.map',url='fmode-tikhub-api-customize.min.js.map'"
  94. else
  95. echo -e "${YELLOW}[4/5] terser 未安装,使用 esbuild --minify 代替...${NC}"
  96. npx esbuild "${DIST_DIR}/fmode-tikhub-api-customize.js" \
  97. --minify \
  98. --outfile="${DIST_DIR}/fmode-tikhub-api-customize.min.js" \
  99. --sourcemap
  100. fi
  101. # 使用terser压缩和混淆 CJS
  102. if command -v terser &> /dev/null; then
  103. echo -e "${YELLOW}[4/5] 使用terser压缩 CJS...${NC}"
  104. terser "${DIST_DIR}/fmode-tikhub-api-customize.cjs" \
  105. --compress \
  106. --mangle \
  107. --output "${DIST_DIR}/fmode-tikhub-api-customize.min.cjs" \
  108. --source-map "content='${DIST_DIR}/fmode-tikhub-api-customize.cjs.map',url='fmode-tikhub-api-customize.min.cjs.map'"
  109. else
  110. echo -e "${YELLOW}[4/5] terser 未安装,使用 esbuild --minify 代替...${NC}"
  111. npx esbuild "${DIST_DIR}/fmode-tikhub-api-customize.cjs" \
  112. --minify \
  113. --outfile="${DIST_DIR}/fmode-tikhub-api-customize.min.cjs" \
  114. --sourcemap
  115. fi
  116. echo -e "${GREEN}[5/5] 构建完成!${NC}"
  117. echo -e "${GREEN}输出目录: ${DIST_DIR}${NC}"