使用 Web 平台 API
Deno 简化 Web 和云开发的一种方式是使用 Web 平台 API(如 fetch
)而不是专有 API。这意味着,如果您曾经为浏览器构建过应用程序,那么您可能已经熟悉 Deno,如果您正在学习 Deno,那么您也在投资于您对 Web 的了解。
支持的 API
以下是 Deno 中支持的 Web 平台 API 的部分列表
- Blob
- BroadcastChannel
- Cache
- 通道消息 API
- 压缩流 API
- Console
- DOM API
- DOM
CustomEvent
、EventTarget
和EventListener
- 编码 API
- Fetch API
FormData
- 位置 API
navigator.language
API- 性能 API
setTimeout
、setInterval
、clearInterval
- 流 API
URL
URLPattern
URLSearchParams
- Web 加密 API
- Web 文件 API
- Web 存储 API
- Web 工作线程 API
WebSocket
您可以在 此处 找到这些 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
模式为manual
的fetch
将返回basic
响应,而不是opaqueredirect
响应。- 规范对 如何处理
file:
URL 模糊不清。Firefox 是唯一一个实现获取file:
URL 的主流浏览器,即使这样,它默认情况下也不起作用。从 Deno 1.16 开始,Deno 支持获取本地文件。有关详细信息,请参见下一节。 request
和response
的头部保护机制已实现,但与浏览器不同,对允许的头部名称没有限制。referrer
、referrerPolicy
、mode
、credentials
、cache
、integrity
、keepalive
和window
属性以及它们在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 端流式传输,因此大型文件可以分块提供,并且可以取消。
CustomEvent
、EventTarget
和 EventListener
概述
DOM 事件 API 可用于调度和监听应用程序中发生的事件。它按照 WHATWG DOM 规范 中的规定实现。
您可以在 MDN 上找到有关此 API 的文档。
规范偏差
- 事件不会冒泡,因为 Deno 没有 DOM 层次结构,因此事件没有树来冒泡/捕获。
timeStamp
属性始终设置为0
。
类型定义
已实现的 Web API 的 TypeScript 定义可以在 lib.deno.shared_globals.d.ts
和 lib.deno.window.d.ts
文件中找到。
特定于工作者的定义可以在 lib.deno.worker.d.ts
文件中找到。
其他 API 与规范的偏差
缓存 API
仅实现以下 API
- CacheStorage::open()
- CacheStorage::has()
- CacheStorage::delete()
- Cache::match()
- Cache::put()
- Cache::delete()
与浏览器相比,有一些不同之处
- 您不能将相对路径传递给 API。请求可以是 Request 或 URL 的实例,也可以是 URL 字符串。
match()
和delete()
还不支持查询选项。