理解 Deno
deno: A new way to Javascript
為什麼要花時間學習它呢?
- 前端開發 Javascript 是世界上最大的生態圈。
- TypeScript 作為 Javascript 的超集,兼顧了 Javascript 靈活性和工程化能力。
- V8 使用 EventLoop 併發模型,天生適合事件驅動型場景。
- 在後端業務開發逐漸標準化的趨勢下,業務開發工具最需要的是可控的效率。
- deno 的作者在建立完 node.js 後,總結大量工業經驗,系統架構設計得很簡潔,簡潔的東西穩定性高,根基正,可成大樹。
然後,從各種資料裡屢清楚這個專案的脈絡
- 作者 Ryan Dahl 的演講 《10 Things I Regret About Node.js》 和 《Deno, A New Server-Side Runtime》
- 官網: https://deno.land
- 使用手冊: https://deno.land/manual.html
- 原始碼釋出資訊: Release.md
可以看到 deno 的設計目標:為 TypeScript/Javascript 提供一個安全簡潔的沙箱執行時。
在原型實現裡,即 Golang 版本,使用 V8 編譯 Javascript,基於 v8 做了一個叫 v8worker2 的模組,通過訊息傳遞的方式實現 js 和 Golang 的溝通,將訊息傳遞抽象成 send/recv,訊息體使用 protobuf 編碼,以簡化架構。
後面的迭代中,由於 Golang GC 和 V8 GC 使執行時的不確定性大大增加,作者決定用 Rust 重寫核心部分,Rust 的 runtime 沒有 GC,主要以顯示宣告資源的所屬權來規避資源競爭的問題,沒有垃圾產生,故不需要回收。
deno 使用第三方開源庫 tokio 作為內部資源非同步請求的排程模組。
由於訊息體編碼模組最重要的高效能,所以也從開始的 protobuf 切換到 flatbuffers。
有了這些背景知識,我們大致就能看懂架構圖了:

deno.png
JS 本身通過 V8 編譯成可執行檔案,通過 libdeno 以收發訊息的形式與 deno runtime 溝通,即操作 OS 資源。