本篇內(nèi)容主要講解“Deno和Node.js的區(qū)別是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Deno和Node.js的區(qū)別是什么”吧!
成都創(chuàng)新互聯(lián)主營維西網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,APP應(yīng)用開發(fā),維西h5小程序設(shè)計搭建,維西網(wǎng)站營銷推廣歡迎維西等地區(qū)企業(yè)咨詢
Deno是為解決Node的一些內(nèi)在問題而創(chuàng)建的,那么與Node.js的區(qū)別是什么?下面本篇文章帶大家詳細(xì)了解一下Deno,介紹一下Deno和Node.js的區(qū)別。
【推薦學(xué)習(xí):《nodejs 教程》】
Node.js的作者Ryan Dahl,過去一年半的時間都在打造一個新的JavaScript運(yùn)行環(huán)境Deno來解決Node的一些內(nèi)在問題。
不過不要誤會,得益于JavaScript龐大的社區(qū)生態(tài)和使用范圍,Node是一個非常不錯的JavaScript運(yùn)行環(huán)境。然而,Dahl 也承認(rèn)在Node的某些方面他應(yīng)該考慮得更全面一些,比如:安全性,模塊機(jī)制,依賴管理等。
在他的計劃中,他并不會去預(yù)想Deno在短時間內(nèi)能夠發(fā)展成一個多大規(guī)模的平臺。當(dāng)然咯,把時間調(diào)回2009年,JavaScript還是人人都能取笑的一個有些怪異的小語言,也木有現(xiàn)在這么多語言特性。
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對JavaScript和TypeScript都支持開箱即用)
V8(Google出品JavaScript運(yùn)行時,主要用在Chrome和Node中)
接下來看看Deno提供了哪些特性。
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); })();
這個腳本分別創(chuàng)建了兩個名為hello.txt
和hello2.txt
的文件,并在其中寫入Hello world
。但是這段代碼運(yùn)行在沙箱環(huán)境中,所以是沒有文件系統(tǒng)的操作權(quán)限滴。
還有一點(diǎn)值得注意,在上面的腳本中我們使用Deno命名空間來操作文件,而不像在Node中使用fs
模塊。Deno命名空間提供了超多基礎(chǔ)方法。不過使用Deno命名空間會導(dǎo)致我們的代碼失去了對瀏覽器的兼容性,這個問題我們晚點(diǎn)再聊。
使用下面的命令執(zhí)行上述腳本:
$ deno run write-hello.ts
執(zhí)行之后,我們會收到下面的提示:
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án)境的權(quán)限提示。不過如果我們選擇allow always
選項,就只會被詢問一次啦。
如果我們選了deny
,會拋出一個PermissionDenied
的錯誤,如果我們沒寫錯誤處理邏輯的話,進(jìn)程在此時就被終止啦。
如果我們用下面的命令來執(zhí)行腳本:
deno run --allow-write write-hello.ts
會在沒有提示的情況下創(chuàng)建這兩個文件。
Deno針對文件系統(tǒng)的命令行標(biāo)志位,除了--allow-write
,還有--allow-net
/--allow-env
/--allow-run
,分別用來開啟針對網(wǎng)絡(luò)、系統(tǒng)環(huán)境變量和操作子進(jìn)程的權(quán)限。
Deno使用瀏覽器一樣的方式,通過URL來加載模塊。很多人第一次見到在服務(wù)端的import語句中見到URL會感到有點(diǎn)困惑,但對我來說這還蠻好理解的:
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
你覺得通過URL來引入模塊會有啥大不了的嗎?答案其實(shí)蠻簡單的:通過使用URL來加載模塊,Deno就可以避免引入一個類似npm
的中心化系統(tǒng)來發(fā)布package,npm
最近受到了很多吐槽。
通過URL來引入代碼,可以讓包的作者們使用自己最喜愛的方式來維護(hù)和發(fā)布自己的代碼。再也不會有package.json
和node_modules
了。
當(dāng)我們啟動應(yīng)用之后,Deno會下載所有被引用的文件,并將它們緩存到本地。一旦引用被緩存下來,Deno就不會再去下載它們了,除非我們使用-- relaod
標(biāo)志位去觸發(fā)重新下載。
還有幾個問題值得我們討論一哈:
由于沒有了一個中心化的包管理站點(diǎn),那些存放模塊的站點(diǎn)可能因為各種各樣的原因掛掉。如果在開發(fā)甚至生產(chǎn)環(huán)境出現(xiàn)這種情況是非常危險滴!
我們在上一節(jié)提到,Deno會緩存好已下載的模塊。由于緩存是存放在我們的本地磁盤的,Deno的作者建議將這些緩存提交到代碼倉庫里。這樣一來,即使存放引用的站點(diǎn)掛了,開發(fā)者們還是可以使用已經(jīng)下載好的模塊(只不過版本是被鎖住的啦)。
Deno會把緩存存儲在環(huán)境變量$DENO_DIR
所指定的目錄下,如果我們不去設(shè)置這個變量,它會指向系統(tǒng)默認(rèn)的緩存目錄。我們可以把$DENO_DIR
指定我們的本地倉庫,然后把它們提交到版本管理系統(tǒng)中(比如:git
)
總是敲URL顯得有點(diǎn)XX,還好,Deno提供了兩種方案來避免我們成為XX。
第一種,你可以在本地文件中將已經(jīng)引用的模塊重新export出來,比如:
export { test, assertEquals } from "https://deno.land/std/testing/mod.ts";
假如上面這個文件叫local-test-utils.ts
?,F(xiàn)在,如果我們想再次使用test
或者assertEquals
方法,只需要像下面這樣引用它們:
import { test, assertEquals } from './local-test-utils.ts';
看得出來,是不是通過URL來引用它們并不是最重要的啦。
第二種方案,建一個引用映射表,比如像下面這樣一個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
版本管理必須由包作者來支持,這樣在client端可以通過在URL中設(shè)置版本號來下載:https://unpkg.com/liltest@0.0.5/dist/liltest.js
。
Deno有計劃做到兼容瀏覽器。從技術(shù)上講,在使用ES module的前提下,我們不需要使用任何類似webpack的打包工具就能在瀏覽器上運(yùn)行Deno代碼。
不過呢,你可以使用類似Babel這樣的工具可以把代碼轉(zhuǎn)化成ES5版本的JavaScript,這樣可以兼容那些不支持所有最新語言特性的低版本瀏覽器中,帶來的后果就是最終文件里有很多不是必須的冗余代碼,增大代碼的體積。
結(jié)果取決于我們的主要目的是啥。
不需要任何配置文件就能在Deno中輕易地使用TypeScript。當(dāng)然咯,你也可以編寫純JavaScript代碼,并使用Deno去執(zhí)行它。
Deno,作為一個新的TypeScript和JavaScript的運(yùn)行環(huán)境,是一個非常有趣的技術(shù)項目,并且至今已經(jīng)穩(wěn)定發(fā)展了一段時間。但是距離在生產(chǎn)環(huán)境中去使用它還有比較長的一段路要走。
通過去中心化(或者翻譯成分布式?)的機(jī)制,把JavaScript生態(tài)系統(tǒng)從npm這樣中心化的包管理系統(tǒng)中解放了出來。
Dahl希望在這個夏天快結(jié)束的時候能夠發(fā)布1.0版本,所以如果你對Deno未來的新進(jìn)展感興趣的話,可以給它個star。
到此,相信大家對“Deno和Node.js的區(qū)別是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!