2年过去了,谁还记得曾想取代Node.js的他?
大家好,我卡颂。
22年11月14日,Deno
发布了v1.28,距离他第一个稳定版本v1.0.0发布(2020年5月13日)已过去2年。
作为Node.js
的竞争者,Deno
似乎并没有达到「取代前者」的目标。
甚至,他在前端社区的声量也越来越小。
那么,这两年Deno
都经历了什么,未来他会取代Node.js
么?
与Node.js的不同
同为「js运行时环境」,Deno
与Node
有什么不同呢?
抛开各种细枝末节,他们最大的不同在于 —— Deno
将「开放」放在很重的地位。
什么平台是最开放的呢?答案是web
。
所以,在Deno
设计的方方面面都能看到web
的影子。比如:
- 原生支持很多
web API
(比如fetch
、URLSearchParams
、Web Workers
...) - 全局变量是与浏览器一样的
window
对象 - 原生支持浏览器标准的
ESM
规范
那么,这些API
、标准
与「开放」有什么关系呢?这里讲个小故事。
Deno
的作者「Ryan Dahl」同时也是Node
的作者。
在实现Node
之初,他将工作重心放在「事件驱动模型」的实现上。这时,有个「项目中引入的模块该如何解析」的问题亟待解决。
他接受了NPM
提出的package.json
建议。简单的说,Node
中的require
方法会去package.json
中寻求如何解析模块(dependencies
、devDependencies
等字段)。
后来,NPM
逐渐成为Node
中最流行的包管理器与事实上的标准,两者逐渐深度捆绑。
而NPM
是一家私人公司,且之后被Github
收购。Github
又在微软旗下。
可以说,占领导份额的Node
第三方依赖管理是受私人大公司(微软)控制的。
反观Deno
,原生采用ESM
规范,最初有两种模块引入方式:
- 从本地路径引入
比如:
import xxx from './a.ts';
- 从远端
url
引入
比如:
import * as utils from "https://deno.land/std@0.166.0/io/util.ts";
相比于Node
中引入一个模块就等于引入一个npm
包,Deno
以url
的方式引入模块显然是更开放的。
毕竟,web
最不缺的就是url
链接了。
Ryan的理想
从上面的故事也能看出,「Ryan Dahl」离开Node
团队,创立Deno
是充满了理想主义色彩的。
在为Deno
预热的JS ConfEU 2018[1]中,他也明确表示:
「Deno不会和Node兼容,不这样的话开发者最终实现的还是Node模块」
在最初的正式版本中,Deno
也确实践行了自己与Node
不同的风格,针对Node
众多缺陷提出了解决方案,比如:
- 针对
Node
的安全性问题,加强了原生API
访问文件系统与网络的限制 - 舍弃了
package.json
- 原生支持
TS
这些特立独行确实引起了开发者热议,但并未达到很好的市场反响。
毕竟,Deno
首个正式版发布时,Node
已经问世11年了。
在Node
问世时,Node
团队只需要持续、稳定的迭代Node
核心API,就会有大量的JS
开发者为Node
生态贡献优质第三方模块。
而在Deno
面世时,又会有多少开发者愿意为Deno
贡献第三方模块呢,用Node
现成的包不香么?
于是,Deno
亲自上阵,满足了开发者的一些刚需,比如:
- 开箱即用的工具链工具(
linter
、formatter
、test-runner
、bundle
)
再加上原生支持TS
,可以说一个Deno
初始项目就具备了一整套工程化最佳实践。
对比同为Rust
编写的工具链工具Rome
(迭代了2年,发布了一个linter
,一个formatter
)就能发现,Deno
的迭代速度可以说是非常快了。
- 应用框架
比如受koa
启发的oak
,以nobundle
为卖点的全栈框架fresh
。
- 发布系统
与Deno
深度整合的Deno Deploy
这些努力似乎并没有取得预期的效果,对比Deno
(蓝色)与Node
(红色)的Google趋势
。
Node
的趋势整体走高,而Deno
的走势极为平坦(只在20年5月v1.0发布时有一点起伏):
现实
今年6月,Deno
获得由红杉领投的2100w刀的A轮融资,用于发展Deno Deploy
。
资本为了获得更好的回报,势必需要更大的用户基数。而Deno
最大的潜在用户群体,就是Node
开发者了。
理想主义的Ryan
不得不面对现实。
在最近的v1.28中,Deno
宣布已显著提高对NPM
包的兼容性,现在开发者可以在Deno
中使用超过130w个NPM
包。
在这背后,Deno
做了大量的Node.js
适配工作(在Deno
中实现Node
原生API
的适配层)。
曾经「替代Node.js」的目标,也逐渐变为「成为更好的Node.js」。
这2年的经历对Deno
来说,就像一个初入职场的热血大学生被社会磨平棱角的过程。
总结
Deno
凉了么?
不仅没有,而且已经发展为融资2600w刀,拥有17名员工的公司。
Deno
会取代Node
么?
在可预见的未来,Deno
都会是「小而美」的状态。在某些细分领域逐渐蚕食Node
的市场份额。
- 我应该使用
Deno
么?
如果你要「写个小脚本」或者「搞个小项目」,相比于Node
,Deno
的开发体验直接拉满。而且白嫖Deno Deploy
不香么?
- 还有什么推荐
Deno
的理由么?
有,你看看隔壁Go
那凸眼睛火腿肠。再看看Deno
的小恐龙敲可爱有木有~
参考资料
[1]
JS ConfEU 2018: https://www.youtube.com/watch?v=M3BM9TB-8yA
相关文章
- macOS 中如何安装 Node.js
- 如何使用jscythe并通过Node.js的Inspector机制执行任意JS代码
- Node.js批量抓取高清妹子图片 增强版详解编程语言
- Node.js开发指南详解编程语言
- Linux环境下配置Node.js(linux配置node)
- Node.js与MongoDB:联手打造高效应用(node与mongodb)
- 如何使用Node.js连接Oracle数据库(node连接oracle)
- 利用Node.js封装MSSQL的尝试(node mssql封装)
- 妙用JS获取Oracle信息的快速方法(js获取Oracle)
- 让链接必须按先后顺序点击的JS代码
- 用js模拟JQuery的show与hide动画函数代码
- JS函数验证总结(方便js客户端输入验证)
- node.js中的buffer.length方法使用说明
- node.js中的fs.realpath方法使用说明
- node.js中的fs.realpathSync方法使用说明
- node.js中的fs.readdir方法使用说明
- node.js解决获取图片真实文件类型的问题