使用服务器端渲染,我们可以保证搜索引擎,与浏览器的Javascript禁用,或没有JavaScript的浏览器仍然可以访问我们的网站内容。

https://b2bspastore.cg79x9wuu9-eccommerc1-p5-public.model-t.myhybris.cloud/powertools-spa/en/USD/

文档:https://sap.github.io/spartacus-docs/server-side-rendering-in-spartacus/#adding-ssr-support-using-schematics-recommended

package.json里添加如下依赖:

 "@angular/platform-server": "~10.1.0","@nguniversal/express-engine": "^10.1.0","@spartacus/setup": "^3.0.0-rc.2","express": "^4.15.2"
  • @angular/platform-server

允许我们在服务器上运行Angular应用程序的技术, 在Angular文档中称为Angular Universal.

Angular Universal通过称为服务器端渲染(SSR)的过程在服务器上生成静态应用程序页面。

根AppModule

打开文件src/app/app.module.ts并在NgModule元数据中找到BrowserModule导入。

将该导入替换为此:

BrowserModule.withServerTransition({appId : ‘your App-ID’ });

如下图所示:

使用以下AppServerModule代码在src/app/目录中创建一个app.server.module.ts文件:

import { NgModule } from '@angular/core';
import {ServerModule,ServerTransferStateModule,
} from '@angular/platform-server';
import { StorefrontComponent } from '@spartacus/storefront';
import { AppModule } from './app.module';@NgModule({imports: [// The AppServerModule should import your AppModule followed// by the ServerModule from @angular/platform-server.AppModule,ServerModule,ServerTransferStateModule,],// Since the bootstrapped component is not inherited from your// imported AppModule, it needs to be repeated here.bootstrap: [StorefrontComponent],
})
export class AppServerModule {}

使用以下代码在src目录中创建一个main.server.ts文件:

/**************************************************************************************************** Load `$localize` onto the global scope - used if i18n tags appear in Angular templates.*/
import { enableProdMode } from '@angular/core';
import '@angular/localize/init';
import { environment } from './environments/environment';if (environment.production) {enableProdMode();
}
export { renderModule, renderModuleFactory } from '@angular/platform-server';
export { AppServerModule } from './app/app.server.module';

Angular在服务端渲染方面提供一套前后端同构解决方案,它就是 Angular Universal(统一平台),一项在服务端运行 Angular 应用的技术。

标准的 Angular 应用会执行在浏览器中,它会在 DOM 中渲染页面,以响应用户的操作。

而 Angular Universal 会在服务端通过一个被称为服务端渲染(server-side rendering - SSR)的过程生成静态的应用页面。

它可以生成这些页面,并在浏览器请求时直接用它们给出响应。 它也可以把页面预先生成为 HTML 文件,然后把它们作为静态文件供服务端使用。

工作原理

要制作一个 Universal 应用,就要安装 platform-server 包。 platform-server 包提供了服务端的 DOM 实现、XMLHttpRequest 和其它底层特性,但不再依赖浏览器。

你要使用 platform-server 模块而不是 platform-browser 模块来编译这个客户端应用,并且在一个 Web 服务器上运行这个 Universal 应用。

服务器(下面的示例中使用的是 Node Express 服务器)会把客户端对应用页面的请求传给 renderModuleFactory 函数。

SEO

网络爬虫不会像人类那样导航到具有高度交互性的 Spartacus Angular 应用,并为其建立索引。

Angular Universal 可以为你生成应用的静态版本,它易搜索、可链接,浏览时也不必借助 JavaScript。它也让站点可以被预览,因为每个 URL 返回的都是一个完全渲染好的页面。

package.json里添加dev dependency:

 "ts-loader": "^6.0.4","@nguniversal/builders": "^10.1.0","@types/express": "^4.17.0",
  • 用于对服务端应用进行转译。

这些文件均需要手动修改:

1. AppServerModule

import { NgModule } from '@angular/core';
import { ServerModule, ServerTransferStateModule } from '@angular/platform-server';
import { ModuleMapLoaderModule } from '@nguniversal/module-map-ngfactory-loader';import { AppBrowserModule } from './app.module';
import { AppComponent } from './app.component';// 可以注册那些在 Universal 环境下运行应用时特有的服务提供商
@NgModule({imports: [AppBrowserModule, // 客户端应用的 AppModuleServerModule, // 服务端的 Angular 模块ModuleMapLoaderModule, // 用于实现服务端的路由的惰性加载ServerTransferStateModule, // 在服务端导入,用于实现将状态从服务器传输到客户端],bootstrap: [AppComponent],
})
export class AppServerModule {}

参考链接:https://www.cnblogs.com/laixiangran/p/8664480.html

服务端应用模块(习惯上叫作 AppServerModule)是一个 Angular 模块,它包装了应用的根模块 AppModule,以便 Universal 可以在你的应用和服务器之间进行协调。 AppServerModule 还会告诉 Angular 在把你的应用以 Universal 方式运行时,该如何引导它。

最后build的dist目录:

client side render(CSR,客户端渲染)模式下,第一个HTTP请求,返回的HTML页面里,cx-storefront标签是空的:

SSR模式下,第一个HTTP请求里,包含了服务器端渲染好的HTML页面:


也可以参考这个文档,进行SAP Spartacus SSR的调试:

How to Debug a Server–Side Rendered Storefront

另一个具体开启 SSR 的步骤

  1. create fresh angular app $ ng new
  2. enter the directory
  3. install spartacus with ssr v3.1.0 using schematics $ng add @spartacus/schematics@3.1.0 --ssr
  4. set backend baseUrl in app.module of the fresh app
  5. disable ssr optimizations by passing null as a second argument of const ngExpressEngine = NgExpressEngineDecorator.get(engine, null); in the file server.ts of your fresh app
  6. if your test backend doesn’t have proper SSL cert, please add at the top of the file server.ts the line:
    process.env.NODE_TLS_REJECT_UNAUTHORIZED = ‘0’;
  7. copy i18n JSON assets to your app:
    cp ./node_modules/@spartacus/assets/i18n-assets ./src/assets -r
  8. in app.module set i18n.debug to true and i18n.backend.loadPath to ‘assets/i18n-assets/{{lng}}/{{ns}}.json’,:
    i18n: {
    chunks: translationChunksConfig,
    backend: {
    loadPath: ‘assets/i18n-assets/{{lng}}/{{ns}}.json’,
    },
    debug: true,
    },
  9. disable Javascript in your browser
  10. run $ yarn dev:ssr
  11. open in the browser http://localhost:4200/

暂时禁用 SAP Spartacus 服务器端渲染引擎的方法

disable SSR Optimizations by passing null as a second parameter to:

NgExpressEngineDecorator.get(engine, null)

传一个 null 进去即可。

更多Jerry的原创文章,尽在:“汪子熙”:

SAP Spartacus 手动开启服务器端渲染 (SSR) 所必须的步骤相关推荐

  1. 大前端学习笔记 -- 搭建自己的服务器端渲染 (SSR)

    搭建自己的服务器端渲染 (SSR) 一.渲染一个Vue实例 mkdir vue-ssr cd vue-ssr npm init -y npm i vue vue-server-renderder se ...

  2. 客户端渲染CSR、服务器端渲染SSR、预渲染Prerendering

    什么是客户端渲染 CSR 在进行SPA(单页面应用)开发时,大多数都会选择Vue.js.默认情况下,会生成vue组件,输出到浏览器,进行生成 DOM 和操作 DOM.使用vue.js开发的项目在浏览器 ...

  3. 1. 服务器端渲染(SSR)简介

    1. 服务器端渲染(SSR)简介 1.1 什么是服务器端渲染(SSR)? Vue.js 是构建客户端应用程序的框架 默认情况下浏览器输出Vue组件,生成DOM并操作DOM 服务器端渲染则是服务器端生成 ...

  4. 服务器端渲染 (SSR)

    什么是服务器端渲染 (SSR)? 客户端渲染:使用 JavaScript 框架进行页面渲染 服务端渲染:服务端将HTML文本组装好,并返回给浏览器,这个HTML文本被浏览器解析之后,不需要经过 Jav ...

  5. 手动安装 SAP Spartacus 3.3.0版本并启用服务器端渲染 SSR

    使用 ng new jerryssr 创建一个空的 Angular 项目: 确保项目创建成功. ng add @spartacus/schematics@latest --baseUrl https: ...

  6. 关于自定义的登录机制在SAP Spartacus服务器端渲染(SSR)实施过程中遇到的问题

    问题背景 某客户使用了第三方的Authentication service来实现Spartacus用户的登录机制: In our project we have integration with MD ...

  7. 关于 SAP Spartacus 服务器端渲染 SSR 无法使用窗口宽度以进行自适应设计的问题

    Storefront 的屏幕布局由可配置的断点(configurable breakpoints)驱动.断点具有可配置的屏幕尺寸(即 < 576px),并且关联的屏幕名称可用于进一步定义布局. ...

  8. 以非生产模式的方式启用SAP Spartacus的服务器端渲染SSR

    思路就是:在package.json里找到对应命令,去除–prod选项: ng build && ng run standalone:server 成功执行: server目录似乎被覆 ...

  9. 为什么使用服务器端渲染 (SSR)?

    什么是 SSR SSR 顾名思义就是 Server-Side Render, 即服务端渲染.原理很简单,就是服务端直接渲染出 HTML 字符串模板,浏览器可以直接解析该字符串模版显示页面,因此首屏的内 ...

最新文章

  1. Linux / TCPIP / 判断 client 已经关闭的方法
  2. java中怎样计算个人所得税计算器,个人所得税计算器
  3. iis6 配置python CGI
  4. java web远程调试工具_java远程调试 - Dendy的个人页面 - OSCHINA - 中文开源技术交流社区...
  5. 4.2 One-Shot 学习
  6. 拉卡拉2020年股东净利润9.31亿 积极布局数字人民币业务
  7. 2020-05-15-用于深度学习训练的分布式多租户GPU集群分析
  8. 富文本编辑器 可全屏可粘贴(只能单独粘贴图片或文字)
  9. 汽车CAN总线入门,通俗易懂
  10. 实验一 网络侦查与网络扫描
  11. Kaldi中语言模型
  12. 负整数补码的三种方法
  13. 计算机音乐野狼,野狼disco(hook部分)单轨调教用
  14. 宇视200W 相机一天所占存储空间是多少
  15. 使用StarUml画数据库ER图,并使用DDL生成SQL代码
  16. Python3 os.mkfifo() 方法、Python3 os.removedirs() 方法
  17. 大蟒蛇python编译器_python蟒蛇绘制
  18. 2022_ECCV_Video Anomaly Detection by Solving Decoupled Spatio-Temporal Jigsaw Puzzles
  19. 自己的第一个Greasy Fork脚本
  20. 20110830 寝室物语

热门文章

  1. golang中的类和接口的使用
  2. HBase原理-要弄懂的sequenceId
  3. css3玩转各种效果【资源】
  4. 初见shell,设置端口参数
  5. 两个时间相差距离多少小时 (精确到秒)
  6. Atitit.js图表控件总结
  7. JavaScript强化教程 —— JavaScript 总结
  8. 产品经理,如何建立自己独特的产品观?(转)
  9. JSP(五):属性范围
  10. 关于 ie8不兼容的一些方法