Node.js的末日来临了吗?

发表时间: 2020-05-25 17:44



作者 | Kasra Madadipouya

译者 | 王强

策划 | 蔡芳芳

转发链接:
https://mp.weixin.qq.com/s/o4Sb3gc0XECJwx17Ajsn4A

Deno 1.0 发布之后的这些天,关于 Node.js 的讨论也甚嚣尘上。在社交媒体和技术论坛中,许多开发人员都在谈论 Node.js 的命运走向。甚至有人断言 Node.js 即将迎来终结,至少这一天迟早会到来。我并不是什么先知,但在本文中我会与大家分享一些看法。本文主要尝试回答“Node.js 是否要完”这个问题。我会向大家解释,为什么现在我们不必在意那些对 Node.js 命运的悲观预测,即便这种预测并非空穴来风。

本文最初发布于 Geeky Hakcer 博客,经原作者授权由 InfoQ 中文站翻译并分享。

引言

每当一种新的语言或技术诞生时,马上就会有很多人谈论它的终结。不信?只需打开谷歌并输入:

(随便选一种语言或技术)快要完蛋了吗?

不管你输入的是哪种技术都可以搜出来一大堆文章来,其中很多无疑写的就是垃圾。就算是 Kubernetes 之类的新技术也不能幸免,Node.js 自然也不例外。但最近炒热“Node.js 要完”这个话题的是 Deno 1.0 版本的发布。

如果你还不知道什么是 Deno,请继续阅读下一节内容。这样你就会知道现在弥漫的恐慌情绪是从何而来的了。

什么是 Deno?

Deno 是由 Node.js 创建者 Ryan Dahl 编写的 Javascript 运行时。它的名字是“Node”一词的变体

这个项目是 Dahl 在 2018 年的演讲“我对 Node.js 感到遗憾的十件事”中宣布的。相比于 C/C++ 编写的 Node.js 而言,Deno 是用 Rust 编写的。

在撰写本文时,Deno 只有一个执行文件,压缩后的大小约为 15MB。

漂亮的 Deno


此外,它没有类似 NPM 的或独立的外部包管理器。它的包管理是内置的。

Deno 运行在沙盒模式下(意味着无法直接访问文件、网络和其他 IO),因此任何权限都需要显式授予才行。

对于 TypeScript 爱好者的一个好消息是,Deno 默认支持 TS。

另外,小编第一时间就整理了Deno学习入门相关文章

「干货」通俗易懂的Deno 入门教程

「干货」了不起的 Deno 实战教程

「实践」Deno bytes 模块全解析

「干货」Deno TCP Echo Server 是怎么运行的?

更多的相关文章,请见本篇文章最底部,好惊喜,等着你!

为什么要讨论 Node.js 的消亡?

之所以社区突然开始认定 Node.js 要完,主要是因为 Deno 的 1.0 版已于 2020 年 5 月 13 日正式发布。虽然这个项目已经开发了两年多时间,但这个正式版本在社交媒体中引发了 Node 开发人员的恐慌。

不用说,Deno 和 Node.js 之间有很多区别。而且 Deno 不一定是 Node.js 的替代品(目前为止是这样),但不管怎样许多人都感到惊慌失措。我对他们恐惧的原因归了一下类,并分别做了探讨。

相同的创造者

造成现在这种局面的一大因素是两种产品有着相同的创造者。而且许多人认为 Ryan Dahl 不会再在 Node 上浪费时间了。于是乎,Node.js 要完。

这个假设看似有理,其实大错特错。Node.js 拥有一个庞大的社区,比其他许多社区都大得多。所以这并不是什么个人项目。

有人在反驳时将 Dahl 对 Node.js 的意义和 Linus Torvalds 对 Linux 的意义做了类比。我要说的是,这根本不是正确的对比。

首先,Dahl 自 2012 年以来就没再参与 Node.js 的开发了。但在过去的 30 年来,Torvalds 一直在以某种形式参与 Linux 的相关工作。

其次,就算是 Torvalds 离开了 Linux 的内核社区,也不能说 Linux 就会完蛋。而且也不要把 Torvalds 的退出与 Linux 社区在 2018 年 9 月的混乱局面划等号。2018 年的那次混乱是一桩原因复杂的黑暗事件,其中只有一部分和 Torvalds 的退出有关系。

最后,Torvalds 还创建了 Git,但并未参与其维护工作。他把 Git 全盘交了出去,可是 Git 完蛋了吗?

Node.js 社区是一片墓地,遍布无人维护的库

众所周知,Node.js 社区是无人维护的库的墓地。不夸张地说,社区中每天诞生或死亡的库的数量超过了每个人的细胞数量。

开源社区每隔三两天就会诞生一个新的框架,新框架或许会风骚一时,然后突然就没人维护了。随便搜一下,你就能在 GitHub 中找到几十个 Star 数众多但没人维护的项目。

可能有人会说,如果这就是社区中的日常,那么我们如何断定 Node.js 就不会遭遇同样的命运呢?

答案是不好说。Node.js 的命运取决于社区和企业的支持。重点不在于项目筹集了多少资金,而在于它是否能得到更多的贡献和支持。如果大量使用 Node.js 的那些公司能雇用一些人为这个项目做出积极贡献,那么 Node.js 几乎不可能迎来末日。举个例子,Java 已经存在 25 年了。Java 之所以如此长寿,除了它可以在几乎所有设备上广泛使用的优势之外,另一个原因就是众多公司的支持。它得到的支持不仅来自于 Oracle,而且还有 Amazon、IBM 和其他许多公司。

但请不要忘记,许多使用 Node.js 的公司都是寿命短、预算紧的初创公司。我们不能指望这些公司做出多大贡献。Node.js 需要的是像 Facebook 或谷歌这样钱包鼓鼓的巨头的支持。

如果社区走向分裂,和 / 或大公司不再支持 Node,那么我们就有理由担忧 Node 正走在衰落之路上了。

Deno 比 Node.js 更好

当然,这一点没有疑问。在构建 Node.js 的过程中,人们获得了丰富的经验和知识,所以 Deno 能做得更好也不奇怪。但是,要评估一项技术的前景不能只看它的能力。那只是其中一个因素。普及率和支持水平是更重要的因素。而且 Deno 在这些方面并无优势,因为它还很年轻。因此,Node.js 不会这么快死掉的。

但我们还可以假设最坏的情况,然后会发生什么呢?

请看这篇文章:Deno 正式发布,彻底弄明白和 node 的区别

如果 Node.js 死掉了会怎样?

我调查时发现,有些人讨论 Node.js 的终结就好像在谈论一个人刚刚死掉一样。问题是,编程语言或技术的消亡过程并不像人类的死亡那样。这种消亡不是一夜之间发生的事情。

技术的更新换代通常需要花费多年时间,因为公司无法在一夜之间或一个月内换掉现有的产品,然后迁移到新产品上。Node 也不例外。Node.js 库不能用在 Deno 中,为 Deno 开发新库是需要花时间的。另外,不要忘记专业知识的可用性。现在很少有人熟悉如何使用 Deno 来构建生产规模的产品。所有这些至少需要几年的时间。

Node 没机会了!

即便 Node 的消亡时间比预期的要早,市场也会长期需要相关的岗位。当然它不会像 COBOL 那样。但至少在接下来的 5 年中 Node 的开发人员都能找到工作。这应该可以为 Node 开发人员提供足够的缓冲期来转换方向。另外,由于 Deno 和 Node 都是 JS 世界的成员,因此从一个切换到另一个的过程并不会那么烦人。

结论

Node.js 至少在未来五年内不会消亡,而当下在社交媒体中关于它死期的争论毫无意义。尽管有一些关于它走下坡路的判断,但到目前为止我们还没有一个明确的结论。就算我们对 Node.js 假设最坏的情况,而对 Deno 假设最光明的未来,各家公司要切换到新技术上依旧需要很长的时间,而且 Deno 的库生态建立起来也需要时间。如果你忧心忡忡,或者对新技术充满好奇,我强烈建议你尝试一下 Deno。

最后,我想声明一下,我对 Deno 没有偏见。这是一个前景光明的好项目。我写这篇文章的目的不是要讨论 Deno 的未来,而是要减轻 Node.js 开发人员的压力。

推荐Vue学习资料文章:

《记一次Vue3.0技术干货分享会》

《Vue 3.x 如何有惊无险地快速入门「进阶篇」》

《「干货」微信支付前后端流程整理(Vue+Node)》

《带你了解 vue-next(Vue 3.0)之 炉火纯青「实践」》

《「干货」Vue+高德地图实现页面点击绘制多边形及多边形切割拆分》

《「干货」Vue+Element前端导入导出Excel》

《「实践」Deno bytes 模块全解析》

《细品pdf.js实践解决含水印、电子签章问题「Vue篇」》

《基于vue + element的后台管理系统解决方案》

《Vue仿蘑菇街商城项目(vue+koa+mongodb)》

《基于 electron-vue 开发的音乐播放器「实践」》

《「实践」Vue项目中标配编辑器插件Vue-Quill-Editor》

《基于 Vue 技术栈的微前端方案实践》

《消息队列助你成为高薪 Node.js 工程师》

《Node.js 中的 stream 模块详解》

《「干货」Deno TCP Echo Server 是怎么运行的?》

《「干货」了不起的 Deno 实战教程》

《「干货」通俗易懂的Deno 入门教程》

《Deno 正式发布,彻底弄明白和 node 的区别》

《「实践」基于Apify+node+react/vue搭建一个有点意思的爬虫平台》

《「实践」深入对比 Vue 3.0 Composition API 和 React Hooks》

《前端网红框架的插件机制全梳理(axios、koa、redux、vuex)》

《深入Vue 必学高阶组件 HOC「进阶篇」》

《深入学习Vue的data、computed、watch来实现最精简响应式系统》

《10个实例小练习,快速入门熟练 Vue3 核心新特性(一)》

《10个实例小练习,快速入门熟练 Vue3 核心新特性(二)》

《教你部署搭建一个Vue-cli4+Webpack移动端框架「实践」》

《2020前端就业Vue框架篇「实践」》

《详解Vue3中 router 带来了哪些变化?》

《Vue项目部署及性能优化指导篇「实践」》

《Vue高性能渲染大数据Tree组件「实践」》

《尤大大细品VuePress搭建技术网站与个人博客「实践」》

《10个Vue开发技巧「实践」》

《是什么导致尤大大选择放弃Webpack?【vite 原理解析】》

《带你了解 vue-next(Vue 3.0)之 小试牛刀【实践】》

《带你了解 vue-next(Vue 3.0)之 初入茅庐【实践】》

《实践Vue 3.0做JSX(TSX)风格的组件开发》

《一篇文章教你并列比较React.js和Vue.js的语法【实践】》

《手拉手带你开启Vue3世界的鬼斧神工【实践】》

《深入浅出通过vue-cli3构建一个SSR应用程序【实践】》

《怎样为你的 Vue.js 单页应用提速》

《聊聊昨晚尤雨溪现场针对Vue3.0 Beta版本新特性知识点汇总》

《【新消息】Vue 3.0 Beta 版本发布,你还学的动么?》

《Vue真是太好了 壹万多字的Vue知识点 超详细!》

《Vue + Koa从零打造一个H5页面可视化编辑器——Quark-h5》

《深入浅出Vue3 跟着尤雨溪学 TypeScript 之 Ref 【实践】》

《手把手教你深入浅出vue-cli3升级vue-cli4的方法》

《Vue 3.0 Beta 和React 开发者分别杠上了》

《手把手教你用vue drag chart 实现一个可以拖动 / 缩放的图表组件》

《Vue3 尝鲜》

《总结Vue组件的通信》

《Vue 开源项目 TOP45》

《2020 年,Vue 受欢迎程度是否会超过 React?》

《尤雨溪:Vue 3.0的设计原则》

《使用vue实现HTML页面生成图片》

《实现全栈收银系统(Node+Vue)(上)》

《实现全栈收银系统(Node+Vue)(下)》

《vue引入原生高德地图》

《Vue合理配置WebSocket并实现群聊》

《多年vue项目实战经验汇总》

《vue之将echart封装为组件》

《基于 Vue 的两层吸顶踩坑总结》

《Vue插件总结【前端开发必备】》

《Vue 开发必须知道的 36 个技巧【近1W字】》

《构建大型 Vue.js 项目的10条建议》

《深入理解vue中的slot与slot-scope》

《手把手教你Vue解析pdf(base64)转图片【实践】》

《使用vue+node搭建前端异常监控系统》

《推荐 8 个漂亮的 vue.js 进度条组件》

《基于Vue实现拖拽升级(九宫格拖拽)》

《手摸手,带你用vue撸后台 系列二(登录权限篇)》

《手摸手,带你用vue撸后台 系列三(实战篇)》

《前端框架用vue还是react?清晰对比两者差异》

《Vue组件间通信几种方式,你用哪种?【实践】》

《浅析 React / Vue 跨端渲染原理与实现》

《10个Vue开发技巧助力成为更好的工程师》

《手把手教你Vue之父子组件间通信实践讲解【props、$ref 、$emit】》

《1W字长文+多图,带你了解vue的双向数据绑定源码实现》

《深入浅出Vue3 的响应式和以前的区别到底在哪里?【实践】》

《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)》

《基于Vue/VueRouter/Vuex/Axios登录路由和接口级拦截原理与实现》

《手把手教你D3.js 实现数据可视化极速上手到Vue应用》

《吃透 Vue 项目开发实践|16个方面深入前端工程化开发技巧【上】》

《吃透 Vue 项目开发实践|16个方面深入前端工程化开发技巧【中】》

《吃透 Vue 项目开发实践|16个方面深入前端工程化开发技巧【下】》

《Vue3.0权限管理实现流程【实践】》

《后台管理系统,前端Vue根据角色动态设置菜单栏和路由》

作者 | Kasra Madadipouya

译者 | 王强

策划 | 蔡芳芳

转发链接:
https://mp.weixin.qq.com/s/o4Sb3gc0XECJwx17Ajsn4A