搜索
首页web前端js教程模块化边缘端包含 JavaScript 计算组件

A modular Edge Side Includes component for JavaScript Compute

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 的主要功能是下载附加模板,以包含到结果流中。遇到 标签使用 fetch 作为检索模板的底层机制,这些参数的主要目的是配置这些 fetch 调用:

  • URL用于解析的src中的相对路径标签。
  • 在发出额外请求来获取模板时使用标头。
  • 可选的配置对象可用于覆盖所进行的获取的行为,并应用其他自定义行为,例如如何处理获取的模板以及自定义错误处理。

在最简单的情况下,您将仅使用配置对象的获取值。如果您不提供它,那么它会使用全局获取函数,但在计算中,您将需要它来指定一个后端,以供在包含模板时使用的获取(除非您使用动态后端功能)。上面的示例片段在调用全局获取之前分配名为 origin_0 的后端。

就是这样!通过这个简单的设置,您可以拥有一个服务 ESI 标签的后端和一个处理它们的计算应用程序。这是您可以运行的完整示例:

小提琴.fastly.dev

支持 ESI 功能

此实现提供了比我们过去提供的其他功能更多的 ESI 功能。

错误处理

有时, 引用的文件会被引用。标签可能由于不存在或导致服务器错误而无法获取。在这些情况下可以通过添加属性 onerror="continue" 来忽略错误。

<include src="./header.html"></include>
<main>
Content
</main>

如果 /templates/header.html 导致错误,ESI 处理器会默默地忽略该错误并替换整个 。带有空字符串的标签。

还可以通过使用 来使用更结构化的错误处理。块,看起来像这样:

<header>Welcome to the web site</header>

ESI 处理器首先执行 的内容。如果 esi:include 标记导致错误,则 ESI 处理器会执行 .

的内容

需要注意的是,整个 是块被整个 替换。如果成功或 则阻止如果有错误。在上面的示例中,如果 /templates/header.html 导致错误,那么这也会导致文本 "Main header" 不会出现在输出中;仅包含文本 “替代标题”。有关更多详细信息,请参阅 ESI 语言规范。

条件句

ESI 还允许通过对变量执行运行时检查来进行条件执行。以下是此类检查的示例:

<header>Welcome to the web site</header>
Content

当处理器遇到 时块,它贯穿 ;块,检查其测试属性中设置的表达式。处理器执行第一个 esi:when 块,其中表达式的计算结果为 true。如果没有一个表达式的计算结果为 true,那么它将选择执行 esi:otherwise 块(如果提供)。整个块被替换为 中的整个块。或执行的块。

处理器提供一组有限的变量,这些变量主要基于请求 cookie。在上面的示例中,检查名为“group”的 HTTP cookie 的值。我们的实现是基于ESI语言规范;请参阅它以了解更多详细信息。

支持的标签和功能列表

此实现支持 ESI 语言规范的以下标签。

  • ESI:包括
  • esi:评论
  • esi:删除
  • esi:尝试 / esi:尝试 / esi:例外
  • ESI:选择 / ESI:何时 / ESI:否则
  • esi:vars

;标签在规范中定义为可选,并且不包含在此实现中。

ESI 标签的属性支持 ESI 变量, 的 test 属性支持 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.dev

拿它来旋转一下吧!

@fastly/esi 现已在 npm 上提供,可以添加到任何 JavaScript 程序中。当然,在 Fastly Compute 程序的边缘使用它,但事实上,只要您的环境支持 fetch API,它甚至可以在 Compute 之外工作。完整的源代码可在 GitHub 上获取。

甚至在创建 Fastly 帐户之前,就可以开始克隆上面的任何一个 Fiddle,并用您自己的来源测试它们。当您准备好在我们的全球网络上发布服务时,您可以注册 Compute 的免费试用版,然后立即开始使用 npm 上的 ESI 库。

通过计算,边缘是可编程和模块化的 - 选择并组合最适合您的解决方案,甚至构建您自己的解决方案。我们并不是唯一能够为计算提供此类模块的公司。任何人都可以为生态系统做出贡献并从中受益。并且,一如既往,在 Fastly 社区论坛上与我们见面,让我们知道您一直在构建什么!

以上是模块化边缘端包含 JavaScript 计算组件的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
JavaScript的角色:使网络交互和动态JavaScript的角色:使网络交互和动态Apr 24, 2025 am 12:12 AM

JavaScript是现代网站的核心,因为它增强了网页的交互性和动态性。1)它允许在不刷新页面的情况下改变内容,2)通过DOMAPI操作网页,3)支持复杂的交互效果如动画和拖放,4)优化性能和最佳实践提高用户体验。

C和JavaScript:连接解释C和JavaScript:连接解释Apr 23, 2025 am 12:07 AM

C 和JavaScript通过WebAssembly实现互操作性。1)C 代码编译成WebAssembly模块,引入到JavaScript环境中,增强计算能力。2)在游戏开发中,C 处理物理引擎和图形渲染,JavaScript负责游戏逻辑和用户界面。

从网站到应用程序:JavaScript的不同应用从网站到应用程序:JavaScript的不同应用Apr 22, 2025 am 12:02 AM

JavaScript在网站、移动应用、桌面应用和服务器端编程中均有广泛应用。1)在网站开发中,JavaScript与HTML、CSS一起操作DOM,实现动态效果,并支持如jQuery、React等框架。2)通过ReactNative和Ionic,JavaScript用于开发跨平台移动应用。3)Electron框架使JavaScript能构建桌面应用。4)Node.js让JavaScript在服务器端运行,支持高并发请求。

Python vs. JavaScript:比较用例和应用程序Python vs. JavaScript:比较用例和应用程序Apr 21, 2025 am 12:01 AM

Python更适合数据科学和自动化,JavaScript更适合前端和全栈开发。1.Python在数据科学和机器学习中表现出色,使用NumPy、Pandas等库进行数据处理和建模。2.Python在自动化和脚本编写方面简洁高效。3.JavaScript在前端开发中不可或缺,用于构建动态网页和单页面应用。4.JavaScript通过Node.js在后端开发中发挥作用,支持全栈开发。

C/C在JavaScript口译员和编译器中的作用C/C在JavaScript口译员和编译器中的作用Apr 20, 2025 am 12:01 AM

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

JavaScript在行动中:现实世界中的示例和项目JavaScript在行动中:现实世界中的示例和项目Apr 19, 2025 am 12:13 AM

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

JavaScript和Web:核心功能和用例JavaScript和Web:核心功能和用例Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

了解JavaScript引擎:实施详细信息了解JavaScript引擎:实施详细信息Apr 17, 2025 am 12:05 AM

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。