【问题标题】:Angular 6 | Server side rendering: issue 'window not defined'角 6 |服务器端渲染:问题“未定义窗口”
【发布时间】:2018-12-10 21:55:07
【问题描述】:

我已将我的应用程序从 Angular 版本 5 更新到最新版本。详情如下:

  Angular CLI: 6.2.1
  Node: 8.12.0
  OS: win32 x64
  Angular: 6.1.6

我也在使用this: ng-toolkit-universal 实现服务器端渲染。我可以使用命令 "npm run build:prod" 构建应用程序,但在运行命令时遇到以下问题:"npm run server":

任何人都可以请帮助或建议一些解决方案。

提前致谢!

【问题讨论】:

  • 您是否在 Angular 应用程序中使用了 window 对象?如果有,建议使用Renderer2 进行DOM 操作,而不是直接使用windowdocument 对象。
  • 你看过this postthis post的答案了吗?
  • 嗨@SiddAjmera,感谢您的回复!是的,我使用的是窗口对象,但没有使用 Renderer2。让我试试看。
  • 这解释了为什么您会收到此错误。 Angular Universal 在服务器上运行时无法访问 windowdocument 对象。这就是为什么 Angular 团队建议使用 Renderer2
  • @SiddAjmera 实际上,我对此很陌生,并尝试了它。我希望 Renderer2 能解决我的问题。你知道 Angular 6 中有什么好的例子/链接吗?

标签: angular angular6 server-side-rendering angular-seo


【解决方案1】:

假设您已使用 Angular Universal 完成 SSR。导入后将以下代码放入您的 server.ts 中。构建并运行。

const domino = require("domino");
const fs = require("fs");
const path = require("path");
const templateA = fs
  .readFileSync(path.join("dist/browser", "index.html"))
  .toString();
const win = domino.createWindow(templateA);
win.Object = Object;
win.Math = Math;

global["window"] = win;
global["document"] = win.document;
global["branch"] = null;
global["object"] = win.object;
global['HTMLElement'] = win.HTMLElement;
global['navigator'] = win.navigator;
global['localStorage'] = localStorage;

【讨论】:

    猜你喜欢
    • 2020-11-16
    • 2021-12-18
    • 2017-12-30
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 2018-04-26
    • 2018-08-06
    • 2020-07-08
    相关资源
    最近更新 更多