過(guò)去一直是程序語(yǔ)言Ruby愛(ài)用者,同時(shí)也是Ruby項(xiàng)目重要貢獻(xiàn)者的電子商務(wù)開(kāi)發(fā)和托管平臺(tái)Shopify,在去年將原本以Ruby編寫(xiě)的Shopify CLI工具,使用Node重新改寫(xiě),Shopify開(kāi)發(fā)團(tuán)隊(duì)現(xiàn)在公開(kāi)了他們這項(xiàng)決定背后的原因和權(quán)衡。
Shopify CLI是Shopify平臺(tái)開(kāi)發(fā)人員的重要工具,能夠用于構(gòu)建主題、應(yīng)用程序和Hydrogen店面,使開(kāi)發(fā)人員能以最佳實(shí)踐創(chuàng)建新項(xiàng)目與平臺(tái)集成,或是發(fā)布生產(chǎn)構(gòu)件供店家使用。Shopify CLI開(kāi)發(fā)團(tuán)隊(duì)發(fā)現(xiàn),開(kāi)發(fā)Shopify應(yīng)用程序的開(kāi)發(fā)人員,在使用CLI上一直存在部分體驗(yàn)問(wèn)題,因此重新查看CLI開(kāi)發(fā)語(yǔ)言選擇,希望做出一些改變。
Shopify CLI在2018年末的時(shí)候開(kāi)始發(fā)展,Shopify開(kāi)發(fā)團(tuán)隊(duì)提到,考慮當(dāng)時(shí)的語(yǔ)言資源和知識(shí),他們?nèi)哉J(rèn)為Ruby是一個(gè)明智的選擇。但是要使用Ruby開(kāi)發(fā)的CLI,用戶計(jì)算機(jī)上需要安裝Ruby,開(kāi)發(fā)團(tuán)隊(duì)則通過(guò)提供安裝文件來(lái)解決這個(gè)問(wèn)題,在2020年,Shopify開(kāi)發(fā)團(tuán)隊(duì)將ThemeKit集成到CLI中,在單一CLI中提供所有的開(kāi)發(fā)功能集。
但因?yàn)镾hopify CLI后來(lái)添加UI擴(kuò)展組件支持,讓開(kāi)發(fā)人員可以在平臺(tái)使用自己的UI擴(kuò)展組件,這使得CLI開(kāi)始依賴Node工具轉(zhuǎn)換和打包擴(kuò)展程序代碼。另一方面,Hydrogen開(kāi)發(fā)團(tuán)隊(duì)也考慮使用Node構(gòu)建新工具,而不是將Hydrogen工作流程集成到Shopify Ruby CLI上,因?yàn)檫^(guò)去用戶常因沒(méi)有完成特定額外的步驟,導(dǎo)致CLI執(zhí)行遭遇問(wèn)題,因此Hydrogen團(tuán)隊(duì)希望用戶可以不再需要在系統(tǒng)安裝Ruby Runtime,只要使用NPM安裝指令就解決項(xiàng)目相依項(xiàng)目的需求。
考量Shopify越來(lái)越依賴JavaScript和Node Runtime的資源、工具和知識(shí),因此Shopify開(kāi)發(fā)團(tuán)隊(duì)重新查看開(kāi)發(fā)語(yǔ)言的選擇,希望新語(yǔ)言采用能盡量減少Runtime的安裝需求,使開(kāi)發(fā)人員體驗(yàn)獲得提升,而且內(nèi)部團(tuán)隊(duì)也可以簡(jiǎn)單貢獻(xiàn),最后他們決定以TypeScript重寫(xiě)CLI,并且在Node Runtime上運(yùn)行。
Shopify內(nèi)部正在使用的語(yǔ)言除了最熟悉的Ruby之外,其次是Node、Go和Rust,Go和Rust以技術(shù)層面來(lái)說(shuō)也是理想的選擇,Shopify開(kāi)發(fā)團(tuán)隊(duì)提到,Go和Rust程序能夠簡(jiǎn)單編譯成二進(jìn)制文件,因此用戶不需要安裝Runtime,但Shopify之所以最后選擇Node,是因?yàn)閮?nèi)部團(tuán)隊(duì)更熟悉Node,他們不希望語(yǔ)言成為內(nèi)部團(tuán)隊(duì)貢獻(xiàn)CLI的障礙。
另外,使用Node來(lái)構(gòu)建CLI,還有一個(gè)有別于Ruby的特性,Node具有靈活的模塊系統(tǒng)和可擴(kuò)展性,Node模塊系統(tǒng)中同一遞移組件的多個(gè)版本不會(huì)互相沖突。
Shopify CLI也在從Ruby更換到Node的過(guò)程,引入函數(shù)程序設(shè)計(jì)的概念,開(kāi)發(fā)團(tuán)隊(duì)解釋,Ruby CLI中的命令業(yè)務(wù)邏輯,屬于有狀態(tài)且具有非常多假設(shè),使得程序代碼更難理解、貢獻(xiàn)和測(cè)試,在Node CLI中他們采用更具函數(shù)性的邏輯,開(kāi)發(fā)團(tuán)隊(duì)沒(méi)有教條式的遵守函數(shù)程序設(shè)計(jì)規(guī)范,但他們目標(biāo)讓邏輯成為傳遞狀態(tài)的函數(shù)組合,把JavaScript對(duì)象和函數(shù)當(dāng)作組合單元,通過(guò)操縱傳遞的實(shí)例創(chuàng)建對(duì)象副本。
Shopify開(kāi)發(fā)團(tuán)隊(duì)提到,Node CLI明顯改善了開(kāi)發(fā)人員體驗(yàn),雖然Hydrogen和應(yīng)用程序開(kāi)發(fā)人員現(xiàn)在只需要Node Runtime,但是主題開(kāi)發(fā)人員仍需要Ruby和Node Runtime,Shopify開(kāi)發(fā)團(tuán)隊(duì)目前已經(jīng)著手移除對(duì)Ruby的依賴,這項(xiàng)工作將在今年稍晚時(shí)完成。