裁縫是一種佈局服務,它使用流從Fragment服務中撰寫網頁。 O'Reilly在此博客文章的標題中將其描述為“提供中間件的庫,您可以將其集成到任何node.js服務器中。”它的部分靈感來自Facebook的Bigpipe,但在電子商務環境中開發。
裁縫的一些功能和好處:
裁縫是Mosaic項目的一部分,該項目旨在幫助開發人員為前端創建微服務。馬賽克還包括一個可擴展的HTTP路由器,用於服務組成(Skipper),並具有存儲路線(Innkeeper)的相關RESTFUL API;有更多組件正在公開發布。如果您的前端團隊正在進行整體對微服務的過渡,則可能會發現裁縫及其可用的兄弟姐妹有益。
如今,微服務獲得了很多牽引力。他們允許多個團隊彼此獨立工作,選擇自己的技術堆棧並建立自己的釋放週期。不幸的是,前端開發尚未完全利用微服務所提供的好處。建立網站的常見做法仍然是“巨石”:一個消耗多個API的單個前端代碼庫。
如果我們可以在前端有微服務怎麼辦?這將使前端開發人員能夠與後端同行在同一功能上合作,並獨立部署網站的部分 - “片段”,例如標題,產品和頁腳。將微服務帶到前端需要一個佈局服務,該服務由片段組成網站。裁縫是為了解決這一需求而開發的。
開始使用裁縫:
yarn add node-tailor const http = require ( 'http' ) ;
const Tailor = require ( 'node-tailor' ) ;
const tailor = new Tailor ( { /* Options */ } ) ;
const server = http . createServer ( tailor . requestHandler ) ;
server . listen ( process . env . PORT || 8080 ) ; fetchContext(request) - 返回上下文的承諾的函數,這是一個將片段ID映射到片段URL的對象,能夠覆蓋頁面上的片段的URL,默認為Promise.resolve({})fetchTemplate(request, parseTemplate) - 應該獲取模板,調用parseTemplate並返回結果的函數。有助於實施自己的方法來檢索和緩存模板,例如從S3中。默認實現lib/fetch-template.js從文件系統獲取模板templatesPath指定模板在本地存儲的路徑,默認為/templates/fragmentTag片段標籤的名稱,默認為fragmenthandledTags一系列自定義標籤,檢查tests/handle-tag以獲取更多信息handleTag(request, tag, options, context) - 接收標籤或關閉標籤並將其序列化為字符串或返回流filterRequestHeaders(attributes, request) - 過濾傳遞給片段請求的請求標頭lib/filter-headers功能filterResponseHeaders(attributes, headers) - 將給定響應標頭的主要片段請求映射到最終響應的功能maxAssetLinks CSS和js尊敬的每個片段的Link標頭指令數 - 默認為1requestFragment(filterHeaders)(url, attributes, request) - 將請求的承諾返回片段服務器,檢查lib/request-fragment中的默認實現amdLoaderUrl -URL到AMD加載器。我們使用cdnjs的requirej默認pipeInstanceName瀏覽器窗口中可用於消耗前端掛鉤的管道實例名稱。pipeAttributes(attributes) - 返回前端鉤上可用的最小片段屬性集的功能。tracer - 符合Opentracing的示踪劑實現。 Tailor使用Parse5來解析模板,在其中用片段服務器和handledTags handleTag的結果將每個fragmentTag替換為每個FragmentTag。
< html >
< head >
< script type =" fragment " src =" http://assets.domain.com " > </ script >
</ head >
< body >
< fragment src =" http://header.domain.com " > </ fragment >
< fragment src =" http://content.domain.com " primary > </ fragment >
< fragment src =" http://footer.domain.com " async > </ fragment >
</ body >
</ html >id可選的唯一標識符(自動化)src碎片的URLprimary - 表示設置頁面響應代碼的片段timeout - 毫秒中片段的可選超時(默認為3000)async - 推遲片段直到身體標籤的末端public - 以防止量身定制的過濾請求標頭從上游到碎片。fallback-src在當前片段的超時/錯誤的情況下,後備片段的URL允許其他屬性並將傳遞給相關功能(例如,
filterRequestHeaders,filterResponseHeaders等)
片段是HTTP(S)服務器,僅渲染頁面的一部分,並設置Link標頭以向CSS和JavaScript資源提供URL。檢查examples/basic-css-and-js/index.js是否實施草案。
片段的JavaScript是一個AMD模塊,該模塊導出init函數,將以片段的DOM元素作為參數調用。
即使碎片響應包含“位置”標頭,裁縫也不會遵循重定向,這是故意的,因為重定向可以引入不良的延遲。帶有屬性的片段primary可以重定向,因為它控制頁面的狀態代碼。
注意:有關與AWS的兼容性, Link標頭也可以通過x-amz-meta-link傳遞
默認情況下,傳入請求將用於選擇模板。
因此,要獲取index.html模板,您要轉到/index 。
如果您想收聽/product/my-product-123以轉到product.html模板,則可以將req.url更改為/product 。
默認情況下對每個標頭進行過濾,以避免洩漏信息,但是您可以通過將其添加到標頭, x-request-host和x-request-uri中給原始URI和主機,然後在片段中讀取標題以了解要獲取和顯示的產品。
http
. createServer ( ( req , res ) => {
req . headers [ 'x-request-uri' ] = req . url
req . url = '/index'
tailor . requestHandler ( req , res ) ;
} )
. listen ( 8080 , function ( ) {
console . log ( 'Tailor server listening on port 8080' ) ;
} ) ;裁縫中的某些概念在特定文檔中進行了詳細描述。
裁縫可以用opentracing開箱即用。它將在Ingress HTTP請求上獲取任何跨度上下文,並將其傳播到現有的遠程過程調用(RPC)。
當前,只有片段的獲取才能提供一些其他詳細信息,例如片段標籤,屬性和一些記錄有效載荷,例如錯誤的堆棧跟踪。
# Get a copy of the repository
git clone https://github.com/zalando/tailor.git
# Change to the folder
cd tailor
# Install dependencies
yarnnode examples/basicnode examples/basic-css-and-js css and-jsnode examples/multiple-fragments-with-custom-amdnode examples/fragment-performance在運行特定示例後,請訪問http:// localhost:8080/index。
注意:請使用節點版本> 6.0.0運行示例
單頁申請示例也可用:
要開始運行基準執行npm run benchmark並等待幾秒鐘才能查看結果。
請在此處查看貢獻指南。