ES Modules Logo ESModules.com

Tooling & Ecosystem

Modern build tools, bundlers, and development workflows for ES Modules.

Vite

Lightning-fast development server leveraging native ES Modules with instant HMR. Vite 7 (2025) updated browser targets, and Vite 8 (2026) replaces both esbuild and Rollup with Rolldown for a unified Rust-based build pipeline.

npm create vite@latest my-app
cd my-app && npm install && npm run dev

Key Features:

  • No bundling in dev mode (native ESM)
  • Instant server start
  • Lightning fast HMR
  • Rolldown-powered builds in Vite 8+

Webpack

Powerful module bundler with extensive plugin ecosystem.

// webpack.config.js
export default {
  entry: './src/index.js',
  output: { filename: 'bundle.js' },
  module: {
    rules: [
      { test: /\.js$/, use: 'babel-loader' }
    ]
  }
};

Rollup

Optimized for library bundling with excellent tree-shaking.

// rollup.config.js
export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.js',
    format: 'esm'
  }
};

TypeScript

Full support for ES Modules with type checking.

// tsconfig.json
{
  "compilerOptions": {
    "module": "ESNext",
    "target": "ESNext",
    "moduleResolution": "bundler"
  }
}

ESLint

Lint ES Modules with proper import/export validation.

// eslint.config.js (flat config - ESLint 9+)
import js from '@eslint/js';

export default [
  js.configs.recommended,
  {
    rules: {
      'no-unused-vars': 'error',
      'import/no-unresolved': 'error'
    }
  }
];

CDNs

Load ES Modules directly from CDNs without build steps.

esm.sh

import React from 'https://esm.sh/react'

Skypack (no longer actively maintained)

import lodash from 'https://cdn.skypack.dev/lodash'

Skypack is no longer actively maintained. Use esm.sh or jspm.io instead.

Rolldown

Rust-based bundler by VoidZero that unifies esbuild (dev) and Rollup (production) into a single tool. Ships as the default bundler in Vite 8, offering 10-30x speed improvement over Rollup with full plugin API compatibility.

// rolldown.config.js
export default {
  input: './src/index.js',
  output: {
    dir: 'dist',
    format: 'esm'
  }
};

Rspack

Rust-based webpack replacement that is 23x faster while maintaining compatibility with 40+ of the top 50 webpack plugins. Now at version 1.4 with official Next.js integration via next-rspack.

// rspack.config.js
module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    module: true  // ESM output
  },
  experiments: {
    outputModule: true
  }
};

Turbopack

Rust-based successor to webpack, now stable and the default bundler in Next.js. Designed for large-scale applications with incremental computation for near-instant rebuilds.

// next.config.js - Turbopack is now the default
/** @type {import('next').NextConfig} */
const nextConfig = {
  // Turbopack enabled by default in Next.js 15+
  // No configuration needed for ESM support
};

export default nextConfig;

Biome

Fast all-in-one toolchain replacing ESLint and Prettier. Includes linting, formatting, and import sorting. In 2026, Biome is adding type-aware lint rules without requiring TypeScript's compiler.

// biome.json
{
  "linter": {
    "rules": {
      "correctness": {
        "noUnusedImports": "error"
      },
      "style": {
        "useImportType": "error"
      }
    }
  },
  "organizeImports": {
    "enabled": true
  }
}