溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Deno和Node.js有哪些區(qū)別

發(fā)布時(shí)間:2022-12-02 09:59:23 來源:億速云 閱讀:128 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“Deno和Node.js有哪些區(qū)別”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

什么是Deno,以及它的主要特性是哪些?

Deno是基于Google V8引擎構(gòu)建的安全的TypeScript運(yùn)行環(huán)境。 下面是構(gòu)建Deno的一些物料:

  • Rust(Deno的核心模塊使用Rust編寫,Node的核心模塊是用C++實(shí)現(xiàn)的)

  • Tokio(Rust實(shí)現(xiàn)的異步編程框架)

  • TypeScript(Deno對(duì)JavaScript和TypeScript都支持開箱即用)

  • V8(Google出品JavaScript運(yùn)行時(shí),主要用在Chrome和Node中)

接下來看看Deno提供了哪些特性。

安全性(權(quán)限管理)

Deno最重要的特性就是安全性。

相較于Node,Deno默認(rèn)使用沙箱環(huán)境執(zhí)行代碼,這意味著運(yùn)行環(huán)境沒有操作以下模塊權(quán)限:

  • 文件系統(tǒng)

  • 網(wǎng)絡(luò)

  • 執(zhí)行其他的腳本

  • 系統(tǒng)環(huán)境變量

讓我們瞅一眼Deno的權(quán)限系統(tǒng)是如何工作滴。

(async () => {
 const encoder = new TextEncoder();
 const data = encoder.encode('Hello world\n');

 await Deno.writeFile('hello.txt', data);
 await Deno.writeFile('hello2.txt', data);
})();

這個(gè)腳本分別創(chuàng)建了兩個(gè)名為hello.txthello2.txt的文件,并在其中寫入Hello world。但是這段代碼運(yùn)行在沙箱環(huán)境中,所以是沒有文件系統(tǒng)的操作權(quán)限滴。

還有一點(diǎn)值得注意,在上面的腳本中我們使用Deno命名空間來操作文件,而不像在Node中使用fs模塊。Deno命名空間提供了超多基礎(chǔ)方法。不過使用Deno命名空間會(huì)導(dǎo)致我們的代碼失去了對(duì)瀏覽器的兼容性,這個(gè)問題我們晚點(diǎn)再聊。

使用下面的命令執(zhí)行上述腳本:

$ deno run write-hello.ts

執(zhí)行之后,我們會(huì)收到下面的提示:

Deno requests write access to "/Users/user/folder/hello.txt". Grant? [a/y/n/d (a = allow always, y = allow once, n = deny once, d = deny always)]

實(shí)際上,基于上面創(chuàng)建文件的腳本我們會(huì)收到兩次來自沙箱環(huán)境的權(quán)限提示。不過如果我們選擇allow always選項(xiàng),就只會(huì)被詢問一次啦。

如果我們選了deny,會(huì)拋出一個(gè)PermissionDenied的錯(cuò)誤,如果我們沒寫錯(cuò)誤處理邏輯的話,進(jìn)程在此時(shí)就被終止啦。

如果我們用下面的命令來執(zhí)行腳本:

deno run --allow-write write-hello.ts

會(huì)在沒有提示的情況下創(chuàng)建這兩個(gè)文件。

Deno針對(duì)文件系統(tǒng)的命令行標(biāo)志位,除了--allow-write,還有--allow-net/--allow-env/--allow-run,分別用來開啟針對(duì)網(wǎng)絡(luò)、系統(tǒng)環(huán)境變量和操作子進(jìn)程的權(quán)限。

模塊機(jī)制

Deno使用瀏覽器一樣的方式,通過URL來加載模塊。很多人第一次見到在服務(wù)端的import語句中見到URL會(huì)感到有點(diǎn)困惑,但對(duì)我來說這還蠻好理解的:

import { assertEquals } from "https://deno.land/std/testing/asserts.ts";

你覺得通過URL來引入模塊會(huì)有啥大不了的嗎?答案其實(shí)蠻簡(jiǎn)單的:通過使用URL來加載模塊,Deno就可以避免引入一個(gè)類似npm的中心化系統(tǒng)來發(fā)布package,npm最近受到了很多吐槽。

通過URL來引入代碼,可以讓包的作者們使用自己最喜愛的方式來維護(hù)和發(fā)布自己的代碼。再也不會(huì)有package.jsonnode_modules了。

當(dāng)我們啟動(dòng)應(yīng)用之后,Deno會(huì)下載所有被引用的文件,并將它們緩存到本地。一旦引用被緩存下來,Deno就不會(huì)再去下載它們了,除非我們使用-- relaod標(biāo)志位去觸發(fā)重新下載。

還有幾個(gè)問題值得我們討論一哈:

萬一存放引用的站點(diǎn)掛了咋辦?

由于沒有了一個(gè)中心化的包管理站點(diǎn),那些存放模塊的站點(diǎn)可能因?yàn)楦鞣N各樣的原因掛掉。如果在開發(fā)甚至生產(chǎn)環(huán)境出現(xiàn)這種情況是非常危險(xiǎn)滴!

我們?cè)谏弦还?jié)提到,Deno會(huì)緩存好已下載的模塊。由于緩存是存放在我們的本地磁盤的,Deno的作者建議將這些緩存提交到代碼倉庫里。這樣一來,即使存放引用的站點(diǎn)掛了,開發(fā)者們還是可以使用已經(jīng)下載好的模塊(只不過版本是被鎖住的啦)。

Deno會(huì)把緩存存儲(chǔ)在環(huán)境變量$DENO_DIR所指定的目錄下,如果我們不去設(shè)置這個(gè)變量,它會(huì)指向系統(tǒng)默認(rèn)的緩存目錄。我們可以把$DENO_DIR指定我們的本地倉庫,然后把它們提交到版本管理系統(tǒng)中(比如:git

只能使用URL來引用模塊嗎?

總是敲URL顯得有點(diǎn)XX,還好,Deno提供了兩種方案來避免我們成為XX。

第一種,你可以在本地文件中將已經(jīng)引用的模塊重新export出來,比如:

export { test, assertEquals } from "https://deno.land/std/testing/mod.ts";

假如上面這個(gè)文件叫local-test-utils.ts?,F(xiàn)在,如果我們想再次使用test或者assertEquals方法,只需要像下面這樣引用它們:

import { test, assertEquals } from './local-test-utils.ts';

看得出來,是不是通過URL來引用它們并不是最重要的啦。

第二種方案,建一個(gè)引用映射表,比如像下面這樣一個(gè)JSON文件:

{
   "imports": {
      "http/": "https://deno.land/std/http/"
   }
}

然后把它像這樣import到代碼里:

import { serve } from "http/server.ts";

為了讓它生效,我們還需要通過--importmap標(biāo)志位讓Deno來引入import映射表:

$ deno run --importmap=import_map.json hello_server.ts

瀏覽器兼容性

Deno有計(jì)劃做到兼容瀏覽器。從技術(shù)上講,在使用ES module的前提下,我們不需要使用任何類似webpack的打包工具就能在瀏覽器上運(yùn)行Deno代碼。

不過呢,你可以使用類似Babel這樣的工具可以把代碼轉(zhuǎn)化成ES5版本的JavaScript,這樣可以兼容那些不支持所有最新語言特性的低版本瀏覽器中,帶來的后果就是最終文件里有很多不是必須的冗余代碼,增大代碼的體積。

結(jié)果取決于我們的主要目的是啥。

支持TypeScript開箱即用

不需要任何配置文件就能在Deno中輕易地使用TypeScript。當(dāng)然咯,你也可以編寫純JavaScript代碼,并使用Deno去執(zhí)行它。

“Deno和Node.js有哪些區(qū)別”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI