- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
服务器 (ssr) 在呈现页面时向 API 发出请求,但浏览器也会发出相同的请求,这意味着对已从服务器获取的数据进行双重请求。
我找到了两个解决方案来解决这个问题。
第一个是使用 TransferHttpCacheModule ,我唯一要做的就是将这个模块添加到 appModule
第二种是直接使用 transfer state api,这意味着我必须在每个服务或解析器中手动添加一些依赖于 transfer state api 的逻辑,它执行 http 请求。例如:
我必须改变这个解析器
@Injectable()
export class CourseResolver implements Resolve<Course> {
constructor(private coursesService: CoursesService) {}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Course> {
const courseId = route.params['id'];
return this.coursesService.findCourseById(courseId);
}
}
为此,为了避免浏览器的二次请求。
@Injectable()
export class CourseResolver implements Resolve<Course> {
constructor(
private coursesService: CoursesService,
@Inject(PLATFORM_ID) private platformId,
private transferState:TransferState) {}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Course> {
const courseId = route.params['id'];
const COURSE_KEY = makeStateKey<Course>('course-' + courseId);
if (this.transferState.hasKey(COURSE_KEY)) {
const course = this.transferState.get<Course>(COURSE_KEY, null);
this.transferState.remove(COURSE_KEY);
return of(course);
}
else {
return this.coursesService.findCourseById(courseId)
.pipe(
tap(course => {
if (isPlatformServer(this.platformId)) {
this.transferState.set(COURSE_KEY, course);
}
})
);
}
}
}
我的问题是这两者有什么区别?哪一个更好? (为什么?)或者 TransferHttpCacheModule
在幕后做与第二种解决方案相同的事情?
最佳答案
使用 TransferHttpCacheModule
(请参阅 documentation )是最简单的选择,并且通过使用拦截器实现您在解析器中尝试实现的目标。
When the module is installed in the application NgModule, it will intercept HttpClient requests on the server and store the response in the TransferState key-value store. This is transferred to the client, which then uses it to respond to the same HttpClient requests on the client.
差异取决于您如何实现您的逻辑。
例如,通过查看您的解析器代码,如果它被使用了 3 次,那么您最终将收到 2 个 API 请求,因为您在使用它之后清除了缓存。
当使用 TransferHttpCacheModule
时,如果有任何 POST 请求并且当应用程序变得稳定时,缓存将停止;所以一旦你是客户端并且页面已经呈现并且客户端应用程序接管了。
使用您的代码,即使应用程序运行在客户端,它也会继续使用缓存
关于angular - TransferHttpCacheModule 与 transferstate api 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62221166/
我的项目需要以下模块: 翻译模块LocalizeRouterModuleTransferHttpCacheModule 不知何故,这种模块组合会产生循环依赖。 TranslateModule 与 Tr
我正在开发一个 Angular Universal 应用程序,并试图以最有效的方式防止服务器/客户端上的重复 HTTP 调用。我已经能够通过使用 ServerTransferStateModule 完
服务器 (ssr) 在呈现页面时向 API 发出请求,但浏览器也会发出相同的请求,这意味着对已从服务器获取的数据进行双重请求。 我找到了两个解决方案来解决这个问题。 第一个是使用 TransferHt
我已经使用 Angular Universal 建立了一个 Angular 8 项目。为了防止重复的 HTTP 调用,Angular 提供了 TransferHttpCacheModule。 我按照官
我是一名优秀的程序员,十分优秀!