Just-in-Time Typescript and ESM support for Node.js.
Important
This is the development branch for jiti v2. Check out jiti/v1 for latest stable docs and unjs/jiti#174 for the v2 roadmap.
- 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
- Docusaurus
- FormKit
- Histoire
- Knip
- Nitro
- Nuxt
- PostCSS loader
- Rsbuild
- Size Limit
- Slidev
- Tailwindcss
- Tokenami
- UnoCSS
- WXT
- Winglang
- Graphql code generator
- Lingui
- Scaffdog
- Storybook
- ...UnJS ecosystem
- ...58M+ npm monthly downloads
- ...5.5M+ public repositories
- [ pr welcome add yours ]
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("./path/to/file.ts");
// 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 });
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";
Or:
node --import jiti/register index.ts
- 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.
Parent module's import.meta
context to use for ESM resolution. (only used for jiti/native
import).
- Type: Boolean
- Default: Enabled if bun is detected
- Environment variable:
JITI_TRY_NATIVE
Try to use native require and import without jiti transformations first.
- 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 π