發(fā)布于:2020-12-24 16:13:08
0
147
0
自從2009年創(chuàng)建以來,Node.js已經成為最流行的web技術之一。它并不是第一個允許JavaScript在服務器端進行處理的公司——那是1997年Netscape公司的Rhino——它專注于在瀏覽器之外執(zhí)行JavaScript,這使得它非常受歡迎。
您可以看到原因:在前端和后端使用相同的語言可以簡化事情。您可以在不了解多種語言的情況下編寫前端和服務器端代碼,然后在這兩種語言中重用代碼。此外,它還有垃圾收集功能,因此不會干擾內存管理或任何底層機制。創(chuàng)建您的業(yè)務邏輯代碼,讓她自行處理。腳本的簡單性是Python過去和現(xiàn)在如此流行的原因之一。
此外,在事件驅動編程還不流行的時候,它普及了它(但并沒有真正使它變得簡單)。js只在被調用時工作。它獲取一個請求,觸發(fā)一個回調,只要沒有其他東西需要運行,它就會休眠。支持大量異步并發(fā)用戶的巨大飛躍。難怪這么多大型web應用程序使用它。
但那是11年前的事了,用計算的術語來說,那已經很古老了。js生態(tài)系統(tǒng)已經發(fā)展到產生大量的圖書館——僅npm就有超過100萬個——它是基于一種本身經歷了11年令人難以置信的增長的技術。有一些破解方法,但它們仍不完美。
Node.js的創(chuàng)建者Ryan Dahl在2012年離開了Node.js項目,大約6年后又開始了與它的合作。在再次使用它的過程中,他發(fā)現(xiàn)了一些困擾他的設計缺陷。在2018年JSConf歐盟的一次發(fā)言中,他說,“當你對漏洞負責時,漏洞就會變得非常明顯?!彼运麤Q定創(chuàng)造一個新的實現(xiàn)他最初的想法:Deno。隨著上周發(fā)布的Deno v1,每個人都可以使用這個新版本。
當Node.js表現(xiàn)完美的時候,為什么你需要一個新的獨立的JavaScript運行時呢?好吧,繼續(xù)往下讀,我們將介紹主要的變化,以及它們對開發(fā)人員意味著什么。
Deno和Node之間的區(qū)別是什么?
與Node一樣,Deno主要在命令行界面上操作,這使得從其他程序調用它更加容易。它內置在Rust中,速度更快,并包含一個插件API。Deno被設計成一系列的防銹板條箱,其中以外延核作為主要的骨架運行時。另一個板條箱提供到JavaScript V8 c++ API的綁定。所以如果另一個版本的JavaScript取代了V8, Deno需要做的就是提供一個新的板條箱。
對于很多人來說,Deno中最致命的特性是對TypeScript的原生支持。TypeScript對JavaScript有很大的影響,但是它必須被轉換成JavaScript,以便利用它強大的類型和其他特性。但是有了Deno, TypeScript現(xiàn)在是一種一流的語言。您可以免去調試類型錯誤的痛苦,而不必擔心復雜的構建鏈。
TypeScript最近迅速流行起來,這在很大程度上是因為靜態(tài)類型語言具有更容易的可維護性和調試性,也因為它被Angular和React等流行的前端框架所采用。通過取消構建步驟,Deno消除了不切換到TypeScript的另一個原因。
對于一個為事件而構建的技術,Node.js并沒有做得很好。它出現(xiàn)在承諾或異步/等待模式的概念之前,因此必須提出自己的版本。早在2009年,Node.js就有了promise抽象的一個版本,但是在2010年就被刪除了。相反,它采用了EventEmitter模式。除非顯式地調用pause(),否則任何打開的TCP套接字都會不停地向您拋出事件,可能會淹沒一個停止的應用程序。
Deno逆轉。不是顯式地停止來自套接字的流,而是必須顯式地讀取它們。它們仍然異步運行,只是不是持續(xù)的。將它與構建在Rust中的類似承諾的抽象“期貨”結合起來,您就可以更容易地管理傳入的事件。
但是現(xiàn)在沒有任何一個網絡技術是孤立的,比如德諾節(jié)點。js -將支持龐大的模塊和依賴關系生態(tài)系統(tǒng)。js用npm做到了這一點,但是盡管它有一個npm的中央存儲庫,它還是無法阻止惡意參與者。最近,一些曾經有用的包被更新并嵌入了惡意代碼,暴露了自動更新的困難。
Deno在如何管理依賴關系方面受到了一些批評。Deno沒有通過包管理器路由它們,而是將每個依賴項模塊指定為一個簡單的URL。您不再擁有中央管理器的保護,但是不能保證該存儲庫提供的保護比直接鏈接到該代碼的保護更多。
像任何現(xiàn)代瀏覽器一樣,Deno在沙箱中執(zhí)行所有代碼;沒有明確的權限,它不能訪問硬盤驅動器、網絡連接或I/O外圍設備。任何代碼都必須使用啟用非沙箱活動的標志來執(zhí)行。而且權限是顆粒狀的——您可以授予對單個硬盤驅動器或網絡位置的訪問權。
Dahl明確表示,這不是節(jié)點的延續(xù);這是一個全新的項目。因此,它目前還不能與現(xiàn)有的Node.js生態(tài)系統(tǒng)相匹配。大多數(shù)包無法工作,工具也不兼容??赡茏屓藗冸x開,但保羅·福特說過我們的播客,“我不流血的邊緣了,但是如果你告訴我,一年后我下載Deno代替節(jié)點和使用包管理方法代替npm的了,我不會感到驚訝?!?/span>
這是web應用程序的游戲規(guī)則改變者,還是一個尚未站穩(wěn)腳跟的有用更新,還有待觀察。但乍一看,它可以在服務器端代碼中實現(xiàn)JavaScript(如TypeScript)標準過程的最新進展。
作者介紹