2022 年夏天,我的隊友 Kailan 為 Fastly Compute 開發了 Rust 箱,實現了 Edge Side Includes (ESI) 模板語言的子集,並發表了一篇關於它。這篇文章很重要,不僅因為我們發布了一個有用的庫,還因為它很好地說明了計算可以為我們帶來什麼:具有模組化功能的可編程邊緣。現在 JavaScript 在 Compute 上普遍可用已有一年多了,我們是時候為 JavaScript 用戶提供類似的解決方案了。 Fastly 的 JavaScript ESI 程式庫現已在 npm 上提供,讓您可以為應用程式添加強大的 ESI 處理。
可程式性和模組化
近十年來,Fastly 的 CDN 一直支援 Edge Side Includes (ESI),這是一種模板語言,透過解釋 HTML 原始碼中的特殊標籤來運作。它圍繞著標籤
index.html
<include src="./header.html"></include> <main> Content </main>
header.html
<header>Welcome to the web site</header>
輸出
<header>Welcome to the web site</header>Content
當計算進入場景時,邊緣景觀主要在兩個方面發生了變化:可編程性和模組化。
在我們對 Rust 的平台支援穩定後不久,我們發布了一個實現 ESI 的 Rust 包,並添加了可編程性。現在您可以使用程式碼配置如何建立其他後端請求以及如何處理回應片段。您甚至可以對並非來自後端伺服器的文件執行 ESI 處理。這種可編程性將其與我們在 VCL 中提供的 ESI 支援區分開來,後者僅限於我們提供的固定功能集。
同時,這種方法是高度模組化的,使程式設計師可以選擇在每個請求的基礎上執行此ESI 處理,並可以選擇將處理與使用相容資料類型的其他模組結合起來,並應用它們按照指定的任何順序和/或邏輯條件。
下一個目標:JavaScript
與我們的 Rust 版本類似,我們希望這個 JavaScript 函式庫是可程式化的。 Fastly 的 JavaScript 支援始終包含 Fetch API 及其配套的 Streams API。 Streams API 的一個實用功能是 TransformStream 接口,它允許透過物件「輸送」資料以應用轉換,這對於 ESI 來說是完美的。透過將 ESI 處理器實現為 TransformStream 的實現,我們能夠將其直接放入用 JavaScript 編寫的快速計算應用程式中。
您可以透過以下方式進行串流:
<include src="./header.html"></include> <main> Content </main>
我們將其稱為 EsiTransformStream 的轉換直接應用於流,從而減輕了記憶體和效能問題。這意味著:
- 在應用轉換之前無需緩衝整個上游響應。
- 變壓器會盡快消耗上游響應,並處理流程中顯示的 ESI 標籤。當轉換器完成處理每個 ESI 標籤時,結果會立即發佈到下游,因此我們能夠保留盡可能小的緩衝區。這允許客戶端在準備就緒時接收串流結果的第一個字節,而不必等待它被完全處理。
此外,這種設計是模組化的,使 EsiTransformStream 成為您可以與其他東西一起使用的另一個工具。例如,您可能希望對回應套用其他轉換(例如壓縮),並且可以透過任意數量的這些轉換流傳送回應,因為它是完全標準的介面。 如果您願意,您甚至可以有條件地僅針對某些請求或回應啟用 ESI,例如透過請求標頭、路徑或回應內容類型。
以下是實例化 EsiTransformStream 的方法:
<header>Welcome to the web site</header>
建構子接受一個 URL 和一個 Headers 對象,並且可以選擇接受一些選項作為第三個參數。如前所述,ESI 的主要功能是下載附加模板,以包含到結果流中。遇到
- URL用於解析
的src中的相對路徑標籤。 - 在發出額外請求來取得範本時使用標頭。
- 可選的配置物件可用於覆寫所進行的獲取的行為,並應用其他自訂行為,例如如何處理取得的範本以及自訂錯誤處理。
在最簡單的情況下,您將僅使用配置物件的取得值。如果您不提供它,那麼它會使用全域獲取函數,但在計算中,您將需要它來指定一個後端,以供在包含模板時使用的獲取(除非您使用動態後端功能)。上面的範例片段在呼叫全域取得之前分配名為 origin_0 的後端。
就是這樣!透過這個簡單的設置,您可以擁有一個服務 ESI 標籤的後端和一個處理它們的計算應用程式。這是您可以運行的完整範例:
支援 ESI 功能
此實作提供了比我們過去提供的其他功能更多的 ESI 功能。
錯誤處理
有時,
<include src="./header.html"></include> <main> Content </main>
如果 /templates/header.html 導致錯誤,ESI 處理器會默默地忽略該錯誤並替換整個
也可以透過使用
<header>Welcome to the web site</header>
ESI 處理器首先執行
要注意的是,整個
條件句
ESI 還允許透過對變數執行運行時檢查來進行條件執行。以下是此類檢查的範例:
<header>Welcome to the web site</header>Content
當處理器遇到
處理器提供一組有限的變量,這些變量主要基於請求 cookie。在上面的範例中,檢查名為「group」的 HTTP cookie 的值。我們的實作是基於ESI語言規範;請參閱它以了解更多詳細資訊。
支援的標籤和功能列表
此實作支援 ESI 語言規範的以下標籤。
- ESI:包括
- esi:評論
- esi:刪除
- esi:試試 / esi:試試 / esi:例外
- ESI:選擇 / ESI:何時 / ESI:否則
- esi:vars
ESI 標籤的屬性支援 ESI 變量,
自訂行為意味著無限的可能性
雖然功能集足以令人興奮,但可編程的真正令人興奮的部分是更多的事情是可能的。引入模板是 ESI 的主要用途,但這絕不是它能做的全部。這是一個例子。
假設您在文件中標記了一個時間戳,您希望在顯示時將其表示為相對日期,例如「2 天前」。執行此操作的方法有很多,但為了獲得最佳性能和記憶體影響,最好在流中執行查找/替換。對此 ESI 庫進行程式設計實際上可以作為實現此目的的一個不錯的選擇。
我們可以使用特製的 ESI 標籤定義要在後端文件中編碼的時間戳,格式如下:
<include src="./header.html"></include> <main> Content </main>
例如,此程式碼片段可以代表太平洋時間 2024 年 1 月 1 日午夜:
<header>Welcome to the web site</header>
現在,設定 EsiTransformStream 以在看到該 URL 模式時提供合成替換文件:
<header>Welcome to the web site</header>Content
現在,當處理器遇到上面的範例片段時,它將發出類似於以下內容的結果(取決於您未來運行它的天數):
const transformedBody = resp.body.pipeThrough(esiTransformStream); return new Response( transformedBody, { status: resp.status, headers: resp.headers, }, );
由於後端文件可透過 Fastly 進行緩存,因此未來的請求可以從快取 HIT 中受益,同時處理將繼續顯示更新的相對時間。
有關此範例的實例,請查看以下小提琴:
拿它來旋轉一下吧!
@fastly/esi 現已在 npm 上提供,可新增至任何 JavaScript 程式。當然,在 Fastly Compute 程式的邊緣使用它,但事實上,只要您的環境支援 fetch API,它甚至可以在 Compute 之外工作。完整的源代碼可在 GitHub 上取得。
甚至在建立 Fastly 帳戶之前,就可以開始複製上面的任何一個 Fiddle,並用您自己的來源測試它們。當您準備好在我們的全球網路上發布服務時,您可以註冊 Compute 的免費試用版,然後立即開始使用 npm 上的 ESI 庫。
透過計算,邊緣是可編程和模組化的 - 選擇並組合最適合您的解決方案,甚至構建您自己的解決方案。我們並不是唯一能夠為計算提供此類模組的公司。任何人都可以為生態系統做出貢獻並從中受益。而且,一如既往,在 Fastly 社群論壇上與我們見面,讓我們知道您一直在建立什麼!
以上是模組化邊緣端包含 JavaScript 運算元件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3漢化版
中文版,非常好用

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。