iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
0
自我挑戰組

玩轉 React 從0到1系列 第 26

【Day 26】關於 Deno 與 NodeJS 的這些年和那些事

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20201014/20109963EeoAMWDT8V.jpg

前言

可能看這系列的讀者會覺得,這主題也太跳了吧~~Deno 不是基於 Typescript 的語言嗎? 怎麼一下子是 React,一下又轉成 Typescript? 是的, Deno 確實是基於 Typescript,但它還是 Node 之父 Ryan Dahl 的新專案呢~~(好拉~小編我說到底就是想寫XD)

NodeJS 目前也算是程式語言中最火的語言之一,但是 NodeJS 的作者 Ryan Dahl 卻在 2018 年的 JSConf 上發表了一個關於 NodeJS設計錯誤的演講,接著 Deno 問世了,Deno 是一隻很可愛的恐龍XD~~好拉,Deno 是來自於 Node 的字母重新排列組合 (Node = no + de),表示要拆了 NodeJS (de = destroy, no = NodeJS)。網路上不少流傳 Deno 會取代 NodeJS,Deno 確實有不少優點(待會會介紹),但是 NodeJS 發展到現在,不論是社群的支持、公司專案上的應用都已經是十分蓬勃,短時間內要被取代是不可能的。

關於 NodeJS 的問題

1. 沒有堅持使用 Promise

Javascript 原生就具有 Callback 這項功能,而 NodeJS 也繼承了這樣的做法,也因此有了後續著名的 Callback Hell(回調地獄)這件事,而 Deno 在設計上一開始就支援 Promise 跟 Async/Await

一句話就能完成讀檔的功能啊~~~

const data = await Deno.readFile(“./file.txt”);
console.log(data);

2. 沒有足夠的安全性

事實上 NodeJS 跟 Deno 都是基於 V8 開發,也就是 Google 的核心套件,瀏覽器的安全性很高。但是在 NodeJS 的設計裡,當我們運行像是 node index.js,index.js 裡又擁有你所有的權限,此時如果剛好遇上 JS 檔案是病毒檔案(maybe 是腳本不安全),很可能此時就被黑客勒索了,在瀏覽器的世界中這種安全性問題並不該發生,只是當初 NodeJS 並沒有加入這些安全機制。而 Deno 的設計裡,當 Deno 編譯時,它會自動去下載需要 import 的檔案,然後存在緩存內,腳本需要在你允許的狀況下才能去跑server起來或是讀取你的(特定)檔案( —allow-net —allow-write),也稱 Deno 這種機制為沙盒機制(SandBox)

3. 錯誤的堅持使用 GYP 以及 沒有提供 FFI

Chrome V8 在 2008 年問世,當時有一種 GYP (Generate Your Projects),所以當 NodeJS 2009 年問世時自然的就使用了 GYP,但後來 V8 轉用了 (Generate Ninja),這時候就剩下 Node 成為唯一用戶了,數據上顯示 GN 比 GYP 快了將近 20 倍,在 Node 中很多套件底層都需要使用 GYP (因為套件要跨平台所以都會使用到),GYP 主要是用來編譯原生 C++ 的模組的,這也可說是 Node 核心最大的問題了。 Deno 在這裏就改用正常多了的 FFI (Foreign Function interface)

4. 錯誤的引入模組 以及 可以隨時隨地的引用

在我們 npm install 後,要引入 Module,通常會使用 request('Module') 的方式,但事實上在於瀏覽器中 <script> 內的 tag 是不能省略 .js 的,這使得 NodeJS 要多執行幾次沒必要的檔案系統查詢功能,才能知道我們要 import 什麼檔案,也導致運行變慢的狀況發生。

另外一個狀況是,就算沒有在 package.json 裡註名的 dependency,在 Node 裡卻可以隨時隨地的引用。

5. 黑洞般的 node_module

https://ithelp.ithome.com.tw/upload/images/20201014/201099632kYzWJ1Cox.png

看到這張圖,使用 NodeJS 的讀者應該很有感,我真正撰寫的檔案才幾 MB,為什麼 node_module 是好幾倍Σ( ° △ °|||),到底載了什麼下來啊~~這是因為 Node 裡的 Vendored-by-default 機制搞的鬼,當你下載一個 Module 的時候,它會自動的將依賴於那個 Module 的 Module 都下載下來,這也導致處理 node_module 方式變得很麻煩。 而 Deno 方便多了,根本就不用npm 安裝了,只要 import url 進來就可以了。

import { serve } from "https://deno.land/std@0.53.0/http/server.ts";

6. package.json 與 npm

NPM 安裝套件 + NodeJS 的主程式使用 require() 讀取 package.json 載入,導致了 npm 的中央集權,而 npm 倉庫裡參差不齊的套件,可能引發一連串的災害,以及 require(‘module') 定義不明確,導致引入這功能很混亂(不一定是 package.json定義的,可能是私有的模組); 加上 package.json 並沒有公認管理檔案的標準,因此導致一個資料夾裡的可能摻雜了很多奇怪的資訊,像是名稱、版本、說明,就像雜物間一樣的亂。

7. index.js

因為在 package.json 就可以控制 main 要是哪個檔案,因此默認加載 index.js 是沒有必要的。

結論

  • 介紹了 NodeJS 的問題
  • 介紹了 Deno 的解決機制

/images/emoticon/emoticon18.gif要開始燃燒了~衝刺


上一篇
【Day 25】用 SOLID 方式開發 React (2)
下一篇
【Day 27】關於 Deno 以及基礎安裝
系列文
玩轉 React 從0到130
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言