使用 Angular Universal 进行服务器端渲染的防御性编程思路

简介: 使用 Angular Universal 进行服务器端渲染的防御性编程思路

如果无法从 Angular 平台注入所需的正确全局值,则可以避免调用浏览器代码,只要不需要在服务器上访问该代码即可。 例如,全局窗口元素的调用通常是为了获取窗口大小或其他一些视觉方面。 但是,在服务器上,没有 screen 的概念,所以很少需要这个功能。


开发人员可能会在网上和其他地方阅读到推荐的方法是使用 isPlatformBrowser 或 isPlatformServer,这个指导值得商榷。


这是因为这样做的话,最终会在应用程序代码中创建特定于平台的代码分支。 这不仅不必要地增加了应用程序的大小,而且还增加了必须维护的复杂性。 通过将代码分离到单独的特定于平台的模块和实现中,基本代码可以保留业务逻辑,并且特定于平台的异常将按应有的方式处理:在个案抽象的基础上。 这可以使用 Angular 的依赖注入 (DI) 来完成,以便在运行时删除有问题的代码并放入替换代码。


下面是一个例子。


为浏览器环境和服务器环境分别创建不同的 service 类:


// window-service.ts
import { Injectable } from '@angular/core';
@Injectable()
export class WindowService {
  getWidth(): number {
    return window.innerWidth;
  }
}
// server-window.service.ts
import { Injectable } from '@angular/core';
import { WindowService } from './window.service';
@Injectable()
export class ServerWindowService extends WindowService {
  getWidth(): number {
    return 0;
  }
}


在服务器端 module 里,使用 Angular 注入框架,注入 ServiceWindowService 实现:

// app-server.module.ts
import {NgModule} from '@angular/core';
import {WindowService} from './window.service';
import {ServerWindowService} from './server-window.service';
@NgModule({
  providers: [{
    provide: WindowService,
    useClass: ServerWindowService,
  }]
})



如果第三方提供的组件不是开箱即用的通用兼容组件,则除了基本应用程序模块之外,您还可以为浏览器和服务器(您应该已经拥有的服务器模块)创建两个单独的模块。 基本应用程序模块将包含所有与平台无关的代码,浏览器模块将包含所有特定于浏览器/服务器不兼容的代码,反之亦然用于服务器模块。 为了避免编辑过多的模板代码,您可以创建一个空操作组件以插入库组件。 这是一个例子:


// example.component.ts
import { Component } from '@angular/core';
@Component({
  selector: 'example-component',
  template: `<library-component></library-component>`, // this is provided by a third-party lib
  // that causes issues rendering on Universal
})
export class ExampleComponent {}



app module:


// app.module.ts
import {NgModule} from '@angular/core';
import {ExampleComponent} from './example.component';
@NgModule({
  declarations: [ExampleComponent],
})


浏览器端 module:


// browser-app.module.ts
import {NgModule} from '@angular/core';
import {LibraryModule} from 'some-lib';
import {AppModule} from './app.module';
@NgModule({
  imports: [AppModule, LibraryModule],
})


// library-shim.component.ts
import { Component } from '@angular/core';
@Component({
  selector: 'library-component',
  template: '',
})
export class LibraryShimComponent {}


服务器端 module:


// server.app.module.ts
import { NgModule } from '@angular/core';
import { LibraryShimComponent } from './library-shim.component';
import { AppModule } from './app.module';
@NgModule({
  imports: [AppModule],
  declarations: [LibraryShimComponent],
})
export class ServerAppModule {}


shim 是针对特定平台永远不支持的功能的补丁。polyfill 是计划支持或更新版本支持的功能的补丁。



相关文章
|
数据采集 JavaScript 前端开发
使用 Angular Universal 实现服务器端渲染
使用 Angular Universal 实现服务器端渲染
使用 Angular Universal 实现服务器端渲染
|
1月前
|
Ubuntu JavaScript 关系型数据库
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客
在阿里云Ubuntu 20.04服务器上部署Ghost博客的步骤包括创建新用户、安装Nginx、MySQL和Node.js 18.x。首先,通过`adduser`命令创建非root用户,然后安装Nginx和MySQL。接着,设置Node.js环境,下载Nodesource GPG密钥并安装Node.js 18.x。之后,使用`npm`安装Ghost-CLI,创建Ghost安装目录并进行安装。配置过程中需提供博客URL、数据库连接信息等。最后,测试访问前台首页和后台管理页面。确保DNS设置正确,并根据提示完成Ghost博客的配置。
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客
|
1月前
|
存储 弹性计算 数据可视化
要将ECS中的文件直接传输到阿里云网盘与相册(
【2月更文挑战第31天】要将ECS中的文件直接传输到阿里云网盘与相册(
420 4
|
1月前
|
SQL 弹性计算 安全
购买阿里云活动内云服务器之后设置密码、安全组、增加带宽、挂载云盘教程
当我们通过阿里云的活动购买完云服务器之后,并不是立马就能使用了,还需要我们设置云服务器密码,配置安全组等基本操作之后才能使用,有的用户还需要购买并挂载数据盘到云服务器上,很多新手用户由于是初次使用阿里云服务器,因此并不知道这些设置的操作流程,下面给大家介绍下这些设置的具体操作流程。
购买阿里云活动内云服务器之后设置密码、安全组、增加带宽、挂载云盘教程
|
21天前
|
弹性计算
阿里云ECS使用体验
在申请高校学生免费体验阿里云ECS云服务器后的一些使用体验和感受。
|
1月前
|
弹性计算
阿里云3M带宽云服务器并发多大?阿里云3M带宽云服务器测评参考
在探讨云服务器3M带宽能支持多大并发这一问题时,我们首先要明白一个关键点:并发量并非仅由带宽决定,还与网站本身的大小密切相关。一般来说,一个优化良好的普通网站页面大小可能只有几K,为便于计算,我们可以暂且假定每个页面大小为50K。
821 1
|
1天前
|
弹性计算 运维 安全
阿里云ecs使用体验
整了台服务器部署项目上线
|
1天前
|
存储 小程序 数据库
阿里云学生云服务器申请,阿里云送每个大学生一台云服务器
2024年,阿里云为学生提供免费7个月的学生服务器,包括2核2G配置、1M带宽和独立IP。学生需通过学信网认证,完成任务可额外获得6个月免费时长。申请流程包括注册阿里云账号、实名认证和学生认证。此外,学生可免费领取300元无门槛优惠券,在阿里云高校计划中使用。学生服务器可用于建站、部署等多种场景。详细信息和申请入口见官方链接。
12 0
|
3天前
|
弹性计算
阿里云ECS的使用心得
本文主要讲述了我是如何了解到ECS,使用ECS的一些经验,以及自己的感悟心得
|
13天前
|
弹性计算 应用服务中间件 Linux
阿里云ECS服务器上从零开始搭建nginx服务器
阿里云ECS服务器上从零开始搭建nginx服务器