2年過去了,有誰還記得曾想取代Node.js的他?

大家好,我卡頌。
22年11月14日,Deno
發(fā)布了v1.28,距離他第一個(gè)穩(wěn)定版本v1.0.0發(fā)布(2020年5月13日)已過去2年。
作為Node.js
的競爭者,Deno
似乎并沒有達(dá)到「取代前者」的目標(biāo)。
甚至,他在前端社區(qū)的聲量也越來越小。
那么,這兩年Deno
都經(jīng)歷了什么,未來他會(huì)取代Node.js
么?
與Node.js的不同
同為「js運(yùn)行時(shí)環(huán)境」,Deno
與Node
有什么不同呢?
拋開各種細(xì)枝末節(jié),他們最大的不同在于 —— Deno
將「開放」放在很重的地位。
什么平臺(tái)是最開放的呢?答案是web
。
所以,在Deno
設(shè)計(jì)的方方面面都能看到web
的影子。比如:
原生支持很多
web API
(比如fetch
、URLSearchParams
、Web Workers
...)全局變量是與瀏覽器一樣的
window
對象原生支持瀏覽器標(biāo)準(zhǔn)的
ESM
規(guī)范
那么,這些API
、標(biāo)準(zhǔn)
與「開放」有什么關(guān)系呢?這里講個(gè)小故事。
Deno
的作者「Ryan Dahl」同時(shí)也是Node
的作者。
在實(shí)現(xiàn)Node
之初,他將工作重心放在「事件驅(qū)動(dòng)模型」的實(shí)現(xiàn)上。這時(shí),有個(gè)「項(xiàng)目中引入的模塊該如何解析」的問題亟待解決。
他接受了NPM
提出的package.json
建議。簡單的說,Node
中的require
方法會(huì)去package.json
中尋求如何解析模塊(dependencies
、devDependencies
等字段)。
后來,NPM
逐漸成為Node
中最流行的包管理器與事實(shí)上的標(biāo)準(zhǔn),兩者逐漸深度捆綁。
而NPM
是一家私人公司,且之后被Github
收購。Github
又在微軟旗下。
可以說,占領(lǐng)導(dǎo)份額的Node
第三方依賴管理是受私人大公司(微軟)控制的。
反觀Deno
,原生采用ESM
規(guī)范,最初有兩種模塊引入方式:
從本地路徑引入
比如:
從遠(yuǎn)端
url
引入
比如:
相比于Node
中引入一個(gè)模塊就等于引入一個(gè)npm
包,Deno
以url
的方式引入模塊顯然是更開放的。
畢竟,web
最不缺的就是url
鏈接了。
Ryan的理想
從上面的故事也能看出,「Ryan Dahl」離開Node
團(tuán)隊(duì),創(chuàng)立Deno
是充滿了理想主義色彩的。
在為Deno
預(yù)熱的JS ConfEU 2018[1]中,他也明確表示:
「Deno不會(huì)和Node兼容,不這樣的話開發(fā)者最終實(shí)現(xiàn)的還是Node模塊」

在最初的正式版本中,Deno
也確實(shí)踐行了自己與Node
不同的風(fēng)格,針對Node
眾多缺陷提出了解決方案,比如:
針對
Node
的安全性問題,加強(qiáng)了原生API
訪問文件系統(tǒng)與網(wǎng)絡(luò)的限制舍棄了
package.json
原生支持
TS
這些特立獨(dú)行確實(shí)引起了開發(fā)者熱議,但并未達(dá)到很好的市場反響。
畢竟,Deno
首個(gè)正式版發(fā)布時(shí),Node
已經(jīng)問世11年了。
在Node
問世時(shí),Node
團(tuán)隊(duì)只需要持續(xù)、穩(wěn)定的迭代Node
核心API,就會(huì)有大量的JS
開發(fā)者為Node
生態(tài)貢獻(xiàn)優(yōu)質(zhì)第三方模塊。
而在Deno
面世時(shí),又會(huì)有多少開發(fā)者愿意為Deno
貢獻(xiàn)第三方模塊呢,用Node
現(xiàn)成的包不香么?
于是,Deno
親自上陣,滿足了開發(fā)者的一些剛需,比如:
開箱即用的工具鏈工具(
linter
、formatter
、test-runner
、bundle
)
再加上原生支持TS
,可以說一個(gè)Deno
初始項(xiàng)目就具備了一整套工程化最佳實(shí)踐。
對比同為Rust
編寫的工具鏈工具Rome
(迭代了2年,發(fā)布了一個(gè)linter
,一個(gè)formatter
)就能發(fā)現(xiàn),Deno
的迭代速度可以說是非??炝?。
應(yīng)用框架
比如受koa
啟發(fā)的oak
,以nobundle
為賣點(diǎn)的全??蚣?code>fresh。
發(fā)布系統(tǒng)
與Deno
深度整合的Deno Deploy
這些努力似乎并沒有取得預(yù)期的效果,對比Deno
(藍(lán)色)與Node
(紅色)的Google趨勢
。
Node
的趨勢整體走高,而Deno
的走勢極為平坦(只在20年5月v1.0發(fā)布時(shí)有一點(diǎn)起伏):

現(xiàn)實(shí)
今年6月,Deno
獲得由紅杉領(lǐng)投的2100w刀的A輪融資,用于發(fā)展Deno Deploy
。
資本為了獲得更好的回報(bào),勢必需要更大的用戶基數(shù)。而Deno
最大的潛在用戶群體,就是Node
開發(fā)者了。
理想主義的Ryan
不得不面對現(xiàn)實(shí)。
在最近的v1.28中,Deno
宣布已顯著提高對NPM
包的兼容性,現(xiàn)在開發(fā)者可以在Deno
中使用超過130w個(gè)NPM
包。
在這背后,Deno
做了大量的Node.js
適配工作(在Deno
中實(shí)現(xiàn)Node
原生API
的適配層)。
曾經(jīng)「替代Node.js」的目標(biāo),也逐漸變?yōu)?strong>「成為更好的Node.js」。
這2年的經(jīng)歷對Deno
來說,就像一個(gè)初入職場的熱血大學(xué)生被社會(huì)磨平棱角的過程。
總結(jié)
Deno
涼了么?
不僅沒有,而且已經(jīng)發(fā)展為融資2600w刀,擁有17名員工的公司。
Deno
會(huì)取代Node
么?
在可預(yù)見的未來,Deno
都會(huì)是「小而美」的狀態(tài)。在某些細(xì)分領(lǐng)域逐漸蠶食Node
的市場份額。
我應(yīng)該使用
Deno
么?
如果你要「寫個(gè)小腳本」或者「搞個(gè)小項(xiàng)目」,相比于Node
,Deno
的開發(fā)體驗(yàn)直接拉滿。而且白嫖Deno Deploy
不香么?
還有什么推薦
Deno
的理由么?
有,你看看隔壁Go
那凸眼睛火腿腸。再看看Deno
的小恐龍敲可愛有木有~
參考資料
[1]
JS ConfEU 2018: https://www.youtube.com/watch?v=M3BM9TB-8yA