The Vite build setup was the result of several attempts to dual publish ESM and CJS for TanStack projects, while preserving compatibility with all Typescript module resolution options.
ES Modules (ESM) is the standard for writing JavaScript modules. However, due to the historical dependency on CommonJS (CJS), many ecosystem tools and projects were initially incompatible with ESM. It is becoming exceedingly rare for this to be the case, and I would urge you to consider whether it is necessary to distribute CJS code at all. Sindre Sorhus has a good summary on this issue here.
Many alternatives have bene created recently, with the most notable being tsdown, built on top of rolldown. We will be adopting tsdown for future projects rather than continuing to use our custom Vite setup.
To install the package, run the following command:
pnpm add -D @tanstack/vite-config
| Framework | Dual Types | ESM only |
|---|---|---|
| Vanilla | tsdown | tsdown or tsc |
| Angular | Not required | ng-packagr (official tool) |
| React | tsdown | tsdown or tsc |
| Solid | Not required | tsc (preserves JSX, necessary for SSR) |
| Svelte | Not required | @sveltejs/package (official tool) |
| Vue | tsdown | tsdown or tsc |
The build config is opinionated, and was designed to work with our internal libraries. If you follow the below instructions, it may work for your library too!
{
"exports": {
".": {
"import": {
"types": "./dist/esm/index.d.ts",
"default": "./dist/esm/index.js"
},
"require": {
"types": "./dist/cjs/index.d.cts",
"default": "./dist/cjs/index.cjs"
}
},
"./package.json": "./package.json"
}
}
import { defineConfig, mergeConfig } from 'vite'
import { tanstackViteConfig } from '@tanstack/vite-config'
const config = defineConfig({
// Framework plugins, vitest config, etc.
})
export default mergeConfig(
config,
tanstackViteConfig({
entry: './src/index.ts',
srcDir: './src',
}),
)