跳到主要內容

使用網路平台 API

Deno 簡化網路和雲端開發的一種方式,是透過使用 Web 平台 API(例如 fetch)而非專有 API。這表示如果您曾經為瀏覽器建置,您可能已經熟悉 Deno,而如果您正在學習 Deno,您也正在投資您對網路的知識。

支援的 API

以下是 Deno 中支援的網路平台 API 部分清單

您可以在 這裡 找到這些 API 的 Deno 參考。若要查看 Web 平台 API 是否在 Deno 中可用,請按一下 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)。與目前的擷取建議不同,此實作支援雙工串流。
  • 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 方法,並會拒絕使用任何其他方法的承諾。
  • 不存在的檔案只會拒絕承諾,並顯示不明確的 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() 尚未支援查詢選項。