跳至主要内容

使用 Web 平台 API

Deno 简化 Web 和云开发的一种方式是使用 Web 平台 API(如 fetch)而不是专有 API。这意味着,如果您曾经为浏览器构建过应用程序,那么您可能已经熟悉 Deno,如果您正在学习 Deno,那么您也在投资于您对 Web 的了解。

支持的 API

以下是 Deno 中支持的 Web 平台 API 的部分列表

您可以在 此处 找到这些 API 的 Deno 参考。要检查 Deno 中是否可以使用 Web 平台 API,请点击 MDN 上的接口 并参考 其浏览器兼容性表(链接示例)。

fetch API

概述

fetch API 可用于发出 HTTP 请求。它按照 WHATWG fetch 规范 中的规定实现。

您可以在 MDN 上找到有关此 API 的文档。

规范偏差

  • Deno 用户代理没有 cookie 存储器。因此,响应中的 set-cookie 标头不会被处理或从可见响应标头中过滤掉。
  • Deno 不遵循同源策略,因为 Deno 用户代理目前没有起源的概念,也没有 cookie 存储器。这意味着 Deno 不需要防止跨源泄露经过身份验证的数据。因此,Deno 未实现 WHATWG fetch 规范的以下部分
    • 3.1. 'Origin' 标头 节。
    • 3.2. CORS 协议 节。
    • 3.5. CORB 节。
    • 3.6. 'Cross-Origin-Resource-Policy' 标头 节。
    • 原子 HTTP 重定向处理.
    • opaqueredirect 响应类型。
  • redirect 模式为 manualfetch 将返回 basic 响应,而不是 opaqueredirect 响应。
  • 规范对 如何处理 file: URL 模糊不清。Firefox 是唯一一个实现获取 file: URL 的主流浏览器,即使这样,它默认情况下也不起作用。从 Deno 1.16 开始,Deno 支持获取本地文件。有关详细信息,请参见下一节。
  • requestresponse 的头部保护机制已实现,但与浏览器不同,对允许的头部名称没有限制。
  • referrerreferrerPolicymodecredentialscacheintegritykeepalivewindow 属性以及它们在 RequestInit 中的相关行为尚未实现。Request 对象上不存在相关字段。
  • 支持请求主体上传流式传输(在 HTTP/1.1 和 HTTP/2 上)。与当前的 fetch 提案不同,该实现支持双向流式传输。
  • headers 迭代器中迭代时,不会将 set-cookie 头部连接起来。这种行为正在规范化过程中

获取本地文件

从 Deno 1.16 开始,Deno 支持获取 file: URL。这使得编写在服务器和本地使用相同代码路径的代码变得更容易,也更容易编写在 Deno CLI 和 Deno Deploy 上都能工作的代码。

Deno 仅支持绝对文件 URL,这意味着 fetch("./some.json") 将不起作用。但是需要注意的是,如果指定了--location,则相对 URL 使用 --location 作为基准,但不能将 file: URL 作为 --location 传递。

为了能够获取相对于当前模块的某些资源,无论模块是本地还是远程,您都需要使用 import.meta.url 作为基准。例如,类似于

const response = await fetch(new URL("./config.json", import.meta.url));
const config = await response.json();

关于获取本地文件的说明

  • 权限应用于读取资源,因此需要适当的 --allow-read 权限才能读取本地文件。
  • 本地获取仅支持 GET 方法,其他方法将拒绝 promise。
  • 不存在的文件将简单地拒绝 promise,并返回一个模糊的 TypeError。这是为了避免潜在的指纹攻击。
  • 响应中没有设置任何头部。因此,由消费者确定诸如内容类型或内容长度等信息。
  • 响应主体从 Rust 端流式传输,因此大型文件可以分块提供,并且可以取消。

CustomEventEventTargetEventListener

概述

DOM 事件 API 可用于调度和监听应用程序中发生的事件。它按照 WHATWG DOM 规范 中的规定实现。

您可以在 MDN 上找到有关此 API 的文档。

规范偏差

  • 事件不会冒泡,因为 Deno 没有 DOM 层次结构,因此事件没有树来冒泡/捕获。
  • timeStamp 属性始终设置为 0

类型定义

已实现的 Web API 的 TypeScript 定义可以在 lib.deno.shared_globals.d.tslib.deno.window.d.ts 文件中找到。

特定于工作者的定义可以在 lib.deno.worker.d.ts 文件中找到。

其他 API 与规范的偏差

缓存 API

仅实现以下 API

与浏览器相比,有一些不同之处

  1. 您不能将相对路径传递给 API。请求可以是 Request 或 URL 的实例,也可以是 URL 字符串。
  2. match()delete() 还不支持查询选项。