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

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

时间:2023-02-18 21:45:39浏览次数:40  
标签:core 服务器端 Universal ts module angular NgModule import Angular

如果无法从 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 是计划支持或更新版本支持的功能的补丁。

标签:core,服务器端,Universal,ts,module,angular,NgModule,import,Angular
From: https://www.cnblogs.com/sap-jerry/p/17133692.html

相关文章

  • 使用 Angular Universal 进行服务器端渲染避免 window is not defined 的错误消息
    尽管Universal项目的目标是能够在服务器上无缝呈现Angular应用程序,但开发人员还是应该考虑一些注意事项。首先,服务器和浏览器环境之间存在明显差异。在服务器上呈现......
  • 关于 Angular Universal 应用执行时需要 Browser API 的问题
    由于AngularUniversalApplication不在浏览器中执行,因此服务器上可能缺少某些浏览器API和功能。例如,服务器端应用程序不能引用仅供浏览器使用的全局对象,例如Window,D......
  • 关于服务器端渲染的 Web 应用的 504 错误问题
    除非客户在SSR中添加了用于显式发送504的自定义逻辑,否则504不会来自SSR。在默认的Spartacus/SSR中,没有显式发送504的逻辑。默认情况下它只发送200或500(仅......
  • 关于 Angular 应用的入口
    ANGULAR.JSON是包含Angular项目的各种属性和配置的文件。这是构建器首先引用的文件,用于查找所有路径和配置并检查哪个是主文件。下面是一个hello-world应用程序的ang......
  • Angular 应用里 index.html 的作用
    index.html位于应用程序的src文件夹中。编译器在此文件的末尾动态添加所有javascript文件。由于现在所有组件都是已知的,因此html文件调用根组件即app-root。根......
  • 关于 Angular Universal 应用执行时需要 Browser API 的问题
    由于AngularUniversalApplication不在浏览器中执行,因此服务器上可能缺少某些浏览器API和功能。例如,服务器端应用程序不能引用仅供浏览器使用的全局对象,例如Window,Do......
  • 创建Socket-服务器端
    网上搜的资料,在这里简单记录一下用途:Socket可以实现软件与软件之间的通信流程:创建Socket——创建网络端口——将Socket与端口绑定——设置最大连接数——监听连线 创建......
  • Angular CLI - NodeJS 兼容版本
    |AngularCLI|Angular|NodeJS|TypeScript|RxJSVersion||-----------|----------......
  • angular - 路由
    路由配置最简单,一个配置项包含了path和component两个属性创建根路由模块需要注意的是,根路由模块默认提供的路由策略为PathLocationStrategy。该策略要求应用必......
  • 服务器端没有这个数据源,你怎么填报呢?
    皕杰报表填报失败问题的分析解决最近有人连续多日针对皕杰报表填报发问,在设计器上好好的,放到服务器就存储失败,且在控制台没有任何错误信息。而展现报表却都能正常显示,这又是......