自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Deno vs Node.js:哪個(gè)更勝一籌?

譯文
開(kāi)發(fā) 前端
Node.is仍然是使用最廣泛的JavaScript運(yùn)行時(shí)環(huán)境,但Deno更安全,并具有現(xiàn)代新穎的優(yōu)勢(shì)。本文比較了Deno和Node.js,幫助您決定哪個(gè)適合下一個(gè)項(xiàng)目。

?譯者 | 布加迪

審校 | 孫淑娟

您在本文中將了解Node.js和Deno、CommonJS與ECMAScript模塊之間的區(qū)別、將TypeScript與Deno結(jié)合使用,以及使用Deno Deploy進(jìn)行更快的部署。末尾附有注釋?zhuān)瑤椭鷽Q定下一個(gè)開(kāi)發(fā)項(xiàng)目使用Node.js還是Deno。

Node.js簡(jiǎn)介

Node.js是跨平臺(tái)的JavaScript運(yùn)行時(shí)環(huán)境,對(duì)服務(wù)器應(yīng)用程序和桌面應(yīng)用程序都很有用。它運(yùn)行向系統(tǒng)注冊(cè)的單線程事件循環(huán)來(lái)處理連接,每個(gè)新連接都會(huì)觸發(fā)JavaScript回調(diào)函數(shù)?;卣{(diào)函數(shù)可以使用非阻塞I/O調(diào)用處理請(qǐng)求。若有必要,它可以從池中生成線程,以執(zhí)行阻塞型或CPU密集型操作,并在CPU核心之間平衡負(fù)載。

大多數(shù)競(jìng)爭(zhēng)性架構(gòu)使用線程進(jìn)行擴(kuò)展,包括Apache HTTP Server、各種Java應(yīng)用服務(wù)器、IIS和ASP.NET以及Ruby on Rails。相比之下,Node使用回調(diào)函數(shù)進(jìn)行擴(kuò)展,這種方法只需較少的內(nèi)存就能處理更多的連接。

Node應(yīng)用程序并不僅限于純粹的JavaScript。您可以使用任何轉(zhuǎn)譯成JavaScript的語(yǔ)言,比如TypeScript和CoffeeScript。Node.js包含Google Chrome V8 JavaScript引擎,該引擎支持ECMAScript 2015 (ES6) 語(yǔ)法,根本不需要Babel之類(lèi)的ES6-to-ES5轉(zhuǎn)譯器。

Node的用途主要來(lái)自其龐大的軟件包庫(kù),該庫(kù)可通過(guò)npm命令來(lái)訪問(wèn)。NPM的全稱(chēng)是Node軟件包管理器,是標(biāo)準(zhǔn)Node.js安裝系統(tǒng)的一部分,不過(guò)它有自己的網(wǎng)站。

基于JavaScript的Node.js平臺(tái)由Ryan Dahl于2009年推出。當(dāng)初開(kāi)發(fā)這個(gè)更具可擴(kuò)展性的平臺(tái)是為了替代面向Linux和MacOS的Apache HTTP Server。NPM由Isaac Schlueter編寫(xiě),于2010年推出。Node.js的原生Windows版本于2011年首次亮相。

Deno簡(jiǎn)介

Deno是面向JavaScript和TypeScript的安全運(yùn)行時(shí)環(huán)境,已針對(duì)WebAssembly、JavaScript XML(JSX)及其TypeScript擴(kuò)展TSX進(jìn)行了擴(kuò)展。Deno由Node.js的創(chuàng)建者開(kāi)發(fā),試圖重新構(gòu)思Node,充分利用自2009年以來(lái)JavaScript方面的進(jìn)步,包括TypeScript編譯器。

與Node.js一樣,Deno本質(zhì)上是Google V8 JavaScript引擎外面的外殼。與Node不同,它在其可執(zhí)行映像中包含TypeScript編譯器。創(chuàng)建了這兩個(gè)運(yùn)行時(shí)環(huán)境的Dahl曾表示,Node.js存在三個(gè)主要問(wèn)題:基于集中式分發(fā)的設(shè)計(jì)欠佳的模塊系統(tǒng)、必須支持的許多遺留API以及缺乏安全性。Deno全部解決了這三個(gè)問(wèn)題。

Node的模塊系統(tǒng)問(wèn)題通過(guò)2022年年中的更新得到了解決。

CommonJS模塊和ECMAScript模塊

Node創(chuàng)建之時(shí),JavaScript模塊的事實(shí)標(biāo)準(zhǔn)是CommonJS,這是npm最初支持的。此后,ECMAScript委員會(huì)正式支持ECMAScript模塊(又叫ES模塊),它得到j(luò)spm軟件包管理器的支持。Deno也支持ES模塊。

對(duì)ES模塊的實(shí)驗(yàn)性支持已添加在Node.js 12.12中,從Node.js 16版本成了穩(wěn)定功能。 TypeScript 4.7也為Node.js 16支持ES模塊。

在JavaScript中加載CommonJS模塊的方法是使用require語(yǔ)句。加載ECMAScript模塊的方法是使用import語(yǔ)句以及匹配的export語(yǔ)句。

最新的Node.js擁有CommonJS和ES模塊的加載器。它們有何不同?CommonJS加載器是完全同步的,負(fù)責(zé)處理require()調(diào)用;支持文件夾作為模塊;如果在require()調(diào)用中省略了擴(kuò)展名(.js、.json或.node),可以嘗試添加擴(kuò)展名。CommonJS加載器不能用于加載ECMAScript模塊。ES模塊加載器則是異步的,負(fù)責(zé)處理import語(yǔ)句和import()表達(dá)式;不支持文件夾作為模塊(必須完整指定目錄索引,比如./startup/index.js);不搜索擴(kuò)展名;并且只接受JavaScript文本文件的.js、.mjs和.cjs擴(kuò)展名。ES模塊可用于加載JavaScript CommonJS模塊。

為什么Deno的安全性更高?

眾所周知,Deno提高了Node.js的安全性。這主要是由于Deno在默認(rèn)情況下不允許程序訪問(wèn)磁盤(pán)、網(wǎng)絡(luò)、子進(jìn)程或環(huán)境變量。如果您需要訪問(wèn)其中任何一項(xiàng),可以使用命令行標(biāo)志選擇加入,這個(gè)標(biāo)志的細(xì)粒度有多高就看您喜歡了,比如--allow-read=/tmp或--allow-net=google.com。Deno的另一個(gè)安全改進(jìn)是,它總是一發(fā)現(xiàn)未捕獲的錯(cuò)誤就終結(jié)。相比之下,Node允許在未捕獲的錯(cuò)誤后繼續(xù)執(zhí)行,結(jié)果無(wú)法預(yù)測(cè)。

可以結(jié)合使用Node.js和Deno嗎?

當(dāng)您考慮是否將Node.js或Deno用于下一個(gè)服務(wù)器端JavaScript項(xiàng)目時(shí),可能想知道是否可以結(jié)合使用兩者。答案是“也許可以”。

首先,從Deno使用Node軟件包往往是可行的。更棒的是,許多常見(jiàn)的阻礙有解決的方法。這包括使用Deno 標(biāo)準(zhǔn)庫(kù)的std/node模塊來(lái)“polyfill”Node的內(nèi)置模塊;使用CDN訪問(wèn)絕大多數(shù)npm軟件包,并確保適用于Deno;使用導(dǎo)入圖(import maps)。此外,從Deno1.15 開(kāi)始,Deno擁有Node兼容模式。

缺點(diǎn)是,Node 的插件系統(tǒng)與Deno不兼容;Deno的Node兼容模式不支持TypeScript;幾個(gè)內(nèi)置的Node模塊(比如vm)與Deno不兼容。

如果您是考慮換成Deno的Node用戶,這里有一份??速成表??有所幫助。

將TypeScript與Deno一起使用

Deno將TypeScript視為頭等語(yǔ)言,就像JavaScript或WebAssembly一樣。它結(jié)合使用Deno中內(nèi)置的TypeScript編譯器和名為swc的Rust庫(kù),將TypeScript(以及TSX和JSX)轉(zhuǎn)換成JavaScript。代碼經(jīng)過(guò)類(lèi)型檢查(如果啟用檢查)并轉(zhuǎn)換后,存儲(chǔ)在緩存中。換句話說(shuō),與Node.js或?yàn)g覽器不同,您不需要使用tsc編譯器手動(dòng)為Deno轉(zhuǎn)譯TypeScript。

從Deno 1.23開(kāi)始,默認(rèn)情況下Deno中沒(méi)有TypeScript類(lèi)型檢查。由于大多數(shù)開(kāi)發(fā)人員通過(guò)編輯器與類(lèi)型檢查器進(jìn)行交互,因此在Deno啟動(dòng)時(shí)再次進(jìn)行類(lèi)型檢查沒(méi)多大意義。話雖如此,您可以使用--check標(biāo)志啟用類(lèi)型檢查。

Deno Deploy實(shí)現(xiàn)更快的部署

Deno Deploy是一個(gè)分布式系統(tǒng),允許您在全球各地靠近用戶的地方(即邊緣)運(yùn)行JavaScript、TypeScript和WebAssembly。Deno Deploy服務(wù)器與V8運(yùn)行時(shí)環(huán)境深度集成,提供最小的延遲,消除不必要的抽象。您可以使用Deno CLI在本地開(kāi)發(fā)腳本,然后在不到一秒的時(shí)間內(nèi)將其部署到Deno Deploy的托管基礎(chǔ)??架構(gòu),無(wú)需進(jìn)行任何配置。

Deno Deploy建立在與Deno CLI相同的現(xiàn)代系統(tǒng)上,以全球可擴(kuò)展的方式提供最新、最出色的Web技術(shù):

  • 在Web上構(gòu)建:使用fetch、WebSocket或URL,就像在瀏覽器中一樣。
  • 對(duì)TypeScript和JSX的內(nèi)置支持:類(lèi)型安全的代碼和直觀的服務(wù)器端渲染,無(wú)需構(gòu)建這一步。
  • 與Web兼容的ECMAScript模塊:像在瀏覽器中一樣導(dǎo)入依賴(lài)項(xiàng),無(wú)需顯式安裝。
  • GitHub 集成:推送到分支,查看已部署的預(yù)覽,并合并以發(fā)布到生產(chǎn)環(huán)境。
  • 速度極快:不到一秒即可部署;服務(wù)全球,靠近用戶。

?從URL來(lái)部署:僅使用URL即可部署代碼。

Deno Deploy有兩種版本。免費(fèi)版僅限于每天100000個(gè)請(qǐng)求、每月100 GiB數(shù)據(jù)傳輸量以及每個(gè)請(qǐng)求10毫秒的CPU時(shí)間。專(zhuān)業(yè)版每月收費(fèi)10美元,包括每月500萬(wàn)次請(qǐng)求和100 GiB數(shù)據(jù)傳輸量,加上每月每多出1百萬(wàn)次請(qǐng)求就收費(fèi)2美元,以及超過(guò)配額后每傳輸1 GiB 數(shù)據(jù)就收費(fèi)0.30美元;專(zhuān)業(yè)版允許每個(gè)請(qǐng)求50毫秒的CPU時(shí)間。

選擇哪一個(gè):Node.js還是Deno?

如您所料,至于哪種技術(shù)更適合您的用例,答案取決于許多因素。我的結(jié)論是,如果您現(xiàn)有的Node.js部署沒(méi)壞掉,別修復(fù)它。如果您打算用TypeScript編寫(xiě)一個(gè)新項(xiàng)目,我強(qiáng)烈建議考慮Deno。然而,如果您的TypeScript項(xiàng)目需要使用多個(gè)沒(méi)有Deno同等軟件包的 Node.js軟件包,需要權(quán)衡Deno項(xiàng)目的可行性。從概念驗(yàn)證入手幾乎必不可少:如果不嘗試一下,很難預(yù)測(cè)您是否可以讓某個(gè)Node.js軟件包在Deno中工作。

原文標(biāo)題:??Deno vs. Node.js: Which is better????,作者:Martin Heller?

?

責(zé)任編輯:華軒 來(lái)源: 51CTO
相關(guān)推薦

2023-09-27 16:52:13

2024-07-31 09:39:33

2014-03-06 15:07:41

青橙小米

2022-07-20 08:16:54

Lombokjava工具

2022-05-30 11:06:44

人工智能AI人類(lèi)智能

2023-08-23 15:14:13

Web開(kāi)發(fā)Javascript編程語(yǔ)言

2020-01-18 14:55:03

架構(gòu)運(yùn)維技術(shù)

2017-06-08 15:38:41

2024-04-25 08:57:04

2020-03-06 09:21:28

PWA原生應(yīng)用Web

2010-05-28 11:21:17

2018-06-12 10:09:41

編程語(yǔ)言PythonJava

2023-10-07 14:30:47

云原生微服務(wù)

2012-11-14 09:44:20

apReduceHadoopCoronApache

2020-02-02 15:42:22

PythonC++編程語(yǔ)言

2018-08-15 08:33:33

編程Go語(yǔ)言開(kāi)發(fā)

2014-05-22 11:26:26

航班app體驗(yàn)

2017-01-11 14:38:39

編程語(yǔ)言Java

2017-04-15 18:58:31

PythonRuby編程語(yǔ)言

2018-03-26 14:09:00

緩存Redis分布式緩存
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)