Node 之父重構的 Deno 正式釋出了,它會取代 Node 嗎?

徐九發表於2020-05-16

clipboard.png

技術編輯:徐九丨發自 侏羅紀公園
SegmentFault 思否報導丨公眾號:SegmentFault


近日,Deno 1.0 正式釋出了。這是 Node 之父 Ryan Dahl 繼 Node 之後的又一大作。

Deno 是一個通用的 JavaScript / TypeScript 程式設計環境。它彙集了許多最佳的開源技術,並在一個小的可執行檔案中提供了全面的解決方案。

Deno 和 Node 作為“同父異母”的親兄弟,不僅名字很像,就連要解決的問題也很像。那麼 Ryan 推出 Deno 的目的什麼?它們之間又有哪些異同?

既生 Node,何生 Deno?

clipboard.png

Dahl 曾經在 JS Conf Berlin 上做了一個題為《10 THINGS I REGRET ABOUT NODE.JS》的演講,在這個演講中他總結了自己當初在 Node 設計中的失誤。

其中的遺憾之一是沒有使用 JavaScript Promises,這些東西在 2009 年被新增到 Node 中,但在 2010 年被移除。這導致的結果是很多 Node 的 Async API "老化嚴重"。

另一個失誤是安全性和缺乏 Node 沙盒。Dahl 表示使用 GYP(Generate Your Projects)的構建系統對使用者來說是"可怕的體驗"。

與早期關注均衡 I/O 的情況相反,模組系統本質上是事後考慮的。如果考慮到這一點,那麼在早期階段就可以做的更好。

這也是 Dahl 為什麼要搞 Deno 的原因,但 Deno 並不定位為 Node 的替代品,從整體功能來看,Deno 有更大的野心。據業內人士分析討論,推測是想要取代現在陳舊的前後端開發模式,讓 Deno 一統前後端開發全流程。

Deno 和 Node 的區別

clipboard.png

它建立在V8(Chromium和Node.js所使用的JavaScript引擎)上,但與Node不同的是,它利用了V8沙盒的安全優勢。除非明確啟用,否則沒有檔案、網路或環境訪問許可權。

clipboard.png

與用 C++編寫的 Node.js 不同,Deno 用 Rust 編寫。

Deno_core 是一個 Rust 包,任何人都可以用它將 JavaScript 執行時嵌入到 Rust 中,而 Deno 就是建立在 deno_core 之上。

另一個包 Rusty_v8,提供了 Rust 與 V8 C++ API 的繫結;它 "試圖成為一個安全的介面",但還不是百分之百的安全。"能夠以安全的方式與 V8 這樣複雜的虛擬機器進行互動是相當驚人的,這讓我們發現了 Deno 本身的許多困難的 bug,"Dahl 釋出的帖子解釋道。

Deno 的排程是由 Tokio 處理的,它是 Rust 的非同步執行時。另一個關鍵元件是 TypeScript,它是 Deno 中的主要語言。你可以直接執行 TypeScript 檔案,不需要將其編譯成 JavaScript。

Deno本身就是一個完整的生態系統,具有執行時和其自己的模組/軟體包管理系統。這為內建所有工具提供了更大的空間,並且成功地消除了 JavaScript 開發中的許多缺點。比如:

  • 通過使用 Web 標準,Deno 可以對其 API 進行過時的驗證;
  • 除 JavaScript 之外還擁有 TypeScript,消除了編譯負擔並允許更緊密的整合;
  • 內建工具意味著無需浪費時間尋找開箱即用的產品;
  • 分散式軟體包管理使使用者從 npm 中解放出來,與使用遞減的 CommonJS 相比,ECMAScript 模組帶來了新鮮的空氣;

Deno 會取代 Node 麼?

clipboard.png

無論如何,由 Dahl 大神光環加持,再加上“面向未來”的設計,Deno 肯定會成為一個熱議的話題。

不過雖然這次 Node 的版本號標為了 1.0,但也仍處於非常早期的階段,Deno API 的某些部分還不穩定,根據文件所說,Deno 的標準模組也還不太穩定。該團隊還表示內部使用的 TypeScript 編譯器速度非常慢。

他們的意圖是將 TypeScript 編譯器移植到 Rust 上,儘管這是一個大專案。如果完成的話,對所有的 TypeScript 開發者都會有幫助,所以 Deno 團隊也在呼籲大家為他們提供幫助。

所以,對於 Deno 是否會取代 Node 這件事,現在討論還為時尚早。但多一個輪子多一條路,Deno 的出現,對於前端這個領域來說,一定是一個好事情。

相關資料:

官方文件:https://deno.land/
GitHub 地址:https://github.com/denoland/deno

clipboard.png

相關文章