Skip to content

Tool Comparison

ZNTC focuses on providing a TypeScript/Flow transpiler, library/app bundler, and dev server from one binary/package. It is not trying to clone the entire Vite ecosystem or webpack loader/plugin universe.

TermMeaning
SupportedPublic surface is documented and covered by regression tests
PartialThe main path works, but some options, hooks, formats, or edge cases are limited
Policy differenceZNTC intentionally chooses different semantics
UnsupportedNo current public surface
AreaZNTCRolldownesbuildSWCRspack/Vite
TS/JSX/Flow single-file transformSupportedPartialTS/JSX, no FlowSupportedloader/plugin layer
Library bundlingSupportedSupportedSupportedspack/swcpack planned to be dropped in v2Rspack supported, Vite uses Rollup/Rolldown
App builder (index.html, env, public)SupportedRecommended through Viteserve/build primitivesUnsupportedVite/Rspack strength
Code splittingSupportedSupportedSupportedLimitedSupported
Manual chunksSupported (config/API)SupportedUnsupportedUnsupportedSupported
Runtime core-js polyfillsSupportedplugin/user-managedUnsupportedenv-orientedRspack/SWC loader layer
React Native presetSupportedUnsupportedUnsupportedusable as transformerMetro/Rspack separate
WASM playgroundSupportedWasm build availablebrowser build availablewasm packagesvaries
AreaZNTC statusNotes
esbuild-style setup(build)PartialFocused on onResolve, onLoad, onTransform, onResolveContext, onAstFunction
Rollup/Vite-style resolveId / load / transformSupportedUse the vitePlugin() wrapper
Output hooks (renderChunk, generateBundle)PartialGeneral post-processing works. Not every Rollup hook is implemented
Lifecycle (buildStart, buildEnd, closeBundle)SupportedRuns on initial build and every rebuild in watch()
this.resolve() / this.emitFile()UnsupportedRequires a separate graph mutation surface
buildSync() + JS pluginsUnsupportedConflicts with the native worker waiting on JS callbacks
Plugin hook filterPartialesbuild-style filters are supported; not identical to Rolldown object-hook filters
AreaZNTCComparison
CLI/JS API/config optionsMostly coveredSee Options Matrix
metafile JSONSupportedesbuild-compatible basic format
Interactive bundle analyzerSupportedUpload meta.json at /analyze/
--analyze tree outputPartialCurrently JSON-oriented. CLI tree format is follow-up work
Profile/benchmarkSupported--profile*, zntc bench, JS benchmark()
Diagnostic docs URLSupportedLinked to ZNTCxxxx error-code docs
FeatureZNTCNotes
zntc dev / zntc build / zntc previewSupporteddev/build/preview semantics are kept aligned
HTML entry rewriteSupporteduses <script type="module" src> as entry
.env* / import.meta.env.*Supported--env-dir, --env-prefix
public/ copySupported--public-dir
CSS ModulesSupportedapp mode
PostCSS / Tailwind v4Supportedthrough @tailwindcss/postcss
Sass/SCSSSupportedoptional sass dependency required
Less/StylusUnsupportedprecompile or use plugin-level handling
CSS-only HMRSupportedincludes PostCSS dependency watch
Error overlaySupportedbuild/runtime overlay with sourcemap remapping
import.meta.globSupportedVite-compatible (eager / import options)
SSR buildUnsupportedoutside the current app-builder boundary
Dev proxySupported--proxy /api=http://...
ItemZNTC policy
Import attributes loader overridewith { type } is pass-through metadata. Loader selection is extension/loader-option based
Physical device runtime targetphysical names such as iPhone 8 are rejected. Use Browserslist queries
Auto node polyfill bundlenot provided. Use explicit fallback, alias, or plugins
Property manglelower priority due to public API stability and debugging cost
SSRunlike Vite/Rspack, not in the current app-builder core boundary