转载:为什么反对Node?
发布于 8 年前 作者 sunfeng90 5718 次浏览 来自 分享

今天看到一个关于反对Node的帖子,和大家分享一下。高手和管理员勿喷,谢谢。看完呵呵就可以了。帖子链接: http://my.oschina.net/CandyDesire/blog/499923

20 回复

看到java是编译执行,我哭了……

好像很老的一篇文章了…

@Chunlin-Li 哈哈。。。算我out了

文章没讲到点上,nodejs坚持纯异步的思维模式才是致命的,还好ES6之后改变了。

用形式同步代码写实质异步的程序才是出路,nodejs还有很大的发展潜力,但决定nodejs命运的不是它自己,而是javascript标准的发展。

跟java比还可以讲异步优势,跟go,lua等语言比,异步编程模型差距太大了,说nodejs现在是小学生都不为过,这就是当初坚持回调异步造的孽,ES6硬生生的被JS标准打脸,还搞出了政变,逼宫的闹剧。

要看看其他语言有没有能和npm相比的?

@coordcn servlet 3.0在2012年开始就支持异步了,所以说这就是个围城,node往同步上走,其他语言往异步上走

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.AsyncContext;
import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * @author admin
 *
 */
@WebServlet(urlPatterns="/demo", asyncSupported=true)
public class AsynServlet extends HttpServlet {
	private static final long serialVersionUID = -8016328059808092454L;
	
	/* (non-Javadoc)
	 * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		  	resp.setContentType("text/html;charset=UTF-8");
	        PrintWriter out = resp.getWriter();
	        out.println("进入Servlet的时间:" + new Date() + ".");
	        out.flush();

	        //在子线程中执行业务调用,并由其负责输出响应,主线程退出
	        final AsyncContext ctx = req.startAsync();
	        ctx.setTimeout(200000);
	        new Work(ctx).start();
	        out.println("结束Servlet的时间:" + new Date() + ".");
	        out.flush();
	}
}

class Work extends Thread{
	private AsyncContext context;
	
	public Work(AsyncContext context){
		this.context = context;
	}
	@Override
	public void run() {
		try {
			Thread.sleep(2000);//让线程休眠2s钟模拟超时操作
			PrintWriter wirter = context.getResponse().getWriter();			
			wirter.write("延迟输出");
			wirter.flush();
			context.complete();
		} catch (InterruptedException e) {
			
		} catch (IOException e) {
			
		}
	}
}

@i5ting 只要是支持函数指针的语言就天然支持回调异步,所以并不存在所谓其他语言往异步上走的说法,异步大家都是支持的,其他语言的异步库你应该比我更清楚。我们的操作系统大部分用c写的,它们无时无刻不在异步。

nodejs比这些语言进步的地方在于ndoejs实现了全过程异步。

其他语言原来的模型(其他语言如c这个时期已经在探索全过程异步,但c语言实现基于回调的异步难,面对复杂的业务逻辑,层层回调,调试编码更难)

client —async–server----sync—db

这个过程就是当初ndoejs创始人要追求纯粹异步的原因,client与server通信异步了,但server与db通信还是同步的。

nodejs

client —async–server----async—db

nodejs解决了服务器内部的异步问题,而且js语言的特性使得它实现回调异步十分简单方便,再加上V8的光环,天才的npm,还有曾经处于鄙视链最底层的痛苦,前端大牛起来造反是必然的。nodejs成功也是必然的。

但是事情发展到现在,nodejs已经不是造反派了,反而成了守旧派,从nodejs阵营的短暂分裂就可以看出,有的人反对ndoejs使用更高级的语言特性,分裂,逼宫是必然的。还好nodejs顺应了潮流,这个潮流就是异步已经不是回调异步的天下,很多其他语言,如go,lua都在朝形式同步,实质异步发展,其他语言的编程模型已经超过了ndoejs,性能上也拉开了距离。现在还有谁说nodejs的性能如何如何?现在主要说的就是npm,就是生态,但生态这个东西是建立在nodejs的编程模型和性能优势的基础上的,没了基础,皮之不存,毛将焉附?

所以我认为nodejs不要总是去跟java,c#比,而是要跟新兴的语言和框架比,只有这样nodejs才能发展得更好。生态繁荣的基础是提供生态发展的土壤肥沃,如果没有这个基础,当别的语言在用同步代码编写异步程序的时候,ndoejs还在为async/await沾沾自喜,甚至还在固守promise,generator/yield,原来前端我不敢说(他们毕竟有信仰和尊严需要维护),但从后端转过来的,肯定会用脚投票。go,lua对他们而言都不是事。

其他语言module是怎么做的?为何es6就实现不了呢?npm不是天才,是noder最开放的表现。比什么呢?当然是比人了。什么javar,c++er,知道什么是分享吗?

现在nodejs能拿出来说的就剩下生态了,如果生态也没有了,就真的什么都没有了  renkou.jpg

@yakczh

现在nodejs能拿出来说的就剩下生态了。

就剩下生态了,在生态为王的年代,就这点还不够吗(看看android 和windows phone就知道了)? JavaScript 就语言本身,槽点多的都不想吐了(当然也在努力发展),这个已经是公认的,但就语言本质来说,语言的本质来说是什么呢,是沟通对吧? JavaScript 用在谁和谁的沟通呢?browser 2 server。现在有更好的语言替代javaScript 吗?至少若干年还不会有吧。 当然现在写纯server 端的选择很多,这个不是很好吗? browser 端现在就是没的选择了,而全栈Nodejs 你值得拥有(这个也是归于生态不是么?)。

@yuu2lee4 我跟fibjs没有半毛钱关系,如果要我推荐,我觉得大家应该去了解下,go,openresty,fibjs的思想也可以了解下。有了对比,你自然就能明白nodejs的异步现在是多么的低级,和别的语言的差距有多大…

在易用性面前,信仰和尊严都是不值钱的,如果nodejs和js还是这么故步自封,自我陶醉,两三年后再来看,我倒是希望被打脸的人是我。

编程语言永远在进化,兵器用着称手就行

我们都是觉得nodejs趁手,觉得不好就找好的去。

每次围观各位大神撕逼都能学到好多

是啊,大神们好牛逼!反正我暂时是用NodeJS+MongoDB+RestfulAPI给移动终端写写接口。

node又不是银弹

@idreamshen 确实啊。每个技术都有其产生的理由,也有其适合的场景。不能愚昧的说哪个语言或者技术最牛逼(很多半吊子都这么说过),最好。

@coordcn 非常支持你这种打着反对派旗号无忧无虑,能够审慎对待node,增加社区活跃量的大神 哈哈~

这不是反对Node的帖子,虽然标题很“诱人”,只是客观分析了一下而已,没人叫你用Node做所有的事情(当然也有人全上Node,比如空弦科技,没有以前的包袱)

回到顶部