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