本页内容

使用 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() 还不支持查询选项。