【问题标题】:Is it possible to prevent RE-fetching with Angular Universal Prerendering?是否可以使用 Angular Universal Prerendering 防止重新获取?
【发布时间】:2021-12-16 11:25:15
【问题描述】:

假设我们有这个 Post 组件:

@Component({
  template: `
    <div 
      *ngIf="post$ | async as post" 
      [innerHTML]="post.content">
    </div>
  `,
})
export class Post implements OnInit {
  post$!: Observable<Post>;

  constructor(private http: HttpClient, private route: ActivatedRoute) {}

  ngOnInit(): void {
    this.post$ = this.route.paramMap.pipe(
      switchMap((params) => {
        const slug = params.get('slug') ;
        return this.http.get<Post>(`${env.apiUrl}/posts/${slug}`);
      })
    );
  }
}

当我们预渲染帖子页面时:

ng run myapp:prerender --routes-file routes.txt

他们的数据被获取并成功生成了 HTML。但是当我们启动生成的静态内容时,它们仍然会重新获取数据。

是否可以防止重新获取?还是不推荐?

【问题讨论】:

    标签: typescript angular-universal


    【解决方案1】:

    它是内置的,使用TransferHttpCacheModule

    它允许在生成的 HTML 代码的script 元素中序列化在服务器端获取的数据。然后在浏览器中,TransferHttpCacheInterceptor 拦截每个 HTTP 请求并检查该数据是否有相应的条目。它使用&lt;http_verb&gt;.&lt;url&gt; 作为键。

    每个缓存条目在使用后立即失效,以便将来使用相同 &lt;http_verb&gt;.&lt;url&gt; 键的请求发送到后端。

    【讨论】:

    • 好的,我已经做到了。我认为问题在于我实际上正在使用apollo-angularapollo-angular.com/docs/data/queries#basic-queries)。似乎没有将这种行为整合为默认行为,我应该有精确的。 apollo-angular 也可以做到吗?
    • 我想我最好再问一个问题,用另一个代码sn-p
    • 我不知道apollo-angular,但如果您有与拦截器顺序相关的问题,您可能对this question 感兴趣。基本上结论是模块声明顺序对确定拦截器顺序很重要。
    • @acmoune 我实际上浏览了apollo-angular 存储库,我注意到它是@apollo/client 的包装器,它是一个更通用的客户端。由于它不使用 Angular 的 HttpClientModule,它不会与 TransferHttpCacheModule 集成
    • apollo-angular 支持 SSR,但必须使用 HttpLink (apollo-angular.com/docs/performance/server-side-rendering/…)。我看到了我的问题。我放置加载 gif 的方式,无论请求是否发出,它都会显示出来。它是固定的。非常感谢@Guerric
    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2017-07-05
    • 2011-05-31
    • 1970-01-01
    • 2017-07-30
    • 2021-01-20
    相关资源
    最近更新 更多