感受又好久好久沒寫東西了,內心有點忐忑不安:一直埋頭工做而不去學習新知識但是程序員的大忌,恰好Deno又正式發佈1.0,因此忙裏偷閒也要學習一下,那麼今天就是帶來一波簡單的Deno源碼分析。前端
有人說Deno就是Destroy Node的縮寫就是爲了替代Node.js而生,也有人說Deno目前不成熟並不能替代如今的Node.js等等;自從Ryan指出Node.js的十大問題而且公開了新的項目Deno,在某乎上立馬就展開各類(友好)討論。不過不管怎麼樣,有競爭纔有進步,Deno已經做爲一個挑戰者走進咱們的視野,咱們只需客觀正視它的優缺點就行了。
不過我的的一些見解,Deno的出現基本意味着這是一場死鬥,由於彼此基本特性實在太類似了:v8引擎,單線程異步,背靠着js的生態圈...,基本意味着開發者選擇二者其一就永遠不須要考慮其二,長遠來看用戶羣可能會分裂吧;而Deno目前在這個基礎上主打的是穩定性和安全性,這是服務端開發所必須的,只有知足這兩個要求基礎上才能去追求更高的性能,因此如今Deno的性能從官方的測試來看跟Node.js比仍是有一段距離,可是我的並不太擔憂這一塊性能差距,早晚也是會慢慢遇上來的,畢竟才1.0嘛。node
準備深刻Deno部分知識仍是要提早準備一下的:c++
不得不說,其實rust就是Deno和Node.js分界點,感受Deno的一個潛在目標就是把Deno的生態與rust的生態捆綁在一塊兒,這樣Deno一開始的生態比較弱的問題也能夠獲得一些緩解吧,另外對於前端來講早晚也是須要學習一門靜態語言的,rust也是一個不錯的選擇(rust但是StackOverflow最受歡迎的語言)。程序員
直接貼上官網的架構圖:
這裏官方的架構圖還沒來得及更新,libdeno已經替換成rusty_v8,這樣意味着咱們開發native插件的時候能夠徹底繞過了c/c++,直接使用rust就能夠完成功能開發(加上rust自己自帶一個可靠強大的標準庫更加駕輕就熟),固然開發者仍是須要了解V8引擎相關的知識了。
再回到架構圖上,咱們知道Node.js是由libuv提供調度和io的能力,那麼在Deno上這個角色就由rust的Tokio庫提供類似的能力,而一開始Deno仍是想使用go語言來提供這樣的能力(Ryan果真是go語言的真粉),可是畢竟go語言也是帶gc的(一個應用上同時跑兩個gc,穩定性實在很難想象)並且性能上也是差rust一截,後面替換成rust也是至關明智的,另外Tokio其實對比libuv也是絕不遜色的(任務調度算法也是參考了go語言的實現)
另外在Deno裏面js與rust的交互都會經過Deno.core.send和Deno.core.recv這兩個方法,這樣作對於應用作審計和權限控制是很是有好處,後面再會分析js和rust是如何交互的。最後例如js異步讀取文件這些操做都會扔到Tokio線程池中執行,這也是Deno實現非阻塞的關鍵點。
而後Deno爲了安全的緣由,對資源都作了一層映射,本來系統的文件描述符或者其餘資源都映射成了一個rid(非零整數),對資源的操做都須要經過rid進行。算法
| **Linux** | **Deno** | | ------------------------------: | :------------------------------- | | Processes | Web Workers | | Syscalls | Ops | | File descriptors (fd) | [Resource ids (rid)](#resources) | | Scheduler | Tokio | | Userland: libc++ / glib / boost | https://deno.land/std/ | | /proc/\$\$/stat | [Deno.metrics()](#metrics) | | man pages | deno types |
好吧,把全部的概念聚集在一塊兒,跟Linux一對比,就會發現Deno真的頗有意思了,難道是想要變成一個輕量級js應用平臺嗎?官方文檔透露的信息實在太少了,感受一些設計意圖也沒有表達出來,但願文檔可以再詳細一點就行了。typescript
. ├── cli //負責實現各類接口,包括兼容瀏覽器的和Deno.xxx ├── core //負責實例化和執行模塊代碼,處理js與rust之間交互還有實現event-loop ├── deno_typescript //負責編譯打包typescript文件和生成v8的snapshot ├── docs //文檔 ├── std //std標準庫 ├── target ├── test_plugin ├── third_party └── tools
本身再整理裏面各個模塊的依賴關係,大體以下:瀏覽器
固然發現更有趣的是std目錄下還有有一個node的模塊:安全
. ├── README.md ├── _fs ├── _utils.ts ├── events.ts ├── events_test.ts ├── fs.ts ├── global.ts ├── module.ts ├── module_test.ts ├── os.ts ├── os_test.ts ├── path.ts ├── process.ts ├── process_test.ts ├── querystring.ts ├── querystring_test.ts ├── tests ├── timers.ts ├── util.ts └── util_test.ts
是否是看到這些文件名稱就有一種至關熟悉的感受,嗯,這就是deno爲了兼容node模塊所作的一個兼容層,雖然尚未完成,不過至少也知道deno也是有這個意願去兼容node的模塊,或許在下一個版本咱們就能看到deno可以直接使用node的模塊去開發應用了。架構
暫時先介紹到這裏,好像一點也沒有深刻到代碼,真的是標題黨,哈哈,下一篇文章再來深刻代碼分析。異步