使用 Angular Universal 进行服务器端渲染避免 window is not defined 的错误消息

简介: 使用 Angular Universal 进行服务器端渲染避免 window is not defined 的错误消息

尽管 Universal 项目的目标是能够在服务器上无缝呈现 Angular 应用程序,但开发人员还是应该考虑一些注意事项。


首先,服务器和浏览器环境之间存在明显差异。 在服务器上呈现时,您的应用程序处于 ephemeral 或者 Snapshot 状态。


应用程序完全呈现一次,返回生成的 HTML,其余应用程序状态在下一次呈现之前被销毁。


其次,服务器环境本质上不具有与浏览器相同的功能(并且具有一些浏览器同样不具有的功能)。 例如,服务器没有任何cookies 的概念。


固然开发人员可以 polyfill 来一定程度上规避这个问题,但是没有完美的解决方案。


另请注意 SSR 的目标:改进应用程序的初始渲染时间。 这意味着应避免或充分防范任何可能降低此初始渲染中应用程序速度的情况出现。


一些 启用 SSR 后的常见错误:


window is not defined

使用 Angular Universal 时最常见的问题之一是服务器环境中缺少浏览器全局变量。 这是因为 Universal 项目使用 domino 作为服务器 DOM 呈现引擎。 因此,服务器上不会存在或不支持某些功能。 这包括窗口和文档全局对象、cookie、某些 HTML 元素(如画布)和其他几个。 Domino 代表节点中的 DOM.


image.png


解决这个错误的一些思路:


通常,需要的全局变量可以通过 Angular 平台通过依赖注入 (DI) 获得。 例如,全局文档可通过 DOCUMENT 令牌获得。 此外,通过 DOCUMENT 对象可以获得 window 和 location 的非常原始的版本。 例如:


示例代码如下:


import { Injectable, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
@Injectable()
export class ExampleService {
  constructor(@Inject(DOCUMENT) private _doc: Document) {}
  getWindow(): Window | null {
    return this._doc.defaultView;
  }
  getLocation(): Location {
    return this._doc.location;
  }
  createElement(tag: string): HTMLElement {
    return this._doc.createElement(tag);
  }
}
相关文章
|
1月前
|
搜索推荐 SEO 缓存
为什么 Angular 服务器端渲染只面向匿名用户,没有用户上下文
为什么 Angular 服务器端渲染只面向匿名用户,没有用户上下文
10 0
|
4月前
|
网络协议 JavaScript
Angular 服务器端渲染应用里重用 TCP 连接的示例代码
Angular 服务器端渲染应用里重用 TCP 连接的示例代码
23 0
|
4月前
|
前端开发 JavaScript
Angular 组件模版代码里使用 ngIf 进行条件渲染的例子
Angular 组件模版代码里使用 ngIf 进行条件渲染的例子
23 0
|
5月前
|
JavaScript
【讲人话】Angular如何通过@ViewChildren获取实时渲染的动态DOM节点元素(@ViewChild只能获取静态的固定DOM节点)
【讲人话】Angular如何通过@ViewChildren获取实时渲染的动态DOM节点元素(@ViewChild只能获取静态的固定DOM节点)
|
6月前
|
运维 前端开发 JavaScript
基于 Angular Universal 引擎进行服务器端渲染的前端应用 State Transfer 故障排查案例
基于 Angular Universal 引擎进行服务器端渲染的前端应用 State Transfer 故障排查案例
47 0
|
6月前
|
JavaScript 前端开发 API
关于 Angular Universal 应用渲染两次的问题
关于 Angular Universal 应用渲染两次的问题
34 0
|
1月前
|
存储 前端开发 API
浅谈 Angular 应用前端消息显示机制的一个实际需求
浅谈 Angular 应用前端消息显示机制的一个实际需求
12 0
|
3月前
|
设计模式 JavaScript 前端开发
什么是 Angular 应用里的 Custom provider
什么是 Angular 应用里的 Custom provider
32 2
|
4月前
Angular 应用里异步打开对话框的技术实现
Angular 应用里异步打开对话框的技术实现
22 0
|
1月前
|
存储 JavaScript 前端开发
Angular 应用 node_modules 子文件夹 @types 的作用介绍
Angular 应用 node_modules 子文件夹 @types 的作用介绍
15 1

热门文章

最新文章