Runtime TypeScript and ESM support for Node.js
2.9k
Stars
106
Forks
34
Open issues
30
Contributors
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.
Inferred from signals mentioned in the README (tests, CI, type safety) — not a review of the actual code.
AI's overall editorial judgment — not an average of the bars above, can weigh other factors too.
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.
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.
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.
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.
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.
not documented in README
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.
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
- 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).
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.
Explore similar
Newsletter
Get analyses like this every Monday
Free weekly digest of the most interesting open-source discoveries.
Languages
Information
- Language
- TypeScript
- License
- MIT
- Last updated
- 3d ago
- Created
- 74mo ago
- Analyzed with
- anthropic/claude-haiku-4-5
Stars over time
Contributors over time
Top 100 contributors only — repos with more will plateau at 100.
Open issues
[Bug]: jiti config import resolver in rspack fails to respect --perserve-symlinks / jiti gives no symlink-following customization options to fix this
Pass `filename` to the Babel transform
tsconfigPaths behaves not the same as tsc
Top contributors
Recent releases
Similar repos
| Repository | Stars | Week Δ | Language | Score | Updated |
|---|---|---|---|---|---|
|
|
2.9k | +13 | TypeScript | 8/10 | 3d ago |
|
|
13.1k | — | JavaScript | 7/10 | 4w ago |
|
|
5.3k | — | JavaScript | 6/10 | 2d ago |
|
|
11.5k | — | TypeScript | 8/10 | 5mo ago |
|
|
4.1k | — | Go | 8/10 | 5d ago |
|
|
2.9k | — | TypeScript | 8/10 | 1d ago |
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 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 is a CDN service converting npm packages to ESM; jiti is a local runtime loader. Solve different distribution and consumption problems; not substitutable.
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 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.