Saltar al contenido principal

Obtención de Datos del Lado del Servidor

Analog soporta la obtención de datos desde el servidor antes de cargar una página. Esto se puede lograr definiendo una función load asíncrona en el archivo .server.ts de la página.

Obtención de los Datos

Para obtener los datos desde el servidor, crea un archivo .server.ts que contenga la función asíncrona load junto al archivo .page.ts.

// src/app/pages/index.server.ts
import { PageServerLoad } from '@analogjs/router';

export const load = async ({
params, // params/queryParams de la solicitud
req, // Solicitud H3
res, // Manejador de Respuesta H3
fetch, // fetch interno para llamadas API directas,
event, // evento de solicitud completo
}: PageServerLoad) => {
return {
loaded: true,
};
};

Inyección de los Datos

Acceder a los datos obtenidos en el servidor se puede hacer utilizando la función injectLoad proporcionada por @analogjs/router.
La función load se resuelve utilizando resolutores de rutas de Angular, por lo que establecer requireSync: false y initialValue: {} no ofrece ninguna ventaja, ya que load se obtiene antes de que el componente sea instanciado.

// src/app/pages/index.page.ts
import { Component } from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
import { injectLoad } from '@analogjs/router';

import { load } from './index.server'; // no incluido en la compilación del cliente

@Component({
standalone: true,
template: `
<h2>Inicio</h2>

Loaded: {{ data().loaded }}
`,
})
export default class BlogComponent {
data = toSignal(injectLoad<typeof load>(), { requireSync: true });
}

Acceder a los datos también se puede hacer con Entradas de Componentes y Enlaces de Entradas de Componentes proporcionados en la configuración del Router de Angular. Para configurar el Router de Angular para Component Input Bindings, agrega withComponentInputBinding() a los argumentos pasados a provideFileRouter() en el app.config.ts.

import { provideHttpClient } from '@angular/common/http';
import { ApplicationConfig } from '@angular/core';
import { provideClientHydration } from '@angular/platform-browser';
import { provideFileRouter } from '@analogjs/router';
import { withNavigationErrorHandler } from '@angular/router';

export const appConfig: ApplicationConfig = {
providers: [
provideFileRouter(
withComponentInputBinding(),
withNavigationErrorHandler(console.error)
),
provideHttpClient(),
provideClientHydration(),
],
};

Ahora, para obtener los datos en el componente, agrega una entrada llamada load.

// src/app/pages/index.page.ts
import { Component, Input } from '@angular/core';
import { LoadResult } from '@analogjs/router';

import { load } from './index.server'; // no incluido en la compilación del cliente

@Component({
standalone: true,
template: `
<h2>Inicio</h2>
Loaded: {{ data.loaded }}
`,
})
export default class BlogComponent {
@Input() load(data: LoadResult<typeof load>) {
this.data = data;
}

data!: LoadResult<typeof load>;
}

Acceso a los Datos de Carga del Servidor

Acceder a los datos de carga del servidor desde el resolutor RouteMeta se puede hacer utilizando la función getLoadResolver proporcionada por @analogjs/router.

import { getLoadResolver } from '@analogjs/router';

export const routeMeta: RouteMeta = {
resolve: {
data: async (route) => {
// llamar al resolutor de carga del servidor para esta ruta desde otro resolutor
const data = await getLoadResolver(route);

return { ...data };
},
},
};

Sobrescribir la URL Base Pública

Analog infiere automáticamente la URL base pública que se debe establecer al usar la obtención de datos del lado del servidor a través de su Contexto de Solicitud del Servidor y Interceptor de Contexto de Solicitud. Para establecer explícitamente la URL base, configura una variable de entorno utilizando un archivo .env para definir la URL base pública.

# .env
VITE_ANALOG_PUBLIC_BASE_URL="http://localhost:5173"

La variable de entorno también debe estar configurada al construir para despliegue.