為什麼需要Deno.js? - DEV
您正在嘗試學習JavaScript。您剛剛對瀏覽器中的JavaScript有所瞭解。然後,突然之間,你遇到Deno 是Node.js殺手之類的炒作。但是您不知道這些是什麼。如果是這樣,請繼續閱讀!
什麼是JavaScript引擎?
您可能知道,JavaScript是一種解釋型程式語言。這意味著在執行之前不會將原始碼編譯成二進位制程式碼。JavaScript引擎可以將JavaScript程式碼即時編譯為可執行的機器程式碼。這就是所謂的即時(JIT)編譯。例如,當您在Google chrome上執行JavaScript時,您的JavaScript引擎為V8。如果在Mozilla上,則為SpiderMonkey。
什麼是JavaScript執行時環境?
通常,您通常不直接使用JavaScript引擎。JavaScript引擎在一個環境中執行,該環境為您的JavaScript應用程式提供了可在執行時使用的其他功能。執行環境是允許與引擎外部環境進行通訊的API。例如,像Google Chrome這樣的網路瀏覽器是一個桌面JavaScript執行時環境,它使用V8 JavaScript引擎並提供DOM API,Fetch API,Storage API等。同樣,諸如Node和Deno之類的伺服器端執行時環境也使用V8引擎,並提供檔案系統訪問,網路訪問,控制檯等。
為什麼我們需要瀏覽器之外的執行環境?
儘管JavaScript的主要環境是Web瀏覽器,但近年來,JavaScript接管了伺服器平臺。
伺服器端JavaScript執行時環境使您可以訪問檔案系統,網路以及Web瀏覽器所不允許的其他內容。實際上,您可以使用僅基於JavaScript的技術堆疊(例如MEAN或MERN)構建整個Web應用程式(從UI到資料層)。
NodeJS怎麼了?
根據NodeJS的建立者Ryan Dahl的說法,NodeJS在某些方面做錯了。他在JSConf EU 2018上發表了有關此主題的演講。
- 不信守Promise:NodeJS實際上有本機的Promise支援,但是幾個月後,它被刪除了。因此,NodeJS必須使用變通方法來實現Promise。
- 安全:V8本身就是一個非常好的安全沙箱。NodeJS刪除了所有這些安全功能,併為應用程式提供了訪問所有內容的許可權。
- 構建系統:Chrome開始將GYP用於構建系統,因此NodeJS也進行了切換。但是後來Chrome放棄了GYP並採用GN作為他們的構建系統,因為它更快,更簡單。根據Ryan Dahl的說法,繼續使用GYP可能是NodeJS核心最大的失敗。
- npm和package.json:所有npm軟體包都包含一個檔案,通常在專案根目錄中,名為package.json-該檔案包含與專案相關的各種後設資料。顧名思義,npm或Node Package Manager用來管理專案中的依賴包,從而使您的生活更輕鬆。package.json檔案具有一些不必要的資訊,只有npm登錄檔才需要。Ryan將此描述為“樣板噪聲”,因為它沒有給專案增加任何噪聲。npm是集中式的,由私人控制。如果您已經在瀏覽器中完成了一些專案,您將知道如何連結到依賴項。與JQuery,Bootstrap等類似。您可以將任何連結新增到HTML,並且可以直接使用它。在Node中,您不能在npm之外的任何地方安裝依賴項表單。
- 沒有副檔名“ .js”的require("module") :這是您匯入外部庫的方式,這還不夠具體。例如,如果要在專案中安裝JQuery,則應首先使用npm透過install命令將其安裝在專案資料夾中:npm install jquery。然後,如果要在檔案中使用它,則可以在要使用JQuery的檔案中新增“ require()”語句:require("JQuery")。這種整潔的語法起作用所需的演算法非常複雜且效率低下。模組載入器必須在多個位置查詢檔案系統,以猜測使用者的意圖。
- node_modules:在專案中安裝依賴項時,它們將下載到“ node_modules”資料夾中。問題是每個專案一個,假設您要建立兩個不同的專案,但是它們都使用JQuery,則可以下載“ JQuery.js”檔案,並將其儲存在共享資料夾中,您可以從兩個專案連結到該資料夾。當您準備釋出專案時,只需更改指向遠端檔案的連結併發布它們。您甚至可以將本地檔案重新用於將來的任何專案。這在Node中是不可能的。
- index.js:如果未指定,NodeJS將尋找“ index.js”檔案。這是不必要的事情。它不必要地使模組載入系統複雜化。在“ require()”支援package.json之後,它變得特別不必要。
所有這些問題都是NodeJS的核心功能,而試圖解決這些問題將意味著建立一個全新的事物。而且有太多使用NodeJS的程式碼,解決這些問題將與永久性中斷相同。所有舊程式碼都將過時。許多科技巨頭都在使用它,許多創業公司都在使用它,許多開發人員在個人專案中使用它。到處都是!
什麼是Deno?
Deno是一個新的跨平臺執行時環境,就像NodeJS一樣,它基於Google的V8引擎。它是由NodeJS的建立者Ryan Dahl製作的。它的製作目的與NodeJS相同。
與Node(C ++)不同,它是用Rust編寫的,這使它變得更快,更安全。它還具有許多很棒的新功能。
1.TypeScript支援
Deno開箱即用地支援Typescript。您無需設定或配置任何東西。TypeScript是JavaScript的型別化超集,可轉換為普通JavaScript。它是由Microsoft開發的。Typescript新增了許多功能,這些功能使擴充套件JavaScript應用程式變得更加容易,並從一開始就防止將來的錯誤。
2.ES模組匯入語法
Deno使您可以使用ES模組語法從Web匯入,就像在瀏覽器中一樣:
import { bgBlue, red, bold } from "https://deno.land/std/colors/mod.ts"; |
Deno在第一次獲取依賴項後會對其進行快取。因此,現在您甚至不必使用單獨的本地檔案進行開發。一切都正常。而且可以在專案之間共享快取的依賴項,因此您可以對正在處理的每個專案使用每個依賴項的一個副本。
這一開關功能可以解決整個node_modules問題,使其速度更快,並幫助Deno使用您在各處使用的標準JavaScript。
3.預設安全
預設情況下,如果您在Deno中執行JavaScript檔案,則除了對專案目錄的讀取許可權外,它沒有其他許可權。您必須對要指令碼具有的所有許可權明確表示“是”。它甚至沒有連線到網際網路或本地網路的許可權。您可以控制指令碼要執行的操作。
NodeJs被殺死?
錯誤!有一件事情,仍然使Node保持它的年齡。隨著時間的流逝,Node獲得了很多使用者,學習資源和社群支援。另一方面,Deno最近達到了1.0版里程碑。這意味著它的使用者群很小,學習資源很少,它本身就將JavaScript社群分為兩個部分。
對於Deno,還沒有標準的工作流程和開發堆疊。從谷歌和微軟這樣的技術巨頭轉向全職工作還有很長的路要走。反過來,這意味著沒有與Deno相關的工作,因此,很少有人會嘗試學習它。
因此,阻礙Deno成為NodeKiller的主要因素是使用者群。
如果您不熟悉JavaScript,則一定要先學習NodeJS。將來,如果Deno仍然被證明是NodeKiller,則可以輕鬆切換到Deno。您要做的就是放棄整潔的匯入語法,並開始對自己的工作負責。
相關文章
- 為什麼需要Docker?Docker
- 為什麼要在2021年放棄ExpressJS -DEVExpressJSdev
- 為什麼需要拆分NFT?
- Elasticsearch:是什麼?你為什麼需要他?Elasticsearch
- 為什麼我們需要 VuexVue
- 為什麼需要資料治理
- 為什麼需要依賴注入依賴注入
- 爬蟲為什麼需要HTTP?爬蟲HTTP
- 為什麼需要require.jsUIJS
- 為什麼企業需要Kaizen?AI
- 我們為什麼需要CDP?
- 為什麼MCU也需要AI?AI
- 【前端筆記】Vuex 是什麼,為什麼需要前端筆記Vue
- 什麼是 SCRM,企業為什麼需要SCRM?
- 什麼是Linux?Linux中dev指什麼?Linuxdev
- 邊緣計算是什麼以及為什麼需要它
- 什麼是Web workers?為什麼我們需要他Web
- 我們為什麼需要async/await ?AI
- 到底為什麼我們需要 Clickhouse?
- 我們為什麼需要雲原生?
- python3 dev是什麼Pythondev
- 什麼是雲原生?企業為什麼需要雲原生?
- 【Java面試】什麼是 ISR,為什麼需要引入 ISRJava面試
- 我們為什麼需要 lock 檔案
- [譯] 為什麼我們需要 Web 3.0Web
- 為什麼在js中需要新增addEventListener()?JSdev
- IT人為什麼也需要懂點FMEA?
- 為什麼需要定期更新SSL證書?
- 企業為什麼需要CRM系統
- 《Learning ELK Stack》5 為什麼需要ElasticsearchElasticsearch
- 為什麼銷售人員需要CRM?
- 為什麼GetHashCode方法需要如此設計?
- 為什麼需要討論“當代性”?
- 為什麼微服務架構需要聚合微服務架構
- 為什麼需要應急響應?網路安全應急響應需要做什麼?
- 什麼是Linux?為什麼企業會需要Linux運維?Linux運維
- 海外問卷調查是什麼,為什麼需要代理IP?
- ">/dev/null 2>&1 "是什麼意思devNull