Representación del lado del servidor con Angular Universal
Este tema tiene como objetivo describir qué es el renderizado del lado del servidor y cómo configurarlo dentro de Ignite UI for Angular.
Angular Universal
Todas las aplicaciones Angular se ejecutan en el navegador del cliente y, a menudo, esto puede resultar en un impacto negativo en el rendimiento de First Meaningful Paint (FMP), es decir, cuando un navegador muestra por primera vez el contenido principal de una página. Aquí es cuando Angular Universal resulta útil: puede generar el HTML completo para una página en el servidor. Representa una página del lado del cliente en HTML en el servidor que luego se inicia en el cliente. Está bien, pero ¿cómo funciona?
FMP mide cuándo el contenido principal de una página es visible para el usuario; en cuanto a la métrica FCP, mide cuánto tiempo le toma al navegador representar la primera parte del contenido DOM después de que un usuario navega a su página. Consulte Puntuación de rendimiento de Lighthouse para obtener más información.
How it works?
Con Angular Universal, ofrecerá una versión estática de la página de inicio de sus aplicaciones, mientras que al mismo tiempo la aplicación Angular completa se carga en segundo plano. La página de destino será HTML puro y se mostrará incluso si JavaScript está deshabilitado. Puede encontrar más información sobre el renderizado del servidor aquí.
Usage
La renderización del lado del servidor es una de las muchas técnicas que forman parte de las pautas de renderización en la web, que pueden:
- Facilite a los rastreadores web la indexación de su sitio web en los puestos más altos de las búsquedas; mejorará su optimización de motores de búsqueda (SEO).
- Muestre la primera página rápidamente: la carga lenta de la página inicial no resulta atractiva para los usuarios (si tarda más de 3 segundos en cargarse).
- Mejore el rendimiento de su aplicación: tendrá un impacto positivo tanto en First Meaningful Paint como en First Contentful Paint.
Le brinda control total sobre SEO y vistas previas de redes sociales, y mejora el rendimiento general percibido de su aplicación al permitir a los usuarios ver una vista pintada inicial.
Add SSR to existing Ignite UI application
Step 1 - Add @nguniversal
Al utilizar el esquema Angular CLI, podemos ejecutar el siguiente comando:
ng add @nguniversal/express-engine --clientProject ssr-example
Este esquema realizará varios cambios en las configuraciones del servidor y cliente de su aplicación, así como comandos npm y actualizaciones de app.module.
Step 2 - Define all browser-specific objects that are missing
Dado que las aplicaciones universales se ejecutan en el servidor y no en el navegador, hay algunas cosas que debes tener en cuenta en tu código. Faltan objetos específicos del navegador, como window
, document
o location
, por lo que recomendamos usar domino para la abstracción DOM del lado del servidor. Domino es una implementación DOM del lado del servidor basada en dom.js de Mozilla.
- instalar domino
npm install domino
- para abstracción dom del lado del servidor - instale xmlhttprequest
npm i xmlhttprequest
: si usa IgxIconService para registrar íconos - Configurar el "servidor.ts"
// server.ts
const domino = require('domino');
const fs = require('fs');
const path = require('path');
const template = fs
.readFileSync(path.join('dist/browser', 'index.html'))
.toString();
const window = domino.createWindow(template);
// Ignite UI browser objects abstractions
(global as any).window = window;
(global as any).document = window.document;
(global as any).Event = window.Event;
(global as any).KeyboardEvent = window.KeyboardEvent;
(global as any).MouseEvent = window.MouseEvent;
(global as any).FocusEvent = window.FocusEvent;
(global as any).PointerEvent = window.PointerEvent;
(global as any).HTMLElement = window.HTMLElement;
(global as any).HTMLElement.prototype.getBoundingClientRect = () => {
return {
left: '',
right: '',
top: '',
bottom: ''
};
};
// If using IgxIconService to register icons
(global as any).XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;
// Other optional depending on your application configuration
(global as any).object = window.object;
(global as any).navigator = window.navigator;
(global as any).localStorage = window.localStorage;
(global as any).DOMTokenList = window.DOMTokenList;
Step 3 - Start your universal app
Ejecute el siguiente comando:
npm run build:ssr && npm run serve:ssr
Como alternativa a Angular Express Engine, puede utilizar ASP.NET Core Engine para ejecutar aplicaciones Angular con renderizado del lado del servidor.
Build a new application from scratch
- Usar
ng new
o el Ignite UIig new
dominio. - Ejecute
ng add igniteui-angular
que instala los paquetes npm de la biblioteca en su espacio de trabajo y configura el proyecto en el directorio de trabajo actual para usar esa biblioteca. - Agregue Angular Universal con
ng add @nguniversal/express-engine --clientProject ig-ssr-example
. "ig-ssr-example" es el nombre de su proyecto. - Agregue Ignite UI for Angular, por ejemplo, Grid, Calendar y
- Configure el archivo "server.ts" para definir todos los objetos específicos del navegador necesarios, como "ventana", "documento" o "ubicación".
- instalar domino
npm install domino
- para abstracción dom del lado del servidor - instale xmlhttprequest
npm i xmlhttprequest
: si usa IgxIconService para registrar íconos
- instalar domino
Use starter project
Utilice el proyecto inicial que incluye Ignite UI for Angular. El proyecto utiliza Angular CLI para crear rápidamente una aplicación sencilla con Angular Universal.
Step 1 - Clone the starter repository
git clone https://github.com/IgniteUI/ng-universal-example.git
Step 2 - Use NPM to install the needed dependencies
npm install
Step 3 - Build and start the application by using:
npm run build:ssr && npm run serve:ssr
Other considerations
- Si su aplicación utiliza otros objetos específicos del navegador, incluya su uso en una declaración condicional, de modo que solo Angular los use en el navegador. Puede hacer esto importando las funciones
isPlatformBrowser
eisPlatformServer
desde@angular/common
, inyectando el tokenPLATFORM_ID
en su componente y ejecutando las funciones importadas para ver si está en el servidor o en el navegador. - Si utiliza ElementRef para el manejo de elementos HTML, no utilice el elemento nativo para manipular los atributos del elemento. En su lugar, inyecte y utilice los métodos Renderer2.
- Todas las URL para solicitudes del servidor deben ser absolutas; tenga en cuenta que las solicitudes de datos de URL relativas fallarán cuando se ejecuten desde el servidor.
- Para manejar eventos del navegador, el equipo Angular proporciona la biblioteca previa al arranque. Esta biblioteca almacena en buffer los eventos y los reproduce una vez que se carga el script del lado del cliente.
- Al utilizar Angular Universal, el servidor renderizará previamente páginas que serán visibles para los usuarios; sin embargo, las interacciones serán limitadas. Una vez que la aplicación del lado del cliente se carga en segundo plano, pasará sin problemas de mostrar las páginas renderizadas por el servidor a la aplicación del lado del cliente.
Useful resources
- Guía universal Angular
- Ignite UI
- Terminología de renderizado del lado del servidor
- Comenzando con Ignite UI for Angular
- Guía de la CLI Ignite UI
- Ignite UI for Angular