吐槽一下我所了解的Node.js
首先是性能,用起来感觉Node.js的性能并没有想象中那么好。内存占用差不多和Ruby一个等级,比Python,PHP要多。计算性能(即CPU使用)上,纯计算并没有太大优势,但因为可以很好地控制异步流程,所以总体表现上来看性能要比PHP好很多。个人觉得Node.js在性能方面是有很大的潜力的,因为有很多大的项目在致力于提高JavaScript虚拟机的性能——比如各大浏览器;同时JavaScript是一个语法简单的语言,也是一个开放标准,不像Python和PHP一样因为顾及兼容性,很难进行大的重构来改善性能。
然后是包管理器和库,Node.js内置了npm,因为npm是个非常好用的包管理器,因为JavaScript的编写门槛低,因为JavaScript本来就有很多优秀的前端库被移植到了后端,所以NPM上的包现在已经多于PyPI和RubyGems了,然后远超PEAR和Composer.Node.js的开发中不同于PHP的一点就是大家都不怕加依赖,每个小需求都去NPM上找已有的库来实现——而且往往都能找到。所以Node.js的开发基本上就是在组合依赖,然后倾向于把一个即使很小的独立需求写成一个库,这倒是和UNIX的思路比较像。再另一方面,Node.js社区对开源十分友好,这里的友好是指大多数的库都是在Github上开放开发的,而且使用的是非常宽松的协议,例如MIT,不像GPL那么具有「攻击性」。
社区,Node.js的应用大部分还是Web后端,而Web后端相关的库基本都是那么几个大牛搞起来的,例如express,jshttp,jade,mocha和koa就是以TJ大神为首的四五个人开发起来的,这倒是个有趣的现象。——虽然TJ大神最后决定淡出Node.js社区。
工具链,Node.js比较年轻,很多好用的工具都是近两年刚刚出现的,例如预编译方言,单元测试和模拟测试,构建工具等;不敢说有多好,但是要比PHP好非常多。至于原因,首先很大程度是因为这些库都是既可用于前端又可用于后端的,因为Web前端的硬需求,让Node.js顺便得益;然后就是因为JavaScript灵活而简单的语法,让这些工具可以以一些非常巧妙而优雅的方式来实现。至于IDE,依然得益于Web前端,还是有一些IDE可用的——虽然JavaScript语言本身不是很利于静态分析。
语法,我还要再强调一下JavaScript的语法简单而灵活,其中重要的一点是JSON,JSON几乎是目前Web领域最通用的数据格式,而在JavaScript对JSON具有原生的支持!JavaScript中所有的数据结构都是围绕着JSON的一个超集——Object展开的,包括数组,函数,对象和类。当然这样也带来一个麻烦,就是因为写起来限制少,导致不知道该怎么写,刚开始学习的时候总免不了反复重构,才能摸清各种设计模式在不同情况下的优劣,找到适合自己和适合具体项目的写法,所以可以说Node.js入门简单,但要构建大型项目,还是比较考验开发者的功力的。因为历史遗留问题,JavaScript的语法算不上优美,不过还好我们有各种预编译方言,比如CoffeeScript,TypeScript,Dart,LiveScript以及ClojureScript,总有一款适合你。
使用场景,JavaScript是一个通用的编程语言,Web前后端自然不必说,来看看其他方面。个人以为Node.js还是很适合用来编写服务器工具的,或称运维工具,因为运维中很多情况是可以异步工作的,JavaScript又有比较不错的正则支持,替代bash和Python也问题不大;Node.js只需装好解释器,就可以随便用,不用畏手畏脚地避免引入依赖。而桌面和移动设备编程,Node.js有node-webkit以及其他各种外壳,虽然目前使用体验不是很好,但是可以非常显著地降低开发成本,轻松跨平台,想必前途也是光明的。
最后说学习Node.js,在我看来,学习Node.js分两点,一是要理清Node.js的「基于事件回调的异步IO」,这是Node.js与其他主流编程语言最不同的一点。然后第二步就是把NPM上Top100的库都看一下,不用细看,只要混个脸熟,知道每个库是干嘛的就行了。完成这两步,那么恭喜你,已经是一个Node.js开发者了。