@hitch42/applet 0.1.1-beta.8 → 0.1.1-beta.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/dist/_internal/client.js +120 -11
  2. package/dist/_internal/log-context.d.ts +34 -0
  3. package/dist/_internal/log-context.js +2 -0
  4. package/dist/_internal/server.d.ts +1 -1
  5. package/dist/_internal/server.js +112 -57
  6. package/dist/applet.js +12 -12
  7. package/dist/build-Bh_S5BUv.js +2 -0
  8. package/dist/{build-DANx9Hgg.js → build-CEfFoIZZ.js} +1 -1
  9. package/dist/{ci-5qWl7lT3.js → ci-BKw14X2h.js} +14 -13
  10. package/dist/client.d.ts +3 -3
  11. package/dist/{contract-rP_eV9PK.d.ts → contract-CsUpTBe0.d.ts} +1 -1
  12. package/dist/{deploy-MQWLG2EA.js → deploy-wGYjwXrx.js} +139 -88
  13. package/dist/{generate-BxYHdoAQ.js → generate-BEIYs17x.js} +65 -28
  14. package/dist/generate-Dox-OYt6.js +2 -0
  15. package/dist/headers-DkNr9MLJ.js +17 -0
  16. package/dist/index.d.ts +23 -22
  17. package/dist/index.js +2 -1
  18. package/dist/{init-jDEgYIXg.js → init-6oGPM46R.js} +15 -17
  19. package/dist/{load-config-BYSxDVAl.js → load-config-xEdTXs0y.js} +2 -2
  20. package/dist/log-context-zu8U9Sjm.js +73 -0
  21. package/dist/{login-C7RKmmTe.js → login-CUx3TmFQ.js} +1 -1
  22. package/dist/{logs-DgjgAxj2.js → logs-DSjuEN0Q.js} +20 -22
  23. package/dist/{manifest-DD_SGkS6.d.ts → manifest-C6_F4bL8.d.ts} +5 -1
  24. package/dist/{manifest-Bp87Uz0a.js → manifest-CJSL9GuC.js} +20 -4
  25. package/dist/{project-CbYPtpPq.js → project-BRZGd6xq.js} +199 -18
  26. package/dist/query-cache-CXmAyLv3.js +82 -0
  27. package/dist/react.d.ts +3 -2
  28. package/dist/react.js +98 -80
  29. package/dist/{schedules-dhU1yyFr.js → schedules-C8_Svr4h.js} +1 -1
  30. package/dist/server.d.ts +9 -4
  31. package/dist/server.js +29 -8
  32. package/dist/{telephony-protocol-DRgiYjqQ.d.ts → telephony-protocol-D-nf3Gca.d.ts} +15 -13
  33. package/dist/telephony.d.ts +24 -4
  34. package/dist/telephony.js +135 -16
  35. package/dist/{upload-YbRKEqR6.d.ts → upload-DKZzz5kW.d.ts} +6 -6
  36. package/dist/{variables-Bwnr7oxf.js → variables-DT5RyHdH.js} +13 -13
  37. package/dist/vite.d.ts +3 -60
  38. package/dist/vite.js +50 -15
  39. package/dist/{workflow-engine-MogejNfF.js → workflow-engine-BOTzURKM.js} +1 -7
  40. package/dist/{workspace-XVtM12ZC.js → workspace-D0dnnlxL.js} +33 -38
  41. package/package.json +13 -5
  42. package/scaffold/.agents/skills/hitch-applets/SKILL.md +30 -4
  43. package/scaffold/.agents/skills/hitch-applets/references/manifest.md +8 -0
  44. package/scaffold/.agents/skills/hitch-applets/references/markdown.md +2 -0
  45. package/scaffold/.agents/skills/hitch-applets/references/records.md +23 -1
  46. package/scaffold/.agents/skills/hitch-data/SKILL.md +2 -1
  47. package/scaffold/.agents/skills/hitch-data/references/attributes.md +7 -1
  48. package/scaffold/.agents/skills/hitch-data/references/limits.md +13 -13
  49. package/scaffold/.agents/skills/hitch-theory/SKILL.md +3 -2
  50. package/scaffold/.agents/skills/react-best-practices/SKILL.md +127 -0
  51. package/scaffold/.agents/skills/react-best-practices/rules/advanced-effect-event-deps.md +50 -0
  52. package/scaffold/.agents/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  53. package/scaffold/.agents/skills/react-best-practices/rules/advanced-init-once.md +42 -0
  54. package/scaffold/.agents/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
  55. package/scaffold/.agents/skills/react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
  56. package/scaffold/.agents/skills/react-best-practices/rules/async-defer-await.md +82 -0
  57. package/scaffold/.agents/skills/react-best-practices/rules/async-dependencies.md +48 -0
  58. package/scaffold/.agents/skills/react-best-practices/rules/async-parallel.md +24 -0
  59. package/scaffold/.agents/skills/react-best-practices/rules/bundle-analyzable-paths.md +42 -0
  60. package/scaffold/.agents/skills/react-best-practices/rules/bundle-barrel-imports.md +39 -0
  61. package/scaffold/.agents/skills/react-best-practices/rules/bundle-conditional.md +35 -0
  62. package/scaffold/.agents/skills/react-best-practices/rules/bundle-defer-third-party.md +46 -0
  63. package/scaffold/.agents/skills/react-best-practices/rules/bundle-dynamic-imports.md +38 -0
  64. package/scaffold/.agents/skills/react-best-practices/rules/bundle-preload.md +40 -0
  65. package/scaffold/.agents/skills/react-best-practices/rules/client-event-listeners.md +78 -0
  66. package/scaffold/.agents/skills/react-best-practices/rules/client-localstorage-schema.md +74 -0
  67. package/scaffold/.agents/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  68. package/scaffold/.agents/skills/react-best-practices/rules/js-batch-dom-css.md +110 -0
  69. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-function-results.md +58 -0
  70. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  71. package/scaffold/.agents/skills/react-best-practices/rules/js-cache-storage.md +56 -0
  72. package/scaffold/.agents/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  73. package/scaffold/.agents/skills/react-best-practices/rules/js-early-exit.md +50 -0
  74. package/scaffold/.agents/skills/react-best-practices/rules/js-flatmap-filter.md +51 -0
  75. package/scaffold/.agents/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  76. package/scaffold/.agents/skills/react-best-practices/rules/js-index-maps.md +37 -0
  77. package/scaffold/.agents/skills/react-best-practices/rules/js-length-check-first.md +50 -0
  78. package/scaffold/.agents/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  79. package/scaffold/.agents/skills/react-best-practices/rules/js-request-idle-callback.md +104 -0
  80. package/scaffold/.agents/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  81. package/scaffold/.agents/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  82. package/scaffold/.agents/skills/react-best-practices/rules/rendering-activity.md +26 -0
  83. package/scaffold/.agents/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +38 -0
  84. package/scaffold/.agents/skills/react-best-practices/rules/rendering-conditional-render.md +32 -0
  85. package/scaffold/.agents/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  86. package/scaffold/.agents/skills/react-best-practices/rules/rendering-hoist-jsx.md +36 -0
  87. package/scaffold/.agents/skills/react-best-practices/rules/rendering-resource-hints.md +81 -0
  88. package/scaffold/.agents/skills/react-best-practices/rules/rendering-script-defer-async.md +36 -0
  89. package/scaffold/.agents/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  90. package/scaffold/.agents/skills/react-best-practices/rules/rendering-usetransition-loading.md +43 -0
  91. package/scaffold/.agents/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  92. package/scaffold/.agents/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  93. package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  94. package/scaffold/.agents/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  95. package/scaffold/.agents/skills/react-best-practices/rules/rerender-functional-setstate.md +77 -0
  96. package/scaffold/.agents/skills/react-best-practices/rules/rerender-lazy-state-init.md +56 -0
  97. package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo-with-default-value.md +36 -0
  98. package/scaffold/.agents/skills/react-best-practices/rules/rerender-memo.md +44 -0
  99. package/scaffold/.agents/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  100. package/scaffold/.agents/skills/react-best-practices/rules/rerender-no-inline-components.md +75 -0
  101. package/scaffold/.agents/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  102. package/scaffold/.agents/skills/react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
  103. package/scaffold/.agents/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  104. package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-deferred-value.md +59 -0
  105. package/scaffold/.agents/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  106. package/scaffold/.agents/skills/tanstack-query/SKILL.md +136 -0
  107. package/scaffold/.agents/skills/tanstack-query/references/compositions/automatic-invalidation-after-mutations.md +124 -0
  108. package/scaffold/.agents/skills/tanstack-query/references/compositions/broadcast-realtime-and-multi-tab-synchronization.md +150 -0
  109. package/scaffold/.agents/skills/tanstack-query/references/compositions/compose-query-with-tanstack-router-and-start.md +248 -0
  110. package/scaffold/.agents/skills/tanstack-query/references/compositions/enforce-query-best-practices-with-eslint.md +167 -0
  111. package/scaffold/.agents/skills/tanstack-query/references/compositions/persist-offline-and-restore-caches.md +181 -0
  112. package/scaffold/.agents/skills/tanstack-query/references/compositions/query-data-and-forms.md +156 -0
  113. package/scaffold/.agents/skills/tanstack-query/references/core/build-query-abstractions.md +130 -0
  114. package/scaffold/.agents/skills/tanstack-query/references/core/cancel-queries-and-consume-abort-signals.md +176 -0
  115. package/scaffold/.agents/skills/tanstack-query/references/core/concurrent-optimistic-updates.md +135 -0
  116. package/scaffold/.agents/skills/tanstack-query/references/core/coordinate-query-execution.md +188 -0
  117. package/scaffold/.agents/skills/tanstack-query/references/core/design-query-keys-and-options.md +182 -0
  118. package/scaffold/.agents/skills/tanstack-query/references/core/fetch-and-observe-queries.md +193 -0
  119. package/scaffold/.agents/skills/tanstack-query/references/core/implement-optimistic-updates-and-cache-writes.md +168 -0
  120. package/scaffold/.agents/skills/tanstack-query/references/core/paginate-and-build-infinite-queries.md +188 -0
  121. package/scaffold/.agents/skills/tanstack-query/references/core/seed-placeholder-select-and-transform-data.md +188 -0
  122. package/scaffold/.agents/skills/tanstack-query/references/core/selectors-and-derived-state.md +145 -0
  123. package/scaffold/.agents/skills/tanstack-query/references/core/tune-defaults-freshness-retries-and-refetching.md +172 -0
  124. package/scaffold/.agents/skills/tanstack-query/references/core/understand-query-internals-and-observers.md +104 -0
  125. package/scaffold/.agents/skills/tanstack-query/references/core/write-mutations-and-invalidate-related-queries.md +183 -0
  126. package/scaffold/.agents/skills/tanstack-query/references/framework/debug-with-devtools.md +169 -0
  127. package/scaffold/.agents/skills/tanstack-query/references/framework/handle-status-and-errors.md +119 -0
  128. package/scaffold/.agents/skills/tanstack-query/references/framework/shape-data-and-render-efficiently.md +184 -0
  129. package/scaffold/.agents/skills/tanstack-query/references/framework/use-framework-adapter-reactivity.md +185 -0
  130. package/scaffold/.agents/skills/tanstack-query/references/framework/use-suspense-and-error-boundaries.md +208 -0
  131. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/migrate-major-versions-and-codemods.md +169 -0
  132. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/prefetch-and-remove-request-waterfalls.md +228 -0
  133. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/setup-query-client-and-providers.md +161 -0
  134. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/ssr-hydration-and-streaming.md +209 -0
  135. package/scaffold/.agents/skills/tanstack-query/references/lifecycle/test-query-code.md +160 -0
  136. package/scaffold/.agents/skills/tanstack-router/SKILL.md +134 -0
  137. package/scaffold/.agents/skills/tanstack-router/references/compositions/router-query.md +412 -0
  138. package/scaffold/.agents/skills/tanstack-router/references/react-router.md +495 -0
  139. package/scaffold/.agents/skills/tanstack-router/references/router-core/auth-and-guards.md +495 -0
  140. package/scaffold/.agents/skills/tanstack-router/references/router-core/code-splitting.md +318 -0
  141. package/scaffold/.agents/skills/tanstack-router/references/router-core/data-loading.md +490 -0
  142. package/scaffold/.agents/skills/tanstack-router/references/router-core/index.md +158 -0
  143. package/scaffold/.agents/skills/tanstack-router/references/router-core/navigation.md +433 -0
  144. package/scaffold/.agents/skills/tanstack-router/references/router-core/not-found-and-errors.md +436 -0
  145. package/scaffold/.agents/skills/tanstack-router/references/router-core/path-params.md +383 -0
  146. package/scaffold/.agents/skills/tanstack-router/references/router-core/search-params.md +343 -0
  147. package/scaffold/.agents/skills/tanstack-router/references/router-core/ssr.md +462 -0
  148. package/scaffold/.agents/skills/tanstack-router/references/router-core/type-safety.md +493 -0
  149. package/scaffold/.agents/skills/tanstack-router/references/router-plugin.md +250 -0
  150. package/scaffold/.agents/skills/tanstack-router/references/virtual-file-routes.md +215 -0
  151. package/scaffold/.agents/skills/web-design-guidelines/SKILL.md +184 -0
  152. package/scaffold/.github/workflows/hitch.yml +1 -1
  153. package/scaffold/AGENTS.md +2 -2
  154. package/scaffold/applet/src/client/components/ui/alert.tsx +1 -1
  155. package/scaffold/applet/src/client/components/ui/button.tsx +1 -1
  156. package/scaffold/applet/src/client/components/ui/checkbox.tsx +1 -1
  157. package/scaffold/applet/src/client/components/ui/dialog.tsx +2 -2
  158. package/scaffold/applet/src/client/components/ui/dropdown-menu.tsx +2 -2
  159. package/scaffold/applet/src/client/components/ui/input-group.tsx +2 -2
  160. package/scaffold/applet/src/client/components/ui/select.tsx +2 -2
  161. package/scaffold/applet/src/client/components/ui/sheet.tsx +2 -2
  162. package/scaffold/applet/src/client/components/ui/spinner.tsx +2 -1
  163. package/scaffold/applet/src/client/components/ui/tabs.tsx +1 -1
  164. package/scaffold/applet/src/client/lib/utils.ts +1 -6
  165. package/scaffold/applet/src/client/styles/globals.css +2 -0
  166. package/dist/build-CFCKKMn7.js +0 -2
  167. package/dist/generate-CQ07Hdpo.js +0 -2
@@ -0,0 +1,318 @@
1
+ ---
2
+ name: code-splitting
3
+ description: >-
4
+ Automatic code splitting (autoCodeSplitting), .lazy.tsx convention,
5
+ createLazyFileRoute, createLazyRoute, lazyRouteComponent, getRouteApi
6
+ for typed hooks in split files, codeSplitGroupings per-route override,
7
+ splitBehavior programmatic config, critical vs non-critical properties.
8
+ metadata:
9
+ type: sub-skill
10
+ library: tanstack-router
11
+ library_version: "1.171.15"
12
+ requires:
13
+ - router-core
14
+ sources:
15
+ - TanStack/router:docs/router/guide/code-splitting.md
16
+ - TanStack/router:docs/router/guide/automatic-code-splitting.md
17
+ ---
18
+
19
+ # Code Splitting
20
+
21
+ TanStack Router separates route code into **critical** (required to match and start loading) and **non-critical** (can be lazy-loaded). The bundler plugin can split automatically, or you can split manually with `.lazy.tsx` files.
22
+
23
+ > **CRITICAL**: Never `export` component functions from route files — exported functions are included in the main bundle and bypass code splitting entirely.
24
+
25
+ > **CRITICAL**: Use `getRouteApi('/path')` in code-split files, NOT `import { Route } from './route'`. Importing Route defeats code splitting.
26
+
27
+ ## What Stays in the Main Bundle (Critical)
28
+
29
+ - Path parsing/serialization
30
+ - `validateSearch`
31
+ - `loader`, `beforeLoad`
32
+ - Route context, static data
33
+ - Links, scripts, styles
34
+
35
+ ## What Gets Split (Non-Critical)
36
+
37
+ - `component`
38
+ - `errorComponent`
39
+ - `pendingComponent`
40
+ - `notFoundComponent`
41
+
42
+ > The `loader` is NOT split by default. It is already async, so splitting it adds a double async cost: fetch the chunk, then execute the loader. Only split the loader if you have a specific reason.
43
+
44
+ ## Setup: Automatic Code Splitting
45
+
46
+ Enable `autoCodeSplitting: true` in the bundler plugin. This is the recommended approach.
47
+
48
+ ```ts
49
+ // vite.config.ts
50
+ import { defineConfig } from "vite";
51
+ import react from "@vitejs/plugin-react";
52
+ import { tanstackRouter } from "@tanstack/router-plugin/vite";
53
+
54
+ export default defineConfig({
55
+ plugins: [
56
+ // TanStack Router plugin MUST come before the framework plugin
57
+ tanstackRouter({
58
+ autoCodeSplitting: true,
59
+ }),
60
+ react(),
61
+ ],
62
+ });
63
+ ```
64
+
65
+ With this enabled, route files are automatically transformed. Components are split into separate chunks; loaders stay in the main bundle. No `.lazy.tsx` files needed.
66
+
67
+ ```tsx
68
+ // src/routes/posts.tsx — everything in one file, splitting is automatic
69
+ import { createFileRoute } from "@tanstack/react-router";
70
+ import { fetchPosts } from "../api";
71
+
72
+ export const Route = createFileRoute("/posts")({
73
+ loader: fetchPosts,
74
+ component: PostsComponent,
75
+ });
76
+
77
+ // NOT exported — this is critical for automatic code splitting to work
78
+ function PostsComponent() {
79
+ const posts = Route.useLoaderData();
80
+ return (
81
+ <ul>
82
+ {posts.map((post) => (
83
+ <li key={post.id}>{post.title}</li>
84
+ ))}
85
+ </ul>
86
+ );
87
+ }
88
+ ```
89
+
90
+ ## Manual Splitting with `.lazy.tsx`
91
+
92
+ If you cannot use automatic code splitting (e.g. CLI-only, no bundler plugin), split manually into two files:
93
+
94
+ ```tsx
95
+ // src/routes/posts.tsx — critical route config only
96
+ import { createFileRoute } from "@tanstack/react-router";
97
+ import { fetchPosts } from "../api";
98
+
99
+ export const Route = createFileRoute("/posts")({
100
+ loader: fetchPosts,
101
+ });
102
+ ```
103
+
104
+ ```tsx
105
+ // src/routes/posts.lazy.tsx — non-critical (lazy-loaded)
106
+ import { createLazyFileRoute } from "@tanstack/react-router";
107
+
108
+ export const Route = createLazyFileRoute("/posts")({
109
+ component: PostsComponent,
110
+ });
111
+
112
+ function PostsComponent() {
113
+ // Use getRouteApi to access typed hooks without importing Route
114
+ return <div>Posts</div>;
115
+ }
116
+ ```
117
+
118
+ `createLazyFileRoute` supports only: `component`, `errorComponent`, `pendingComponent`, `notFoundComponent`.
119
+
120
+ ## Virtual Routes
121
+
122
+ If splitting leaves the critical route file empty, delete it entirely. A virtual route is auto-generated in `routeTree.gen.ts`:
123
+
124
+ ```tsx
125
+ // src/routes/about.lazy.tsx — no about.tsx needed
126
+ import { createLazyFileRoute } from "@tanstack/react-router";
127
+
128
+ export const Route = createLazyFileRoute("/about")({
129
+ component: () => <h1>About Us</h1>,
130
+ });
131
+ ```
132
+
133
+ ## Code-Based Splitting
134
+
135
+ For code-based (non-file-based) routing, use `createLazyRoute` and the `.lazy()` method:
136
+
137
+ ```tsx
138
+ // src/posts.lazy.tsx
139
+ import { createLazyRoute } from "@tanstack/react-router";
140
+
141
+ export const Route = createLazyRoute("/posts")({
142
+ component: PostsComponent,
143
+ });
144
+
145
+ function PostsComponent() {
146
+ return <div>Posts</div>;
147
+ }
148
+ ```
149
+
150
+ ```tsx
151
+ // src/app.tsx
152
+ import { createRoute } from "@tanstack/react-router";
153
+
154
+ const postsRoute = createRoute({
155
+ getParentRoute: () => rootRoute,
156
+ path: "/posts",
157
+ }).lazy(() => import("./posts.lazy").then((d) => d.Route));
158
+ ```
159
+
160
+ ## Accessing Typed Hooks in Split Files: `getRouteApi`
161
+
162
+ When your component lives in a separate file, use `getRouteApi` to get typed access to route hooks without importing the Route object:
163
+
164
+ ```tsx
165
+ // src/routes/posts.lazy.tsx
166
+ import { createLazyFileRoute, getRouteApi } from "@tanstack/react-router";
167
+
168
+ const routeApi = getRouteApi("/posts");
169
+
170
+ export const Route = createLazyFileRoute("/posts")({
171
+ component: PostsComponent,
172
+ });
173
+
174
+ function PostsComponent() {
175
+ const posts = routeApi.useLoaderData();
176
+ const { page } = routeApi.useSearch();
177
+ const params = routeApi.useParams();
178
+ const context = routeApi.useRouteContext();
179
+ return <div>Posts page {page}</div>;
180
+ }
181
+ ```
182
+
183
+ `getRouteApi` provides: `useLoaderData`, `useLoaderDeps`, `useMatch`, `useParams`, `useRouteContext`, `useSearch`.
184
+
185
+ ## Per-Route Split Overrides: `codeSplitGroupings`
186
+
187
+ Override split behavior for a specific route by adding `codeSplitGroupings` directly in the route file:
188
+
189
+ ```tsx
190
+ // src/routes/posts.tsx
191
+ import { createFileRoute } from "@tanstack/react-router";
192
+ import { loadPostsData } from "./-heavy-posts-utils";
193
+
194
+ export const Route = createFileRoute("/posts")({
195
+ // Bundle loader and component together for this route
196
+ codeSplitGroupings: [["loader", "component"]],
197
+ loader: () => loadPostsData(),
198
+ component: PostsComponent,
199
+ });
200
+
201
+ function PostsComponent() {
202
+ const data = Route.useLoaderData();
203
+ return <div>{data.title}</div>;
204
+ }
205
+ ```
206
+
207
+ ## Global Split Configuration
208
+
209
+ ### `defaultBehavior` — Change Default Groupings
210
+
211
+ ```ts
212
+ // vite.config.ts
213
+ import { defineConfig } from "vite";
214
+ import { tanstackRouter } from "@tanstack/router-plugin/vite";
215
+
216
+ export default defineConfig({
217
+ plugins: [
218
+ tanstackRouter({
219
+ autoCodeSplitting: true,
220
+ codeSplittingOptions: {
221
+ defaultBehavior: [
222
+ // Bundle all UI components into one chunk
223
+ ["component", "pendingComponent", "errorComponent", "notFoundComponent"],
224
+ ],
225
+ },
226
+ }),
227
+ ],
228
+ });
229
+ ```
230
+
231
+ ### `splitBehavior` — Programmatic Per-Route Logic
232
+
233
+ ```ts
234
+ // vite.config.ts
235
+ import { defineConfig } from "vite";
236
+ import { tanstackRouter } from "@tanstack/router-plugin/vite";
237
+
238
+ export default defineConfig({
239
+ plugins: [
240
+ tanstackRouter({
241
+ autoCodeSplitting: true,
242
+ codeSplittingOptions: {
243
+ splitBehavior: ({ routeId }) => {
244
+ if (routeId.startsWith("/posts")) {
245
+ return [["loader", "component"]];
246
+ }
247
+ // All other routes use defaultBehavior
248
+ },
249
+ },
250
+ }),
251
+ ],
252
+ });
253
+ ```
254
+
255
+ ### Precedence Order
256
+
257
+ 1. Per-route `codeSplitGroupings` (highest)
258
+ 2. `splitBehavior` function
259
+ 3. `defaultBehavior` option (lowest)
260
+
261
+ ## Common Mistakes
262
+
263
+ ### 1. HIGH: Exporting component functions prevents code splitting
264
+
265
+ ```tsx
266
+ // WRONG — export puts PostsComponent in the main bundle
267
+ export function PostsComponent() {
268
+ return <div>Posts</div>;
269
+ }
270
+
271
+ // CORRECT — no export, function stays in the split chunk
272
+ function PostsComponent() {
273
+ return <div>Posts</div>;
274
+ }
275
+ ```
276
+
277
+ ### 2. MEDIUM: Trying to code-split the root route
278
+
279
+ `__root.tsx` does not support code splitting. It is always rendered regardless of the current route. Do not create `__root.lazy.tsx`.
280
+
281
+ ### 3. MEDIUM: Splitting the loader adds double async cost
282
+
283
+ ```tsx
284
+ // AVOID unless you have a specific reason
285
+ codeSplittingOptions: {
286
+ defaultBehavior: [
287
+ ['loader'], // Fetch chunk THEN execute loader = two network waterfalls
288
+ ['component'],
289
+ ],
290
+ }
291
+
292
+ // PREFERRED — loader stays in main bundle (default behavior)
293
+ codeSplittingOptions: {
294
+ defaultBehavior: [
295
+ ['component'],
296
+ ['errorComponent'],
297
+ ['notFoundComponent'],
298
+ ],
299
+ }
300
+ ```
301
+
302
+ ### 4. HIGH: Importing Route in code-split files for typed hooks
303
+
304
+ ```tsx
305
+ // WRONG — importing Route pulls route config into the lazy chunk
306
+ import { Route } from "./posts.tsx";
307
+ const data = Route.useLoaderData();
308
+
309
+ // CORRECT — getRouteApi gives typed hooks without pulling in the route
310
+ import { getRouteApi } from "@tanstack/react-router";
311
+ const routeApi = getRouteApi("/posts");
312
+ const data = routeApi.useLoaderData();
313
+ ```
314
+
315
+ ## Cross-References
316
+
317
+ - **router-core/data-loading** — Loader splitting decisions affect data loading performance. Splitting the loader adds latency before data can be fetched.
318
+ - **router-core/type-safety** — `getRouteApi` is the type-safe way to access hooks from split files.