- Spec files
npm-tanstack--react-start
Describes: pkg:npm/@tanstack/react-start@1.131.x
- Description
- SSR, Streaming, Server Functions, API Routes, bundling and more powered by TanStack Router and Vite. Ready to deploy to your favorite hosting provider.
- Author
- tessl
- Last updated
How to use
npx @tessl/cli registry install tessl/npm-tanstack--react-start@1.131.0
vite-plugin.md docs/
1# Vite Build Integration23Vite plugin for seamless integration with the Vite build system, providing automatic code splitting, server-side entry generation, client hydration setup, and development server configuration for TanStack React Start applications.45## Capabilities67### TanStackStartVitePlugin89Main Vite plugin that configures the build system for TanStack React Start applications.1011```typescript { .api }12/**13* Main Vite plugin for TanStack React Start integration14* Configures Vite for full-stack React applications with SSR support15* @param opts - Optional plugin configuration options16* @returns Array of Vite plugins for complete Start integration17*/18function TanStackStartVitePlugin(19opts?: TanStackStartInputConfig & WithReactPlugin20): Array<PluginOption>;2122/**23* Alias for TanStackStartVitePlugin24* @param opts - Optional plugin configuration options25* @returns Array of Vite plugins for complete Start integration26*/27const tanstackStart: typeof TanStackStartVitePlugin;28```2930**Usage Examples:**3132```typescript33// Basic usage34import { defineConfig } from 'vite';35import { TanStackStartVitePlugin } from '@tanstack/react-start/plugin/vite';3637export default defineConfig({38plugins: [39TanStackStartVitePlugin(),40],41});4243// With custom React plugin configuration44import { defineConfig } from 'vite';45import { TanStackStartVitePlugin } from '@tanstack/react-start/plugin/vite';46import react from '@vitejs/plugin-react';4748export default defineConfig({49plugins: [50react({51// Custom React plugin options52babel: {53plugins: ['babel-plugin-styled-components'],54},55}),56TanStackStartVitePlugin({57customViteReactPlugin: true, // Tells Start not to add its own React plugin58}),59],60});6162// Using the alias63import { tanstackStart } from '@tanstack/react-start/plugin/vite';6465export default defineConfig({66plugins: [tanstackStart()],67});68```6970### Plugin Configuration7172Configuration options for customizing the TanStack Start Vite plugin behavior.7374```typescript { .api }75/**76* Parses and validates TanStack Start plugin options77* @param opts - Input configuration options78* @returns Validated and processed configuration79*/80function getTanStackStartOptions(81opts?: TanStackStartInputConfig82): TanStackStartOutputConfig;8384interface TanStackStartInputConfig {85/** Custom React plugin options (passed to @vitejs/plugin-react) */86react?: ViteReactOptions;8788/**89* Set to true if you're manually adding @vitejs/plugin-react to your config90* Prevents Start from adding its own React plugin automatically91*/92customViteReactPlugin?: boolean;93}9495interface TanStackStartOutputConfig extends TanStackStartInputConfig {96react: ViteReactOptions;97customViteReactPlugin: boolean;98}99100interface WithReactPlugin {101react?: ViteReactOptions;102customViteReactPlugin?: boolean;103}104105interface ViteReactOptions {106/** Babel configuration for React plugin */107babel?: {108plugins?: Array<string | [string, any]>;109presets?: Array<string | [string, any]>;110};111112/** Include/exclude patterns for React plugin processing */113include?: string | RegExp | Array<string | RegExp>;114exclude?: string | RegExp | Array<string | RegExp>;115116/** JSX runtime configuration */117jsxRuntime?: 'automatic' | 'classic';118jsxImportSource?: string;119120/** Additional options passed to @vitejs/plugin-react */121[key: string]: any;122}123```124125### Virtual Module Generation126127The plugin automatically generates virtual modules for client and server entry points.128129```typescript { .api }130interface VirtualModuleContext {131/** Path to the router configuration file */132routerFilepath: string;133134/** Path to the server entry file */135serverEntryFilepath: string;136137/** Build target (client or server) */138target: 'client' | 'server';139}140141/**142* Generates virtual client entry module143* Creates the client-side hydration and rendering setup144*/145interface VirtualClientEntry {146content: string; // Generated client entry code147}148149/**150* Generates virtual server entry module151* Creates the server-side request handler152*/153interface VirtualServerEntry {154content: string; // Generated server entry code155}156157/**158* Generates virtual server root handler for deployment platforms159* Creates platform-specific server handlers (H3, etc.)160*/161interface VirtualServerRootHandler {162content: string; // Generated server root handler code163}164```165166The plugin generates these virtual modules:167168**Client Entry** (automatically generated):169```typescript170import { StrictMode, startTransition } from 'react';171import { hydrateRoot } from 'react-dom/client';172import { StartClient } from '@tanstack/react-start';173import { createRouter } from './router'; // Your router file174175const router = createRouter();176177startTransition(() => {178hydrateRoot(179document,180<StrictMode>181<StartClient router={router} />182</StrictMode>183);184});185```186187**Server Entry** (automatically generated):188```typescript189import { createStartHandler, defaultStreamHandler } from '@tanstack/react-start/server';190import { createRouter } from './router'; // Your router file191192export default createStartHandler({193createRouter,194})(defaultStreamHandler);195```196197**Server Root Handler** (automatically generated):198```typescript199import { toWebRequest, defineEventHandler } from '@tanstack/react-start/server';200import serverEntry from './server-entry'; // Generated server entry201202export default defineEventHandler(function(event) {203const request = toWebRequest(event);204return serverEntry({ request });205});206```207208### Build Configuration209210The plugin automatically configures Vite with optimized settings for TanStack Start applications.211212```typescript { .api }213interface StartBuildConfig {214/** Resolve configuration for dependencies */215resolve: {216/** Deduplicated packages to prevent version conflicts */217dedupe: Array<string>;218219/** External packages for monorepo development */220external?: Array<string>;221};222223/** Dependency optimization configuration */224optimizeDeps: {225/** Packages to exclude from optimization */226exclude: Array<string>;227228/** Packages to include in optimization */229include: Array<string>;230};231}232```233234Default configuration applied:235```typescript236{237resolve: {238dedupe: ['react', 'react-dom', '@tanstack/react-router'],239},240optimizeDeps: {241exclude: ['@tanstack/react-router-devtools'],242include: [243'react',244'react/jsx-runtime',245'react/jsx-dev-runtime',246'react-dom',247'react-dom/client',248'@tanstack/react-router',249],250},251}252```253254### Package Crawling255256The plugin includes intelligent package crawling for dependency management.257258```typescript { .api }259interface PackageCrawlOptions {260/** Package name */261name: string;262263/** Package exports field from package.json */264exports?: Record<string, unknown> | string;265266/** Peer dependencies */267peerDependencies: Record<string, string>;268}269270type CrawlResult = 'include' | 'exclude' | undefined;271272/**273* Determines how packages should be handled during the build process274* @param opts - Package information for crawling decision275* @returns Crawl result indicating how to handle the package276*/277interface PackageCrawler {278(opts: PackageCrawlOptions): CrawlResult;279}280```281282The plugin uses these crawling rules:283- **Exclude** `@tanstack/react-router-devtools` (development only)284- **Include** packages with root exports and React peer dependencies285- **Undefined** for other packages (use default Vite behavior)286287### Framework Integration288289Integration with the TanStack Start framework core.290291```typescript { .api }292interface FrameworkIntegration {293/** Framework identifier */294framework: 'react';295296/** Virtual module generators */297getVirtualServerRootHandler(ctx: VirtualModuleContext): string;298getVirtualClientEntry(ctx: VirtualModuleContext): string;299getVirtualServerEntry(ctx: VirtualModuleContext): string;300301/** Package crawling configuration */302crawlPackages(opts: PackageCrawlOptions): CrawlResult;303}304```305306## Plugin Architecture307308The TanStackStartVitePlugin consists of multiple sub-plugins:3093101. **Configuration Plugin**: Sets up Vite environment and build options3112. **Core Plugin**: Handles virtual module generation and framework integration3123. **React Plugin**: Configures React transformation (unless `customViteReactPlugin: true`)313314**Plugin Order:**315```typescript316[317{318name: 'tanstack-react-start:config',319configEnvironment: () => ({ /* Vite config */ }),320},321TanStackStartVitePluginCore({322framework: 'react',323// ... framework-specific configuration324}),325!opts?.customViteReactPlugin && viteReact(options.react),326]327```328329## Core Types330331```typescript { .api }332interface PluginOption {333/** Plugin name identifier */334name: string;335336/** Configure Vite environment */337configEnvironment?: () => {338resolve?: any;339optimizeDeps?: any;340[key: string]: any;341};342343/** Build start hook */344buildStart?: (opts: any) => void | Promise<void>;345346/** Transform hook for code transformation */347transform?: (code: string, id: string) => string | null | Promise<string | null>;348349/** Generate bundle hook */350generateBundle?: (opts: any, bundle: any) => void | Promise<void>;351352/** Additional plugin options */353[key: string]: any;354}355356interface ViteConfig {357plugins: Array<PluginOption>;358resolve?: {359dedupe?: Array<string>;360external?: Array<string>;361alias?: Record<string, string>;362};363optimizeDeps?: {364include?: Array<string>;365exclude?: Array<string>;366};367build?: {368rollupOptions?: any;369ssr?: boolean;370};371ssr?: {372external?: Array<string>;373noExternal?: Array<string>;374};375}376377interface CreateRpcFn {378(functionId: string, serverBase: string, splitImportFn?: () => Promise<any>): any;379}380```381382## Usage Patterns383384### Basic Configuration385386```typescript387import { defineConfig } from 'vite';388import { TanStackStartVitePlugin } from '@tanstack/react-start/plugin/vite';389390export default defineConfig({391plugins: [392TanStackStartVitePlugin(),393],394});395```396397### Advanced Configuration398399```typescript400import { defineConfig } from 'vite';401import { TanStackStartVitePlugin } from '@tanstack/react-start/plugin/vite';402import react from '@vitejs/plugin-react';403404export default defineConfig({405plugins: [406react({407babel: {408plugins: [409['styled-components', { displayName: true }],410],411},412}),413TanStackStartVitePlugin({414customViteReactPlugin: true,415}),416],417418// Additional Vite configuration419server: {420port: 3000,421},422423build: {424sourcemap: true,425},426});427```428429### Monorepo Configuration430431```typescript432import { defineConfig } from 'vite';433import { TanStackStartVitePlugin } from '@tanstack/react-start/plugin/vite';434import path from 'path';435436export default defineConfig({437plugins: [438TanStackStartVitePlugin(),439],440441resolve: {442alias: {443'@': path.resolve(__dirname, 'src'),444'@shared': path.resolve(__dirname, '../shared'),445},446},447});448```