请停止Node.js在企业应用中争斗

这是来自Dave Banister的博文Blog,将反对NodeJS在企业中应用的陈旧观点逐一批驳,这篇文章主要是针对微软阵营的程序员。摘要如下,原文请点按标题:

1995年大约有40万人在互联网上,但到2011年有近45亿。电脑已经变得如此之快,我的手机比我的第一个网站服务器有更强的处理能力。互联网连接提高了这么多,购买任何媒体的拷贝(如电影光盘)似乎比较愚蠢。 Web服务现在已经是一个商业化网站必要的功能。弹性计算使得扩展缩放变得如此精妙。

随着这些变化,网络的发展已经转移。每次技术换挡,基础客户端技术必须适应,而我们现在正处于这样一个换档节点,这迫使大多数应用程序的功能转移到浏览器中,这不是可能不可能的问题,如果你想跟上竞争,应该认为这是必要的。

在JavaScript过去的二十年中,JS框架、工具和模式不断在进化和发展。JavaScript从一个只有必要时才使用的可以被亵渎的语言已经演变到Web开发中的一个完全充满活力的一等公民。

随着Node.js近年来的兴起,在服务器端使用JavaScript似乎是一个很大的阻力,甚至更多的阻力来自Node.js自身。在我看来,这种阻力是基于不同程度的误解,很多都是一些古老的观点。在这篇文章中,我打算展示所有的反对在企业中使用Node.js的主要论点。

我不是一个JavaScript开发。我是一名软件开发人员。 JavaScript不是我所选择的语言,我在合适的地方会使用它,就像所有其他的语言一样。我完全熟悉主流的SQL,当我编写C/ C + +代码的时候。net走入了我的世界,我甚至使用一些内联汇编,使用新的CPU指令只是为了好玩。我已经涉足ObjectC和Java原生移动应用程序,我想我可能是享受喜欢编写正则表达式唯一的人。重要的是要明白,我不是一些JavaScript传道者那样挂羊头卖狗肉。我只是基于近20年的开发经验看到Node.JS在构建Web应用程序上的价值。

误解:为什么我们要使用其他服务器?
首先, Node.js不是一个服务器。这是一个阻止在在企业中应用的根本误解。我用Node.js的每一天中,我很少将它作为一个服务器使用。没有JavaScript的提示prompt是无法运行NodeJS的,该提示prompt可以基于另一个shell的系统上。

将Node.js作为外壳shell,shell脚本其实提供了Node.js究竟是什么的更好的解释。我觉得Node.js的脚本更象bash或PowerShell脚本。如果使用这些脚本启动起来一个Web服务器,那么这个脚本就是一个Web服务器。

我们将NodeJS看成脚本而不是服务器有不少优点。是什么让Node.js成为比其他的shell更好的替代?是NPM。NPM包管理器可以让我在拉包,几乎无所不能。这些模块包括数据访问库,编译器,服务器,以及其他一切。

其次, Node.js并不仅限于HTTP / S 它有TCP和UDP支持。人们已经建立了如DNS和SMTP服务器等一些疯狂的事情。这很重要,因为我不再去关心任何人在使用IIS实施DNS服务器。只有这种级别的灵活性才能创造这么多的选择,这是当前其他企业服务器的选择无法比拟的。

第三, 带有IS插件Node.js是一个平台。开箱即用, Node.js包含HTTP监听者 ,但它不包含一个真正的服务器。这让开发人员编写自己的服务器,或者使用NPM来拉一把。在Node.js上一切工作方式相同。 Node.js所提供的简约API提供了构建几乎任何东西的工具。在巨大的包库中提供了几乎所有的东西的实现。

误解:JS真的不像一个真正语言
avaScript已经长大了。在ECMA 6规范包括类,接口,和所有通常流行的面向对象语言相关的好东西。这些功能虽然是未来,但在此期间,TypeScript 已经提供了这些功能在编译时的检查。即使没有这些功能, JavaScript开发人员都使用原型继承。 JavaScript支持单元测试,依赖注入,错误处理,以及所有的其他企业真正关心的功能。

....

误解:JS不能进行编译检查

JavaScript并没有一个编译器,所有不会进行错误检查,但是静态代码分析和单元测试是验证你的代码更好的手段((banq注:IDE等提供了静态代码分析,如Sublime)。
)

静态代码分析应该弥补JavaScript基于语法编译时的错误;单元测试弥补JavaScript基于代码中的错误测试。如果你认为编译器输出仍然是重要的,TypeScript的编译器应该给你这些需求。

误解:NodeJS是单线程
Node.js使用C编写的libuv为I/O管理自己的线程,包括网络 文件系统等,libuv 必要时会为I/O创建一个线程池,V*事件循环是另外一个单独的线程,专门处于队列中事件,这些事件数据映射到JS的可执行函数,这就是Node.JS的异步I/O原理。

这个对于每个处理进程的单个V8事件循环,意味着Node.JS提供一个集群的API,允许主Node.js进程生成子进程,这个集群API也能用于跨进程通讯,每个进程都接受它自己的 V8事件循环,也就是拥有自己的javaScript线程,这就是传统多线程能够在Node.JS中实现原理。

Node.js有可扩展模块可以实现本地原生代码。原生代码可以生成线程。已经有模块提供产生的后台和工作线程。

现在一个现代Web应用程序中,大多数的正常请求的时间都花在等待一个数据库调用、REST API请求或文件操作的完成。异步I / O采用通过发出一个外部呼叫的不同方法,当调用完成,它就会被扔进事件循环。主线程就不会处于永远等待。传统的多线程技术有额外消耗,比如内存或上下文切换等。异步I / O的方式是如此引人注目,异步和等待的关键字将被引入到C# NET 4.5,异步控制器将引入在ASP.NET MVC 4中。

这里是Uber从传统的LAMP堆栈切换到Node.JS的Uber报告,能看跨多核扩展集群,也能够通过基于云的弹性计算扩展。

完,其他一些不重要的误解可参考原文。