Deno 是 Node.js 之父新造的輪子。旨在用 Golang 和 TypeScript 實現一個很小的 JS runtime。(其目標不是取代 Node.js)
由於 Deno 還沒有釋出可直接執行的二進位制檔案,所以想要了解 Deno 的功能的話你有兩種方式:
- 下載 Deno 原始碼自行編譯
- 直接看原始碼
第一種方式我在 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/009_pub_sub.ts
- 後兩個 API 的使用方式見:tests.ts
除此之外還有其他 API,見 testdata 裡面的 15 個左右的測試檔案,目測有如下功能:
- console.log
- import { returnsHi, returnsFoo2, printHello3 } from"./subdir/mod1.ts";
- import { printHello } from"http://localhost:4545/testdata/subdir/print_hello.ts";
- setTimeout
- setInterval
- throwError
- fetch
- 提供了 window 全域性變數
- 提供了 TextEncoder
- 提供了 os#exit、os#codeFetch 和 os#codeCache(用途我還沒看出來)
- 提供了一個極小的 runtime ,按照官方說法,這個 runtime 可移植性很好
- 其他
上面是 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 工程師指日可待,真是百利而無一害~
少年,我看好你。