快速瞭解 Deno 目前的 API

方應杭發表於2018-06-01

Deno 是 Node.js 之父新造的輪子。旨在用 Golang 和 TypeScript 實現一個很小的 JS runtime。(其目標不是取代 Node.js)

由於 Deno 還沒有釋出可直接執行的二進位制檔案,所以想要了解 Deno 的功能的話你有兩種方式:

  1. 下載 Deno 原始碼自行編譯
  2. 直接看原始碼

第一種方式我在 macOS 上折騰了好久,依然出現各種報錯,只好作罷,現在只能等 GitHub 網友推出 Dockerfile 再試試。有在 macOS 上執行成功的可以說下經驗。

第二種方式其實也不算難,因為目前 Deno 的功能真的挺少的。

原始碼速讀

首先開啟 deno.d.ts 可以看到 deno 提供的 API

declare module "deno" {
  type MessageCallback = (msg: Uint8Array) => void;
  function sub(channel: string, cb: MessageCallback): void;
  function pub(channel: string, payload: Uint8Array): null | ArrayBuffer;

  function readFileSync(filename: string): Uint8Array;
  function writeFileSync(
    filename: string,
    data: Uint8Array,
    perm: number
  ): void;
}
複製程式碼

sub、pub、readFileSync 和 writeFileSync 共四個。

除此之外還有其他 API,見 testdata 裡面的 15 個左右的測試檔案,目測有如下功能:

  1. console.log
  2. import { returnsHi, returnsFoo2, printHello3 } from"./subdir/mod1.ts";
  3. import { printHello } from"http://localhost:4545/testdata/subdir/print_hello.ts";
  4. setTimeout
  5. setInterval
  6. throwError
  7. fetch
  8. 提供了 window 全域性變數
  9. 提供了 TextEncoder
  10. 提供了 os#exit、os#codeFetch 和 os#codeCache(用途我還沒看出來)
  11. 提供了一個極小的 runtime ,按照官方說法,這個 runtime 可移植性很好
  12. 其他

上面是 JS 方面的功能,有些功能應該沒寫進測試裡,我還沒時間細看。

可以看出 Deno 從一開始就沒有想要相容 Node.js。

除此之外 Deno 還有一個 V8 worker,它提供的 API 也很簡單:

declare namespace V8Worker2 {
  function print(...args: any[]): void;
  type RecvCallback = (ab: ArrayBuffer) => void;
  function recv(cb: RecvCallback): void;
  function send(ab: ArrayBuffer): null | ArrayBuffer;
}
複製程式碼

就這三個 API。send 和 recv 的使用方法見 dispatch.ts#L60。 deno#pub 就是基於 send 實現的。

如果你看好 Deno,現在學習 go,然後看 Deno 原始碼,說不定一年後你就是 Deno 大佬了~!

就算 Deno 沒火,你也學會了 go,轉職 go 工程師指日可待,真是百利而無一害~

少年,我看好你。

相關文章