理解 Deno

deno: A new way to JavaScript

為什么要花時間學(xué)習(xí)它呢?

  1. 前端開發(fā) JavaScript 是世界上最大的生態(tài)圈。
  2. TypeScript 作為 JavaScript 的超集,兼顧了 JavaScript 靈活性和工程化能力。
  3. V8 使用 EventLoop 并發(fā)模型,天生適合事件驅(qū)動型場景。
  4. 在后端業(yè)務(wù)開發(fā)逐漸標(biāo)準(zhǔn)化的趨勢下,業(yè)務(wù)開發(fā)工具最需要的是可控的效率。
  5. deno 的作者在創(chuàng)建完 node.js 后,總結(jié)大量工業(yè)經(jīng)驗(yàn),系統(tǒng)架構(gòu)設(shè)計得很簡潔,簡潔的東西穩(wěn)定性高,根基正,可成大樹。

然后,從各種資料里屢清楚這個項(xiàng)目的脈絡(luò)

  1. 作者 Ryan Dahl 的演講《10 Things I Regret About Node.js》《Deno, A New Server-Side Runtime》
  2. 官網(wǎng):https://deno.land
  3. 使用手冊:https://deno.land/manual.html
  4. 源碼發(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 資源。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容