search
React star Featured

How to Fix require is not defined in Vite Error in React Project

Learn how to fix the 'require is not defined' error in Vite with React. Complete guide with solutions for CommonJS compatibility and ES6 modules.

person By Gautam Sharma
calendar_today January 2, 2026
schedule 14 min read
Vite React ES6 Modules CommonJS Error Handling Module System

The ‘require is not defined’ error in Vite is a common issue developers encounter when trying to use CommonJS require statements in a Vite environment that primarily supports ES6 modules. This error occurs because Vite uses native ES6 modules and doesn’t provide the Node.js CommonJS environment by default.

This comprehensive guide provides complete solutions to resolve the require not defined error with practical examples and module compatibility techniques.


Understanding the require Not Defined Error

Vite is built around native ES6 modules and doesn’t include Node.js globals like require, process, or Buffer by default. When code attempts to use CommonJS syntax in a Vite environment, this error occurs.

Common Error Messages:

  • require is not defined
  • process is not defined
  • Buffer is not defined
  • module is not defined
  • exports is not defined

Common Causes and Solutions

1. CommonJS require Statements

The most common cause is using require statements in Vite projects.

❌ Problem Scenario:

// ❌ This will fail in Vite
const React = require('react');
const ReactDOM = require('react-dom');
const myModule = require('./myModule');

function App() {
  return React.createElement('div', null, 'Hello World');
}

ReactDOM.render(React.createElement(App), document.getElementById('root'));

✅ Solution: Use ES6 Imports

// ✅ Use ES6 imports in Vite
import React from 'react';
import ReactDOM from 'react-dom';
import myModule from './myModule';

function App() {
  return <div>Hello World</div>;
}

ReactDOM.createRoot(document.getElementById('root')).render(<App />);

2. Third-Party Libraries Using CommonJS

Some libraries still use CommonJS exports, causing issues in Vite.

❌ Problem Scenario:

// ❌ Library using CommonJS might cause issues
import someLibrary from 'some-commonjs-library'; // This might fail

✅ Solution: Configure Vite for CommonJS Compatibility

// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { resolve } from 'path';

export default defineConfig({
  plugins: [react()],
  define: {
    global: 'globalThis',
  },
  resolve: {
    alias: {
      // Add aliases if needed
    },
  },
  optimizeDeps: {
    include: [
      // Include problematic dependencies
    ],
  },
});

Solution 1: Proper Module Conversion

Convert CommonJS code to ES6 modules.

CommonJS to ES6 Conversion:

// Before: CommonJS (file.js)
function greet(name) {
  return `Hello, ${name}!`;
}

function farewell(name) {
  return `Goodbye, ${name}!`;
}

module.exports = {
  greet,
  farewell
};

// After: ES6 Module (file.js)
export function greet(name) {
  return `Hello, ${name}!`;
}

export function farewell(name) {
  return `Goodbye, ${name}!`;
}

// Or as default export
const utils = {
  greet,
  farewell
};

export default utils;

Import Conversion:

// Before: CommonJS imports
const { greet, farewell } = require('./utils');
const React = require('react');

// After: ES6 imports
import { greet, farewell } from './utils';
import React from 'react';

// Or named imports
import { useState, useEffect } from 'react';

// Or mixed imports
import React, { useState } from 'react';

Solution 2: Vite Configuration for CommonJS Compatibility

Configure Vite to handle CommonJS dependencies properly.

Vite Configuration:

// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { resolve } from 'path';

export default defineConfig({
  plugins: [react()],
  
  define: {
    // ✅ Define global variables for browser environment
    global: 'globalThis',
  },
  
  resolve: {
    // ✅ Handle different file extensions
    extensions: ['.js', '.jsx', '.ts', '.tsx'],
    
    alias: {
      // ✅ Create aliases for easier imports
      '@': resolve(__dirname, './src'),
      '@components': resolve(__dirname, './src/components'),
      '@utils': resolve(__dirname, './src/utils'),
    },
  },
  
  optimizeDeps: {
    // ✅ Include dependencies that need optimization
    include: [
      'react',
      'react-dom',
      // Add other dependencies that might cause issues
    ],
    
    // ✅ Handle CommonJS dependencies
    esbuildOptions: {
      define: {
        global: 'globalThis',
      },
    },
  },
  
  build: {
    rollupOptions: {
      // ✅ Configure rollup for CommonJS compatibility
      external: [], // Specify external dependencies if needed
    },
  },
});

Advanced Vite Configuration:

// vite.config.js with CommonJS support
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import commonjs from '@rollup/plugin-commonjs';

export default defineConfig({
  plugins: [
    react(),
    // ✅ Add CommonJS plugin if needed
    commonjs({
      include: ['node_modules/**'],
      extensions: ['.js', '.cjs'],
    }),
  ],
  
  define: {
    global: 'globalThis',
  },
  
  optimizeDeps: {
    include: [
      'react',
      'react-dom',
      // Include problematic dependencies
    ],
    
    esbuildOptions: {
      define: {
        global: 'globalThis',
      },
      plugins: [
        // Add esbuild plugins if needed
      ],
    },
  },
  
  server: {
    // ✅ Configure for development
    host: true,
    port: 3000,
  },
});

Solution 3: Dynamic Import Handling

Use dynamic imports for conditional CommonJS compatibility.

// Dynamic import for CommonJS compatibility
async function loadModule(modulePath) {
  try {
    // ✅ Try ES6 import first
    const module = await import(modulePath);
    return module;
  } catch (error) {
    console.error('ES6 import failed:', error);
    
    // ✅ Fallback to CommonJS if available (in Node.js environment)
    if (typeof require !== 'undefined') {
      try {
        return require(modulePath);
      } catch (requireError) {
        console.error('CommonJS require also failed:', requireError);
        throw new Error(`Module loading failed: ${modulePath}`);
      }
    }
    
    throw error;
  }
}

// Usage
async function useModule() {
  const module = await loadModule('./myModule');
  // Use the module
  console.log(module);
}

// Conditional dynamic imports
async function conditionalImport(condition) {
  if (condition) {
    const { heavyModule } = await import('./heavyModule.js');
    return heavyModule;
  } else {
    const { lightModule } = await import('./lightModule.js');
    return lightModule;
  }
}

Solution 4: Environment Detection and Polyfills

Create polyfills for Node.js globals in browser environments.

Global Polyfills:

// utils/polyfills.js
// ✅ Create polyfills for Node.js globals

// Buffer polyfill
if (typeof Buffer === 'undefined') {
  globalThis.Buffer = {
    from: (input, encoding = 'utf8') => {
      if (typeof input === 'string') {
        const encoder = new TextEncoder();
        return encoder.encode(input);
      } else if (Array.isArray(input)) {
        return new Uint8Array(input);
      }
      return new Uint8Array(0);
    },
    isBuffer: (obj) => obj instanceof Uint8Array,
  };
}

// Process polyfill
if (typeof process === 'undefined') {
  globalThis.process = {
    env: {
      NODE_ENV: 'development',
    },
    version: 'v18.0.0', // Mock version
    platform: 'browser',
  };
}

// Set globalThis as global for compatibility
globalThis.global = globalThis;

export {};

Environment-Specific Code:

// utils/envUtils.js
class EnvironmentUtils {
  static isNode() {
    return typeof process !== 'undefined' && 
           process.versions && 
           process.versions.node;
  }

  static isBrowser() {
    return typeof window !== 'undefined' && 
           typeof window.document !== 'undefined';
  }

  static hasRequire() {
    return typeof require !== 'undefined';
  }

  static hasImport() {
    return typeof import !== 'undefined';
  }

  static safeRequire(modulePath) {
    if (this.hasRequire()) {
      try {
        return require(modulePath);
      } catch (error) {
        console.error('Require failed:', error);
        return null;
      }
    }
    return null;
  }

  static safeImport(modulePath) {
    if (this.hasImport()) {
      return import(modulePath);
    }
    return Promise.reject(new Error('Import not available'));
  }
}

// Usage
const utils = new EnvironmentUtils();
if (utils.isBrowser()) {
  // Browser-specific code
} else if (utils.isNode()) {
  // Node.js-specific code
}

Solution 5: React-Specific Module Handling

Handle modules properly in React components with Vite.

React Component with Module Handling:

// components/ModuleLoader.js
import React, { useState, useEffect } from 'react';

function ModuleLoader({ modulePath }) {
  const [module, setModule] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const loadModule = async () => {
      try {
        setLoading(true);
        
        // ✅ Use dynamic import for module loading
        const importedModule = await import(modulePath);
        setModule(importedModule);
      } catch (err) {
        setError(err.message);
        console.error('Module loading failed:', err);
      } finally {
        setLoading(false);
      }
    };

    loadModule();
  }, [modulePath]);

  if (loading) return <div>Loading module...</div>;
  if (error) return <div>Error: {error}</div>;
  if (!module) return <div>Module not loaded</div>;

  return (
    <div>
      <pre>{JSON.stringify(module, null, 2)}</pre>
    </div>
  );
}

export default ModuleLoader;

Lazy Loading with Error Boundaries:

// components/LazyComponent.js
import React, { lazy, Suspense } from 'react';

// ✅ Lazy load components with proper error handling
const LazyComponent = lazy(() => 
  import('./MyComponent').catch(error => {
    console.error('Failed to load component:', error);
    return import('./FallbackComponent');
  })
);

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <LazyComponent />
    </Suspense>
  );
}

export default App;

Solution 6: Third-Party Library Integration

Handle third-party libraries that use CommonJS properly.

Handling Problematic Libraries:

// utils/libraryHandler.js
class LibraryHandler {
  static async loadLibrary(libraryName) {
    try {
      // ✅ Try ES6 import first
      return await import(libraryName);
    } catch (error) {
      console.warn(`ES6 import failed for ${libraryName}:`, error);
      
      // ✅ Try different import methods
      const possiblePaths = [
        libraryName,
        `${libraryName}/dist/index.js`,
        `${libraryName}/lib/index.js`,
      ];

      for (const path of possiblePaths) {
        try {
          return await import(path);
        } catch {
          continue;
        }
      }

      throw new Error(`Could not load library: ${libraryName}`);
    }
  }

  static createSafeWrapper(libraryName) {
    return async (...args) => {
      try {
        const lib = await this.loadLibrary(libraryName);
        return lib.default ? lib.default(...args) : lib(...args);
      } catch (error) {
        console.error(`Library ${libraryName} failed:`, error);
        // Return fallback or throw error based on requirements
        throw error;
      }
    };
  }
}

// Usage
const safeLodash = LibraryHandler.createSafeWrapper('lodash');

Vite Configuration for Specific Libraries:

// vite.config.js for specific libraries
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

export default defineConfig({
  plugins: [react()],
  
  optimizeDeps: {
    include: [
      'react',
      'react-dom',
      // Add specific libraries that need optimization
    ],
    
    esbuildOptions: {
      define: {
        global: 'globalThis',
      },
      // ✅ Handle specific library requirements
      plugins: [
        // Add specific plugins if needed
      ],
    },
  },
  
  define: {
    // ✅ Define globals for libraries that expect them
    global: 'globalThis',
    process: JSON.stringify({
      env: { NODE_ENV: 'development' },
    }),
  },
});

Solution 7: Build and Development Workflow

Optimize your development workflow for Vite and React.

Package.json Scripts:

{
  "name": "my-vite-react-app",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview",
    "clean": "rm -rf node_modules/.vite",
    "fresh": "npm run clean && npm install && npm run dev",
    "check-modules": "npm ls --depth=0"
  },
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "@types/react": "^18.0.27",
    "@types/react-dom": "^18.0.10",
    "@vitejs/plugin-react": "^4.0.0",
    "vite": "^4.1.0"
  }
}

Development Configuration:

// vite.config.js for development
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

export default defineConfig(({ mode }) => {
  const isDevelopment = mode === 'development';
  
  return {
    plugins: [react()],
    
    define: {
      global: 'globalThis',
      ...(isDevelopment && {
        'process.env.NODE_ENV': JSON.stringify('development'),
      }),
    },
    
    server: {
      port: 3000,
      open: true,
      host: true,
    },
    
    optimizeDeps: {
      include: [
        'react',
        'react-dom',
      ],
      
      esbuildOptions: {
        define: {
          global: 'globalThis',
        },
      },
    },
  };
});

Solution 8: Testing Environment Setup

Configure your testing environment for Vite and CommonJS compatibility.

Jest Configuration:

// jest.config.js
export default {
  testEnvironment: 'jsdom',
  extensionsToTreatAsEsm: ['.ts', '.tsx'],
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1',
  },
  transform: {
    '^.+\\.(t|j)sx?$': [
      '@swc/jest',
      {
        jsc: {
          parser: {
            syntax: 'typescript',
            tsx: true,
          },
          target: 'es2020',
        },
      },
    ],
  },
  setupFilesAfterEnv: ['<rootDir>/tests/setup.js'],
};

// tests/setup.js
// Mock Node.js globals for tests
global.process = {
  env: { NODE_ENV: 'test' },
};

global.Buffer = {
  from: (input) => new Uint8Array(Array.from(input)),
  isBuffer: (obj) => obj instanceof Uint8Array,
};

global.global = global;

Testing Components:

// components/MyComponent.test.js
import { render, screen } from '@testing-library/react';
import MyComponent from './MyComponent';

describe('MyComponent', () => {
  test('should render without require errors', () => {
    render(<MyComponent />);
    expect(screen.getByText(/Hello/i)).toBeInTheDocument();
  });
});

Solution 9: Error Handling and Debugging

Implement proper error handling for module-related issues.

// utils/moduleErrorHandler.js
class ModuleErrorHandler {
  static async handleImportError(importPath, error) {
    console.error(`Import error for: ${importPath}`);
    console.error('Error details:', error.message);
    
    // ✅ Provide helpful suggestions
    const suggestions = this.generateSuggestions(importPath, error);
    console.error('Possible solutions:', suggestions);
    
    throw error;
  }

  static generateSuggestions(importPath, error) {
    const suggestions = [];
    
    if (error.message.includes('require is not defined')) {
      suggestions.push('Use ES6 import syntax instead of CommonJS require');
      suggestions.push('Check if the module is compatible with Vite');
      suggestions.push('Verify the module path is correct');
    }
    
    if (error.message.includes('process is not defined')) {
      suggestions.push('Add process polyfill in vite.config.js');
      suggestions.push('Use environment variables properly');
    }
    
    return suggestions;
  }

  static async safeDynamicImport(path) {
    try {
      return await import(path);
    } catch (error) {
      await this.handleImportError(path, error);
    }
  }
}

// Enhanced import function
async function enhancedImport(path, options = {}) {
  const { 
    retryExtensions = ['.js', '.mjs', '.cjs'], 
    fallback = null,
    timeout = 5000 
  } = options;

  try {
    return await import(path);
  } catch (error) {
    // ✅ Try with different extensions
    for (const ext of retryExtensions) {
      try {
        return await import(path + ext);
      } catch {
        continue;
      }
    }

    // ✅ Try fallback if provided
    if (fallback) {
      return await import(fallback);
    }

    throw error;
  }
}

Performance Considerations

Optimized Module Loading:

// utils/optimizedModuleLoader.js
class OptimizedModuleLoader {
  constructor() {
    this.cache = new Map();
  }

  async loadWithCache(path) {
    // ✅ Cache resolved modules
    if (this.cache.has(path)) {
      return this.cache.get(path);
    }

    try {
      const module = await import(path);
      this.cache.set(path, module);
      return module;
    } catch (error) {
      console.error(`Failed to import ${path}:`, error);
      throw error;
    }
  }

  async batchLoad(paths) {
    // ✅ Load multiple modules concurrently
    const promises = paths.map(path => this.loadWithCache(path));
    return await Promise.all(promises);
  }

  async conditionalLoad(condition, truePath, falsePath) {
    // ✅ Conditional loading without side effects
    const path = condition ? truePath : falsePath;
    return await this.loadWithCache(path);
  }
}

// Usage
const moduleLoader = new OptimizedModuleLoader();
const [module1, module2] = await moduleLoader.batchLoad([
  './module1.js',
  './module2.js'
]);

Security Considerations

Safe Module Loading:

// utils/safeModuleLoader.js
class SafeModuleLoader {
  static validatePath(path) {
    // ✅ Prevent directory traversal attacks
    if (path.includes('../') || path.includes('..\\')) {
      throw new Error('Invalid path: directory traversal detected');
    }
    
    // ✅ Validate file extensions
    const allowedExtensions = ['.js', '.mjs', '.cjs', '.ts', '.tsx'];
    const extension = path.match(/\.[^/.]+$/)?.[0];
    
    if (extension && !allowedExtensions.includes(extension)) {
      throw new Error(`Invalid file extension: ${extension}`);
    }
    
    return true;
  }

  static async safeImport(path) {
    // ✅ Validate path before importing
    this.validatePath(path);
    
    try {
      return await import(path);
    } catch (error) {
      // ✅ Log security-relevant errors
      console.error('Security error during import:', error);
      throw error;
    }
  }

  static createSafeImportValidator(allowedPaths) {
    return async (path) => {
      // ✅ Check against allowed paths
      const isAllowed = allowedPaths.some(allowed => 
        path.startsWith(allowed) || path.includes(allowed)
      );
      
      if (!isAllowed) {
        throw new Error(`Path not allowed: ${path}`);
      }
      
      return await import(path);
    };
  }
}

// Usage
const safeImport = SafeModuleLoader.createSafeImportValidator([
  './components/',
  './utils/',
  './services/'
]);

const component = await safeImport('./components/MyComponent.js');

Common Mistakes to Avoid

1. Using CommonJS in Vite:

// ❌ Don't do this in Vite
const myModule = require('./myModule'); // Will fail

2. Missing Vite Configuration:

// ❌ Don't forget to configure Vite for globals
// Always add global: 'globalThis' in define

3. Incorrect Import Syntax:

// ❌ Don't use incorrect extensions
import myModule from './myModule'; // Missing .js extension in some cases

Alternative Solutions

Using React DevTools:

// Component with module detection
function ModuleDetector() {
  const [moduleInfo, setModuleInfo] = useState({});

  useEffect(() => {
    const info = {
      hasImport: typeof import !== 'undefined',
      hasRequire: typeof require !== 'undefined',
      environment: typeof window !== 'undefined' ? 'browser' : 'node'
    };
    setModuleInfo(info);
  }, []);

  return (
    <div data-testid="module-detector">
      <pre>{JSON.stringify(moduleInfo, null, 2)}</pre>
    </div>
  );
}

Feature Detection:

// Check for module system support
function checkModuleSupport() {
  try {
    // Dynamic import support
    return typeof import !== 'undefined';
  } catch {
    return false;
  }
}

// Module system detection
function getModuleSystem() {
  if (typeof require !== 'undefined') {
    return 'commonjs';
  } else if (typeof import !== 'undefined') {
    return 'es6';
  }
  return 'unknown';
}

Troubleshooting Checklist

When encountering the require is not defined error:

  1. Check Import Syntax: Ensure using ES6 import/export syntax
  2. Verify Vite Configuration: Confirm globals are properly defined
  3. Review Dependencies: Check if libraries are Vite-compatible
  4. Test in Isolation: Try importing in a simple test file
  5. Clear Cache: Remove node_modules/.vite directory
  6. Update Vite Plugin: Ensure @vitejs/plugin-react is current
  7. Check File Extensions: Verify correct extensions in imports

Conclusion

The ‘require is not defined’ error in Vite occurs when attempting to use Node.js CommonJS syntax in a Vite environment that expects ES6 modules. By understanding the differences between module systems, configuring Vite properly, and implementing appropriate polyfills, you can resolve these errors and ensure your React applications work seamlessly with Vite.

The key to resolving this error is using proper ES6 import syntax, configuring Vite for CommonJS compatibility when needed, and implementing robust error handling. Whether you’re working with simple React applications or complex projects with many dependencies, the solutions provided in this guide will help you maintain smooth Vite development workflows.

Remember to always use ES6 modules in Vite projects, configure proper polyfills for Node.js globals, and implement appropriate fallback mechanisms to ensure compatibility across different environments.

Gautam Sharma

About Gautam Sharma

Full-stack developer and tech blogger sharing coding tutorials and best practices

Related Articles

React

How to Solve Vite Outdated Optimize Dep Error in React Project

Learn how to fix the 'Outdated optimize dep' error in Vite with React. Complete guide with solutions for dependency optimization and caching issues.

January 2, 2026
React

Fix: process is not defined error in React Vite - Complete Solution Guide

Learn how to fix the 'process is not defined' error in React Vite projects. This guide covers environment variables, Node.js compatibility, and best practices for Vite configuration.

January 1, 2026
React

How to Fix CORS Error in React Vite Project: Complete Guide 2026

Learn how to fix CORS errors in React Vite projects with step-by-step solutions. This guide covers proxy setup, server configurations, and best practices for handling cross-origin requests.

January 1, 2026