You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 06-tanstack-start/README.md
+38-63Lines changed: 38 additions & 63 deletions
Original file line number
Diff line number
Diff line change
@@ -1,32 +1,24 @@
1
1
# Tanstack Start
2
2
3
-
Ahora le toca el turno a [`Tanstack Start`](https://tanstack.com/start/latest), que es el framework para transformar nuestra aplicación en una de `Server Side Rendering` (ojo que por ahora esta en `beta` y para React y para Solid).
3
+
Si arrancamos el proyecto, vemos que utiliza `vinxi` (aunque en la versión release lo van a sustituir por un `plugin` de `vite`)
4
4
5
-
## Instalación
5
+
Si abrimos las DevTools del navegador y cargamos la primera página, vemos que directamente viene un `html` con el contenido de ésta.
6
6
7
-
Las librerías que ahora necesitamos, a parte de la del router que ya tenemos instalada, son:
7
+
Si hacemos `login` y navegamos vemos que ahora hace la descarga con las rutas `lazy` como si fuese una SPA normal.
8
8
9
-
```bash
10
-
npm install @tanstack/react-start
11
-
npm install -D vinxi
9
+
Pero si recargamos la página, vemos que vuelve a hacer la descarga del `html` completo aunque no sea la del `login`.
12
10
13
-
```
14
-
15
-
> Vinxi es un SDK para crear tu propio framework como `Tanstack Start`, `Next.js`, etc. con tus propias reglas y está basado en `Vite`, `Nitro` y `Rollup`.
16
-
>
17
-
> Pero comentan que Vinxi la eliminarán en la versión 1 y lo sustituirán por un `plugin` de `Vite` o directamente con el `CLI`.
11
+
Así cumplimos con el SEO y mantenemos lo bueno de una SPA.
18
12
19
-
¿Qué dependencias no necesitamos ahora?
13
+
> Podemos poner breakpoint en el VSCode y en el navegador.
20
14
21
-
```bash
22
-
npm uninstall vite @vitejs/plugin-react @tanstack/router-plugin
23
-
```
15
+
## Configuración
24
16
25
-
> No necesitamos estas porque ya están incluidas en `Tanstack Start`.
17
+
Para configurar todo esto, necesitamos hacer unos pequeños ajustes:
26
18
27
-
##Configuración
19
+
### package.json
28
20
29
-
Es decir, ahora necesitamos hacer unos pequeños ajustes para que nuestra aplicación funcione con `SSR`.
21
+
- Instalamos `@tanstack/react-start` y `vinxi`, ya tienen integrados `vite` y el `plugin` del router.
30
22
31
23
_./frontend/package.json_
32
24
@@ -40,38 +32,11 @@ _./frontend/package.json_
40
32
},
41
33
```
42
34
43
-
Renombramos el fichero `vite.config.ts` a `app.config.ts`.
35
+
### app.config.ts
44
36
45
-
- Ahora `defineConfig` lo importamos de `@tanstack/react-start/config`.
46
-
- Los plugins de `react` y el `router` ya no los necesitamos, porque ya están incluidos, y el router se puede configurar en la propiedad `tsr` (TanStack Router).
47
-
- Eso si, le añadimos la propiedad `appDirectory` a `src` para que sepa donde está nuestra aplicación (por defecto es `app`).
48
-
- Y la configuración restante, en la propia de `vite`.
37
+
Renombramos el fichero `vite.config.ts` a `app.config.ts` y como veis la configuración es muy parecida, y sigue soportando la configuración de `vite`.
49
38
50
-
_./frontend/vite.config.ts_
51
-
52
-
```diff
53
-
- import { defineConfig } from "vite";
54
-
+ import { defineConfig } from "@tanstack/react-start/config";
55
-
- import react from "@vitejs/plugin-react";
56
-
- import { TanStackRouterVite } from "@tanstack/router-plugin/vite";
Eso significa, que ahora vamos a tener 2 puntos de entrada: uno para el cliente y otro para el servidor.
65
+
### ssr.tsx
66
+
67
+
Eso significa, que ahora vamos a tener 2 puntos de entrada:
101
68
102
-
El de servidor `ssr.tsx`:
69
+
Uno para el servidor `ssr.tsx`:
103
70
104
71
- Importamos la funcion de `createRouter` y se la pasamos al `createStartHandler` que será el encargado de manejar las peticiones según la ruta que se solicite.
105
72
- También importamos la función `getRouterManifest` que se encargará de gestionar los recursos y `preloads` de la aplicación.
Es decir, ahora nos sobran 2 ficheros: el `index.html` y el `index.tsx`. Tenemos que ir migrando el contenido.
112
+
### Migración del index.html
113
+
114
+
Ahora nos sobran 2 ficheros: el `index.html` y el `index.tsx`. Para mover el código a un sitio común podríamos optar por el fichero principal del router `__root.tsx`:
115
+
116
+
- Utilizar propiedad `head` del router para cambiar título y metadatos.
117
+
- Añadimos la estructura básica de un `html` en el render.
144
118
145
-
Ahora, el fichero principal de la aplicación tanto para el cliente como para el servidor es el `routes/__root.tsx`:
- Nos llevamos los imports de los estilos, pero lo importamos como una URL para poder inyectarlos en el `head` del html como un `link` para que funcionen en modo servidor.
199
-
- El `RouterProvider` es algo que ya está incluido en los puntos de entrada de servidor y cliente.
200
-
- Pero si nos vamos a llevar la configuración de `react-query`. Si se necesita en un nivel superior, se puede usar [las propiedas `Wrap` o `InnerWrap` del router](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#wrap-property)
201
-
- Ya podemos borar el `index.tsx`.
171
+
- Podemos importar los estilos, pero como un `link` de HTML para que funcionen en modo servidor.
172
+
- Nos llevamos los proveedor necesarios (menos el del router que ya lo tiene incluido internamente),
173
+
- Y ya estaría todo listo.
202
174
203
175
_./frontend/src/routes/\_\_root.tsx_
204
176
205
177
```diff
206
-
+ import appStyles from "../index.css?url";
207
178
import {
208
179
Outlet,
209
180
createRootRouteWithContext,
@@ -256,6 +227,10 @@ function RootComponent() {
256
227
257
228
> Nota: [CSS Modules FOUC (flash of unstyled content) se resolverá en la versión 1](https://github.com/TanStack/router/issues/3023#issuecomment-2689163745)
258
229
259
-
Ahora, sea cual sea la ruta que solicitemos inicialmente, se renderizará en servidor. Y las navegaciones posteriores se harán en cliente, con esto tenemos lo mejor de ambos mundos, conseguimos una carga inicial rápida y mantenemos la interactividad de una SPA (con su memoria en cliente, etc).
230
+
### Otros cambios
260
231
261
-
> Podemos poner breakpoint en el VSCode y en el navegador.
232
+
Eso si, si tienes código como por ejemplo lo que yo he añadido del [localStorage](./frontend/src/common/storage.ts) tendrás que comprobar si se ejecuta en cliente o servidor.
233
+
234
+
### Conclusión
235
+
236
+
A partir de aquí ya tenemos una aplicación con `SSR` y te puedes aprovechar las nuevas características que te da de `Server Functions`, `API Routes`, etc.
0 commit comments