为nodejs辩护,3点证明他是一个好语言

近日使用nodejs开发的网站越来越多,来自各界的反面批评之声也是此起彼伏,我想只是因为不了解,其实他绝对有能力和实力与PHP等语言PK。亲们都知道nodejs只是一个解释器,用来在服务端运行遵守标准的JS代码,本文就从以下5点加历史佐证证明,JS不管在前端后端,都是一个好语言。

先来一段历史:亲们都很清楚,JS是被创造用来在浏览器端运行的语言,也正是要在客户端运行,标准统一问题是最大的难题,当初netscape和IE都向ECMA协会提交了自己的javascript,最终由于netscape的JS更中性,被接受成为ECMAscript-262。。。

1、不同于一般的JS代码 
到2009年时,一群反人类的程序员依据多个开源产品和标准协议创建了nodejs,nodejs包括很多开源项目:V8,commonjs等等,这里我只把commonjs拿出来说,很多不了解nodejs的人认为JS只是一个前端语言,其实不然,ECMA官方并没有把JS定义为前端语言(也就是没有说JS是专门用来实现效果的),甚至没有为JS定义代码风格和使用领域,正是因为这样,JS变成了一个“臃肿”的语言,JS同时也具有了像PHP,PYTHON这样强大的能力,nodejs开发者正是认识到了这一点,但是也有了很多问题,比如javascript不支持模块化(最新的第六版已经支持了),没有像require这样基本的函数,没有一个完整的代码风格标准。很幸运的是,目前已经有一些这样的标准了,即commonjs和AMD,可以说他们是两大对立的标准,虽然AMD衍生自commonjs,AMD是异步模块加载机制,他是异步的,也就是说,如果某一个模块因为开发者的错误而卡死之后,JS引擎会跳过他继续往下加载,就是说他更适合在前端运行,于是乎一群类似jQuery的库遵守了AMD标准,但是服务则不同,如果某一个模块没被加载到,很可能整个网站就运行不了了,同时也因为commomjs还定义了很多桌面程序API,并且追随者更多,显然commomjs比起前端的js更适合服务器环境,但必须注意的是API和IO都是异步的,于是……(但是问题也来了,如果某个模块挂了,会拖垮整个服务器)

2、更高的跨平台性 
首先,不管是什么什么标准的JS,终究都是JS,所以,只要简单的修改几处就可以在任何平台下运行(必须要说的是commonjs比较简单,很容易遵守),甚至是从客户端横跨到服务端,我的意思也很明白,就是说,即使不用nodejs,也可以让JS运行在服务器,即使是为nodejs写的代码,也一样可以运行在客户端,不要问我怎么做,这样的JS框架不止一个,很多前端也会nodejs,前端那些遵守commmonjs的库也可以被用在nodejs上

3、更快的运行速度(不计数据库和复杂业务逻辑) 
本节数据均为本人亲测 
先说说环境,本人4核宏碁超极本,本来是win8.1,这次测PHP和nodejs,为了性能考虑,特使用ubuntu13.10核心版测试,PHP5.5 nodejs0.10.20 均开启4个进程,内存8G,为了保证公平,为nodejs使用了一些第三方类库(包括multi-node等提高性能的)同时我运行nodejs时要求其使用多核CPU,必须说明的是,nodejs通过更改连接连接到服务器的方式。每个连接都创建一个进程,该进程不需要配套内存块,而不是为每个连接生成一个新的OS线程(并向其分配一些配套内存)。这点和PHP类似,因为并发和IO是很重要的部分,就只测这些了,结果是他们响应请求的平均时间 
代码就不贴了,每秒100次请求,持续10秒,每次读文件,生成一个100位数字随机数,随意生成另外一个文件,写入这个随机数,然后返回这个数到客户端,结果: 
PHP 58毫秒 
nodejs平均 43毫秒 
从上不难看出,在IO和并发方面,nodejs略胜一筹,但这是不准确的,实际运行的网站业务十分复杂,还会有大量SQL请求,在并发量惊人的网站上,结果也不会是这样

以上的所有评论都是我看到很多nodejs反对者一时冲动写出来的。。。。我只是想说,不要因为nodejs的年轻和不完善就去批判他,这就像是因为一个大人做错事去骂一个小孩子,我希望我的文章都是比较中性的,所以现在反过来审视nodejs,其实不完善的地方也不止一点点,这里列出我认为他不适合大型网站开发的地方和我喜欢他的地方

我喜欢的地方 
1、事件式编程,利用js事件轻松实现异步运行,网上有个例子我觉得比较贴切,

举一个业务场景为例:家庭主妇在家中准备中餐,她需要完成两道菜,一道拌黄瓜,一道西红柿蛋汤。以PHP为例,家庭主妇会先做完拌黄瓜,接着完成西红柿蛋汤,是以顺序/串行执行的。但是现在突然出了一点意外,凉拌黄瓜需要的酱油用光了,需要她儿子出门帮她买酱油回来。那么PHP家庭主妇在叫她儿子出门打酱油的这段时间都是属于等待状态的,直到酱油买回来,才会继续下一道菜的制作。那么,在NodeJS的家庭主妇又会是怎样一个场景呢,很明显,在等待儿子打酱油回来的时间里,她可以暂停凉拌黄瓜的制作(这里我要补充如果卡死了,nodejs还是会拖垮整个服务器的),而直接进行西红柿蛋汤的过程,儿子打完酱油回来,继续完成她的凉拌黄瓜。没有浪费掉等待的时间。

2、快的多的IO和并发速度,亲们也应该知道,nodejs处理这些个速度很快,twitter使用它代替ruby来处理每秒上千条tweets。Node在这里的角色是迅速收集tweet并将这个信息传递给另一个负责写入的进程。想象一下另一种设计 — 一个常规 PHP 服务器自己试图处理对数据库的写入 — 每个tweet将在写入数据库时导致一个短暂的延迟,这是因为数据库调用正在阻塞通道。由于数据库延迟,一台这样设计的机器每秒可能只能处理2000条入站tweets。每秒100万条tweets需要500个服务器。相反,Node能处理每个连接而不会阻塞通道,从而能捕获尽可能多的tweets。一个能处理50,000 条tweets的Node机器只需要20个服务器。

3、简单快捷,这是相对前端开发者来说的,的确,这一段时间学习nodejs以来,确实没有学习其他语言那种困难,只是需要预先学习commonjs,最好还要有服务端编程经验。

我不喜欢的地方 
1、不完整的服务器,nodejs自带一个非常简单的web服务器,很可惜实际使用不可能使用它,但是nodejs官方也没有提供驱动程序以让apache和nginx使用它,于是乎只能用一些第三方组件,用类似fastcgi的第三方插件运行它,好吧,不能怪他,用别人的话说,nodejs是个没准备好的web程序

2、深度嵌套回调问题,这个问题我不想多讲,虽然有不少解决方案,但我觉得都不完美

3、每次有个新用户就会创建一个新进程,但是如果不用第三方扩展,他们只能使用单一CPU,但是,当创建了这些进程后,不会马上结束生命周期,这就有可能导致内存泄露,和PHP的线程安全模式不同的是,nodejs进程通常只服务于一个用户,不会像PHP的线程安全模式那样等待下一个用户


以上只是我的个人评论,nodejs只是一个套件包,语言还是JS,请不要把对JS的讨厌施加到nodejs上,PHP能做的JS都能做,nodejs的JS标准也不是常见的前端JS标准(现在大多数前端都有自己的标准,不过也有很多人遵守AMD标准),希望大家中性的看待新生事物

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值