精华 狼叔回复的《Node相比传统服务端技术栈好在哪里?》
发布于 6 年前 作者 i5ting 19517 次浏览 来自 分享

本来不想回复的,匿名的那哥们写的挺好的,虽然不懂他为什么要匿名。但看到某些回复,不得不说几句。乱解读,误人子弟的事,还是有必要澄清的,以免Node有无端被黑,相信这也是所有布道者都应该承担这种除魔卫道的责任。

没有领袖,Node 之父用 Go,TJ 也用 Go,都跑了。

  1. 语言不是因素,是他想做的事儿变了,但他的心依然还是爱着Koa

TJ转做Go有很多原因

别乱解读,误人子弟

  1. Node.js之父在2012年就离开社区的,然而这5年发展的依然很好

狼叔写过一篇文章 请别拿“死”人做文章, Node.js之父Ryan Dahl在2012年就离开社区的,我们必须要承认他作为创始人的伟大创举,但不能标签化,ryan不代表node,从他离开社区后,对于社区而言,他就“死”在曾经的丰功伟绩上,未来与他无关!

Node.js之父在2012年就离开社区的,然而这5年发展的依然很好,并无影响。这篇文章本来没什么问题,但有些人借位营销就恶心了。

狼叔说:Node.js不是最好,也不是最差,是性价比比较高的,可惜node做后端一直不温不火,java,php利益相关,只有新项目用,微服务架构下,会更好一些。很多人node是用错的,不是用node就什么都用,分清场景。不误解,不传谣,合适自己的才是最好的 但是总有些人想拿这事儿做文章过度解读,

抽象程度不够高,对于做业务的人来说这很痛苦。使用者中小白太多,人员素质参差不齐,包的数量多,质量却呵呵。

这完全是没逻辑的屁话,看起来没问题,却经不起推敲。

抽象程度,所有语言都有这个问题,Go就没有么?Java、PHP这么多年小白少么?说人员素质参差不齐,哪个语言不一样?所以说,这完全是狗屁逻辑。我比较喜欢Ruby社区,是高手和低手两级分化最明显。Node.js从2009年到现在才8年,再成熟能成熟到哪里呢?不拿一个起点比较都是扯淡。

最后说npm,黑的完全不到点上,目前超过60万个模块,绝对是社区第一。在众多包管理器上,我没见过质量都一样好的,按照8020原则,60万里至少有12万个模块是不错的吧,你工作中能用到的会超过三位数么?

所以说质量好不好要看人怎么选,而不应该赖到npm上。长点心吧。

用来做脚本倒是没啥问题,做商业开发就处处踩坑了。我没怎么用 Node做 Web,因为怕 hold 不住。

没用过,就别瞎逼逼。

国内国外的成功案例,眼瞎看不到么?我亲历的去哪儿和阿里都在大量使用,我亲耳听到的腾讯大量使用Node,对于李成银所在的360团队也是大量使用。

如果说 Node hold 不住,其他语言就能 hold 住?呵呵

如果说 人 hold 不住,那我相信,那是水平问题。

目前 Node Web 框架依然是 koa 和 express 类似的架构,中间件没什么问题,但是如何组织它们,如何在 high level 层面把控他们却没有看到很好的最佳实践。

没用Node还哔哔框架,不是打脸么?

我们可以根据框架的特性进行分类

框架名称 特性 点评
Express 简单、实用,路由中间件等五脏俱全 最著名的Web框架
Derby.js && Meteor 同构 前后端都放到一起,模糊了开发便捷,看上去更简单,实际上上对开发来说要求更高
Sails、Total 面向其他语言,Ruby、PHP等 借鉴业界优秀实现,也是 Node.js 成熟的一个标志
MEAN.js 面向架构 类似于脚手架,又期望同构,结果只是蹭了热点
Hapi和Restfy 面向Api && 微服务 移动互联网时代Api的作用被放大,故而独立分类。尤其是对于微服务开发更是利器
ThinkJS 面向新特性 借鉴ThinkPHP,并慢慢走出自己的一条路,对于Async函数等新特性支持,无出其右,新版v3.0是基于Koa v2.0的作为内核的
Koa 专注于异步流程改进 下一代Web框架
Egg 基于Koa,在开发上有极大便利 企业级Web开发框架

各种框架都经过大厂小厂实践,别的语言实现的我敢说Node都有了。还有什么所谓的更好实践,从2005年rails横空出世之后,大部分框架都是借鉴ROR,Node就算没有走到最前面,至少没有落后于最佳实践,否则,请给出,否则,请闭嘴,别瞎逼逼。

大公司也是相继开发自己基于 koa 的框架。

悖论,去哪儿的基于Express用的杠杠的,无任何问题。Node不缺Web框架,Koa虽好,但迁移各种还需要时间,未来是变化的,Koa能否一统天下还犹未可知。可以肯定的是Koa在异步流程控制做的改进,命名为Node下一个Web框架是不过分的。

比如micro,比如fastify,非常多好东西。

不过在我一个 Rails 使用者的眼里,这些框架还是不够 high level如果性能要求高,我的选择肯定是 Go 而不是 Node。

用rails的人还考虑性能么?我不是黑ror的朋友们。rails这样的神器足够好,即使ruby以前性能那么不好,但不影响人家开发很多世界级应用啊。尽管后面有的被替换了,但又怎样呢?做ror的高手技能都非常全面,ruby和前端和运维都是极其的熟练。当然Node和go也有这样的人,但普遍偏弱,这不是人的问题,而是产生的时间较短,没背景的人就不能出现全栈牛逼的能力。

如果真追求性能,我建议用rust写,如果还想牛逼,用c写,最好顺便把操作系统也写了。

人还是要有自知之明,做应用软件和系统软件是不一样的思维。傻逼才只看性能呢。

Node 除了亲 JS 好像对我没啥吸引力。但是如果公司非要用我也不反对,大不了自己摸爬滚打找出最佳实践即可。

没用过,请绕过。我特别尊重苏千和朴灵,推动Node在阿里落地,比如苏千做的cnpm真是功德无量,比如Egg,能够统一全公司的资源去推动框架落地,可预见大公司阻力。朴灵的alinode解决了性能调优的问题,内部使用的经验沉淀,对外提供付费服务。

这是人物。做的比说的多,低调如此,也不去惹是非。用德艺双馨形容不为过。

Node 还有一个好处是 UI 做的好,比如 pm2,比如调试器,毕竟是前端,但这些都不是杀手级的卖点呀。我不是挑语言的开发者。

Node 和 UI有关系么?呵呵呵

Node 对我属于一个可用可不用位置。不过相信牛逼的你肯定可以玩转 Node。加油吧少年。我对Node新人的建议是玩一玩可以,

没用过,就别瞎逼逼。

js已经横跨3端,pc/h5,移动端(hybrid和组件化),pc client(nw.js和electron,atom和vscode体验还不错)

Node补足了js服务端的补足,比如io,比如过于依赖浏览器。

  • 1)初衷,server端,不想成了前端开发的基础设施
  • 2)命令行辅助工具,甚至可以是运维
  • 3)移动端:cordova,pc端:nw.js和electron
  • 4)组件化,构建,代理
  • 5)架构,前后端分离、api proxy
  • 6)性能优化、反爬虫与爬虫
    1. 全栈最便捷之路

不过要早点转 Go,因为 Node 并没有什么突出的优势。

Go在服务器端,并发模型上确实很好。做后端是极好的选型。但在前后端分离或者单体应用里,真的合适么?

前面说了,性能并不是继续选型的唯一因素,不然ror那些牛人早转了。我一直的看法是前端离不开node,api层node有优势,io密集和脚本动态,做api组装聚合类的非常合适。对于后端服务,Node也是可以的,不过这时的node和go是一样的,尤其是上了微服务架构,服务是独立的,和语言无关,按照其特性选就好了,何必扯一些没用的。

最后说一下Node全栈

每次演讲我会都问大家是不是前端,回答“是”的人非常多,我会开玩笑的恭喜大家:“现在的前端就是钱端”,确实,现在前端发展异常的快,而且没有趋向于类比java里ssh框架的那种稳定,所以未来很长一段时间,还会增长,持续混乱,这对前端来说是把双刃剑,一方面有很强的压迫感,不学习就跟不上时代,另一方它也是机遇,能够带给更多机会,包括money。

大家都疑惑的一个问题是如何在这样巨变的时代能够通过学习来应变,我可以很负责的告诉大家,没有捷径,但通过掌握 Node.js 能够让你降低这个学习曲线而已,毕竟Node.js是大前端的基础设施。大家可以看一下,前端的开发过程,模块化,构建,辅助工具,调优,架构调整,可以说Node.js是无处不在的。

其实,辅助大前端开发只是Node.js的一个非常无心插柳的衍生功能,通过掌握Node.js能够让你能做的更多、获得的更多,甚至可以说有更多自我实现的快乐,在后面的章节会详细讲解Node.js的具体应用场景好处,这也是本书名字里“更了不起的”要去阐述的内容。

综上种种,就是我一直提倡以 JavaScript 语言为中心的 Node全栈 概念的缘由,JavaScript 覆盖所有前端,Node.js 擅长做 I/O 密集型的后端,外加辅助开发的各种基础设施,无疑是工作、学习和成为快速掌握全栈技术最好的途径。你会的越多,你能做的就更多,你的人生也将会有不一样的精彩篇章。

补充

没有领袖?

笑死了,根本就是外行,Node的接力棒是 TJ 和 sindresorhus ?ryan走了, Isaac Schlueter接✋的好么,然后是TJ Fontaine。之后闹出了iojs分裂问题,后来促使joyent不得不妥协,成立Node基金会。 现在是纯社区玩法,背后是Node基金会。

可以说,任何人离开都不会有特别大影响。铁打的营盘流水的兵,而已。

TJ是想对Node改进的,但Node的负担太重了,现有体系和机制改变不是易事,而且也没有动力促使它改变。很多特性都是意淫的,根本不是Node设计的场景,所以说这些没意义。响马大哥的fibjs就是一个不错的实践,但为什么二者不融合呢?。。。。因为没法真的没法这样做。。。

拿 express 和 Rails 对比,是一样东西么?

我知道不能把 Node 跟 Rails 一起比,因为一个是平台,一个是框架。那我就详细拿 express 和Rails 比吧。express 可以说是提供了一个 RESTful API + MVC 的框架,本身既没有 orm 也没有提供各方面的脚手架(对比 Rails 的 scaffold)也没有提供任何主观性的集成(比如你需要自己搭建测试框架)

进一步暴漏无知。express本身只是内核加了几个实用中间价的微型框架。Rails呢?是一个一站式的顶级Web框架。rails在2005年横空出世,node是2009年产生,exprss是2010年才有,这个比较客观么?

谬误1:express 可以说是提供了一个 RESTful API + MVC 的框架

a)谁说express是RESTful API了?

明显要自己规约才能实现的,这也意淫到express上。。。sinatra呢,beego,Revel,Martini呢?

express上实现rest可以,但不能这叫。

var express = require('express');
var router = express.Router();

var $ = require('../controllers/users_controller');

// -- custom

/**
 * Auto generate RESTful url routes.
 *
 * URL routes:
 *
 *  GET    /users[/]        => user.list()
 *  GET    /users/new       => user.new()
 *  GET    /users/:id       => user.show()
 *  GET    /users/:id/edit  => user.edit()
 *  POST   /users[/]        => user.create()
 *  PATCH  /users/:id       => user.update()
 *  DELETE /users/:id       => user.destroy()
 *
 */

router.get('/new', $.new);  
router.get('/:id/edit', $.edit);

router.route('/')
  .get($.list)
  .post($.create);

router.route('/:id')
  .patch($.update)
  .get($.show)
  .delete($.destroy);


module.exports = router;

b)谁说express是MVC了?

express目录有router和view就算mvc了?呵呵,看看rails,thinkjs,eggjs行么?

├── app.js
├── bin
│   └── www
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js
│   └── users.js
└── views
    ├── error.jade
    ├── index.jade
    └── layout.jade

7 directories, 9 files

c)谁说express是和rails一样的框架了?

你可以这也理解express只是内核(插件机制) + 几个常用插件。是一个麻雀虽小,五脏俱全的微型框架。一个连基本约定,orm,脚手架,migrate都没有的框架也算框架?

express不会直接使用的。大部分情况都是要自己封装的,如果说直接拿express-generator做事儿,做分析的,那真是用浅尝辄止形容不为过。

d)说express不如rails

确实不如,本来就不是一样的东西。ruby诞生自93年,rails诞生2005年,node和express呢?

起点不一样,比较有意义么?

Node哲学 与 Left-pad事件始末,真了解?

Node 社区的哲学是可以把 left pad 作为一个包,这看起来真的很傻。

明明不知道事件始末就乱发表意见,是否得当?是够傻的。

2016年3月份,kik是Azer写的模块,但Kik同时是手机通信录的社交软件,所以这个社交软件上就无耻的直接说让Azer把kik名字给他们,Azer不同意,他们就拿律师函恐吓,并让npm妥协,所以npm就妥协了

Azer一怒之下将自己在 npm 上的 273 个封包全部撤下,其中就包括 left-pad 封包。一石激起千层浪,依赖 left-pad 的上千个项目包括 babel 和 react-native 瞬间崩溃。大量开发者看着自己项目构建失败,顿时被吓尿。

观点

  • 1)就没见过这么傻逼的公司,一个红包就能解决的事儿,非要用强权,如果对方在改模块上耗费心血少的话,转给你也是可以商量的。

  • 2)11行代码要不要封装成一个包?

sindresorhus: Containing complexity is not about putting everything in one-line functions/modules.

社区一致认可的结论:你的模块必须含有一定的复杂性,不然就没啥意义了。

  • 3)npm上那么多个模块,大多数都是无意义的吧?

从我开始讲Node.js全栈大约是3月份,那是npm上是25.6万个吧,截止到2017年3月是45万个,我想说的是那个包仓库都是有好有坏,按照80/20原则,数量是也是相当可观的。总比那些某些语言连包管理机制都不完善的要强太多了吧!

If the version is less than 24 hours old, you can unpublish it. The package will be completely removed from the registry.

这世界是完美的?

没用过别逼逼我不同意,我在做新的项目之前仔细对比了 Node Web 框架与其他框架,发现 Node 的上述问题,才使用了别的。
我不认为我一定要用过之后再来逼逼。
你也是做过项目的,知道如果一个项目做毁了会有多大损失,我不会为了来逼逼而去做毁一个项目。
如果你技术一般,我建议你先别用 Node,因为会让你的技术更一般。
如果你技术很牛,我不需要建议你什么,你牛你先说。

没用过就是没用过,很多精髓的东西如果停留在表面,是不是太肤浅了?哪个框架是完美的?了解敏捷么?敏捷的基础认知是什么?

从上面那express和rails比,从对express是rest+mvc的描述,暴漏对node了解太浅。如果说想黑node,我再帮你补二刀,早年robbin范凯,一直在黑node的回调地狱,可是又如何呢?该有多人用还是有多少人用

有种你别装,装了就别瞎比比,既想当婊子,又想立牌坊吗?

至于项目能否做成功,我并不认为是技术的问题。更多的是你对技术的熟练程度,哪个熟悉就用哪个,你哪个自己不熟悉的,做毁了,然后来骂框架,骂语言?这也是神逻辑啊。

狼叔经常说:“少抱怨,多思考,未来更美好”,适用于所有人。

人员参差不齐要说人员参差不齐, Node 社区说第二,有哪个敢说第一?

PHP 好歹也是专注 Web 后台。Node 可笑的地方在于一群前端以为自己会后端就来写 Web 后台。我没有数据支持,但是我就是这么认为的。
Java 后台的新人也是第一天就会专注于后台方面的学习。
当然这并不能作为你不使用 Node 的原因,如果你是大神,你不会在乎这个社区有多少小白的。但是我前面也说了,我关注的大神都从 Node 社区走了啊。我为什么还要进 Node 社区……
阿里的苏千我在阿里的时候也有向他请教 Node 方面的知识,我从未否认他们的贡献,不过我并不会因此捧 Node。

PHP专注于Web 后台,我估计看了这话,鸟哥会哭的很伤心的。Node的人不是可笑,是有追求,慢慢写着写着就在成长。

Java 后台的新人也是第一天就会专注于后台方面的学习?呵呵,没学Java么?去看看core java吧,上来学后台,没见过。

关注的大神都从 Node 社区走了,这话更扯淡。哪个社区不是这样的?不同年龄,职位,人生阶段,关注点会不一样的。比如严清zensh就从node转了go,人家职位也不一样了。再有说话不要用“都”,我举个例子朴灵,https://cnodejs.org/user/JacksonTian,大家去看看他的最近参与的话题,10天前的。https://cnodejs.org/topic/5a20be0a110a338547d6e371#5a24c72b9178b0a14ac01e1b

最后,再说一件事儿,别老贴金,进了阿里不代表什么,马云说了,三年以上才算阿里人,才有阿里味。向玉伯,寒冬,苏千,朴灵,天猪等大大们致敬。

Hold 不住?

Node 呢,请问我该用什么数据库?用什么 ORM?用什么模板语言?用什么做后台任务?如何监控内存?如何分析日志?如何做分布式?如何做安全?有些人看说用 Node 做业务速度快,Node 的框架就做那么点低层次的封装,能不快吗?你把各种中间件加完试试?每个领域都要自己去找最佳实践,然后自己集成起来。

先不论对node和express等理解错误的问题。

先看狼叔之前的回复 https://www.zhihu.com/question/263855387/answer/273769595

一般,后端开发指的是 Web 应用开发中和视图渲染无关的部分,但现在架构升级,Node 承担了前后端分离重任之后,有了更多玩法。从带视图的传统 Web应用面向Api接口应用,到通过 RPC 调用封装对数据库的操作,到提供前端 Api 代理和网关,服务组装等,统称为后端开发,不再是以往只有和数据库打交道的部分才算后端,这样,就可以让前端工程师对开发过程可控,更好的进行调优和性能优化。

对Node.js来说,一直没有在后端取得其合理的占有率。原因很简单

  • 1)利益分配,已有实现大多是Java或者其他语言,基本是没法撼动的,重写的成本是巨大的,另外,如果用Node写了,那么那些写Java的人怎么办?抢人饭碗,这是要拼命的。

  • 2)Node相对年轻,大家对Node的理解不够,回调和异步流程控制略麻烦,很多架构师都不愿意花时间去学习。尽管在Web应用部分处理起来非常简单高效,但在遇到问题时并不容易排查定位,对开发者水平要求略高。

  • 3)开发者技能单一,很多是从前端转过来的,对数据库,架构方面知识欠缺,对系统设计也知之不多,这是很危险的,有种麻杆打狼两头害怕的感觉。

  • 4)Node在科普、培训、布道等方面做的并不好,国外使用的非常多,国内却很少人知道,不如某些语言做得好。

了不起是个不能随便说的词儿,对于 Node.js 来说,简化并发编程,用了不起来形容并不过分,在2009年横空出世时,确实是独一无二的。但在今天,已经8岁的 Node.js 有了更多、更为广泛的应用场景,它已经远远大于当初设计时的初衷了,我觉得用更了不起来形容已经不过分了!

你这个问题,很明显暴漏了自己的问题就是上面的原因之3。

开发者技能单一,很多是从前端转过来的,对数据库,架构方面知识欠缺,对系统设计也知之不多,这是很危险的,有种麻杆打狼两头害怕的感觉。

不懂架构,不懂数据库,还没有明白人带,那你用啥框架,语言能好呢?

  • 1)复用已有基础设施,很明显比自己造轮子好。别动不动就java已死,xx已死的,冰冻三尺非一日之寒
  • 2)微服务架构下,你需要多复杂?

不懂不可怕,别装懂。

UI 是 User Inferface,意思是 Node 社区做的工具的外观(UI)都很漂亮。

pm2 的 UI(命令行界面)我就很喜欢,Node 内容 Chrome 调试(界面)我也很喜欢,这是 UI,我不是说 GUI。程序员之间说 UI 难道不是既包括 GUI 又包括 CLI 吗?这只是对于术语的误解而已,不重要。

各位看官自己判断这句话吧。

所以 NodeJS 社区很明智,多多模仿其他成熟框架是对的。但我直接去看你模仿的框架就好。?

举例,我想学日语,结果发现日语里有汉语的影子,于是我去学了汉语?是这逻辑么?

水是原子组成的,干嘛喝水呢?去喝原子啊,反正有很多途径。。。

JS 全栈

我不知道这有什么意义?为了全栈而全栈?Java 二十年前也有一样的口号,然后呢?而且 JS 现在已经很奇怪了。

目前看js是最容易实现全栈的途径,没有之一。我很喜欢ror,但同时学2种还是略难。其他就更不要说了。Java是跨平台,能和JS一样么?你真的了解从applet到awt到swing到他们衰亡的历史么?不见得吧,说话还是要有理有据的。

全栈是信仰,是一种积极的人生态度。何谓为了全栈而全栈?我看到的更多的是大家积极的学习,努力的向提高成长。在技术变化如此快的今天,我们不是更该如此么?我尊重每一个有全栈信仰的人,我也祝福你们,未来是你们的。

关于语言他回复的2个点

  • 我对Node新人的建议是玩一玩可以,不过要早点转 Go,因为 Node 并没有什么突出的优势。
  • 我宁愿用 Java 都不会用 Node.js,除非工资特别高

一会扯go,一会扯java,难道对这门语言很熟悉的?还是纯粹为了挑起语言战争?还是为了培训机构站台?

大家姑妄言之,姑妄笑之就好,别认真,认真你就输了

朴大说过:“为什么非要尝试去说服傻逼”,可怜之人必有可恨之处,但不容许有人黑我大Node。

29 回复

这波回答可以说是非常精彩了👍

黑不黑不重要,主要是做的事,招聘的人。

如果在这个地方,来一大波招聘,这也不用怎么解释!

大哥怒了,不过还是分析得比较有理有据

其实没必要跟他们说这么多,说多了还容易被人当作eechen

@zy445566 适当的反驳一下,我也没有那么多精力,舆论方向不能被带偏就行

在知乎看到黑node的,感觉恶心

不喜欢那个搞培训的…知呼经常推他的东西,后来直接屏蔽了… 不管对人还是对事都非常支持!!!

php才是最好的语言

一般黑的人的心理是,怕别人做的好,可是自己又没有精力去研究,然后就开始恶言中伤了。

厉害了 我的叔

node 是越喜欢就越喜欢,默默祝福

狼叔厉害了

有人黑,才证明火嘛。

其实我一直用node做后端的,前年去年做爬虫,做数据分析,做接口,今年一直各种微服务,感觉写习惯了还挺好写,相反前端还用的不是非常多,因为以前也只是擅长后台,我是从用C#转到用node的……

狼叔经常说:“少抱怨,多思考,未来更美好”,适用于所有人。 赞。

但是相对来说,nodejs的工作岗位真的少。个人项目nodejs觉对的首选。

@zhangshuaizone 我招,来吧

@zhangshuaizone node都是做中间件用得比较多,单询找node的岗位确实不多,一般都包含在高级前端的必要条件之一,但我们公司就有专门node职位,主要用来调java和net等各种接口

@zhangshuaizone 我招,来吧


本人写代码,拿起Node就是干

做项目现在都讲实际情况,在Java,php,python等方兴未艾之际,人们对新的东西都保持者敬畏心理,敬而观之。

node确实缺少顶级web框架,说的也没错

感觉就是 Node 在后端并没有多大的优势 但是前端几乎都是 Node 的天下,要找工作的话还是在前端发展比较好

看业务场景了,我司的node也已中间层居多

From Noder

个人觉得,js的数字精度问题是很大的硬伤,业界标准有计划么?

node开发不仅仅是做react,vue的

大前端首选node,对前端的帮助是巨大的

我TM居然看完了.

回到顶部