unjs

unjs/jiti

TypeScript MIT Dev Tools

Runtime TypeScript and ESM support for Node.js

2.9k stars
106 forks
active
GitHub +13 / week

2.9k

Stars

106

Forks

34

Open issues

30

Contributors

v2.7.0 05 May 2026

AI Analysis

jiti enables seamless TypeScript and ESM support in Node.js at runtime, allowing developers to import and execute TypeScript files directly without build steps. It is primarily used by framework and tooling developers (Nuxt, Storybook, ESLint, Tailwind, etc.) who need dynamic code loading with TypeScript support, rather than by end-application developers. It is not a general-purpose runtime but a specialized utility for the JavaScript ecosystem tooling layer.

Dev Tools Runtime Discovery value: 3/10
Documentation 8/10
Activity 9/10
Community 8/10
Code quality 7/10

Inferred from signals mentioned in the README (tests, CI, type safety) — not a review of the actual code.

Overall score 8/10

AI's overall editorial judgment — not an average of the bars above, can weigh other factors too.

typescript-runtime esm-loader dynamic-imports node-runtime zero-dependency
Actively maintained MIT licensed Niche/specialized use case Popular Production ready
Deep Analysis · Based on README and public signals
4d ago

TypeScript and ESM runtime loader with 60M+ monthly downloads across major frameworks

jiti is a Node.js runtime loader enabling seamless TypeScript and ESM module execution without compilation steps. Originally designed to support configuration files in build tools, it has become a critical dependency across Nuxt, Docusaurus, ESLint, Tailwind, Storybook, and 60+ other projects totaling 60M+ monthly npm downloads. It provides both async (import) and deprecated sync (require) APIs, with zero production dependencies and integration with Node.js native cache mechanisms.

Origin

Created June 2020 by unjs/unjs (a collective maintaining JavaScript ecosystem tooling). Evolved from a simple TypeScript loader into a de facto standard for configuration file loading in the Node.js ecosystem. Version 2.x introduced breaking changes around interop defaults; currently in active v2 development with v1 available for legacy users.

Growth

Adoption driven by two forces: (1) the shift toward TypeScript in build tool configuration files (e.g., vite.config.ts, nuxt.config.ts), making jiti indispensable for tools that needed to load these; (2) inclusion in widely-adopted frameworks like Nuxt and Docusaurus, which spread jiti transitively to millions of users. Growth appears steady rather than explosive, with 15 stars added in the last 7 days and 2,902 total — but star count masks true adoption: downstream dependents and download volume are the real signal.

In production

Adoption extensively documented in README: explicitly used by 20+ named projects (Docusaurus, ESLint, FormKit, Nuxt, Tailwind, Storybook, Rsbuild, UnoCSS, etc.), referenced as dependency in 6M+ public GitHub repositories and 60M+ monthly npm downloads. This is among the highest real-world adoption evidence possible for a utility library. Adoption verified across multiple high-traffic ecosystems, not theoretical or self-reported.

Code analysis
Architecture

Based on README, jiti appears to use Babel for lazy-loaded transpilation with filesystem caching (node_modules/.cache/jiti or system temp), Node.js require.cache integration for CommonJS interop, and optional ESM loader registration via Node.js global hooks (Node 20+). Implements smart syntax detection to avoid unnecessary transforms and provides Proxy-based interop wrapping for CJS/ESM mixing (adding ~25-50ns per property access). Zero production dependencies noted. Likely uses esbuild or similar for internal bundling but not documented.

Tests

not documented in README

Maintenance

Last push 2026-07-05 (1 day before evaluation date); repository was actively maintained as of this analysis. Repository created 2020-06-07; 6+ years of continuous operation. No explicit changelog or release schedule in README excerpt, but v1/v2 branch structure suggests deliberate versioning strategy. Active development branch noted in README suggests ongoing feature work. Cannot assess issue response times or PR merge velocity from metadata alone.

Honest verdict

ADOPT IF: you are building a Node.js tool, framework, or CLI that needs to load TypeScript or ESM configuration files at runtime without requiring users to pre-compile. ADOPT IF you need seamless CJS/ESM interop in configuration loading. AVOID IF: you need a general-purpose TypeScript runner (use tsx instead) or a browser-compatible module system (use systemjs). AVOID IF: your use case requires advanced module federation or registry-based resolution. MONITOR IF: you rely on the deprecated sync API (jiti() function) — README flags CommonJS sync as deprecated, suggesting eventual removal in v3+.

Independent dimensions

Mainstream potential

6/10

Technical importance

8/10

Adoption evidence

9/10

Risks
  • API deprecation path: CommonJS synchronous API (jiti()) is deprecated, may be removed in future major version. Users relying on sync workflows could face breaking changes.
  • Proxy overhead: interopDefault wrapping adds 25-50ns per property access across all imported modules. Measurable in performance-critical hot paths, though likely negligible for config loading.
  • Dependency on Babel internals: Uses Babel for transformation but details of Babel version, stability, and upgrade path not documented in README. Changes to Babel could impact jiti.
  • Node.js version coupling: ESM loader registration requires Node 20+. Older Node.js versions fall back to alternatives, potentially fragmenting behavior across environments.
  • Filesystem cache assumptions: Default caching strategy assumes writable temp directories and node_modules/.cache access. May fail silently or degrade in restricted environments (CI containers, sandboxes).
Prediction

jiti will likely remain a foundational utility in the Node.js ecosystem for the next 3–5 years, especially as TypeScript adoption in config files continues. Upstream adoption (Nuxt, Docusaurus, ESLint) provides stable baseline demand. Main risk is eventual replacement by native Node.js runtime features (import.meta.resolve, native TypeScript support)—jiti already provides jiti/native as a future-proofing alias. Growth trajectory suggests maturity rather than explosive expansion; expect steady maintenance and incremental API improvements aligned with ECMAScript/Node.js standards.

0 found this helpful

Newsletter

Get analyses like this every Monday

Free weekly digest of the most interesting open-source discoveries.

Languages

TypeScript
83.5%
JavaScript
16.5%

Information

Language
TypeScript
License
MIT
Last updated
3d ago
Created
74mo ago
Analyzed with
anthropic/claude-haiku-4-5

Stars over time

Loading…

Contributors over time

Top 100 contributors only — repos with more will plateau at 100.

Loading…

Similar repos

systemjs

systemjs/systemjs

SystemJS is a standards-based ES module loader that allows code written for...

13.1k JavaScript Web Dev
thinkjs

thinkjs/thinkjs

ThinkJS is a Node.js web framework that leverages ES2015+ and TypeScript...

5.3k JavaScript Web Dev
jaredpalmer

jaredpalmer/tsdx

TSDX is a zero-config CLI for building and publishing TypeScript packages,...

11.5k TypeScript Dev Tools
esm-dev

esm-dev/esm.sh

esm.sh is a no-build JavaScript CDN that serves ESM modules directly from NPM,...

4.1k Go Web Dev
aws

aws/jsii

jsii is a polyglot interoperability framework that enables TypeScript class...

2.9k TypeScript Dev Tools
vs. alternatives
tsx (12,040 stars)

tsx is a full TypeScript runner (CLI-focused) while jiti is a module loader (programmatic-focused). tsx replaces ts-node for script execution; jiti is embedded in build tools to load config files. Different use cases despite surface similarity.

systemjs (13,092 stars)

systemjs is a universal module loader for browser and Node.js with registry/URL-based resolution; jiti is Node.js-only and filesystem-based. systemjs targets module federation and dynamic imports; jiti targets local config loading and development workflows.

esm.sh (4,116 stars)

esm.sh is a CDN service converting npm packages to ESM; jiti is a local runtime loader. Solve different distribution and consumption problems; not substitutable.

jsii (2,859 stars)

jsii is a code generation tool for cross-language bindings (TypeScript → Python, Java, etc.); jiti is a runtime loader. Entirely different purposes and audiences.

esbuild (commercial + open)

esbuild is a bundler and transpiler; jiti is a lightweight runtime loader that can use esbuild internally. esbuild is for build pipelines; jiti is for runtime module loading. Complementary, not competitive.