Как удалить или заменить все console.log в Angular SSR - PullRequest
2 голосов
/ 23 февраля 2020

Я создал angular проект с CLI. когда я запускаю проект, он показывает все console.log, которые я использовал в режиме разработки. Тогда я погуглил и нашел решение. Заменена пустой функцией в производственном режиме, добавив две строки кода в файл main.ts:

if (environment.production) {
  enableProdMode();
  if (window) {
    window.console.log = window.console.warn = window.console.info = window.console.debug = function () {/* no log */ };
  }
}

Это помогает мне избавиться от этой проблемы в производственном режиме и экономит много времени на удаление все console.log строк вручную. Итак, я добавил эти строки в файл main.server.ts также для решения проблемы в SSR.

Но проблема в том, что я строю с angular SSR и запускаю проект он возвращает ошибки:

ReferenceError: window is not defined
    at Object.K011 (C:\xampp\htdocs\10MS\10-minute-school-3.0\dist\server\main.js:1:176367)
    at __webpack_require__ (C:\xampp\htdocs\10MS\10-minute-school-3.0\dist\server\main.js:1:295)
    at Object.0 (C:\xampp\htdocs\10MS\10-minute-school-3.0\dist\server\main.js:1:5525)
    at __webpack_require__ (C:\xampp\htdocs\10MS\10-minute-school-3.0\dist\server\main.js:1:295)
    at +JNS (C:\xampp\htdocs\10MS\10-minute-school-3.0\dist\server\main.js:1:1624)
    at Object.<anonymous> (C:\xampp\htdocs\10MS\10-minute-school-3.0\dist\server\main.js:1:1669)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)

Я понимаю проблему, заключающуюся в том, что в nodejs нет глобальной переменной window. Но мне нужно удалить все console.log строк. Как я могу удалить все console.log строк в SSR build.

1 Ответ

0 голосов
/ 23 февраля 2020

Вместо того, чтобы делать это в файле main.ts , вы можете переопределить консольные методы (log, warn, error и т. Д. c) в app.module.ts файл непосредственно перед инициализацией приложения. Это можно сделать с помощью токена инжектора APP_INITIALIZER, который позволяет запускать некоторые пользовательские логики инициализации c, необходимые для вашего приложения.

PLATFORM_ID - это еще один токен инжектора, который предоставляется Angular один раз. платформа инициализируется (платформой может быть сервер, браузер или веб-работник), и она доступна до инициализации приложения. Используя этот токен, мы можем определить платформу с помощью метода isPlatformBrowser(platformId), который возвращает true, если платформа является браузером.

Мы можем объединить две вышеупомянутые стратегии, чтобы переопределить консольные методы, как показано ниже.

app.module.ts

import {
  NgModule,
  Injector,
  APP_INITIALIZER,
  PLATFORM_ID
} from "@angular/core";
import { isPlatformBrowser, isPlatformServer } from "@angular/common";
import { environment } from '../environments/environment';
...

/**
 * Factory method to override the console methods
 * during app initialization
 */
function silenceConsoleMethods(injector: Injector) {
  return () => {
    const platformId = injector.get(PLATFORM_ID);
    if (isPlatformBrowser(platformId) && environment.production) {
      window.console.log = window.console.debug = window.console.warn = window.console.error = () => {};
    } else if (isPlatformServer(platformId)) {
      console.log = console.debug = console.warn = console.error = () => {};
    }
  };
}

@NgModule({
  ...
  providers: [
    {
      provide: APP_INITIALIZER,
      useFactory: silenceConsoleMethods,
      deps: [Injector],
      multi: true
    }
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}

Вы можете найти рабочую версию приведенного выше примера в Stackbliz здесь . Чтобы продемонстрировать, как работает решение, я переопределил все методы ведения журнала консоли, кроме ошибок, чтобы отобразить сообщения об ошибках на консоли.

PS:

Вы можете использовать isPlatformServer(platformId) для определите, является ли платформа серверной, и выполните любые логики инициализации c, связанные с рендерингом на стороне сервера.

Редактировать:

Обновлено silenceConsoleMethods() в приложении Файл .module.ts для переопределения объекта консоли, когда приложение отображается с использованием Nodejs среды выполнения. Теперь вы не должны сталкиваться с какими-либо проблемами, когда приложение отображается на стороне сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...