【发布时间】:2018-06-20 23:00:18
【问题描述】:
我使用 TransferState API 创建了一个 ApiService 来缓存来自 wordpress 的数据:
get(url, id) {
const key = makeStateKey(id);
if (this.transferState.hasKey(key)) {
const item = this.transferState.get(key, null);
return of(item);
} else {
return this.http.get(url).pipe(
map(items => {
this.transferState.set(key, items);
return items;
})
);
}
}
然后我用它来获取数据:
this.apiService.get(environment.url + '/wp-json/wp/v2/posts').subscribe(res => {
this.posts = res;
});
这很好用,运行时,第一次调用 API,第二次总是被缓存。
静态生成时:
/index.html
<script id="my-app-state" type="application/json">
<!-- top level page data -->
</script>
/posts/index.html
<script id="my-app-state" type="application/json">
<!-- top level page data -->
<!-- posts data -->
</script>
如果我登陆确切的 html 页面 /posts/index.html,则从 TransferState 缓存中加载数据 https://kmturley.github.io/angular-universal-wordpress-cms/frontend/dist/browser/sample-page
如果我登陆 /index.html,并导航到 /posts 它使用 html5 路由,则脚本标签中的数据不可用。而是通过 http 加载 https://kmturley.github.io/angular-universal-wordpress-cms/frontend/dist/browser/
据我了解,原因是因为您登陆了一个真正的静态 index.html 文件,其中包含导航时的 then ,所有后续页面都没有加载 .html 文件,它们实际上是 html5 路由/posts。
所以问题是,如何让 TransferState 缓存使用静态生成的 /posts/index.html 文件?
可能的解决方案:
- 预先加载所有数据(有效,但每个页面为 1.1MB)
- 将数据放入可以通过ajax加载的静态文件
- 禁用 html5 路由,因此用户使用正确的脚本标签点击静态 .html 文件
- 一些未记录的角度解决方案??
静态生成的演示:
https://kmturley.github.io/angular-universal-wordpress-cms/frontend/dist/browser/
静态生成源:
https://github.com/kmturley/angular-universal-wordpress-cms/tree/gh-pages/frontend/dist/browser
完整的代码库在这里:
【问题讨论】:
-
TransferState 数据仅适用于服务器端已加载的数据。其目的是避免两次发出相同的请求(一次是在预渲染时,一次是在实际的 Angular 应用程序接管时)。正如您所指出的,当您从
/index.html导航到/posts时,它是客户端导航,使用 Angular 的路由器。因此,/posts没有可用的 TransferData。调用wordpress api有什么问题? -
我希望一切都是静态的,以减少 WordPress 的负载和安全性。考虑到数据就在那里,就在另一个 index.html 文件中,应该有办法吗?我可能不得不拼凑出一个解决方案
-
如果您希望所有内容都是静态的,则需要预渲染所有页面。 Angular Universal 可以为您做到这一点。然后,您可以按照您的建议以某种方式停用路由器客户端。但这不是真正的角度方式
-
我通过生成静态 json 文件创建了一个解决方法! github.com/kmturley/angular-universal-wordpress-cms/commit/… 虽然不为它的 hackiness 感到自豪
-
总比停用路由器好,你不应该为此感到难过=)
标签: angular angular-universal static-generator angular-transfer-state