Jerry在2020 SAP全球技术大会的分享:SAP Spartacus技术介绍的文字版
這是Jerry 2020年的第86篇文章,也是汪子熙公眾號總共第268篇原創(chuàng)文章。
這篇文章的視頻版本如下:
https://v.qq.com/x/page/b3212l6kqvg.html
這個分享是SAP 2020全球技術大會(SAP TechEd),“客戶自主”時代的極致體驗分論壇內容之一:
本文的分享主要分為以下四個方面來介紹Spartacus.
首先,通過Spartacus四大特性的介紹,讓大家對作為SAP Commerce Cloud新一代Storefront這個電商前臺店鋪應用有一個直觀的了解。Spartacus的首頁如下圖所示,其logo是一個印有閃電的購物袋,象征著Spartacus能為用戶帶來流暢快捷的在線購物體驗。
其次,通過和Commerce Cloud原有的基于Accelerator技術的Storefront相比較,讓大家了解SAP推出Spartacus的原因是什么。
緊接著,是Spartacus技術架構的簡要介紹。
最后,可能是SAP Commerce從業(yè)者比較關心的一個話題,即Spartacus的發(fā)布方式和更新頻率,因為這個話題也和廣大Commerce從業(yè)者是否決定選擇Spartacus密切相關。
SAP Commerce Cloud是SAP一款電商解決方案,而Storefront這個術語,指的是該解決方案的前臺店鋪界面。一句話概括Spartacus,它是基于現(xiàn)代Web開發(fā)技術和框架打造而成的一款新的SAP Commerce Cloud Storefront.
那何謂現(xiàn)代呢?Spartacus 1.0版發(fā)布于2019年7月,因此相比前一代基于Accelerator技術的Storefront來說,Spartacus具有得天獨厚的優(yōu)勢,能夠采取比較成熟和現(xiàn)代的前端技術來開發(fā)。
Spartacus特性之一:單頁面應用Single Page Application
這也是Spartacus命名的由來。所謂單頁面應用,是由一個稱為外殼(shell)的html頁面和多個包含具體業(yè)務邏輯的頁面片段組成。
Commerce傳統(tǒng)的Storefront,基于JSP實現(xiàn),JSP是一種服務器端渲染技術,頁面代碼在Commerce服務器端生成。而單頁面應用是一種富客戶端技術,頁面片段的渲染以及頁面路由,放在客戶端完成,這樣減輕了Commerce服務器的負載。當單頁面應用的界面內容發(fā)生變化時,不需要重新加載整個外殼html頁面,而僅僅需要更新相關的發(fā)生變化的頁面片段,這樣較多頁面應用相比,頁面之間的切換更加流暢,用戶體驗更好。
Spartacus特性之二:響應式設計和自適應設計
這是web應用的用戶體驗領域兩個容易混淆的概念,因為二者都是為了解決網(wǎng)頁在不同屏幕尺寸的設備上展示的問題。從編程角度講,響應式設計通過各種前端技術,為頁面元素賦予了根據(jù)屏幕分辨率的變化而自動調整顯示行為,以達到最佳顯示效果的能力。
例如Spartacus里的列表控件,隨著屏幕寬度的減小,顯示的列表欄的數(shù)目也隨之減少。而自適應設計,為不同類別的設備分別實現(xiàn)不同的頁面,檢測到設備分辨率后調用對應的網(wǎng)頁。Spartacus的頁面設計絕大部分是響應式布局,但也支持自適應布局的特性。
Commerce的CMS模塊將Storefront UI按照功能上的邏輯相關性,劃分成不同的區(qū)域,而Spartacus可以允許使用者根據(jù)不同的屏幕尺寸,配置在該尺寸下,不同的區(qū)域內應該顯示哪一些UI組件。
Spartacus特性之三:100% API 驅動
Commerce Cloud提供了一組稱為Omni Commerce Connect(簡稱OCC)的Restful API.
Spartacus通過標準的HTTP協(xié)議調用這組API,實現(xiàn)同Commerce Cloud交互的目的。從編程層面來說,100%的API驅動確保了Spartacus的前后端分離,使得Spartacus的二次開發(fā)人員不需要去了解Commerce平臺Java層的實現(xiàn)細節(jié),而過去基于Commerce Accelerator技術的Storefront二次開發(fā),需要的是會使用JSP和Java的全棧開發(fā)者。
從更深層次來說,100% API驅動使Spartacus同Commerce平臺也解除了緊耦合關系,從而極大提升了Spartacus的可升級性。這一點在接下來Accelerator同Spartacus的對比中我們會進一步說明。
Spartacus特性之四:開源,免費
Spartacus的代碼是完全開源的,托管在Github上。如果大家細心察看Github倉庫上的代碼提交者列表,就會發(fā)現(xiàn),這些代碼貢獻者有的是像Jerry這樣的SAP職員,有的來自partner公司,還有freelancer即自由職業(yè)者。SAP選擇將Spartacus開源,希望構建出一個繁榮的生態(tài)圈,和開源社區(qū)里其他貢獻者共同在Commerce Storefront領域進行持續(xù)創(chuàng)新。
那么,SAP為什么要推出Spartacus呢?這得從Spartacus誕生之前,SAP Commerce傳統(tǒng)的Storefront實現(xiàn)技術即Accelerator說起。
Accelerator是Spartacus發(fā)布之前,SAP Commerce Cloud使用的Storefront實現(xiàn)技術。
Accelerator是一個開箱即用的web實現(xiàn)模板,是Commerce平臺的一部分,以源代碼的方式交付給客戶。客戶通過一個叫做module generator的工具,基于Accelerator 模板代碼生成自己的Storefront實現(xiàn),然后基于這些生成的代碼繼續(xù)二次開發(fā)。這種源代碼生成方式確實能加快客戶的Storefront二次開發(fā)速度,這也是Accelerator命名的由來。
然而,Accelerator這種同Commerce平臺的緊耦合關系,以及基于源代碼級別的二次開發(fā)方式,給Commerce項目實施的可升級性帶來很大的挑戰(zhàn)。例如,當客戶發(fā)現(xiàn)新版本的Accelerator能滿足自己新的業(yè)務需求時,希望升級Accelerator. 然而由于Accelerator是Commerce平臺的一部分,所以必須先升級整個Commerce系統(tǒng),再使用module generator基于高版本的Accelerator代碼,重新生成自定義實現(xiàn),再把基于低版本Accelerator模板而進行的二次開發(fā)內容,逐一手動地遷移到高版本Accelerator生成的自定義實現(xiàn)中去。
當Commerce的二次開發(fā)達到一定規(guī)模量的時候,這種手動升級的方式很挑戰(zhàn)。
Accelerator具有的這些缺陷,在Spartacus問世之后都迎刃而解。
Accelerator通過源代碼的方式提供了一個Storefront的開發(fā)模板,而Spartacus則以庫的方式,提供了一個輕型的Storefront開發(fā)框架。我們新建一個Angular應用,導入對Spartacus庫的依賴,當我們需要升級Spartacus時,只需要更新Angular應用的package.json文件里Spartacus庫文件的版本號即可,因此Spartacus從可升級性上來說是一個巨大的飛躍。
Spartacus采用API的方式同Commerce交互,這使得Spartacus可以同Commerce分開部署,分別進行升級,比如目前已經(jīng)發(fā)布的Spartacus 3.0,支持從Commerce 1905開始及其之后的所有版本。
Spartacus采用Angular開發(fā),編譯之后生成JavaScript代碼,作為其運行時語言。這樣一來,使用Spartacus的二次開發(fā)人員,不再需要像過去開發(fā)Accelerator那樣,不再需要掌握前端JSP和后端Java的全棧開發(fā)技術棧。
Accelerator的可擴展性,是通過犧牲可升級性為代價換來的。同Accelerator只有源代碼級別的修改這一單一的擴展方式相比,Spartacus實現(xiàn)擴展性的手段更加多元化。
(1) Spartacus的模塊之一,ConfigModule,將業(yè)務邏輯和頁面布局以及樣式,通過配置的方式暴露出來。二次開發(fā)人員通過調整配置,可以更改Spartacus默認的行為和頁面布局以及樣式。
(2) Spartacus的頁面布局由不同的Angular組件組成,這些Angular組件同Commerce的CMS組件具有一一對應關系。Spartacus允許二次開發(fā)人員增強甚至開發(fā)新的Angular組件,去替換Spartacus發(fā)布時使用的默認組件,以此來實現(xiàn)客戶的頁面定制化需求。
(3) 借助Angular強大的依賴注入機制,Spartacus允許開發(fā)人員像Commerce后臺開發(fā)人員使用Java Spring框架那樣,開發(fā)自己的service實現(xiàn)。通過Angular的Dependency Injection機制,注入自開發(fā)的service,從而達到定制化Spartacus的運行流程和邏輯的目的。
下面我們來簡要了解Spartacus使用到的一些技術棧和Spartacus同Commerce交互的基本原理。
前面說到,Spartacus是基于現(xiàn)代Web開發(fā)技術打造而成的一個Storefront開發(fā)框架。因此,涉及到的技術棧都是目前前端開發(fā)普遍使用的一些比較成熟的技術。
Angular:由Google維護的一款web前端開發(fā)框架,借鑒了大量有十幾二十年歷史的成熟的后端開發(fā)理念,比如依賴注入、接口、注解等等,這些理念在開發(fā) 需要持續(xù)迭代和維護的大規(guī)模企業(yè)級前端應用時,顯得特別有優(yōu)勢。Angular同時也是一款與時俱進的框架,比如對TypeScript的支持,跟RxJS的深度整合,對Progressive Web Application即 漸進式網(wǎng)頁應用理念 第一時間的支持等等。
Spartacus 1.0基于Angular 9,而目前最新的Spartacus 3.0, 基于Angular 10. 上個月Google發(fā)布了最新的Angular 11,目前我們團隊的架構師,正在評估Spartacus支持Angular 11的技術可行性。
TypeScript: Angular的開發(fā)語言是TypeScript,ES5, ES6是JavaScript發(fā)展過程中出現(xiàn)的兩個版本,而TypeScript不僅是ES6的超集,而且是一門靜態(tài)類型編程語言。2018 年有一份前端項目中出現(xiàn)頻率最高的十大錯誤類型統(tǒng)計報告,其中前7位都和類型錯誤有關:
而TypeScript的編譯器 靜態(tài)類型檢查,可以避免不少的類型錯誤。通過強類型接口,在服務實現(xiàn)者和服務調用者之間創(chuàng)建了一種契約,這種契約能降低Spartacus組件和服務之間的耦合性,幫助像Spartacus這種 其開發(fā)者來自世界各地的開源項目 進行更有效率地開發(fā)。
Rxjs: Reactive Extension JavaScript,是一種響應式編程實踐,Angular是RxJS這個庫的重度使用者。Rxjs的核心是Observable(可觀察對象),Spartacus的實現(xiàn),使用Rxjs的可觀察對象,封裝了從Commerce讀取業(yè)務數(shù)據(jù)的異步操作。通過Rxjs提供的施加在可觀察對象上的各種操作符,Spartacus可以靈活地控制 異步讀取 Commerce業(yè)務數(shù)據(jù)的時序,對Spartacus和Commerce之間的數(shù)據(jù)流進行聚合或者拆分。
Ngrx: Angular應用使用的一個能夠優(yōu)雅的管理應用狀態(tài)的庫。Angular和其他主流的前端框架一樣,遵循組件化開發(fā)的標準,組件間通信基本都是單向數(shù)據(jù)流:父組件通過屬性綁定把數(shù)據(jù)傳遞給子組件,子組件如果想要修改傳入的數(shù)據(jù),必須通過事件回調同父組件通信。NgRx作為通信場景里的第三方,能夠統(tǒng)一管理組件的狀態(tài),降低了Spartacus這類復雜前端應用組件間狀態(tài)管理的復雜度和出錯的可能。
SASS:Syntactically Awesome Stylesheets的縮寫,是一種CSS的擴展語言,在CSS基礎上增添了定義變量,支持代碼塊嵌套,繼承,命名空間,父級引用等特性,大大提高了css的開發(fā)效率。可以說Spartacus能夠支持從頁面整體顏色風格,到控件外觀 細粒度的微調,SASS功不可沒。
Jasmine:一個前端單元測試框架。
Cypress:一個端到端的自動化測試框架。
我們通過完善的單元測試和端到端自動化測試,保障了Spartacus這種開源項目的代碼質量。
最后,我們開發(fā)出的Spartacus,經(jīng)過打包后,以庫的形式發(fā)布到npmjs.com上去。
這是一張Spartacus同Commerce交互的示意圖。我們首先看圖的最右邊。Spartacus同Commerce系統(tǒng)的通信,通過HTTP協(xié)議調用OCC API完成。Connector是HTTP調用的發(fā)起者,維護了靜態(tài)的配置信息,即API的endpoint.
比如,從Commerce系統(tǒng)讀取產(chǎn)品主數(shù)據(jù),讀取的字段列表以url參數(shù)的形式出現(xiàn)在API endpoint里。這些字段列表可以在Connector的靜態(tài)配置點里進行配置。Connector并不會直接同Commerce交互,而是把請求轉發(fā)給Adapter,具體通信由Adapter完成,Connector只負責調度Adapter. Spartacus發(fā)布的Adapter默認使用OCC Module,即Commerce標準的OCC Restful API,但是客戶也可以實現(xiàn)自己的Adapter,連接Commerce之外的其他后臺系統(tǒng)。
Connector將Adapter取回的數(shù)據(jù)交給NgRx的store結構統(tǒng)一管理,后者的復雜度被Fa?ade層所隱藏,而Spartacus UI組件只會同F(xiàn)a?ade層交互,進行數(shù)據(jù)綁定和頁面展示。這體現(xiàn)了關注點分離的設計原則。最后,因為UI組件和Commerce后臺組件的數(shù)據(jù)模型存在差異,因此需要Converter,在數(shù)據(jù)從Commerce取回,準備呈現(xiàn)在UI之前,先要通過Converter轉換成適合UI展示的結構;反之,在Spartacus提交數(shù)據(jù)準備寫回Commerce時,也要先將數(shù)據(jù)通過Converter轉換成OCC API接受的數(shù)據(jù)格式。
那么Spartacus github倉庫里的源代碼,通過什么方式發(fā)布給客戶使用呢?
前面已經(jīng)提到,Spartacus打包之后,以庫的方式發(fā)布到npmjs.com上。這是一張Spartacus庫文件之一,Spartacus Storefront托管到npmjs網(wǎng)站上的截圖。這個庫的版本號為2.1.3, 我們稍后會介紹其版本機制。
Spartacus庫主要有三個實體組成:core, storefront和styles. 其中storefront包含了用戶肉眼可見的,組成電商店鋪應用外觀的UI組件,客戶可以重用和增強這個庫文件里包含的組件。Core這個庫文件則包含了Spartacus的控制邏輯。用戶可以開發(fā)自己的服務類,通過Angular依賴注入的機制,把自開發(fā)服務類注入到core框架之中。Styles包含了Spartacus的界面樣式實現(xiàn),客戶可以對這些樣式進行定制化,或者用自開發(fā)樣式來覆蓋標準樣式。
之前進行Accelerator和Storefront的可升級性比較時已經(jīng)提到過,客戶基于Spartacus庫文件進行Storefront二次開發(fā),并不會直接修改Spartacus發(fā)布的源代碼。客戶的二次開發(fā)代碼,和Spartacus庫文件是一種松耦合的依賴關系。客戶升級Spartacus版本,在絕大多數(shù)情況下都不會影響到已有的二次開發(fā)代碼。那么所謂的“絕大多數(shù)情況下”,具體是指什么呢?這就要從Spartacus的版本管理機制說起。
同絕大多數(shù)流行的開源框架和庫一樣,Spartacus的版本管理也采取了所謂語義化版本的機制,版本號由主版本號,次版本號和修訂版本號三部分組成,中間由小數(shù)點分隔開。
主版本號的升高,用于引入無法向后兼容的變更或顛覆性的更新。無法向后兼容的變更,是指Spartacus升級之后,之前基于低版本編寫的二次開發(fā)代碼,需要人工調整后才能繼續(xù)工作。而顛覆性的更新,一個例子就是Spartacus升級到3.0版本之后,首次支持B2B的電商功能。
次版本號的增加:用于引入新功能,并且版本更新之后,已有的二次開發(fā)代碼不需任何調整仍然能夠繼續(xù)正常工作。源代碼重構,性能優(yōu)化等不屬于bug修復的修改,也通過次版本號的增加而引入。
修訂版本號:主要用于發(fā)布bug的修復。
Spartacus的修訂版本發(fā)布,以周為單位,確保使用過程中發(fā)現(xiàn)的bug能盡早得到解決。次版本的發(fā)布以月為單位,這種更新的頻率有助于客戶快速地進行持續(xù)改進和持續(xù)創(chuàng)新。
而主版本的更新,可以參考SAP官方路線圖網(wǎng)站上的聲明。
從上面這張截圖中package.json里定義的依賴,我們能夠發(fā)現(xiàn)之前講到的core, storefront和styles 3個庫,再加上主要包含了文檔和翻譯的assets庫。
其中版本號2.1.0之前的這個符號^,有個術語叫做hat, 這是語義化版本管理機制里的范圍標識符之一,表示這個Storefront二次開發(fā)工程支持主版本號為2,且次版本號大于1的所有Spartacus版本,但是不支持主版本號為3的Spartacus. 換句話說,圖中這個二次開發(fā)項目,只支持SAP Commerce B2C的功能,因為B2B的功能是Spartacus 3.0版本里才引入的。
最后,讓我們用一些關鍵字來總結今天的分享。SAP Spartacus誕生于2019年7月,是一款滿足響應式和自適應特性的現(xiàn)代Storefront應用和開發(fā)框架。同之前的Accelerator Storefront相比,Spartacus在保留了原有的可定制化特性之外,具有更流暢的用戶體驗和良好的可升級性,并且本身開源,無需購買額外的license. 如果大家對Spartacus有興趣想深入了解,可以去open SAP網(wǎng)站上學習Spartacus的公開課.
感謝閱讀。
更多Jerry的原創(chuàng)文章,盡在:“汪子熙”:
總結
以上是生活随笔為你收集整理的Jerry在2020 SAP全球技术大会的分享:SAP Spartacus技术介绍的文字版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 赋得送贾岛谪长江
- 下一篇: css固定定位_css定位布局(w3cs