Angular 9 SSR Build Serve eror - ОШИБКА ReferenceError: документ не определен - PullRequest
1 голос
/ 11 марта 2020

ОШИБКА ReferenceError: документ не определен

import { readFileSync } from 'fs';
const domino = require('domino');  // import the library `domino`
const DIST_FOLDER = join(process.cwd(), 'dist/browser');
const template = readFileSync(join(DIST_FOLDER, 'index.html')).toString(); // use `index.html` as template
const win = domino.createWindow(template); // create object Window
global['window'] = win;
global['Event'] = win.Event;               // assign the `win.Event` to prop `Event`
global['document'] = win.document;

Даже добавление этого в Server.ts Исправление проблемы, но в производительности TTFB Время слишком высоко. У кого есть решение ...?

Ответы [ 3 ]

1 голос
/ 11 марта 2020

попробуйте использовать константу DOCUMENT, предоставляемую пакетом @ angular / common

import { Inject, Injectable } from '@angular/core';
import { DOCUMENT } from '@angular/common';

@Injectable()
export class MyService {
  constructor(@Inject(DOCUMENT) private document: Document) {}
}
0 голосов
/ 12 марта 2020

Несмотря на название, похоже, ваш вопрос скорее о медленном TTFB, чем об ошибке с document неопределенной.

Что касается этой неопределенной ошибки документа, решение может быть следующим:

  • используйте следующую инъекцию @Inject(DOCUMENT) private document, если ошибка появляется в вашем собственном коде

  • используйте domino, если ошибка появляется в сторонних библиотеках, если вы не можете заменить эти библиотеки другими, которые работают с angular universal.

To решить медленный TTFB, нет решения волхвов c. Старайтесь избегать рендеринга компонентов, которые не обязательно должны быть отрисованы на стороне сервера, убедитесь, что у вас нет длительных вызовов API, используйте кэширование

0 голосов
/ 11 марта 2020

К таким глобальным переменным относятся окно, документ, localStorage, indexedDB, setTimeout и setInterval, которые нельзя использовать в angular универсальном приложении

Использовать объект документа из общего модуля Anguar

Импорт из библиотеки

import { DOCUMENT } from '@angular/common';

Ввод в эксплуатацию

@Inject(DOCUMENT) private document: Document,
...