search
Javascript star Featured

How to Fix __dirname is not defined Error: Node.js & JS Tutorial

Learn how to resolve the __dirname not defined error in Node.js and browser environments. Complete guide with solutions for ES6 modules and modern JavaScript.

person By Gautam Sharma
calendar_today January 2, 2026
schedule 12 min read
Node.js JavaScript ES6 Modules Error Handling Bundlers Webpack

The ‘__dirname is not defined’ error is a common issue developers encounter when working with JavaScript modules, especially when transitioning from CommonJS to ES6 modules or when running code in browser environments. This error occurs because __dirname is a Node.js-specific global variable that doesn’t exist in ES6 modules or browser environments.

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


Understanding the __dirname Not Defined Error

The __dirname variable is a Node.js global that contains the directory name of the current module. It’s only available in CommonJS modules and doesn’t exist in ES6 modules or browser environments.

Common Error Scenarios:

  • ReferenceError: __dirname is not defined
  • Uncaught ReferenceError: __dirname is not defined
  • __dirname is not defined in ES module scope
  • Cannot read property '__dirname' of undefined

Common Causes and Solutions

1. ES6 Module Environment Issues

The most common cause is using __dirname in ES6 modules (files with .mjs extension or "type": "module" in package.json).

❌ Problem Scenario:

// file.mjs - ES6 module
import fs from 'fs';

// ❌ This will cause an error in ES6 modules
const configPath = __dirname + '/config.json';
const config = fs.readFileSync(configPath, 'utf8');

✅ Solution: Use import.meta.url

// file.mjs - ES6 module solution
import fs from 'fs';
import { fileURLToPath } from 'url';
import { dirname } from 'path';

// ✅ Get directory name in ES6 modules
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

const configPath = __dirname + '/config.json';
const config = fs.readFileSync(configPath, 'utf8');

2. Browser Environment Issues

Using __dirname in browser environments will always fail.

❌ Problem Scenario:

// This will fail in browsers
function getAssetPath(assetName) {
  // ❌ __dirname doesn't exist in browsers
  return __dirname + '/assets/' + assetName;
}

✅ Solution: Environment Detection

// Browser-compatible solution
function getAssetPath(assetName) {
  if (typeof window !== 'undefined') {
    // Browser environment - use relative paths or CDN
    return '/assets/' + assetName;
  } else if (typeof __dirname !== 'undefined') {
    // Node.js environment
    return __dirname + '/assets/' + assetName;
  } else {
    // Fallback
    return './assets/' + assetName;
  }
}

Solution 1: ES6 Module Compatibility

Handle __dirname in ES6 modules properly.

// ES6 module approach
import { fileURLToPath } from 'url';
import { dirname } from 'path';

// ✅ Get __dirname equivalent in ES6 modules
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

// Now you can use __dirname equivalent
import fs from 'fs';

function readConfig() {
  const configPath = __dirname + '/config.json';
  return fs.readFileSync(configPath, 'utf8');
}

// Alternative: Create a helper function
function getDirname(importMetaUrl) {
  return dirname(fileURLToPath(importMetaUrl));
}

// Usage
const currentDir = getDirname(import.meta.url);

Solution 2: CommonJS vs ES6 Module Detection

Detect the module system and handle accordingly.

// Universal module system detection
let __dirname;

if (typeof module !== 'undefined' && module.exports) {
  // CommonJS environment
  __dirname = global.__dirname || (typeof __dirname !== 'undefined' ? __dirname : undefined);
} else if (typeof import.meta !== 'undefined') {
  // ES6 module environment
  import { fileURLToPath } from 'url';
  import { dirname } from 'path';
  
  const __filename = fileURLToPath(import.meta.url);
  __dirname = dirname(__filename);
} else {
  // Fallback for other environments
  __dirname = './';
}

// Now use __dirname safely
import fs from 'fs';

function readLocalFile(filename) {
  const filePath = __dirname + '/' + filename;
  return fs.readFileSync(filePath, 'utf8');
}

Solution 3: Webpack Configuration

Configure Webpack to handle __dirname properly.

Webpack 5 Configuration:

// webpack.config.js
module.exports = {
  // ... other config
  resolve: {
    fallback: {
      // Provide fallbacks for Node.js globals
      "path": require.resolve("path-browserify"),
      "fs": false, // Disable fs module in browser
      "__dirname": false, // Don't polyfill __dirname
    }
  },
  // Define __dirname for Node.js builds
  node: {
    __dirname: true, // Enable __dirname in Node.js builds
    __filename: true
  },
  // For browser builds, you might want to handle this differently
  target: 'node', // or 'web' for browser builds
};

Webpack 4 Configuration:

// webpack.config.js (Webpack 4)
module.exports = {
  // ... other config
  node: {
    __dirname: true,
    __filename: true,
  },
  resolve: {
    fallback: {
      "fs": false,
      "path": require.resolve("path-browserify"),
    }
  }
};

Solution 4: Babel Configuration

Use Babel to transform modules and handle __dirname.

// babel.config.js
module.exports = {
  presets: [
    ['@babel/preset-env', {
      targets: {
        node: 'current',
      },
      modules: 'commonjs', // Keep as commonjs or false for es6 modules
    }],
  ],
  plugins: [
    // Transform __dirname for browser environments if needed
    ['@babel/plugin-transform-modules-commonjs', {
      strict: true,
      allowTopLevelThis: true
    }]
  ]
};

Package.json Configuration:

{
  "name": "my-package",
  "type": "module", // Enables ES6 modules
  "main": "index.cjs", // CommonJS entry point
  "module": "index.mjs", // ES6 module entry point
  "exports": {
    ".": {
      "import": "./index.mjs",
      "require": "./index.cjs"
    }
  },
  "scripts": {
    "build": "babel src --out-dir dist --extensions '.js,.mjs'",
    "start": "node --loader es-module-loader ./dist/index.mjs"
  }
}

Solution 5: Universal Path Utilities

Create utilities that work across different environments.

// utils/pathUtils.js
import { fileURLToPath } from 'url';
import { dirname } from 'path';

class PathUtils {
  static getDirname() {
    if (typeof __dirname !== 'undefined') {
      // CommonJS environment
      return __dirname;
    } else if (typeof import.meta !== 'undefined') {
      // ES6 module environment
      return dirname(fileURLToPath(import.meta.url));
    } else {
      // Browser or other environment
      return '.';
    }
  }

  static resolvePath(relativePath) {
    const baseDir = this.getDirname();
    if (typeof process !== 'undefined' && process.platform) {
      // Node.js environment
      const path = require('path');
      return path.resolve(baseDir, relativePath);
    } else {
      // Browser environment - return relative path
      return relativePath;
    }
  }

  static joinPath(...paths) {
    if (typeof process !== 'undefined' && process.platform) {
      // Node.js environment
      const path = require('path');
      return path.join(...paths);
    } else {
      // Browser environment - simple join
      return paths.join('/');
    }
  }
}

// Usage
const currentDir = PathUtils.getDirname();
const configPath = PathUtils.resolvePath('./config.json');

Solution 6: Environment-Specific Code

Handle different environments appropriately.

// environment-specific code
function getBasePath() {
  if (typeof window !== 'undefined') {
    // Browser environment
    return window.location.origin;
  } else if (typeof process !== 'undefined' && process.versions && process.versions.node) {
    // Node.js environment
    if (typeof __dirname !== 'undefined') {
      return __dirname;
    } else {
      // ES6 module in Node.js
      const { fileURLToPath } = require('url');
      const { dirname } = require('path');
      return dirname(fileURLToPath(import.meta.url));
    }
  } else {
    // Unknown environment
    return '.';
  }
}

// File operations wrapper
function safeFileOperation(operation, ...args) {
  if (typeof process !== 'undefined' && process.versions && process.versions.node) {
    // Node.js environment - safe to use fs
    const fs = require('fs');
    return operation(fs, ...args);
  } else {
    // Browser environment - use fetch or other browser APIs
    console.warn('File operations not available in browser environment');
    return null;
  }
}

// Usage
const basePath = getBasePath();
const fileContent = safeFileOperation((fs, path) => {
  return fs.readFileSync(path, 'utf8');
}, basePath + '/config.json');

Solution 7: Build System Integration

Configure different build systems to handle __dirname.

Rollup Configuration:

// rollup.config.js
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import { string } from 'rollup-plugin-string';

export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.js',
    format: 'cjs', // or 'es' for ES6 modules
  },
  plugins: [
    resolve({
      preferBuiltins: true,
    }),
    commonjs(),
    string({
      include: ['**/*.json']
    }),
    {
      name: 'node-globals',
      resolveId(id) {
        if (id === '__dirname-shim') {
          return id;
        }
        return null;
      },
      load(id) {
        if (id === '__dirname-shim') {
          return `
            import { fileURLToPath } from 'url';
            import { dirname } from 'path';
            const __filename = fileURLToPath(import.meta.url);
            const __dirname = dirname(__filename);
            export { __dirname, __filename };
          `;
        }
        return null;
      }
    }
  ],
};

Vite Configuration:

// vite.config.js
import { defineConfig } from 'vite';

export default defineConfig({
  define: {
    __dirname: 'import.meta.dirname', // This won't work, need alternative
  },
  resolve: {
    alias: {
      // Create aliases for common paths
      '@': '/src',
    }
  },
  build: {
    rollupOptions: {
      external: [], // Specify external dependencies
    }
  }
});

// For Node.js builds with Vite
export default defineConfig({
  define: {
    global: 'globalThis',
  },
  build: {
    lib: {
      entry: 'src/index.js',
      formats: ['cjs', 'es']
    }
  }
});

Solution 8: Testing Environment Setup

Configure your testing environment to handle __dirname.

// jest.config.js
module.exports = {
  testEnvironment: 'node',
  setupFilesAfterEnv: ['<rootDir>/tests/setup.js'],
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1',
  },
};

// tests/setup.js
// Mock __dirname for tests
if (typeof __dirname === 'undefined') {
  global.__dirname = process.cwd();
}

// For ES6 modules in tests
import { fileURLToPath } from 'url';
import { dirname } from 'path';

const __filename = fileURLToPath(import.meta.url);
global.__dirname = dirname(__filename);

// Example test
import { readConfig } from '../src/config';

describe('Config reading', () => {
  test('should read config file', () => {
    const config = readConfig();
    expect(config).toBeDefined();
  });
});

Solution 9: Alternative Approaches

Use alternative methods that don’t rely on __dirname.

// Alternative 1: Use process.cwd() for current working directory
function getCurrentWorkingDir() {
  if (typeof process !== 'undefined' && process.cwd) {
    return process.cwd();
  }
  return '.';
}

// Alternative 2: Use import to get module path
const modulePath = new URL(import.meta.url).pathname;

// Alternative 3: Use a configuration file approach
// config.js
const config = {
  basePath: typeof __dirname !== 'undefined' ? __dirname : import.meta.dirname || '.',
  assetsPath: './assets',
  configPath: './config'
};

export default config;

// Alternative 4: Use build-time constants
const BUILD_TIME_DIR = process.env.NODE_ENV === 'production' 
  ? process.cwd() 
  : __dirname || new URL('.', import.meta.url).pathname;

// Alternative 5: Create a module-level constant
const MODULE_DIR = (function() {
  if (typeof __dirname !== 'undefined') {
    return __dirname;
  } else if (typeof import.meta !== 'undefined') {
    const { fileURLToPath } = require('url');
    const { dirname } = require('path');
    return dirname(fileURLToPath(import.meta.url));
  }
  return '.';
})();

Solution 10: Framework-Specific Implementations

Handle __dirname in different frameworks.

Express.js:

// app.js for Express
import express from 'express';
import { fileURLToPath } from 'url';
import { dirname } from 'path';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

const app = express();

// Serve static files
app.use(express.static(__dirname + '/public'));

// View engine setup
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');

app.get('/', (req, res) => {
  res.render('index');
});

export default app;

Next.js:

// next.config.js
import { fileURLToPath } from 'url';
import { dirname } from 'path';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

/** @type {import('next').NextConfig} */
const nextConfig = {
  webpack: (config, { isServer }) => {
    if (!isServer) {
      config.resolve.fallback = {
        ...config.resolve.fallback,
        fs: false,
        path: require.resolve('path-browserify'),
      };
    }
    return config;
  },
  output: 'export', // For static export
};

export default nextConfig;

Performance Considerations

Efficient Path Resolution:

// Optimized path utilities
class OptimizedPathUtils {
  constructor() {
    this._dirname = null;
    this._initialized = false;
  }

  getDirname() {
    if (!this._initialized) {
      if (typeof __dirname !== 'undefined') {
        this._dirname = __dirname;
      } else if (typeof import.meta !== 'undefined') {
        const { fileURLToPath } = require('url');
        const { dirname } = require('path');
        this._dirname = dirname(fileURLToPath(import.meta.url));
      } else {
        this._dirname = '.';
      }
      this._initialized = true;
    }
    return this._dirname;
  }

  resolve(relativePath) {
    const dir = this.getDirname();
    if (typeof process !== 'undefined' && process.platform) {
      const path = require('path');
      return path.resolve(dir, relativePath);
    }
    return dir + '/' + relativePath;
  }
}

const pathUtils = new OptimizedPathUtils();

Security Considerations

Safe Path Handling:

// Secure path handling
function securePathJoin(basePath, relativePath) {
  // Validate inputs to prevent path traversal
  if (typeof relativePath !== 'string' || relativePath.includes('../')) {
    throw new Error('Invalid path: path traversal detected');
  }

  const dir = typeof __dirname !== 'undefined' 
    ? __dirname 
    : (typeof import.meta !== 'undefined' 
      ? dirname(fileURLToPath(import.meta.url)) 
      : '.');

  if (typeof process !== 'undefined' && process.platform) {
    const path = require('path');
    const resolved = path.resolve(dir, relativePath);
    // Additional security check
    if (!resolved.startsWith(dir)) {
      throw new Error('Path outside base directory');
    }
    return resolved;
  }

  return dir + '/' + relativePath;
}

Common Mistakes to Avoid

1. Assuming __dirname Always Exists:

// ❌ Don't do this
function badFunction() {
  const path = __dirname + '/config.json'; // Will fail in ES6 modules
  return require(path);
}

2. Not Handling Different Module Systems:

// ❌ Don't do this
const configPath = __dirname + '/config.json'; // Only works in CommonJS

3. Using __dirname in Browser Code:

// ❌ Don't do this
function browserFunction() {
  const assetsPath = __dirname + '/assets/'; // Will always fail in browsers
}

Alternative Solutions

Using React DevTools Approach:

// Component with path detection
function PathDetector() {
  const [pathInfo, setPathInfo] = useState({});

  useEffect(() => {
    const info = {
      hasDirname: typeof __dirname !== 'undefined',
      hasImportMeta: typeof import.meta !== 'undefined',
      environment: typeof window !== 'undefined' ? 'browser' : 'node'
    };
    setPathInfo(info);
  }, []);

  return <div>Path Info: {JSON.stringify(pathInfo)}</div>;
}

Feature Detection:

// Check for __dirname availability
function hasDirnameSupport() {
  try {
    return typeof __dirname !== 'undefined';
  } catch {
    return false;
  }
}

function hasImportMetaSupport() {
  try {
    return typeof import.meta !== 'undefined';
  } catch {
    return false;
  }
}

Troubleshooting Checklist

When encountering the __dirname is not defined error:

  1. Check Module Type: Determine if using CommonJS or ES6 modules
  2. Verify Environment: Confirm if running in Node.js or browser
  3. Review Package.json: Check if "type": "module" is set
  4. Test File Extensions: Verify .js vs .mjs usage
  5. Check Build Configuration: Ensure bundler handles globals properly
  6. Validate Import/Export Syntax: Confirm module syntax consistency
  7. Review Framework Documentation: Check framework-specific guidelines

Conclusion

The ‘__dirname is not defined’ error occurs when attempting to use Node.js-specific global variables in environments where they don’t exist. By understanding the differences between module systems and implementing proper environment detection, you can ensure your JavaScript applications work seamlessly across different environments.

The key to resolving this error is understanding that __dirname is Node.js-specific, implementing proper module system detection, and using appropriate alternatives for different environments. Whether you’re working with CommonJS, ES6 modules, or browser environments, the solutions provided in this guide will help you handle path resolution appropriately in your JavaScript applications.

Remember to always validate your environment, use proper module syntax, and implement fallbacks to ensure your code works across different JavaScript runtime environments.

Gautam Sharma

About Gautam Sharma

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

Related Articles

Javascript

How to Handle & Fix Failed to resolve import Error Tutorial

Learn how to fix 'failed to resolve import' errors in JavaScript. Complete guide with solutions for ES6 modules, Node.js, and bundler configurations.

January 2, 2026
Javascript

[SOLVED] ReferenceError: exports is not defined in JavaScript Tutorial

Learn how to resolve the common exports undefined error in JavaScript, ES6 modules, and modern frameworks. Complete guide with solutions for module compatibility issues.

January 2, 2026
Javascript

[SOLVED] Error Module parse failed: Unexpected token

Learn how to fix the 'Module parse failed: Unexpected token' error in JavaScript. Complete guide with solutions for JSX, TypeScript, and bundler configurations.

January 2, 2026