Shipkit
DocsFeaturesPricing
DocsFeaturesPricing

Command Palette

Search for a command to run...

Shipkit DocumentationBuild memory optimizationDevelopment GuideEnvironment VariablesError HandlingFile StructureMiddlewareRebranding Guide

Vercel Deployment Checks

Development GuideCLIDependency UpdatesDevToolsFeature FlagsAI PromptsSetup RequirementsSupply chaintRPCWeb Workers

FeaturesAIAnalytics IntegrationAuthenticationCMSDatabaseEmailHapticsPaymentsComponent RegistryStorageUIVisual BuilderWaitlist Feature

Quick StartDeploymentEnvironment VariablesFile StructureSetup Wizard

Caching & Rate LimitingContent ManagementError HandlingMarkdown and MDXMiddlewareProxy-Safe Server ActionsRebranding GuideWebhook Security Implementation GuideMulti-Zone ArchitectureVercel Deployment

IntegrationsPayload CMSDataFast Analytics IntegrationGoogle Analytics IntegrationGoogle Tag Manager IntegrationPostHogStatSig IntegrationUmami Analytics IntegrationAuth.js IntegrationBetter AuthClerkStack Auth IntegrationSupabase Authentication IntegrationBuilder.io IntegrationPayload CMS IntegrationAWS S3 IntegrationResend Email IntegrationUpstash Redis IntegrationVercel Blob IntegrationLemon SqueezyPolarStripe

API RoutesComponentsAPI Route SnippetsAuthentication SnippetsComponent SnippetsForm Handling SnippetsSnippets Introduction

ShipKit Build Memory Optimization Guide

This guide addresses out-of-memory (OOM) issues during builds, particularly with large dependencies like @huggingface/transformers and other memory-intensive libraries.

🚨 Common Build Issues

Symptoms

  • Error: Command "pnpm run build" exited with SIGKILL
  • Out of Memory errors during build
  • Large WASM files (21.6 MB) won't be precached
  • Build timeouts on Vercel/CI platforms

Root Causes

  1. Large Dependencies: Libraries like @huggingface/transformers, three.js, remotion
  2. WASM Files: Heavy WebAssembly files (especially from AI/ML libraries)
  3. Insufficient Memory Allocation: Default Node.js memory limits
  4. Build Configuration: Unoptimized webpack/Next.js settings

📊 Current Dependency Analysis

Run the bundle analyzer to understand your current situation:

npm run analyze:bundle

Memory-Intensive Dependencies

  • @huggingface/transformers (21.6 MB WASM file)
  • three.js and @react-three/* (3D graphics)
  • remotion (video processing)
  • @opentelemetry/* (monitoring)
  • monaco-editor (code editor)
  • playwright (browser automation)

🔧 Optimization Solutions

1. Node.js Memory Configuration

Local Development

# Use memory-optimized build
npm run build:memory-optimized

# Or with custom memory settings
NODE_OPTIONS="--max-old-space-size=6144 --max-semi-space-size=1024" npm run build

Vercel/Production

# Use Vercel-optimized build
npm run build:vercel

# Environment variables (set in Vercel dashboard)
NODE_OPTIONS="--max-old-space-size=8192 --max-semi-space-size=512"

2. Next.js Configuration Optimizations

The next.config.ts has been optimized with:

experimental: {
  // Memory optimization settings
  workerThreads: false,
  esmExternals: true,
  cpus: 1, // Limit to single CPU core
  isrMemoryCacheSize: 0,
  largePageDataBytes: 128 * 1000, // 128KB limit
}

3. Webpack Bundle Splitting

Optimized chunk splitting prevents large bundles:

splitChunks: {
  maxSize: 200000, // 200KB max chunk size
  cacheGroups: {
    // Split transformers into smaller chunks
    transformers: {
      test: /[\\/]node_modules[\\/]@huggingface[\\/]transformers[\\/]/,
      name: "transformers",
      chunks: "async", // Only load when needed
      priority: 15,
      maxSize: 50000, // Very small chunks
    },
    // Other optimizations...
  }
}

4. PWA Configuration for Large Files

Updated PWA config to handle large WASM files:

// src/config/nextjs/with-pwa.ts
const pwaConfig = {
  maximumFileSizeToCacheInBytes: 25 * 1024 * 1024, // 25MB
  exclude: [/\.wasm$/, /\.bin$/, /onnx/, /transformers/],
  runtimeCaching: [
    {
      urlPattern: /\.wasm$/,
      handler: "CacheFirst",
      options: {
        cacheName: "wasm-cache",
        expiration: {
          maxEntries: 10,
          maxAgeSeconds: 60 * 60 * 24 * 30, // 30 days
        },
      },
    },
  ],
};

5. Dependency Externalization

Heavy libraries are externalized on the server:

// next.config.ts
config.externals = [
  {
    "@huggingface/transformers": "@huggingface/transformers",
    three: "three",
    "@react-three/fiber": "@react-three/fiber",
    remotion: "remotion",
    "better-sqlite3": "better-sqlite3",
  },
];

⚠️ Important: Do NOT externalize sharp as it's required at runtime by:

  • Payload CMS for image processing
  • Image optimization services
  • Server-side image transformations

🚀 Build Scripts

Available Scripts

{
  "build": "NODE_OPTIONS=\"--max-old-space-size=6144\" next build",
  "build:memory-optimized": "NODE_OPTIONS=\"--max-old-space-size=6144 --max-semi-space-size=1024\" next build",
  "build:vercel": "NODE_OPTIONS=\"--max-old-space-size=8192 --max-semi-space-size=512 --optimize-for-size\" next build",
  "analyze:bundle": "node scripts/analyze-bundle.js"
}

Usage

# Local development
npm run build:memory-optimized

# Production/Vercel
npm run build:vercel

# Analyze dependencies
npm run analyze:bundle

🔍 Monitoring and Troubleshooting

Memory Usage Monitoring

# Check memory before build
npm run prebuild

# Monitor Node.js memory
node --trace-gc --max-old-space-size=8192 node_modules/.bin/next build

# Analyze bundle size
npm run analyze:both

Debugging OOM Issues

  1. Check Current Memory Usage:

    npm run analyze:bundle
    
  2. Identify Large Dependencies:

    npx webpack-bundle-analyzer .next/static/chunks/*.js
    
  3. Monitor Build Process:

    # Enable verbose logging
    DEBUG=* npm run build:memory-optimized
    

Common Solutions

IssueSolution
WASM files too largeIncrease maximumFileSizeToCacheInBytes in PWA config
Build OOM on VercelUse build:vercel script with higher memory limits
Large bundle sizeEnable chunk splitting and externalization
Slow buildsDisable source maps in production
Memory leaksUse --optimize-for-size flag

🎯 Best Practices

1. Dynamic Imports for Heavy Libraries

// Instead of static imports
import { AutoTokenizer } from "@huggingface/transformers";

// Use dynamic imports
const loadTransformers = async () => {
  const { AutoTokenizer } = await import("@huggingface/transformers");
  return AutoTokenizer;
};

2. Conditional Loading

// Only load AI features when needed
const AIComponent = lazy(() =>
  import("./ai-component").then((module) => ({
    default: module.AIComponent,
  }))
);

3. Environment-Based Optimization

// next.config.ts
const config = {
  experimental: {
    workerThreads: process.env.NODE_ENV === "development" ? true : false,
    cpus: process.env.NODE_ENV === "development" ? undefined : 1,
  },
};

4. Build Environment Configuration

Create .env.build with optimized settings:

NODE_OPTIONS="--max-old-space-size=8192 --max-semi-space-size=512 --optimize-for-size"
NEXT_TELEMETRY_DISABLED=1
SKIP_ENV_VALIDATION=1
NEXT_DISABLE_SOURCEMAPS=true

📋 Quick Fixes Checklist

  • Use build:vercel script for production builds
  • Increase Node.js memory limits (--max-old-space-size=8192)
  • Enable chunk splitting for large libraries
  • Externalize heavy dependencies on server
  • Configure PWA for large WASM files
  • Disable source maps in production
  • Use dynamic imports for AI/ML libraries
  • Monitor build with bundle analyzer
  • Test build locally before deployment

🆘 Emergency Fixes

If you're experiencing immediate build failures:

  1. Temporary workaround:

    # Disable problematic features
    DISABLE_HUGGINGFACE_TRANSFORMERS=true npm run build
    
  2. Reduce memory usage:

    # Use single-threaded build
    NODE_OPTIONS="--max-old-space-size=8192 --optimize-for-size" npm run build
    
  3. Skip non-essential features:

    # Skip linting and type checking
    SKIP_LINT=true SKIP_TYPE_CHECK=true npm run build
    

📚 Additional Resources

  • Next.js Memory Optimization
  • Webpack Bundle Splitting
  • Node.js Memory Management
  • Vercel Build Optimization

🤝 Contributing

If you discover new optimization techniques or encounter issues, please:

  1. Test the solution locally
  2. Update this documentation
  3. Share findings with the team
  4. Monitor build performance metrics

Last Updated: 2024-01-XX Build Environment: Node.js 18+, Next.js 15+, Vercel