【譯】Deno是啥?會取代Node.js嗎?

原文連接: blog.bitsrc.io/what-is-den…node

Denonode.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 運行環境,相反的是,RyanDeno 中增長了一些他認爲在 Node.js 中所缺乏的東西。安全

安全集成

默認狀況下,Node.js 容許你訪問任何內容,也就是說,你能夠讀寫文件系統,發送傳輸請求,訪問環境變量等等。 做爲開發人員,具備這種訪問權限固然是有好處的,但在編寫代碼時萬一不當心,有可能會帶來安全風險。bash

所以,Deno 可使用命令行參數來啓用或禁用對不一樣安全功能的訪問。若是你須要腳本可以訪問 /etc 文件夾,能夠執行如下操做:websocket

deno --allow-read=/etc myscript.ts
複製代碼

這樣,你的代碼就能夠從該文件夾中讀取任何內容,而且會在沒有權限的狀況下拋出全異常。 這相似於其餘平臺處理安全性的方式。若是你是 Android 用戶,你確定遇到過不少應用程序曾要求你容許它們讀取聯繫人,電話,文件夾等,這與此相似。 經過在執行腳本的命令行中敲上這些參數,就能夠提供代碼所需的權限。markdown

更完整的標準庫

自從第一個 Node.js 版本以來,JavaScript 就開始改進其標準庫。可是與其餘語言相比,它還有很長的路要走。 Deno 也致力於改善這一點,並聲稱其擁有一個很是完整的標準庫,容許開發人員使用官方工具來執行基本的任務,只有複雜的任務時才須要使用外部庫(好比 NPM )。數據結構

本質上講,Deno 提供了諸如 爲終端文本添加顏色、使用外部數據結構(例如二進制,csvyaml 等)、生成 UUID 甚至編寫 websocket 等開箱即用的方法。 還有一些其餘的更基本的模塊可用,例如訪問文件系統,日期轉換函數,http 相關函數等等。

集成Typescript

你沒有看錯,若是你是 TypeScript 的愛好者,那麼 Deno 自己就能夠知足你的須要,不須要額外引入外部庫,默認狀況下就能夠將 Typescript 轉換爲 JavaScript

儘管默認狀況下,Deno 自身會完成轉換,可是你可使用本身的 tsconfig.json 文件來覆蓋默認配置:

deno run -c tsconfig.json [your-script.ts]
複製代碼

默認配置採用的是嚴格模式,所以任何不符合規範的編碼都會當即獲得警告。

再也不須要 NPM 或node_modules 文件夾

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嗎

咱們中的有些人早在 Node.js 0.10 版本推出的那天起就已經開始使用它了,而且是在生產環境中使用它!真相聽起來也許有點嚇人,可是咱們正在作,由於沒有別的能替代的。 PHP,Python 甚至 Ruby(更不用說 Java.NET)都沒法與具備 JavaScript 和異步I/O模型的 Node.js 相提並論。 多年來,Node(和JavaScript)已經發展到能夠知足行業要求。 是否是很完美? 可是,就像生活中的任何其餘事物同樣,編程語言也不是天衣無縫的。

Deno 如今只是一個僅有2年開發迭代的產品。它還沒有在生產環境中進行嘗試,也還沒有編寫異常的測試用例來了解其如何處理邊界狀況。直到作到了這一點,它才能供早期嘗試者使用。也許一年後,咱們將看到有些公司開始分享他們的使用經驗,他們如何解決新發現的缺點等。最終,社區將對其進行調整讓它變得更有用,更受衆。它會取代 Node.js 嗎?咱們拭目以待。

相關文章
相關標籤/搜索