Home

Awesome

esm-loader

Node.js loader for loading TypeScript files.

Features

Protip: use with cjs-loader or tsx

esm-loader only transforms ES modules (.mjs/.mts extensions or .js files in module type packages).

To transform CommonJS files (.cjs/.cts extensions or .js files in commonjs type packages), use this with cjs-loader.

Alternatively, use tsx to handle them both automatically.

<br> <p align="center"> <a href="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=platinum"> <picture> <source width="830" media="(prefers-color-scheme: dark)" srcset="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=platinum&image=dark"> <source width="830" media="(prefers-color-scheme: light)" srcset="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=platinum&image"> <img width="830" src="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=platinum&image" alt="Premium sponsor banner"> </picture> </a> </p>

Install

npm install --save-dev @esbuild-kit/esm-loader

Usage

Pass @esbuild-kit/esm-loader into the --loader flag.

node --loader @esbuild-kit/esm-loader ./file.ts

TypeScript configuration

The following properties are used from tsconfig.json in the working directory:

Custom tsconfig.json path

By default, tsconfig.json will be detected from the current working directory.

To set a custom path, use the ESBK_TSCONFIG_PATH environment variable:

ESBK_TSCONFIG_PATH=./path/to/tsconfig.custom.json node --loader @esbuild-kit/esm-loader ./file.ts

Cache

Modules transformations are cached in the system cache directory (TMPDIR). Transforms are cached by content hash so duplicate dependencies are not re-transformed.

Set environment variable ESBK_DISABLE_CACHE to a truthy value to disable the cache:

ESBK_DISABLE_CACHE=1 node --loader @esbuild-kit/esm-loader ./file.ts
<br> <p align="center"> <a href="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=gold"> <picture> <source width="830" media="(prefers-color-scheme: dark)" srcset="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=gold&image=dark"> <source width="830" media="(prefers-color-scheme: light)" srcset="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=gold&image"> <img width="830" src="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=gold&image" alt="Premium sponsor banner"> </picture> </a> </p>

FAQ

Can it import JSON modules?

Yes. This loader transpiles JSON modules so it's also compatible with named imports.

Can it import ESM modules over network?

Node.js has built-in support for network imports behind the --experimental-network-imports flag.

You can pass it in with esm-loader:

node --loader @esbuild-kit/esm-loader --experimental-network-imports ./file.ts

Can it resolve files without an extension?

In ESM, import paths must be explicit (must include file name and extension).

For backwards compatibility, this loader adds support for classic Node resolution for extensions: .js, .json, .ts, .tsx, .jsx. Resolving a index file by the directory name works too.

import file from './file' // -> ./file.js
import directory from './directory' // -> ./directory/index.js

Can it use Node.js's CommonJS resolution algorithm?

ESM import resolution expects explicit import paths, whereas CommonJS resolution expects implicit imports (eg. extensionless & directory imports).

As a result of this change, Node.js changes how it imports a path that matches both a file and directory. In ESM, the directory would be imported, but in CJS, the file would be imported.

To use to the CommonJS resolution algorithm, use the --experimental-specifier-resolution=node flag.

node --loader @esbuild-kit/esm-loader --experimental-specifier-resolution=node ./file.ts

Related

Sponsors

<p align="center"> <a href="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=silver1"> <picture> <source width="410" media="(prefers-color-scheme: dark)" srcset="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=silver1&image=dark"> <source width="410" media="(prefers-color-scheme: light)" srcset="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=silver1&image"> <img width="410" src="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=silver1&image" alt="Premium sponsor banner"> </picture> </a> <a href="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=silver2"> <picture> <source width="410" media="(prefers-color-scheme: dark)" srcset="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=silver2&image=dark"> <source width="410" media="(prefers-color-scheme: light)" srcset="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=silver2&image"> <img width="410" src="https://privatenumber-sponsors.vercel.app/api/sponsor?tier=silver2&image" alt="Premium sponsor banner"> </picture> </a> </p> <p align="center"> <a href="https://github.com/sponsors/privatenumber"> <img src="https://cdn.jsdelivr.net/gh/privatenumber/sponsors/sponsorkit/sponsors.svg"> </a> </p>