在過去的幾個月中,JAMstack的接受度非常高,現(xiàn)在可以使用多種工具和服務(wù)來創(chuàng)建快速,動態(tài)的Web應(yīng)用程序。JAMstack提倡原子部署,這種部署可以產(chǎn)生更頻繁,更輕松的部署周期,這意味著可以以簡單的方式將最新更新交付給用戶。
這改變了整個開發(fā)流程。傳統(tǒng)上復(fù)雜的應(yīng)用程序和功能(例如身份驗證,結(jié)帳,支付系統(tǒng)和媒體管理)現(xiàn)在可以通過幾行代碼來添加。此外,有了JAMstack,我們不再使用整體應(yīng)用程序,而是開發(fā)較小的組件并將其原子部署到全局CDN(邊緣服務(wù)器)。開發(fā)人員可以利用靜態(tài)網(wǎng)站生成器,并使用客戶端JavaScript和無數(shù)API來增強其網(wǎng)站,這意味著他們只需要關(guān)注一件事:開發(fā)。無需處理與DevOps相關(guān)的任務(wù)。
在本文中,我們將回顧為什么您應(yīng)該關(guān)心這個新堆棧,以及如何最好地使用它來構(gòu)建更快,更安全的網(wǎng)站。您還可以在下面的蘇黎世前線會議上觀看我就此主題發(fā)表的演講。
塔馬斯Piros -釋放的JAM堆棧的力量從正面蘇黎世會議上Vimeo的。
什么是JAMstack?
jamstack:主頁
該JAMstack主頁。
JAMstack的JAM部分是作為堆棧核心的三個核心概念的首字母縮寫:JavaScript,API和標(biāo)記。但是,我們需要更深入地研究,以找出JAMstack的功能,以及如何一起使用這些技術(shù)來獲得出色的體驗。
對JAMstack的更好描述(盡管更長)是,它使我們可以使用易于訪問的服務(wù)來創(chuàng)建性能卓越的網(wǎng)站,并更快地部署它們,而無需原始服務(wù)器。
描述的最后一部分很好奇。為什么沒有原始服務(wù)器?
原始服務(wù)器是運行應(yīng)用程序的服務(wù)器,通常是Web服務(wù)器,例如Apache或Express,它可以接受請求并提供響應(yīng)。
這樣做的關(guān)鍵之處在于,當(dāng)您考慮使用LAMP堆棧之類的經(jīng)典設(shè)置時,會在請求時生成頁面:用戶單擊鏈接,PHP文件被加載,該文件可能通過以下方式向數(shù)據(jù)庫發(fā)出請求: SQL查詢的一種方式,它收集數(shù)據(jù)并返回一些模板,然后將其渲染為HTML,這就是用戶所看到的最終產(chǎn)品。盡管有一些可用的緩存機制,但只要加載同一頁面,就會發(fā)生此過程,這意味著可能不需要每次都進(jìn)行數(shù)據(jù)查詢。但是,這個概念仍然存在:我們有在每個請求上執(zhí)行的服務(wù)器端代碼。
“換句話說,我們預(yù)先渲染了標(biāo)記,因此當(dāng)用戶請求頁面時,根本不需要執(zhí)行服務(wù)器端代碼。”
使用JAMstack,我們的方法略有不同。如果我們在構(gòu)建時提前基于模板邏輯和結(jié)構(gòu)生成HTML文件怎么辦?換句話說,我們預(yù)先渲染了標(biāo)記,因此,當(dāng)用戶請求頁面時,根本不需要執(zhí)行服務(wù)器端代碼。生成的HTML代碼可以放置到任何托管提供商的服務(wù)器,GitHub Pages上,甚至只是Amazon的S3上,并可以立即提供。
jamstack:流程圖
JAMstack網(wǎng)站是使用JavaScript,API和標(biāo)記構(gòu)建的,無需原始服務(wù)器即可提供服務(wù)。
模板圖標(biāo)
項目管理:規(guī)劃您的Web設(shè)計工作流程
將免費的項目管理副本:規(guī)劃Web設(shè)計工作流發(fā)送到收件箱。
電子郵件
輸入您的電子郵件地址
輸入您的電子郵件-我們還將向您發(fā)送與Shopify相關(guān)的營銷電子郵件。您可以隨時取消訂閱。注意:該指南不會發(fā)送到基于角色的電子郵件,例如info @,developer @等。
我們的虛擬齒輪正在轉(zhuǎn)動。
請注意,
我們的電子郵件最多可能需要15分鐘
才能到達(dá)您的收件箱。
使用靜態(tài)網(wǎng)站生成器進(jìn)行預(yù)渲染
為了實現(xiàn)我們之前討論的內(nèi)容,我們需要一個能夠預(yù)渲染標(biāo)記的工具。靜態(tài)站點生成器(SSG)正是為此目的而設(shè)計的。今天有一些靜態(tài)站點生成器,其中大多數(shù)基于流行的JavaScript前端框架,例如React(Gatsby,Next.js)和Vue(Nuxt.js,Gridsome)。還有一些不基于JavaScript的語言,例如Jekyll(Ruby)和Hugo(Go aka Golang),或者基于香草JavaScript的語言(11y)。
“我們?nèi)绾晤A(yù)渲染標(biāo)記與用于該工具的編程語言無關(guān)。”
此時,當(dāng)我們談?wù)揜uby和Go for SSG時,您可能想知道JAMstack中的“ J”為什么用于JavaScript。實際上,這是我大多數(shù)演講和講習(xí)班中提到的一個問題。關(guān)鍵的區(qū)別在于靜態(tài)站點生成器與JAMstack中的“ M”(標(biāo)記)相關(guān)。我們?nèi)绾晤A(yù)渲染標(biāo)記與用于該工具的編程語言無關(guān)。“ J”(JavaScript)位是指我們可以使用各種JavaScript功能來增強應(yīng)用程序,但這是應(yīng)用程序中的“客戶端”。
這使我想到了JAM API中的第二個字母。
您可能還會喜歡: 業(yè)內(nèi)人士對Shopify所采用技術(shù)的關(guān)注。
蜜蜂
您可能以前曾經(jīng)聽說過“站在巨人的肩膀上”的說法。我發(fā)現(xiàn)這句話在這里非常相關(guān)。讓我舉兩個例子。
傳統(tǒng)上(想想LAMP堆棧),創(chuàng)建聯(lián)系表單有些挑戰(zhàn)。我們必須使用HTML和JavaScript創(chuàng)建一個表單,并且必須將數(shù)據(jù)從表單發(fā)送到后端(PHP)進(jìn)行處理。服務(wù)器不僅必須處理數(shù)據(jù),而且還必須配置并運行郵件服務(wù)器,以便可以從前端發(fā)送處理了數(shù)據(jù)的電子郵件。這需要Unix知識以及其他編程技能。
另一個示例是身份驗證。身份驗證通常很困難:我們需要將用戶名/密碼組合存儲在數(shù)據(jù)庫中,確保其安全性,生成Cookie和令牌,并對它們進(jìn)行驗證,等等。但是,當(dāng)數(shù)據(jù)庫負(fù)載增加兩倍時,會發(fā)生什么?如果我們從未有過單獨的身份驗證數(shù)據(jù)庫怎么辦?我們?nèi)绾畏謩e縮放它們?
如今,有很多服務(wù)可以幫助我們更輕松地創(chuàng)建聯(lián)系表和身份驗證。Formspree是聯(lián)系表單的一個示例。我們需要做的就是在action表單中添加一個指向的屬性https://formspree.io/my@email.com,僅此而已。
jamstack:formspree主頁
Formspree使添加聯(lián)系表單變得容易。
以同樣的方式,我們可以使用Netlify Identity或Auth0之類的服務(wù)來向我們的應(yīng)用程序添加身份驗證。
這一切的重點?有一些公司在其領(lǐng)域內(nèi)是專家。Formspree僅處理表單和表單集成,Auth0僅處理身份驗證,Cloudinary僅處理圖像管理,Shopify處理電子商務(wù)和相關(guān)項目。這些公司(和其他公司)做一件事,并且做得很好。作為開發(fā)人員,我們應(yīng)該利用他們的服務(wù)。這些組織幾乎專有地公開了API或為我們提供了某種SDK,可以很容易地與我們的代碼集成。
“這些公司(和其他公司)做一件事,并且做得很好。作為開發(fā)人員,我們應(yīng)該利用其服務(wù)。”
在創(chuàng)建更復(fù)雜的應(yīng)用程序(例如電子商務(wù)網(wǎng)站)時,問題通常是整個應(yīng)用程序是一個巨大的,相互耦合的整體。管理界面與購物車,支付系統(tǒng),產(chǎn)品清單和評論一起綁定到了主應(yīng)用程序。一切都在一個屋檐下,管理小變化非常困難。使用JAMstack,我們可以打破僵局!
借助Shopify 及其API等服務(wù),我們可以構(gòu)建一個脫鉤的電子商務(wù)平臺并靜態(tài)生成所有頁面,以提高性能。這意味著,當(dāng)用戶查看產(chǎn)品列表時,我們不需要進(jìn)行數(shù)據(jù)庫查詢即可收集有關(guān)產(chǎn)品的數(shù)據(jù)-在構(gòu)建時就已經(jīng)為我們完成了。
使用這種方法對應(yīng)用程序所做的更改要容易得多,因為為了更改產(chǎn)品清單中的某些內(nèi)容,我們不需要關(guān)閉整個站點。相反,我們可以進(jìn)行更改,重新生成頁面,并且所有內(nèi)容都將為我們發(fā)布到CDN(前提是我們使用的是Netlify之類的服務(wù))。
jamstack:netlify主頁
該Netlify主頁。
Shopify為開發(fā)人員提供了REST API和GraphQL API,以管理電子商務(wù)平臺的管理端,并且再次與應(yīng)用程序的其余部分完全分離。讓他們擔(dān)心擴展,負(fù)載平衡,安全性以及其他通常不是我們要做的事情。
但是,如果我們?nèi)匀恍枰獔?zhí)行服務(wù)器端代碼怎么辦?我們可以利用功能即服務(wù)(無服務(wù)器功能),例如AWS Lambda或Google Cloud Functions。這些通常以JavaScript編寫,并且可以部署在供應(yīng)商的服務(wù)器上。最終,我們得到的只是一個端點,可以從客戶端JavaScript代碼中調(diào)用該端點,然后依次調(diào)用我們的函數(shù)并返回結(jié)果。
還有一個名為Serverless,Inc的組織,它是Serverless Framework的創(chuàng)建者,它封裝了所有其他服務(wù),并允許我們使用CLI工具將其部署到任何提供商。
您可能還會喜歡: 解構(gòu)Monolith:設(shè)計可最大程度提高開發(fā)人員生產(chǎn)力的軟件。
無頭CMS
通常,網(wǎng)站也需要數(shù)據(jù)??紤]一下博客或電子商務(wù)平臺之類的東西。如果由于沒有在請求時渲染網(wǎng)站而沒有進(jìn)行數(shù)據(jù)庫查詢的選項,那么如何確保仍然有可用數(shù)據(jù)?
請遇到無頭的CMS?,F(xiàn)在,這個名字很好奇。什么是無頭CMS?考慮一下像WordPress這樣的經(jīng)典內(nèi)容管理系統(tǒng)。WordPress是一個前端和后端緊密耦合的整體應(yīng)用程序。沒有辦法將它們分開。
另一方面,無頭CMS將數(shù)據(jù)層與表示層分開-換句話說,數(shù)據(jù)是在一個地方進(jìn)行管理的,但是無頭CMS并不關(guān)心該數(shù)據(jù)如何呈現(xiàn)以及在何處呈現(xiàn)。
請注意,一些無頭CMS提供程序確實提供了UI,但這只是可以管理基礎(chǔ)數(shù)據(jù)的管理界面-仍然不會影響將數(shù)據(jù)呈現(xiàn)給用戶的方式。
無頭CMS有兩種類型:基于git和基于API?;贏PI的API允許我們將數(shù)據(jù)存儲在數(shù)據(jù)庫(SQL或NoSQL)中,并公開可通過HTTP調(diào)用使用的API端點。基于git的文件管理可在文件(例如Markdown)中找到的數(shù)據(jù),并通過YAML前題將元數(shù)據(jù)提供給markdown文件。元數(shù)據(jù)類型是因素,例如帖子的作者或產(chǎn)品的價格。
部署
jamstack:火箭起飛
我們已經(jīng)確定,作為開發(fā)人員,我們需要使用工具(靜態(tài)站點生成器)預(yù)先渲染標(biāo)記,然后需要以某種方式將該站點部署到CDN網(wǎng)絡(luò)。
使用Netlify,AWS Amplify和Zeit Now之類的服務(wù),可以通過多種方式發(fā)布和部署應(yīng)用程序。它們都將我們預(yù)先渲染的標(biāo)記推送到CDN。為什么這有用?CDN會自動進(jìn)行負(fù)載平衡,并且它們將始終根據(jù)其地理位置將內(nèi)容提供給最近的請求用戶。
從歷史上看,使CDN緩存無效是很困難的。使CDN緩存無效意味著如果有新版本的應(yīng)用程序可用,則不應(yīng)將其緩存在CDN上的任何位置,因為某些訪問者可能會獲取“陳舊”數(shù)據(jù)。如前所述,所有服務(wù)都會自動處理緩存失效。
此外,從開發(fā)人員的角度來看,可以非常迅速地部署原子更改。通常,工作流程如下所示:處理某些代碼的開發(fā)人員執(zhí)行g(shù)it push和commit。部署服務(wù)會注意到有一個對git的新提交,并開始了重新部署過程,該過程包括預(yù)渲染和再次使緩存無效。
“由于堆棧的預(yù)渲染,非原始服務(wù)器方面,默認(rèn)情況下站點將更快。”
諸如Netlify之類的服務(wù)將使所有部署保持其歷史記錄,而只需單擊一下鼠標(biāo),即可回滾到該應(yīng)用程序的先前版本。
使用JAMstack對最終用戶和開發(fā)人員也有許多其他好處。最終用戶顯然將能夠更快地接收到站點的更新/更改,并且由于堆棧中預(yù)先呈現(xiàn)的非原始服務(wù)器方面,因此默認(rèn)情況下站點將更快。
開發(fā)人員和開發(fā)團(tuán)隊可以從失去的原因中受益匪淺。首先,他們不需要管理服務(wù)器,并且與標(biāo)準(zhǔn)開發(fā)相關(guān)的任務(wù)中添加的DevOps相關(guān)任務(wù)也更少。即使需要執(zhí)行一些服務(wù)器端代碼,無服務(wù)器功能也可以解決。
開箱即用也可以使用JAMstack中的安全性。如果我們考慮一下LAMP堆棧,則涉及到許多服務(wù)器-應(yīng)用程序服務(wù)器,數(shù)據(jù)庫服務(wù)器-彼此連接,每個服務(wù)器執(zhí)行代碼和查詢。攻擊表面積相當(dāng)大。
在JAMstack中,沒有服務(wù)器端代碼執(zhí)行,默認(rèn)情況下,所有站點內(nèi)容都是“靜態(tài)”的,并且放置在CDN服務(wù)器上。攻擊表面積小得多。
不過,請不要對術(shù)語“靜態(tài)”感到困惑。JAMstack使用稱為靜態(tài)站點生成器的事實并不意味著該站點只是普通的舊HTML。
前面我們討論了“ J”(JavaScript)用于向應(yīng)用程序添加動態(tài)功能和交互性??蛻舳薐avaScript可用于通過使用API??,使用SDK甚至增強水合作用來增強應(yīng)用程序。
您可能還會喜歡: 網(wǎng)站安全性:改善前端安全性而不被黑客入侵的13種方法。
對企業(yè)有利
企業(yè)還可以利用一個事實,即使用JAMstack計劃項目要容易得多,并且成本也要高得多。無需購買服務(wù)器即可輕松進(jìn)行成本計算,而可以購買服務(wù)時間,這很容易計算。一般而言,由于無需管理物理服務(wù)器,因此對操作的依賴較少。
此外,談到成本,必須提到開發(fā)人員的成本。之前,我們提到過開發(fā)人員如何專注于開發(fā),這意味著他們的時間花在了應(yīng)該做的事情上,而不是在DevOps和其他與基礎(chǔ)架構(gòu)管理相關(guān)的任務(wù)上,這也節(jié)省了一些成本。
JAMstack不僅是為其帶來的開發(fā)利益,而且為其可以提供的業(yè)務(wù)優(yōu)勢的可靠決定。
模板圖標(biāo)
項目管理:規(guī)劃您的Web設(shè)計工作流程
將免費的項目管理副本:規(guī)劃Web設(shè)計工作流發(fā)送到收件箱。
電子郵件
輸入您的電子郵件地址
輸入您的電子郵件-我們還將向您發(fā)送與Shopify相關(guān)的營銷電子郵件。您可以隨時取消訂閱。注意:該指南不會發(fā)送到基于角色的電子郵件,例如info @,developer @等。
我們的虛擬齒輪正在轉(zhuǎn)動。
請注意,
我們的電子郵件最多可能需要15分鐘
才能到達(dá)您的收件箱。
天生充滿活力
JAMstack對最終用戶和開發(fā)人員都有很多好處,當(dāng)然,您應(yīng)該嘗試一下它。它提供了更好的用戶體驗和更好的整體開發(fā)工作流程。不要害羞地利用一些出色的服務(wù)來使您本來應(yīng)該靜態(tài)的應(yīng)用程序自然地動態(tài)化。