deno: A new way to JavaScript
為什么要花時間學(xué)習(xí)它呢?
- 前端開發(fā) JavaScript 是世界上最大的生態(tài)圈。
- TypeScript 作為 JavaScript 的超集,兼顧了 JavaScript 靈活性和工程化能力。
- V8 使用 EventLoop 并發(fā)模型,天生適合事件驅(qū)動型場景。
- 在后端業(yè)務(wù)開發(fā)逐漸標(biāo)準(zhǔn)化的趨勢下,業(yè)務(wù)開發(fā)工具最需要的是可控的效率。
- deno 的作者在創(chuàng)建完 node.js 后,總結(jié)大量工業(yè)經(jīng)驗(yàn),系統(tǒng)架構(gòu)設(shè)計得很簡潔,簡潔的東西穩(wěn)定性高,根基正,可成大樹。
然后,從各種資料里屢清楚這個項(xiàng)目的脈絡(luò)
- 作者 Ryan Dahl 的演講《10 Things I Regret About Node.js》 和 《Deno, A New Server-Side Runtime》
- 官網(wǎng):https://deno.land
- 使用手冊:https://deno.land/manual.html
- 源碼發(fā)布信息:Release.md
可以看到 deno 的設(shè)計目標(biāo):為 TypeScript/JavaScript 提供一個安全簡潔的沙箱運(yùn)行時。
在原型實(shí)現(xiàn)里,即 Golang 版本,使用 V8 編譯 JavaScript,基于 v8 做了一個叫 v8worker2 的模塊,通過消息傳遞的方式實(shí)現(xiàn) js 和 Golang 的溝通,將消息傳遞抽象成 send/recv,消息體使用 protobuf 編碼,以簡化架構(gòu)。
后面的迭代中,由于 Golang GC 和 V8 GC 使運(yùn)行時的不確定性大大增加,作者決定用 Rust 重寫內(nèi)核部分,Rust 的 runtime 沒有 GC,主要以顯示聲明資源的所屬權(quán)來規(guī)避資源競爭的問題,沒有垃圾產(chǎn)生,故不需要回收。
deno 使用第三方開源庫 tokio 作為內(nèi)部資源異步請求的調(diào)度模塊。
由于消息體編碼模塊最重要的高性能,所以也從開始的 protobuf 切換到 flatbuffers。
有了這些背景知識,我們大致就能看懂架構(gòu)圖了:

deno.png
JS 本身通過 V8 編譯成可執(zhí)行文件,通過 libdeno 以收發(fā)消息的形式與 deno runtime 溝通,即操作 OS 資源。