#!/bin/bash ############################################################################### # fmode-brightdata-api 构建脚本 # # 功能: # 1. 使用esbuild打包所有ESM模块 # 2. 使用terser进行代码混淆和压缩 # 3. 生成可发布到npm或CDN的dist文件 # 4. 支持Deno和Node.js环境 # # 使用方法: # chmod +x build.sh # ./build.sh # # 输出: # ./dist/{version}/fmode-brightdata-api.js - 打包后的文件 # ./dist/{version}/fmode-brightdata-api.min.js - 混淆压缩后的文件 ############################################################################### # 设置错误时退出 set -e # 颜色输出 GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color echo -e "${GREEN}==================================================${NC}" echo -e "${GREEN} fmode-brightdata-api 构建脚本${NC}" echo -e "${GREEN}==================================================${NC}" # 检查是否在正确的目录 if [ ! -f "package.json" ]; then echo -e "${RED}错误: package.json 不存在${NC}" echo -e "${YELLOW}请确保在 fmode-brightdata-api 目录下运行此脚本${NC}" exit 1 fi # 读取版本号 VERSION=$(node -p "require('./package.json').version" 2>/dev/null || echo "1.0.0") if [ -z "$VERSION" ]; then echo -e "${RED}错误: 无法从 package.json 读取版本号${NC}" exit 1 fi echo -e "${GREEN}版本号: ${VERSION}${NC}" # 创建dist/{version}目录 DIST_DIR="dist/${VERSION}" echo -e "${YELLOW}[1/5] 创建 ${DIST_DIR} 目录...${NC}" rm -rf "${DIST_DIR}" mkdir -p "${DIST_DIR}" # 检查是否安装了依赖 if [ ! -d "node_modules" ]; then echo -e "${YELLOW}[2/5] 安装依赖...${NC}" npm install else echo -e "${GREEN}[2/5] 依赖已安装,跳过...${NC}" fi # 使用esbuild打包 esm echo -e "${YELLOW}[3/5] 使用esbuild打包 ESM 格式...${NC}" npx esbuild src/mod.ts \ --bundle \ --format=esm \ --platform=node \ --target=node16 \ --outfile="${DIST_DIR}/fmode-brightdata-api.js" \ --sourcemap \ --external:express if [ $? -eq 0 ]; then echo -e "${GREEN}✓ ESM 打包成功${NC}" else echo -e "${RED}✗ ESM 打包失败${NC}" exit 1 fi # 使用esbuild打包 cjs echo -e "${YELLOW}[3/5] 使用esbuild打包 CJS 格式...${NC}" npx esbuild src/mod.ts \ --bundle \ --format=cjs \ --platform=node \ --target=node16 \ --outfile="${DIST_DIR}/fmode-brightdata-api.cjs" \ --sourcemap \ --external:express if [ $? -eq 0 ]; then echo -e "${GREEN}✓ CJS 打包成功${NC}" else echo -e "${RED}✗ CJS 打包失败${NC}" exit 1 fi # 使用terser压缩和混淆 ESM if command -v terser &> /dev/null; then echo -e "${YELLOW}[4/5] 使用terser压缩 ESM...${NC}" terser "${DIST_DIR}/fmode-brightdata-api.js" \ --compress \ --mangle \ --output "${DIST_DIR}/fmode-brightdata-api.min.js" \ --source-map "content='${DIST_DIR}/fmode-brightdata-api.js.map',url='fmode-brightdata-api.min.js.map'" else echo -e "${YELLOW}[4/5] terser 未安装,使用 esbuild --minify 代替...${NC}" npx esbuild "${DIST_DIR}/fmode-brightdata-api.js" \ --minify \ --outfile="${DIST_DIR}/fmode-brightdata-api.min.js" \ --sourcemap fi # 使用terser压缩和混淆 CJS if command -v terser &> /dev/null; then echo -e "${YELLOW}[4/5] 使用terser压缩 CJS...${NC}" terser "${DIST_DIR}/fmode-brightdata-api.cjs" \ --compress \ --mangle \ --output "${DIST_DIR}/fmode-brightdata-api.min.cjs" \ --source-map "content='${DIST_DIR}/fmode-brightdata-api.cjs.map',url='fmode-brightdata-api.min.cjs.map'" else echo -e "${YELLOW}[4/5] terser 未安装,使用 esbuild --minify 代替...${NC}" npx esbuild "${DIST_DIR}/fmode-brightdata-api.cjs" \ --minify \ --outfile="${DIST_DIR}/fmode-brightdata-api.min.cjs" \ --sourcemap fi echo -e "${GREEN}[5/5] 构建完成!${NC}" echo -e "${GREEN}输出目录: ${DIST_DIR}${NC}"