ECMAScript module loader that enables ES module syntax in Node.js 6+ without Babel or bundling
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
ESM is the world's most advanced ECMAScript module loader. This fast, production-ready, zero-dependency loader enables ES module syntax in Node.js 6+ without requiring Babel or bundling. It provides seamless interoperability between CommonJS and ES modules with extensive configuration options.
npm install esm// Main import
const esm = require("esm");
// Create enhanced require function
require = require("esm")(module);
// With options
require = require("esm")(module, options);// Method 1: Package-level setup (recommended)
// index.js
require = require("esm")(module)
module.exports = require("./main.js")
// main.js - now supports ES module syntax
import { readFile } from "fs";
import path from "path";
export const myFunction = () => "Hello ES modules!";
// Method 2: CLI usage
// node -r esm main.js
// Method 3: REPL usage
// node -r esmESM works by providing an enhanced require function that can load both CommonJS and ES modules:
Creates an enhanced require function with ES module support.
/**
* Create an enhanced require function with ES module support
* @param {Object} module - The CommonJS module object (usually `module`)
* @param {ESMOptions|string} [options] - Configuration options or mode string
* @returns {Function} Enhanced require function with ES module loading capabilities
*/
function esmLoader(module, options);Usage Examples:
// Basic usage
require = require("esm")(module);
// With string mode
require = require("esm")(module, "auto");
// With configuration object
require = require("esm")(module, {
mode: "auto",
cjs: true,
await: false
});
// Now load ES modules
const myModule = require("./es-module.js");Complete configuration object for customizing loader behavior.
/**
* ESM loader configuration options
*/
interface ESMOptions {
/** CJS interoperability settings */
cjs?: boolean | CJSOptions;
/** Package.json fields to check when importing */
mainFields?: string[];
/** Module detection mode */
mode?: "auto" | "all" | "strict";
/** Enable top-level await support (Node 10+) */
await?: boolean;
/** Apply options to all module loads */
force?: boolean;
/** Enable WebAssembly module support (Node 8+) */
wasm?: boolean;
/** Cache directory path or toggle */
cache?: boolean | string;
/** Include inline source maps */
sourceMap?: boolean;
}
/**
* CommonJS interoperability configuration
*/
interface CJSOptions {
/** Store ES modules in require.cache */
cache?: boolean;
/** Remove dangling .default access */
dedefault?: boolean;
/** Enable __esModule interoperability */
esModule?: boolean;
/** Respect require.extensions in ESM */
extensions?: boolean;
/** Enable mutable namespace objects */
mutableNamespace?: boolean;
/** Import named exports of CJS modules */
namedExports?: boolean;
/** Follow CJS path rules in ESM */
paths?: boolean;
/** Enable top-level return support */
topLevelReturn?: boolean;
/** Provide __dirname, __filename, require in ESM */
vars?: boolean;
}Configuration Examples:
// Auto mode with full CJS compatibility (recommended)
require = require("esm")(module, {
mode: "auto",
cjs: true
});
// Custom CJS interop settings
require = require("esm")(module, {
mode: "auto",
cjs: {
cache: true,
namedExports: true,
vars: true,
esModule: false
}
});
// All files as ES modules
require = require("esm")(module, {
mode: "all",
force: true
});Module detection and processing modes.
/**
* Module detection modes
*/
type ModuleMode = "auto" | "all" | "strict";
/**
* - "strict": Only .mjs files are treated as ES modules
* - "auto": Detect ES modules by syntax (import/export/import.meta/"use module") or .mjs extension
* - "all": All files except those with "use script" directive or .cjs extension are ES modules
*/Mode Examples:
// Strict mode - only .mjs files
require = require("esm")(module, "strict");
// Auto mode - detect by syntax
require = require("esm")(module, "auto");
// All mode - assume ES modules
require = require("esm")(module, "all");External configuration through environment variables and config files.
/**
* Environment configuration options
*/
interface EnvironmentConfig {
/** ESM_OPTIONS: JSON6 configuration string or config file path */
ESM_OPTIONS?: string;
/** ESM_DISABLE_CACHE: Disable caching when truthy */
ESM_DISABLE_CACHE?: string;
}Environment Examples:
# JSON6 configuration
export ESM_OPTIONS='{"mode":"auto","cjs":true}'
# Config file path
export ESM_OPTIONS="./config/esm-config.json"
# Disable caching
export ESM_DISABLE_CACHE=true
# Then run
node -r esm main.jsConfig file formats:
// .esmrc.js
module.exports = {
mode: "auto",
cjs: true
};
// .esmrc.json
{
"mode": "auto",
"cjs": true
}
// package.json
{
"esm": {
"mode": "auto",
"cjs": true
}
}Enhanced capabilities and integrations.
/**
* Advanced feature flags
*/
interface AdvancedFeatures {
/** Top-level await support (Node 10+) */
await?: boolean;
/** WebAssembly module support (Node 8+) */
wasm?: boolean;
/** Force options on all loads */
force?: boolean;
/** Source map generation */
sourceMap?: boolean;
}Advanced Examples:
// Enable top-level await
require = require("esm")(module, {
mode: "auto",
await: true,
cjs: true
});
// WebAssembly support
require = require("esm")(module, {
mode: "auto",
wasm: true
});
// Force all modules through ESM
require = require("esm")(module, {
mode: "auto",
force: true,
sourceMap: true
});ESM throws standard Node.js module errors and includes specific validation:
// Invalid module parameter
try {
require("esm")("not-a-module");
} catch (error) {
// ERR_INVALID_ARG_TYPE: The "module" argument must be of type object
}
// Module syntax errors are reported normally
try {
require("./invalid-syntax.js");
} catch (error) {
// SyntaxError with file location and details
}// Jest
require = require("esm")(module);
// Mocha
// mocha --require esm test/**/*.js
// AVA
// ava --require esm test/**/*.js// Webpack
module.exports = {
resolve: {
mainFields: ["module", "main"]
}
};
// Package.json for bundlers
{
"main": "index.js",
"module": "main.js"
}import/export statementsimport() expressionsimport.meta object support--eval, --print, --check)