Aurelia服务器端呈现-避免不必要的客户端api调用

Aurelia服务器端呈现-避免不必要的客户端api调用,aurelia,server-side-rendering,Aurelia,Server Side Rendering,我有一个基于Aurelia CLI 1.2.x和Webpack 4的应用程序,并使用服务器端渲染,因为搜索引擎索引是必不可少的 大约160多页是纯文本页面;这些通常是静态页面,但内容实际上是从数据库检索的 由于这些页面是通过CMS管理的,而且许多页面可以随意添加,所以我在Aurelia中有一个catch all模块,负责获取内容并显示它 catch all.js: 从'aurelia-I18N'导入{I18N}; 从“aurelia框架”导入{inject}; 从“plugin/static c

我有一个基于Aurelia CLI 1.2.x和Webpack 4的应用程序,并使用服务器端渲染,因为搜索引擎索引是必不可少的

大约160多页是纯文本页面;这些通常是静态页面,但内容实际上是从数据库检索的

由于这些页面是通过CMS管理的,而且许多页面可以随意添加,所以我在Aurelia中有一个catch all模块,负责获取内容并显示它

catch all.js

从'aurelia-I18N'导入{I18N};
从“aurelia框架”导入{inject};
从“plugin/static content/static content”导入{StaticContent};
从“插件/服务模型”导入{StaticContentService};
从“aurelia路由器”导入{Router};
@注入(StaticContentService、I18N、路由器)
导出类CatchAll{
构造函数(staticContentService、i18n、路由器){
这是。_staticContentService=staticContentService;
this.language=i18n.getLocale();
this.router=路由器;
}
异步canActivate(参数){
常量路径=参数路径;
让结果=等待StaticContent.isStaticContent(路径,this.\u staticContentService,this.language);
如果(结果){
this.page=PLATFORM.moduleName(“静态内容”);
this.context=结果;
}
如果(!this.page){
此.router.navigateToRoute(“未找到”);
}
}
}
使用非常简单的html对应项,
catch all.html


静态方法
StaticContent.isStaticContent
是获取页面实际html内容的地方:

静态异步isStaticContent(路径、staticContentService、语言){
试一试{
设url=path.slice(1);
let page=wait staticContentService.getByUrl(url,语言);
如果(!第页){
返回false;
}
返回{page:page};
}捕获(e){
错误(e);
返回e;
}
}
app.js
中的
catch all
模块配置如下:

config.mapUnknownRoutes(导航说明=>{
返回{moduleId:PLATFORM.moduleName(“catch all”)};
});
正如我所说,这是基于Aurelia的服务器端渲染方法,使用
Koa
aureliaKoaMiddleware
,等等

问题 这种方法工作正常,如果我检查network选项卡,第一个请求就会返回完全呈现的html。 之后,客户端会发出各种请求以获取图像等,但最后一个请求是
staticContentService.getByUrl(url,language)
以再次获取页面内容

这不仅看起来是一种浪费,而且是对SEO的惩罚

有没有一种方法(特定于Aurelia或通用Node.js)可以将预呈现的内容从ssr呈现的html传输到客户端调用


我知道ReactJs有内置的方法来处理这个问题,Angular 5+有“状态转移API”来解决这个问题。

很高兴看到它为您工作。对于静态内容,您是否有可能将这些内容序列化到页面中,并在以后动态页面时从页面中获取这些内容,而不是发出请求?谢谢@bigopon。在预渲染之后,我可以访问膝关节炎中的预渲染HTML。(在
server.js
中)。但我不确定在奥雷莉亚“绘制”应用程序时,我会如何重用它。有什么建议吗?可能是这样的:
let page=wait(window.languageJson | | staticContentService.getByUrl(url,language))有趣。但是,在膝关节炎中运行时,代码< >窗口> /代码>是否可用?我会试一试,然后再向你汇报,这样你就可以在有效的情况下得到你的答案;)我相信,在引导过程中,窗口应该由aurelia-pal-nodejs全局提供。如果没有,您可以在输入脚本中轻松地执行此操作。即使不是,也可能只是一个包含大量文本的元素,或者是要提取的属性