Después de actualizar a Angular 9, aparece el error ReferenceError: window is not defined al ejecutar yarn serve:ssr .
En nuestras aplicaciones Angular, usamos el truco con Domino para emular la ventana de SSR (como en https://github.com/Angular-RU/angular-universal-starter/blob/master/server.ts#L21 ).
Entonces, después de la ng update , agregué estas líneas después de las importaciones en server.ts :
const distFolder = join(process.cwd(), 'dist/browser'); const indexHtml = existsSync(join(distFolder, 'index.original.html')) ? 'index.original.html' : 'index'; // Emulate browser APIs const domino = require('domino'); const fs = require('fs'); const templateA = fs.readFileSync(join(distFolder, indexHtml)).toString(); const win = domino.createWindow(templateA); win.Object = Object; win.Math = Math; global['window'] = win; global['document'] = win.document; Sin embargo, parece que la configuración de global['window'] está ocurriendo demasiado tarde o nunca.
¿Tiene alguna idea de dónde configurar global['window'] para que los componentes angulares y las bibliotecas puedan acceder a él en SSR?
Resuelto, gracias a este comentario https://github.com/angular/universal/issues/1678#issuecomment-627031128
La clave es tener línea
import { AppServerModule } from './src/main.server'; después de la definición de global['window']
Tenga cuidado con los formateadores automáticos en su editor, que generalmente colocan las líneas de importación en la parte superior del archivo automáticamente :)
Lo puse debajo de las importaciones y arriba del método app()
import { ngExpressEngine } from '@nguniversal/express-engine'; import * as express from 'express'; import { join } from 'path'; import { AppServerModule } from './src/main.server'; import { APP_BASE_HREF } from '@angular/common'; import { existsSync, readFileSync } from 'fs'; import * as domino from 'domino'; import * as core from 'express-serve-static-core'; const template = join('browser', 'index.html'); const win = domino.createWindow(template); global['window'] = win; global['document'] = win.document; // The Express app is exported so that it can be used by serverless Functions. export function app(): core.Express {Hago dos tareas para arreglarlo.
primero: en angular.json establece "optimización": falso para la compilación del servidor, ayuda a encontrar el módulo paty 3d que llama error
segundo - subo domino en mi server.ts