Angular 2 - 如何使用 prerender.io 和延迟加载

Chr*_*odz 5 javascript seo prerender typescript angular

由于 Angular Universal 在很长一段时间内都不会出现在 CLI 中,我必须使用 prerender.io 来让 SEO 正常工作。然而,经过一些测试,它似乎并没有那么好,因为它似乎没有等待延迟加载的模块,所以 SEO 仍然失败。

在他们这个位置的网站上,他们这样说:

您的页面是否仅部分呈现?

我们的 Prerender 服务器会尽力通过计算进行中的请求数来确定页面何时完成加载。一旦飞行中的请求数达到零,我们等待一小段时间,然后保存 HTML。如果这太早保存页面,您可以使用我们的 window.prerenderReady 标志通知服务器您的页面已准备好保存。

把它放在你的 HTML 中:

<script> window.prerenderReady = false; </script>
Run Code Online (Sandbox Code Playgroud)

当我们看到 window.prerenderReady 设置为 false 时,我们将等到它设置为 true 以保存 HTML。当您的页面准备就绪时(通常在 ajax 调用之后)执行此操作:

window.prerenderReady = true;
Run Code Online (Sandbox Code Playgroud)

这是我不明白如何去做的地方。由于 Angular 从模板中删除脚本标签(不确定这只是 CLI 行为还是 Angular 本身),我无法设置初始脚本标签。我也无法弄清楚如何从我的组件类更新模板脚本标签内的window属性prerenderReady,因为我不能只使用window.prerenderReady = true并期望它工作,因为必须将脚本添加到模板中。

有没有人设法解决这个问题或对我如何实现这一目标有任何想法?

小智 0

消除:server.use(prerender.removeScriptTags());

prerender.io 可以设置为保留在脚本中,以便它们可以运行。

我的 Meteor-Angular2 设置也给了我同样的悲伤。我的页眉和页脚模块将呈现,但不会呈现我的路由器出口输出。我将:放在
<script> window.prerenderReady = false; </script>
我的主index.html(包含主 <app></app>标签)上,并将:
window.prerenderReady = true;
放在最后一个回调的末尾。然后我注释掉:在我的预渲染服务器
//server.use(prerender.removeScriptTags());
的 server.js 中- 它最终正确渲染。