node 目前发展如何?感觉最近两年不是很火呀!
发布于 9 年前 作者 wdragon1983 86824 次浏览 最后一次编辑是 8 年前 来自 问答

搜索上面各种技术介绍,博客 帖子很多都是两年以前的。51job上面node 职位也不是很多。 编程语言排行,去年JavaScript降低了一位。而且估计这些用户大多还是以前前端的用户,JavaScript这门语言,在前端至少很长一段时间是无法撼动的。就跟后端的java一样。但是js的后端node,种种迹象表明,node很难火起来呀! 不知道目前有没有上千万级别用户,以node为主要开发语言开发的公司呢?

33 回复

已经火过了,现在都忙着埋头填坑呢

@yakczh

这个回复很精髓啊。。。

楼主在这里讨论nodejs不是很火,你会被灭火的。

就是论事,讨论一下。你们都没什么看法吗?

最近工作原因见了不少外包公司,收上来的方案连PHP都凤毛麟角。

@wdragon1983

@yakczh 说得已经很清楚了啊,已经火过了,现在都忙着埋头填坑。

说得太直接了,这里有的人会不高兴,会表示不欢迎的。@alsotang 还是挺不错的,比较客观开放,但是一些自认为比较牛逼的人是会不舒服的。发这种帖子的你也不是第一个,也不会是最后一个。

你要了解真实情况可以看看Node.js 在双十一中有哪些应用,表现如何? 尤其看与java对比的那部分。

nodejs刚出来的时候是以性能著称的,为了追求性能,他把所有阻塞操作都用回调异步来实现,再加上v8,在三年前来看,这性能跟PHP,java,python比那是杠杆的。但现在已经没有任何性能优势了,尤其是go,fibjs等新语言,新框架出现之后,性能的实际情况可以看响马大哥的测试

就连PHP都在大力提高性能。现在实际上也没有多少人再提nodejs的性能优势了。性能优势没有了,甚至落后了,现在宣扬的重点是生态,是巨量的库,是前后端统一。当然有的人会说,我不在乎性能,公司刚起步,nodejs性能足够了。说这种话的人是正确的,nodejs就是适合创业公司,人手不多,前后端语言统一,快速原型开发迭代。但nodejs绝对不是银蛋,他适合干的事情,也就是中小项目的原型开发,前端工具库,模板渲染等。阿里系拿nodejs主要用来做前后端分离的,把原来不该是后端的活交给nodejs去干,后端只要提供数据,nodejs负责渲染就行。这种开发模式对大公司而言就减少了沟通成本,将取后端数据的API给nodejs层调用就是,网页渲染成什么样由nodejs决定,这部分代码原来是后端的人写,显示效果又是由前端决定的,这中间就存在沟通成本,现在全由前端干了,自然效率就提高了很多。顺带的,nodejs还能提供性能上相对于PHP或java的好处。这是对nodejs正确的用法,要么是中小项目,要么是阿里这样作为渲染层,要么为前端提供各种工具链。

就nodejs本身而言,坑太多了,javascript语言本身就是个坑,这就决定了他不适合大型,对稳定安全有一定要求的项目。阿里自己的人说nodejs可能需要5-10年来弥补和java的差距。我并不清楚这种判断的依据,但肯定是经历过,对比过才会有的结论。

javascript语言现在已经进入了快速进化期,ES6跟ES5比,加入了很多新特性,很多语法糖,新特性和语法糖起的作用有好有坏,好是很多新特性的确能够简化代码,坏是语言越来越复杂的同时,还继续保持了对老版本的兼容性,javascript原本自由的语法问题会被新增的复杂度迅速放大,如果不做一定的硬性编码规定,团队作战将是一个极大的考验。nodejs巨量库,大多是精巧的个人项目,或许是对javascript这个语言特性最好的注解。我举个例子,继承,是用ES5的原型继承(ES5的原型继承就有好几种),还是用ES6的class语法糖?这需要强约束。异步,我可以用callback,promise,generator/yield,async/await,这也需要强约束。

javascript大量的用户本身也是坑,nodejs最不缺的是人,但最缺的也是人。会javascript的人茫茫多,但用的真正好的却很少,javascript是典型的入门容易精通难。大量从前端转nodejs的人,没有一定的基础,搞了小项目就觉得自己是后端大牛了,这样的人不在少数,把nodejs当银弹的人或公司不在少数。大家看看nodejs项目核心贡献有多少中国人就明白了,几乎是等于零蛋,阿里的人在Node.js 在双十一中有哪些应用,表现如何?再一次讲了实话,大家可以去看看。

javascript大量用户中坑不少,那巨量的库中的坑有多少大家只能自己去体会了。并不是说高质量的库没有,而是少。精华就那么几个,其他数量众多能有什么用?敢随便用么?其实并不敢。

我如果继续下去,马上就会有人过来说怪话了,以上只是个人观点,大家自己去斟酌吧。

顺便介绍下我的个人项目,c + Lua + libuv 实现的异步网络库,tcp部分已经实现,http部分正在编码,过年后实现tls,https,websocket和一些数据库客户端(初期可能会直接用openresty现成的)

https://github.com/coordcn/LuaIO

通过lua的协程在c代码层面将回调异步转换为形式同步,异步编程将和同步编程没什么两样,性能和编程模型统一了。

说的挺好

@yuu2lee4

就是受fibjs和openresty的启发,我个人无法驾驭c++和v8,只能用lua来实现。

@coordcn 谢谢分享你的想法

@brickyang 那方案主要都是什么

@IfAaron 猜也猜得到肯定是 JAVA 一堆啦,还有C

@brickyang 拿如果有人拿了个node方案,你们会考虑吗

阿里的人说 他们用node 做CDN的源站 。大量的提高了QPS。 节省了很多成本。 但是我不知道为什么一定要用node做源站,用java 或者 其他语言做源站 不也是一样提高。 这个与node在阿里的应用没什么关系吧。

@wdragon1983

主要是相对PHP,jsp单机QPS能力提高。阿里用node主要看中的还是前后端的分离,把原来后端干的活全给前端干了。

@coordcn jsp不用说了,虽然java一开始靠jsp + servlet 但是现在由于tomcat 等web容器太过臃肿,性能一直跟不上,java现在主要还是中间件的稳定强大。php之所以占领前端市场也是这个原因。 那现在的意思,阿里是想用node 把php替代掉了

@wdragon1983

就是这个意思啊,我给的链接里有阿里人的说明。

@IfAaron 我们就是要用node方案

TypeScript, JS弱类型坑的救星

如果JS异步混乱,其它语言只会更乱。

@dou4cc 笑而不语。。。

@coordcn 我看这两天fibjs重构了 性能又提高不少

@coordcn 顺便问个问题,你们看源码的。node里面的异步库 比如async 之类的,提供的并行处理方法。 是本身这个方法就是异步的,还是非异步的方法 这个库可以让他并行执行。 因为js是单线程的,如果传2个方法A ,B给 async并行处理,如果这两个方法本身不是异步的。你们async 如果想并行处理,只有开子进程来执行了。 还是说async本身要求接受的方法是异步的,比如 一些io操作的方法?

@coordcn 或者async 是不是用process.nextTick这种类似的方法,这种方法提供的 不是并行的操作。 仅仅是异步,但是还是在事件循环里面执行。

@wdragon1983

传入的方法是不是异步随便你,如果你传入了同步方法,而且很耗时间,就会发生阻塞。

拿async来说,async只关注回调函数有没有被调用,所以你只要在同步函数后面加个回调函数就行了。

function test(arg, callback) {
	for (var i = 0;  i  < 100000000;  i++) {
		arg += i;
	}
		
	callback(null, arg);
}

上面的函数其实是同步的,加个回调是伪装成符合async调用的样子。nodejs将异步回调的第一个参数约定为ERROR对象,第一个为null就是告诉后续调用者在这一步没有错误,可以继续。

我是这么理解的,在一个事件周期内,所有代码上都是同步执行的。异步函数调用过程也是同步的,每一次异步函数调用,大致分为几个步骤,输入参数的准备和传入,调用系统调用或者传给线程池(这个时候系统调用或线程池已经开始执行,但主线程还是同步顺序的往下执行),注册事件和回调函数。我们看到所谓的并行,其实跟主线程无关,主线程就是个发布命令的,干活要么是内核,要么是其他线程。内核和其他线程干完后,会通知自己已经完成,并把结果传给主线程。主线程在后面的事件循环中调用原先注册好的回调代码继续顺序的往下执行。

process.nextTick就是注册了个下个事件周期执行的回调函数。

我举个例子来解释上段文字可能效果更好:

var a = 0;

fs.readFile('test.txt',  function(err, data){
	console.log('in:' + a);
});

a++;

console.log('out: ' + a);

看看a的值自然就明白了执行顺序了。

我的方案和nodejs是不一样的,跟fibjs类似。非javascript实现,而是lua + libuv实现。

local a = 0
-- fs.readFile是异步的,但通过协程转化后可以写成类同步的方式,javascript的generator也提供了类似的功能。
local data, err = fs.readFile('test.txt') 
a = a + 1
print(a)

反正会写node的人…也不单单只会写node…

其实ls说到的node作为工具链来说,实在说到心坎里头了

现在node在我手里就是做工作工具链,虽然主职是android,但是用node,做做静态服务器,做做数据,写写命令行工具的非常方便

只有lz提到的发展前景,我觉得经历过iojs后,nodejs应该能够稳步发展了,毕竟每天巨量的库更新,还有node本身的演进

感觉不火…因为过了火的那段时间了…

@coordcn 刚刚看了你的回复。又去补习了一下基础知识 协程。平时听携程多了,和这个不一样。 我是搞java的,对线程熟悉点。但对协程没了解过。今天看了一个介绍。用两句话来总结 。本质上协程就是用户空间下的线程。 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示的调度,且协程的切换完全在用户态进行。 我看了一下 nodejs fibjs 和你的实现方案。 好像解决的问题都是异步回调的方式的恶魔金字塔。太让人难以接受。所以有了 promiseA+ async fibjs 的协程。 但是本质上 感觉都是为了解决IO问题出现的阻塞。 交给操作系统来做,做完了通知回调。 而java之类的语言,就是用多线程的方案。多线程由于系统调度开销比较大。但是如果执行的方法不是一个IO操作,是一个CPU操作,这种异步或者协程的方案,就没什么意义了,不能利用cpu,不如线程的方案。而fibjs 和你现在做的,仅仅是 nodejs 异步实现 代码的封装。本质还是差不多。
就我刚才的问题,async提供的并行处理,实质上依然是单线程下 处理。在下一个事件循环里面处理。 如果是cpu操作,依然是 不能并行执行。

@wdragon1983

的确如此,nodejs的软肋之一就是不能做大量计算,只适合做IO。

要解决这个问题,对CPU而言,只能是多进程或多线程(nodejs和LuaIO是多进程方案,fibjs是多线程)。opencl(充分利用CPU和GPU的计算能力,像生成CAPTCHA等需求上,用显卡计算要快得多)也是可选项,等LuaIO项目稳定后,我会考虑加入opencl的绑定,会参照webcl的API,当然这个至少是1年之后的事情。如果还不满足计算量,只能加CPU,加机器。

协程,线程,进程,三者要解决的问题是不一样的,把他们放在合适的地方发挥最大效能就是。

就计算效率来讲,java的虚拟机已经是最好的,javascript跟java不是一个量级的,重CPU应用我首选C,这也是我选择lua的原因之一,c和lua绑定非常简单,可以说是最简单的(没有之一),基本上有c基础,两三个小时就能上手,比v8绑定简单得多得多,这也意味着很多c或c++应用可以迅速的移植。

fibjs跟nodejs是没有关系的,代码都是响马自己写的,fibjs只用了v8。LuaIO用了nodejs的异步库libuv。在高性能IO原理上大家都差不多,不同的的就是面向用户的API不同。nodejs底层是callback接口,ES6提供了generator做转换。fibjs和LuaIO是直接在c代码层面将回调用协程包装成同步接口,毕竟写同步代码的程序员远多于写异步代码的,这种转换有的时候还是存在成本的。

@coordcn 但是一门语言的发展 不是那么容易的。语言是要有用户基础 长时间运行 稳定性 开源社区支持 等等。 我不知道你们写fibjs 或者其他的东西仅仅是为了自己爱好,还是想有什么其他的想法。

@wdragon1983

nodejs刚出来的时候也很简陋啊,这个没必要担心的。爱好是首要的,lua也有一定的群众基础,尤其在游戏服务端。fibjs他们自己的项目在用,也吸引了其他贡献者。一个开源项目要想成功,对技术方向的把握肯定要准,方向准了,持续的投入,分享,合作,能不能成,那得看运气了,当然运气也不是我考虑的,我把我想做的事情做好就行了,即便项目失败了,这个过程对技术的积累也是非常有用的。做开源如果太功利了反而不好。lua绑定libuv的不止我一个再做,有个老外做的luvit,他直接用lua替代了v8,nodejs原有的回调问题都没有改变,我认为这样的项目方向就错了,lua提供了协程等基础工具不用,非要学javascirpt把问题搞复杂了,这就是方向上出了问题。luvit的作者技术还是很牛的,一些基础的lua代码,比如原型继承我就是用的luvit的。

我不参与fibjs主要原因是我c++不行,v8也太过复杂,无法驾驭,lua足够精巧,简单,也满足我的要求,lua对我而言就是最好的选择,现在项目还是个人项目,0.1版的发布可能要到新年过后。

另外提一下,除了一些大公司,我了解到的开源项目,异步转同步的基本上都是中国人在做,比较有代表的openresty,fibjs,alilua,luajit.io。其他项目可能更好,可能是我孤陋寡闻,有信息的朋友可以继续分享。我们中国人并不是创新能力不行,而是有的时候不必要的担心太多了,想到了去做就行了,成功失败交给老天爷去定。。。

感觉还好啊

Sent from CNodejs for iOS

@coordcn 中国人的智商本来就是高的,搞技术类的人也多。肯定会有一批nb的人,虽然中国最nb的人不是搞技术的,都是去搞政治了。但是技术还是有一大批人才的。就拿java的应用来说,阿里的团队已经做的很nb了。即使在国际上,也算是一流了。至于开源项目少,主要原因可能一个是 语言的问题,还有中国人本身不习惯分享的私心。 祝愿你的项目能走好。支持开源

@wdragon1983

谢谢。

国内有些团队的确有点那啥,前几天某宝不是来个椅子什么的,基于koa,一顿show结果没代码。没代码,文字吹出花来也不是那个味。不出来宣传还好,宣传了又不开源,不知道是几个意思?或许还没准备好?没准备就不要宣传啊。。。

我对开源的观点是自愿不强制,但要有基本的回馈社区的底线。

基本原则:基础设施开源,具体业务闭源。

尤其是对一些大公司而言,那么大公司,要么别show,要么做贡献,里面难不成都是业务相关代码?或者基础框架和业务没分离?如果是前者,那就没show的必要,如果是后者,那更没show的必要了。。。

国内一些学术项目,美其名曰保护知识产权,不愿意开源,这中间有多少是属于国家机密级别的项目?有也是极少。这中间的项目质量可想而知了,一些大家可以想象的猫腻有多少?国家应该要求非机密项目,研究性项目开源,这样代码在大家眼皮底下,那中拿开源项目改改胡弄的事情要少得多了。从某种意义上讲,开源的氛围决定了一个国家的整体软件水平。

哎,又要得罪人了。。。

回到顶部