使用 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 是计划支持或更新版本支持的功能的补丁。

相关文章
|
17天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
15天前
|
JavaScript 搜索推荐 前端开发
理解服务器端渲染(SSR):提高网页性能与SEO的秘籍
理解服务器端渲染(SSR):提高网页性能与SEO的秘籍
|
12天前
|
SQL 安全 网络安全
美国高防云服务器能防御哪些攻击? - 蓝易云
高防云服务器通常具有一定的防御能力,可以帮助抵御这些攻击。然而,防御的效果也取决于服务器的配置和管理,以及应用程序的安全性。
52 0
|
17天前
|
资源调度
在 Next.js 中使用自定义服务器框架进行服务器端渲染
在 Next.js 中使用自定义服务器框架进行服务器端渲染
Next.js 的服务器端渲染框架集成
Next.js 的服务器端渲染框架集成
|
17天前
|
Ubuntu Android开发 数据安全/隐私保护
【Android平板编程】远程Ubuntu服务器Code-Server编程写代码
【Android平板编程】远程Ubuntu服务器Code-Server编程写代码
|
17天前
|
JavaScript 前端开发 搜索推荐
Vue 的服务器端渲染(SSR)和客户端渲染(CSR)在渲染过程、性能、用户体验等方面都存在显著的区别
【5月更文挑战第8天】Vue 的 SSR 和 CSR 在渲染上有明显差异。SSR 服务器端生成 HTML 返回给浏览器,提供更快首屏加载和更好的 SEO,但增加服务器负担。CSR 客户端渲染,首次加载可能较慢,但交互更流畅,开发更简单。两者各有优劣,需根据项目需求权衡选择。
20 2
|
17天前
|
数据采集 资源调度 前端开发
React的服务器端渲染:使用ReactDOMServer进行高效页面预渲染
【4月更文挑战第25天】使用ReactDOMServer,React支持服务器端渲染以实现高效预渲染。通过在Node.js环境中将React组件转化为HTML字符串,减少客户端JavaScript负载和渲染时间。优点包括更快首屏加载、改善SEO和兼容无JavaScript环境,但也会增加服务器负载、复杂性和状态管理挑战。开发者需根据项目需求平衡SSR和CSR。
|
17天前
|
缓存 JavaScript 前端开发
Vue的服务端渲染:Vue的服务器端渲染(SSR)技术详解
【4月更文挑战第24天】Vue的服务器端渲染(SSR)能解决SPA的首屏加载和SEO问题。SSR预渲染HTML,提升首屏速度,改善SEO,提供更好的用户体验。Nuxt.js是Vue的SSR框架,简化开发流程。但SSR增加服务器压力,开发成本高,且需处理缓存问题。选择SSR需权衡优劣。本文旨在帮助理解Vue SSR原理、优势及实践方法。
|
17天前
|
网络协议 Ubuntu Linux
iPad Pro “买后生产力” - 在iPad上远程连接服务器编程写代码【公网远程】
iPad Pro “买后生产力” - 在iPad上远程连接服务器编程写代码【公网远程】
http://www.vxiaotou.com