原文連接: blog.bitsrc.io/what-is-den…node
Deno
是 node.js
的做者 Ryan Dahl
編寫的,這是否意味着 Deno
實際上就是 Node.js
的替代品,咱們是否應該開始計劃重構衝刺呢? 若是你想了解更多,請往下看。web
在2018年,Ryan
進行了一次演講,在演講中他提出了他認爲的有關 Node.js
的十大問題。在演講結束時,他揭開了 Deno
的面紗。當時 Deno
只是他正在建設中的一個小項目,也許被你們稱做 Node.js
v2版本,在 Node.js
的基礎上進行了改進,而且更加安全。編程
這裏是演講的視頻地址,你們最好去看一看。json
兩年後,在2020年5月13日,官方正式發佈了 Deno
1.0版本。一個全新的讓 JavaScript
運行在服務端的開發平臺。不像 Node.js
是用 C++
語言開發,Deno
底層是用基於 Tokio
平臺(提供 JavaScript
所需的異步運行環境)的 Rust
語言編寫的,仍然運行在 V8
引擎上。緩存
咱們不僅僅在談論與當前 Node.js
徹底兼容的新 JavaScript
運行環境,相反的是,Ryan
在 Deno
中增長了一些他認爲在 Node.js
中所缺乏的東西。安全
默認狀況下,Node.js
容許你訪問任何內容,也就是說,你能夠讀寫文件系統,發送傳輸請求,訪問環境變量等等。 做爲開發人員,具備這種訪問權限固然是有好處的,但在編寫代碼時萬一不當心,有可能會帶來安全風險。bash
所以,Deno
可使用命令行參數來啓用或禁用對不一樣安全功能的訪問。若是你須要腳本可以訪問 /etc
文件夾,能夠執行如下操做:websocket
deno --allow-read=/etc myscript.ts
複製代碼
這樣,你的代碼就能夠從該文件夾中讀取任何內容,而且會在沒有權限的狀況下拋出全異常。 這相似於其餘平臺處理安全性的方式。若是你是 Android
用戶,你確定遇到過不少應用程序曾要求你容許它們讀取聯繫人,電話,文件夾等,這與此相似。 經過在執行腳本的命令行中敲上這些參數,就能夠提供代碼所需的權限。markdown
自從第一個 Node.js
版本以來,JavaScript
就開始改進其標準庫。可是與其餘語言相比,它還有很長的路要走。 Deno
也致力於改善這一點,並聲稱其擁有一個很是完整的標準庫,容許開發人員使用官方工具來執行基本的任務,只有複雜的任務時才須要使用外部庫(好比 NPM
)。數據結構
本質上講,Deno
提供了諸如 爲終端文本添加顏色、使用外部數據結構(例如二進制,csv
,yaml
等)、生成 UUID
甚至編寫 websocket
等開箱即用的方法。 還有一些其餘的更基本的模塊可用,例如訪問文件系統,日期轉換函數,http
相關函數等等。
你沒有看錯,若是你是 TypeScript
的愛好者,那麼 Deno
自己就能夠知足你的須要,不須要額外引入外部庫,默認狀況下就能夠將 Typescript
轉換爲 JavaScript
。
儘管默認狀況下,Deno
自身會完成轉換,可是你可使用本身的 tsconfig.json
文件來覆蓋默認配置:
deno run -c tsconfig.json [your-script.ts]
複製代碼
默認配置採用的是嚴格模式,所以任何不符合規範的編碼都會當即獲得警告。
在 Node.js
中, 每個模塊和它的祖先模塊都有着千絲萬縷的依賴關係。是否太臃腫了呢?是不是一個錯誤的方式來分發管理依賴呢?這絕對是 Node.js
最具爭議的方面之一,所以 Deno
決定徹底放棄它。
那麼,Deno
是如何處理依賴關係的? 它容許你從任何地方引入模塊。換句話說,你能夠簡單地執行如下操做:
import * as log from "https://deno.land/std/log/mod.ts"; 複製代碼
今後再也不須要擁有本身的集中式存儲庫,可是你必須謹慎的進行此操做,由於從沒法控制的第三方來源導入模塊會使你暴露。
實際上,咱們也再也不須要 package.json
,如今經過在名爲 deps.ts
的文件中維護模塊列表及其各自的URL便可實現依賴管理。 可是版本控制怎麼辦呢?我知道你就會問。你能夠在 URL
上指定軟件包的版本,雖然不是很精美,但確管用。
一個簡單的 deps.ts
文件也許是這樣子的:
export { assert } from "https://deno.land/std@v0.39.0/testing/asserts.ts"; export { green, bold } from "https://deno.land/std@v0.39.0/fmt/colors.ts"; 複製代碼
這將從新導出模塊,若是你想更改其引用版本,簡單的更改 URL
就能夠了。
順便說一下,第一次執行代碼後,導入的模塊就會被緩存下來直到你下一次重啓。
Deno
還包含其餘功能,例如開箱即用的大型工具,包括 test runner, debugger, file watcher
等。 可是有些只是其提供的 API
,須要在其基礎上寫本身的邏輯才能使用它們。
以 Deno.watchFs
提供的 file watcher API
爲例,若是你正在尋找與 nodemon
相似的解決方案,你必須本身編寫代碼來實現。 下面的23行代碼是一個解決這種問題的列子:
function startProcess(args: string[] = []): Deno.Process { return Deno.run({ cmd: ['deno', ...args] }); } const throttle = 500; let app: Deno.Process = startProcess(Deno.args); let timeout: number|null = null; function runApp() { app && app.close(); app = startProcess(Deno.args); } for await (const event of Deno.watchFs('.')) { if (event.kind !== "access") { if (timeout) clearTimeout(timeout); timeout = setTimeout(runApp, throttle); } } 複製代碼
咱們中的有些人早在 Node.js
0.10 版本推出的那天起就已經開始使用它了,而且是在生產環境中使用它!真相聽起來也許有點嚇人,可是咱們正在作,由於沒有別的能替代的。 PHP,Python
甚至 Ruby
(更不用說 Java
或 .NET
)都沒法與具備 JavaScript
和異步I/O模型的 Node.js
相提並論。 多年來,Node
(和JavaScript)已經發展到能夠知足行業要求。 是否是很完美? 可是,就像生活中的任何其餘事物同樣,編程語言也不是天衣無縫的。
Deno
如今只是一個僅有2年開發迭代的產品。它還沒有在生產環境中進行嘗試,也還沒有編寫異常的測試用例來了解其如何處理邊界狀況。直到作到了這一點,它才能供早期嘗試者使用。也許一年後,咱們將看到有些公司開始分享他們的使用經驗,他們如何解決新發現的缺點等。最終,社區將對其進行調整讓它變得更有用,更受衆。它會取代 Node.js
嗎?咱們拭目以待。