measure-chunk-stats.sh 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #!/usr/bin/env bash
  2. # Measure ChunkModuleStats (initial / async-only / total) for [[...path]] page.
  3. # Usage: ./bin/measure-chunk-stats.sh [port]
  4. set -euo pipefail
  5. PORT="${1:-3099}"
  6. LOG=$(mktemp /tmp/chunk-stats-XXXXXX.log)
  7. cleanup() {
  8. local pids
  9. pids=$(lsof -ti :"$PORT" 2>/dev/null || true)
  10. if [ -n "$pids" ]; then
  11. kill -9 $pids 2>/dev/null || true
  12. fi
  13. rm -f "$LOG"
  14. }
  15. trap cleanup EXIT
  16. # 1. Ensure port is free
  17. cleanup_pids=$(lsof -ti :"$PORT" 2>/dev/null || true)
  18. if [ -n "$cleanup_pids" ]; then
  19. kill -9 $cleanup_pids 2>/dev/null || true
  20. sleep 1
  21. fi
  22. # 2. Clean .next dev cache (v16 uses .next/dev for isolated dev builds)
  23. rm -rf "$(dirname "$0")/../.next/dev"
  24. # 3. Start Next.js dev server (--webpack to opt out of Turbopack default in v16)
  25. cd "$(dirname "$0")/.."
  26. npx next dev --webpack -p "$PORT" > "$LOG" 2>&1 &
  27. NEXT_PID=$!
  28. # 4. Wait for server ready
  29. echo "Waiting for Next.js to start on port $PORT ..."
  30. for i in $(seq 1 30); do
  31. if grep -q "Local:" "$LOG" 2>/dev/null; then
  32. break
  33. fi
  34. sleep 1
  35. done
  36. # 5. Trigger compilation
  37. echo "Triggering compilation ..."
  38. curl -s -o /dev/null http://localhost:"$PORT"/
  39. # 6. Wait for ChunkModuleStats output (non-zero initial)
  40. echo "Waiting for compilation ..."
  41. for i in $(seq 1 120); do
  42. if grep -qP 'ChunkModuleStats\] initial: [1-9]' "$LOG" 2>/dev/null; then
  43. break
  44. fi
  45. sleep 2
  46. done
  47. # 7. Print results
  48. echo ""
  49. echo "=== Results ==="
  50. grep -E 'ChunkModuleStats|Compiled.*modules' "$LOG" | grep -v 'initial: 0,' | head -5
  51. echo ""