Runtime typescript and ESM support for Node.js

npm install jiti@1.13.0



npm version npm downloads bundle size

Just-in-Time Typescript and ESM support for Node.js.


This is the development branch for jiti v2. Check out jiti/v1 for latest stable docs and unjs/jiti#174 for the v2 roadmap.

✅ Features

  • Seamless Typescript and ESM syntax support
  • Seamless interoperability between ESM and CommonJS
  • Synchronous API to replace require()
  • Asynchronous API to replace import()
  • ESM Loader support
  • Super slim and zero dependency
  • Smart syntax detection to avoid extra transforms
  • Node.js native require cache integration
  • Filesystem transpile with hard disk caches
  • Custom resolve aliases

🌟 Used by

💡 Usage


You can use jiti CLI to quickly run any script with Typescript and native ESM support!

npx jiti ./index.ts

# or

jiti ./index.ts


// --- Initialize ---

// ESM
import { createJiti } from "jiti";
const jiti = createJiti(import.meta.url);

// CommonJS
const { createJiti } = require("jiti");
const jiti = createJiti(__filename);

// --- ESM Compatible APIs ---

// jiti.import() acts like import() with Typescript support
await jiti.import("./path/to/file.ts");

// jiti.esmResolve() acts like import.meta.resolve() with additional features
const resolvedPath = jiti.esmResolve("./src");

// --- CJS Compatible APIs ---

// jiti() acts like require() with Typescript and (non async) ESM support

// jiti.resolve() acts like require.resolve() with additional features
const resolvedPath = jiti.resolve("./src");

You can also pass options as second argument:

const jiti = createJiti(import.meta.url, { debug: true });

Register global ESM loader

You can globally register jiti using global hooks.

Note: This is an experimental approach and only tested to work on Node.js > 20. I don't recommend it and unless you have to, please prefer explicit method.

import "jiti/register";


node --import jiti/register index.ts

⚙️ Options


  • Type: Boolean
  • Default: false
  • Environment variable: JITI_DEBUG

Enable verbose logging. You can use JITI_DEBUG=1 <your command> to enable it.


  • Type: Boolean | String
  • Default: true
  • Environment variable: JITI_FS_CACHE

Filesystem source cache (enabled by default)

By default (when is true), jiti uses node_modules/.cache/jiti (if exists) or {TMP_DIR}/jiti.

Note: It is recommended to keep this option enabled for better performance.


  • Type: String
  • Default: true
  • Environment variable: JITI_MODULE_CACHE

Runtime module cache (enabled by default).

Disabling allows editing code and importing same module multiple times.

When enabled, jiti integrates with Node.js native CommonJS cache store.


  • Type: Function
  • Default: Babel (lazy loaded)

Transform function. See src/babel for more details


  • Type: Boolean
  • Default false
  • Environment variable: JITI_SOURCE_MAPS

Add inline source map to transformed source for better debugging.


  • Type: Boolean
  • Default: false
  • Environment variable: JITI_INTEROP_DEFAULT

Return the .default export of a module at the top-level.


  • Type: Object
  • Default: -
  • Environment variable: JITI_ALIAS

Custom alias map used to resolve ids.


  • Type: Array
  • Default: ['typescript`]
  • Environment variable: JITI_NATIVE_MODULES

List of modules (within node_modules) to always use native require for them.


  • Type: Array
  • Default: []
  • Environment variable: JITI_TRANSFORM_MODULES

List of modules (within node_modules) to transform them regardless of syntax.


  • Type: Boolean
  • Default: Enabled if process.versions.bun exists (Bun runtime)
  • Environment variable: JITI_EXPERIMENTAL_BUN

Enable experimental native Bun support for transformations.


  • Clone this repository
  • Enable Corepack using corepack enable
  • Install dependencies using pnpm install
  • Run pnpm dev
  • Run pnpm jiti ./test/path/to/file.ts


Published under the MIT license. Made by @pi0 and community 💛