和 node的nodejs 优势劣势 (为什么 创业公司 选择的不

关于Node.js不得不说的事儿 - 为程序员服务
关于Node.js不得不说的事儿
Node.js自从诞生之后就引起了广大web前端开发同学的关注,且很快成为开源分享站点github.com最热门的话题之一。同时国内越来越多的技术沙龙里出现Node.js的身影,也有越来越多的团队开始在生产系统上使用Node.js。但正如《人月神话》作者所说的一样”No Silver Bullet”,软件开发没有银弹,适当的技术适当做适当的事情。下面我们来看下Node.js于我们来说应该持怎样的态度。
Node.js到底是什么?
Node.js不是一个新的开发语言,而是开发语言(JavaScript)的一个运行环境。通俗的说就是原来只是跑在浏览器里的JavaScript可以跑在你的PC,你的Mac,甚至你的Web服务器上了。
Node.js官网()对其介绍足够简单明了:
Node.js是基于Chrome的JS运行环境,用来方便地构建高效的、可扩展的网络应用。由于采用事件驱动和无阻塞模型,使得Node.js对跨平台的资源密集型实时应用有更轻量、高效和完美的支持。
但是如果单单是把JavaScript运行环境(Chrome V8引擎)放到Windows或Linux平台其实是没有太大意义的,因为JavaScript在浏览器里的部分魅力在于DOM,BOM操作。同时Javascript在浏览器上的发挥严重受限于跨域,安全,本地限制等各种约束。Node.js提供的环境刚刚相反,减掉DOM和BOM等支持,增加了文件系统、进程管理、事件驱动(类似DOM上的)、util工具集和HTTP服务等各种强大的功能。于是,Node.js具备了其他开发语言所具备的能力。被困在浏览器里的这头野兽,被放养了。
哪些人在用Node.js?
一类是生产系统,直接或间接的面向互联网用户的,举例如下:
长链接聊天服务
整站Node.js开发+Express框架
Node.js做MySQL中间层
淘宝指数、数据魔方等及中间层
虚拟机服务
一类是工具集,提升研发效率和方法:这个就不胜枚举了。可以毫不夸张的说,几乎所有的称得上名字的互联网公司都有在使用。
Node.js优势和劣势
下面主要从语言的特点,开发的成本,功能特点的一些角度来简单做一个划分:
异步的I/O模型
这个应该是Node.js做生产系统最大的优势,也是官方主打的特性。在实时聊天、IO密集、服务(数据库)调用阻塞等问题上,JS的异步模式有天然优势。举例:
JavaScript代码
JavaScript本身语言入门门槛低,且在互联网时代下有大量的web前端开发同学(熟练使用JavaScript、熟悉其语言特性,同时这批同学对HTTP协议有着深入的理解),他们不需要学习新的语言即可以涉猎server开发。这使得新兴创业公司及一些前端相对强势的大公司,在生产系统上都有了不俗的表现。
活跃的社区、群体和模块化能力
Node.js社区在以疯狂的速度发展,github上的项目也层出不穷。使用Node.js的都是具备一定产品意识和外向性格的群里,这使得基于Node.js的新的idea在媒体上屡屡曝光。Node.js提供了非常便利的模块管理模式(npm工具),大大降低了模块耦合的成本。同时,基于node.js的工具模块在跨平台web前端开发过程中,体现出了绝大的价值。比如:grunt代码整合,前端代码预编译等。
当然我们也要看到Node.js的劣势和问题所在:
稳定性上有所欠缺
毕竟,Node.js是新生产物,在它赶超其他热门语言的过程需要时间和成长。目前最让人头痛的一个问题是,Node.js在升级过程中,经常会导致开发者基于老版本开发的代码无法直接使用。这个是在pomleo(网易游戏开发框架)和朋友网长链接聊天server研发过程中都遇到过的问题。(当然可以通过不升级和适配的方式解决)
不太适合敏捷web开发或大型复杂web开发
如果你或你的团队熟悉php,java等web开发语言,那么不建议使用Node.js作为项目开发首选。比如我们内部的管理系统,敏捷开发调试会选择php;海量的生产系统会选择C++。这里举一个很简单的例子。php和node.js的hello world。
Node.js代码
这个看上去还好,但是当你需要对一个静态资源进行cache的时候,php或java等依赖web server的可以默认实现且简单配置可以处理,但是对于node.js就惨了。你需要逐条编写代码实现HTTP协议上的功能,重复造轮子。Node.js的开发成本除了语言特性上的便捷以外,其他逻辑开发和C/C++几乎是一样的。代码如下:
这搞起来是不是很蛋疼。当然也有一些解决方案,比如使用express等框架,但是这里问题还是会存在。毕竟Node.js还在成长,对于很多问题可能都还没有人解决,那么就需要使用Node.js对基础应用和网络知识有较深入的理解,且对研发效率有所影响。
好了,上面两个劣势已经使得我们在选型过程中需要足够的慎重,但是也不能因噎废食嘛。
我们如何看待Node.js
我个人的理解是:在大工具时代下,Node.js为前端开发同学插上了创造力的翅膀。
首先是在轻逻辑,长链接场景下,我们对Node.js可以更为开放,基于socket.io可以在半天内,实现一个10w+级别同时在线的聊天系统(其性能不低于C/C++,且扩展性远高于C/C++)。
其次,在web研发流程中,Node.js扮演这重要的工具化、自动化的角色。比如:less.js,grunt.js,mocha,zombie.js。Node.js在全球的互联网行业工具化过程中,已经扮演了潮流的引导者的角色。我们在保持学习的同时,需要不断的思考和实践,日常的研发过程中那些手工行为、人为检查甚至是效率不高的开发模式是可以用Node.js来工具化和自动化的。
这个也是为什么要写这篇文章的目的,希望在工具化和自动化的道路上,再给大家打一针强心剂。
关于Node.js不得不说的
Node.js的模块管理器,有了它你就可以一行命令下载所有node.js的模块或基于node.js的工具。Eg: npm install express,一下帮你搞定。
Node.js的多版本管理器。之前提到了Node.js版本更新很快,且是版本升级不兼容旧的API,那么同一台机器不同项目可能存在多个Node.js版本。那么这个神奇可以帮你一条命令解决问题。
使用npm install n -g就可以(可惜暂时不支持windows =。=!,不过微软已经官方支持node.js了,相信支持的日子不远了)。用法:n use 0.10.5
首先是node debug 这个跟gdb的单步调试模式差不多。
其次是通过webstorm等工具进行远程调试,但本地需要保存代码且服务器开端口
然后是node-inspector调试,这货跟我们weire的模式是一样的,在页面里模拟chrome debug工具。
Node.js不是第一个尝试将JavaScript放在浏览器之外的地方运行。早在JS诞生的时候网景公司就这么干过,可是后来没有流行。直到近几年JS引擎的强大导致JS又重新流行起来。群空间用过的rhino工具支持的RingoJS也是类似的思路。如果当年统一JS而诞生的ECMAScript规范一样,CommonJS为浏览器外的JS标准而诞生。这块大家可以百度了解下~
做一个有思想的互联网人
原文地址:, 感谢原作者分享。
您可能感兴趣的代码开始使用node.js
服务器君一共花费了210.656 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议
node.js是由Ryan Dahl编写的服务器端js framework,其初衷是为了编写更为高效的web服务器。它的亮点在于:
使用当前最快的google v8 js engine
单线程。因为不需要考虑并发,所以也就没有了锁和阻塞的概念,大大简化编程。
事件回调模型。所有的异步操作,比如数据库访问都是通过事件触发的。
完全发挥javascript作为动态解释语言的强大威力。开发人员可以自由的使用一切特性比如closure,并且不需要担心跨浏览器支持(因为是服务端)。
你可能会问单线程怎么处理多用户请求呢?事实上Ryan观察到web访问的一个事实:每次web请求服务周期最耗费时间的往往是IO操作,包括读写文件、数据库操作、开启网络连接访问某个rest api等等。真正web server内部的运算只占很小的比例。比如浏览器访问一个页面,几乎大部分时间都花在IO的读写上了,从读文件一直到向socket写数据,花在页面后端代码的计算量则微乎其微。
举个不很恰当的例子来说明单线程和回调的作用。假设web server是一个银行,每个浏览器的访问相当于客户去窗口取一笔钱。客户在某个窗口办理业务相当于服务器从本地硬盘读写文件。这个操作会花很长时间(相信大家深有体会),由于窗口数有限所以需要一个排队叫号系统就是我们的nodejs线程(相当于apache不过是单线程的)。当窗口有空时营业员就通知排号系统请叫下一位,但是喇叭一次只播放一个叫号的声音,所以所有通知都存放在了一个事件队列中,排号系统报完一个号再处理下一个直到队列空为止,然后就处于idle状态。如果把叫号类比后端代码执行(如.aspx的页面生命周期),他的速度要比处理银行业务快的多,所以只需要一个喇叭就足够了。由于没有多线程的切换消耗,所有计算都作用在了实际的计算上从而提高了处理量。
& 。 作者Ryan亲自讲述node.js的开发哲学,和一些并发问题的探讨。
实验证明nodejs有着相当不错的速度和并发能力,据说是apache的40倍。&
关于安装请参考:& 。推荐在linux系统下安装。windows安装请看。介绍如何将nodejs做成windows service
javascript单线程的
v8快的邪门的
nodejs是一个遵循的框架和基础设施,相当于jdk和.net framework。它当然可以胜任web以外的其他编程,比如IO。不过最大的亮点还是web编程。
已经有大量的nodejs插件。比如类似ror的mvc框架,支持多种template engines,比较受欢迎的有ejs,jade和haml(nodejs是非常底层的它甚至不封装session和cookie,都留给插件去完成)。
淘宝工程师发起的
接下来介绍如何用不到40行编写一个显示最新sina微博的server app(假设你已经对js和事件模型非常熟悉)。
首先我们需要导入一些库文件,相当于java的import和.net的using。
var http=require('http'),
tweets = null,
template =
&em>@user.screen_name&/em>
&img src="@user.profile_image_url" />
&span>@text&/span>
http是nodejs提供的类库。tweets是最新一次提取的sina微博的JSON对象,初始化为null。格式请参考sina api的Statuses/public timeline。
template是我们每行微博的格式包括:名字,头像和内容。@user.screen_name其实是JSON对象的访问路径,下面会介绍如何使用这个trick。
接下来我们设置一个每5秒执行一次的程序,从sina那里访问最新的微博。
(function(){
http.createClient(80, 'api.t.sina.com.cn')
.request('GET', '/statuses/public_timeline.json?source=', {'host': 'api.t.sina.com.cn'})
.addListener('response', function(response){
var result = ''
response.addListener('data',function(data){
result += data
.addListener('end',function(){
tweets = JSON.parse(result)
setTimeout(arguments.callee, 5000)
这里用匿名方法定义后马上调用,在结束后setTimeout5秒钟再调用自己一次,也可以用setInterval实现,推荐这种方式。
http.createClient创建web client对象用来访问sina的rest api,紧接着调用request生成一个clientrequest对象。之后通过对自己的级联操作添加事件和发起访问,类似jquery的chaining风格。
注意httpClient.response是一个异步事件,通知nodejs微博访问有反应了请处理。从IO读取数据又是事件风格的。data事件是每次读取的批量数据,如果数据量很大会分几次读完。end事件说明全部返回的json都读取完毕,我们就可以将其解析成对象,用到了JSON.parse。
最后需要编写监听端口的服务器,用来处理每次http请求。
http.createServer(function(req,res){
res.writeHeader(200, {'Content-Type':'text/ charset=utf-8'})
res.write('&!docytype html>&html>&body>')
if(tweets && tweets.length){
for(var i = 0; i&tweets. i++){
var itm = template.replace(/@([w.]+)/g, function(){ return eval('tweets[i].'+arguments[1]) })
res.write(itm)
res.end('&/body>&/html>')
}).listen(8080)
对就是这么简单。http.createServer创建一个web server对象并监听8080端口。然后又是事件响应,每当有访问,就调用方法生成最终的html,其中传入了req和res(封装了'请求'和'响应'的逻辑)
由于不需要处理什么form或者cookie,request对象几乎没有用武之地。返回响应头200和格式编码。然后是html头。
如果tweets存在,根据之前定义的模板显示每一条微博。这里用到eval来访问json对象,模板中@之后的内容就是对象的路径,拼接以后形如tweets[i].screen_name。最后关闭html结束http response。
结束语:现在迅猛增加的node.js插件证明了它的成功,相信随着更好的调试器和monitoring的出现,nodejs会在web app领域占据重要的位置。相比ruby他速度更快,相比c#,javascript更灵活,并且可以和网页javascript有很好的互动。
本文地址:,欢迎访问原出处。
不打个分吗?
转载随意,但请带上本文地址:
如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 。
大家都在看
阅读一百本计算机著作吧,少年
弗里曼 (作者), 等 (作者)
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton,Command、Adapter、Facade、TemplateMethod、Iterator、Composite、State、Proxy。最后三章比较特别。第12章介绍如何将两个以上的设计模式结合起来成为新的设计模式(例如著名的MVC模式),作者称其为复合设计模式(这是作者自创的名称,并非四人组的标准名词)。
扫一扫,在手机上阅读
栏目最新博文
31,030 views
21,020 views
18,261 views
16,051 views
15,631 views
13,729 views
20,251 views
14,845 views
14,440 views
14,802 views
栏目博文推荐
9,026 views
6,105 views
31,030 views
4,616 views
8,853 views
3,951 views
6,918 views
7,458 views
4,938 views
6,095 views
播种一种思想,收获一种行为;播种一种行为,收获一种习惯;播种一种习惯,收获一种品格;播种一种品格,收获一种命运。
关于网站与作者
互联网信息太多太杂,各互联网公司不断推送娱乐花边新闻,SNS,微博不断转移我们的注意力。但是,我们的时间和精力却是有限的。这里是互联网浩瀚的海洋中的一座宁静与美丽的小岛,供开发者歇息与静心潜心修炼(愿景)。
“Veda”的本义是知识、启示,希望这里能为开发者提供充足的技术资料。
我的电子邮件gonnsai(at)163.com,腾讯微博:,欢迎与我联系。Node.js 未来会超越 Java 吗?- 百度派
{{ mainData.uname }}
:{{ mainData.content }}
{{ prevData.uname }}
:{{ prevData.content }}
{{ mainData.uname }}
:{{ mainData.content }}
0 || contentType !== 1" class="separate-line">
:{{ item.content }}
Java 虚拟机(JVM)
Node.js 未来会超越 Java 吗?
问题说明(可选):
扫一扫分享到微信
Node.js前几年一直被热捧,因为它前后台同语言,可以节约开发资源,以其高性能著称。但是要说超越Java,我并不认同。Node.js在很多方面还是存在一定的劣势,而Java正好能弥补这些不足。首先Node.js火起来主...
Node.js前几年一直被热捧,因为它前后台同语言,可以节约开发资源,以其高性能著称。但是要说超越Java,我并不认同。Node.js在很多方面还是存在一定的劣势,而Java正好能弥补这些不足。首先Node.js火起来主要是由于有很多创业公司的出现,Node.js比较适合中小系统的开发,深受创业公司的热捧,因为他们人手不多,前后端语言统一,可以提高效率。而对于一些大型公司,由于基本架构的问题,如果使用Node.js进行改写,成本会很高。此外,Node.js包的质量和Java相比还存在一定差距。还需要开发者的逐步改善。但总体来看Node.js这个平台还是很优秀的,对于新用户来说比较容易搭建工作环境。但是它始终是一个单线程的执行环境对于多核的优势无法充分发挥。Java毕竟是更为传统,对于现有的参考项目和相关的人员来说准备比较充分,Node.js属于新事物,相关方面会比较欠缺。但是由于它可以加快开发进度以及适合实时应用程序开发等特征,属于异军突起,也受到很多追捧。当然一个稍微大点的系统都不是一个开发语言可以搞定的。Node.js虽然可以很快的在服务器端做原型,并且性能还很高,而且代码量相对Java来说少很多,但是Node.js在做密集型处理的工作时不能直接解决问题。所以,我认为这二者的竞争并不明显,也不会有谁被取代,至于说超越,只能说各自的突出的领域不同吧。
扫一扫分享到微信
Node.js 未来会超越 Java 吗?
,才能进行回答
一个问题只能回答一次,请&nbsp点击此处&nbsp查看你的答案
2人关注了此问题}

我要回帖

更多关于 nodejs的优势 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信