1.为什么要开始用nodejs, 而不是php

理由有三点:

  1. 因为我是前端程序员出身,nodejs都是用javascript写的,这样相当于前端和后端都使用javascript,开发更加有效率。当然很多网友提到这里有一个悖论,就是虽然是同一个语言写的框架/类库,但不依靠文档还是不会用。然而不可否认的是,相同的语言基础确实降低了理解的难度,这一点不可忽视。
  2. nodejs是现在最流行的短平快web后端开发技术,解决大规模I/O问题及其高效,其社区也非常火。使用sailjs+nodejs可以快速开发原型。举个例子,咱们的服务器后端肯定要定义一个用户对象,并在数据库中存取数据。php+codeigniter只能定义对象后,一个一个写对应的增删改查的rest API。使用sailjs+nodejs方案,只需要在后端定义这么一个用户对象,那么可以自动地生成对这个节点对象的增删改查的rest API,极大提高开发效率。
  3. 据说在程序员之间引起战争,最简单的办法就是发个帖子赞美php打压其他后台脚本语言,然后其他语言的爱好者就会一拥而上,帖子点击轻松破万有木有。事实上php经过这么多年的发展,其实能做的比我们想象的要多得多——能做的都做了,不能做的创造条件也做了。例如新浪大部分服务都是php实现的。在计算机界,比起硬件的更新换代,编程语言的变化又慢又不明显。我对php应该是有感情的。但是事实上,后端我通常都是有人帮忙,我专心做前端,所以php我并不是特别熟练。当面临要单干的现状时,我迫切地需要一种可以最大限度扬长避短的方案。何况追求新技术跟研究老技术其实并不矛盾。既然如此,不如直接上nodejs。

2.javascript后台运行效率是否比较低?

nodejs这个服务器端javascript框架出现后,很多人质疑其效率是否比较低。这也很正常,因为javascript本来就是是用C编写的前端脚本语言,本身依赖解释器运行,运行效率当然没有编译运行的C高——但是不要忘记,php, ruby, python,大家都是解释型脚本语言。nodejs在服务器端后台使用的是V8引擎,V8在运行之前将JavaScript编译成了机器码,而非字节码或是解释执行 它,以此提升性能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译。现在主流的动态语言里面,执行效率排序大概是 JavaScript > Python > Ruby (假设用常见的解释器:V8、CPython、MRI)。下文还有更深刻的例子,摘自知乎http://www.zhihu.com/question/19653241。

总而言之,你可以看到,作为服务器,nodejs是足够快了。其在解决高并发访问方面相对php有相当优势,npm模块化令其安装方便,因而现在已经有很多公司企业采用Nodejs进行开发,github的node项目上详细列举了使用node开发的程序https://github.com/joyent/node/wiki/Projects,-Applications,-and-Companies-Using-Node,我认为从09年到现在,node可以说已经是比较成熟的技术方案了。

但是,nodejs主要解决的是并发访问问题,对大规模服务器端计算并没有特别的优化。这里javascript的确有些弱势,
其一:javascript这类弱类型解释型语言,计算效率不高。例如计算最大质数的问题,javascript比java要慢1,2个数量级 ,这还不算浮点数精度差异。(事实上,计算最大质数的问题一般都是都是用C语言+分布式计算来处理。)
其二:nodejs是单线程的,任何 CPU密集型操作会削弱掉 Node通过事件驱动、异步 I/O 模型等等带来的在吞吐量上的优势,因为当线程被非异步的高计算量占用时任何传入的请求将被阻塞。 这意味着丧失了node的高并发优势,同时带来高延时。

对此的解决方法,有两种:
其一:可以对于关键计算的模块,可以采用java甚至C/C++来写。将繁重的计算转移到更合适的语言写的后台进程来处理,同时让他们通过像 RabbitMQ 那样通过消息队列服务器来进行通信,这是最常见的做法。(我坦言C/C++我写不了,没有经验)
其二:涉及到服务器上多核并发处理,Node 的核心团队已经使用 cluster 模块的形式在这一方面做了一些工作 (参考:http://nodejs.org/api/cluster.html)。当然,也可以很容易的通过 nginx 的反向代理运行多个 Node.js 的服务器实例来避免单一线程阻塞的问题。这样的设置有很高的可扩展性,例如一开始的时候可以在一台服务器上运行多个实例,等计算量大时就可以分配到多个节点服务器上运行。用 Node.js 你可以得到很高的吞吐量,每个请求都作为一个小任务非常迅速和高效地处理。

3.javascript代码是否有保密性?
首先我要说明,browser端的代码都是明文,不存在编译反编译一说。如果要保密的话,可以使用js代码压缩工具使得代码不可读,但是也有工具可以反压缩,例如http://jsbeautifier.org。所以,如果重要逻辑放在browser端肯定是没有任何保密性可言的。这就是为什么大多数javascript框架都是开源的,因为它天生是开源的。
但是,放在服务器端的程序,则是保密的。除非服务器被黑客入侵了。所以一般来讲,都会将重要的逻辑放在服务器端实现。目前我还没有研究过如何把服务器端的js代码加密,因为暂时没有这样的需求。现在较为流行的做法是卖服务,而不是卖程序本身。

4.nodejs的相关框架是否成熟?


从实践上说,nodejs只是提供了建筑工具,为了快速原型我们还是需要一套脚手架和铝合金门窗。目前nodejs的这种MVC框架也就只有express和sails这两个选择。其中express是名气最大的的nodejs框架,大多数nodejs项目都用了它;而sails则在它的基础上更上层楼,关于二者的对比这里可以稍微参考一下:http://vschart.com/compare/sails-js/vs/express-web-framework。
相比express,我更喜欢sails。对于一个后台的MVC框架,我们最需要的就是两点:简易的路由和好用的ORM。路由方面,sails采用了express的路由和模版,所以可以放心。ROM方面,sails基本是仿照rails来做的,有着类似的ORM机制,所以也可以放心。sailsjs在创建对象、生成RESTful API方面更是极为方便,它可以自动地为每个模型创建增删改查接口,这点天生强悍,而php天生弱势(php由于自身原因不直接支持delete语义,还得用别的办法模拟)。这点在前端配合使用angularjs的时候非常方便,因为angularjs的$resource模块就是完全restful风格的,双方对接起来特别顺畅。此外sails还有一大优势就是开发实时通信的项目,例如有很多chart的dashboard——这不就是我们的需求吗?它对websocket支持的很好(这也是nodejs的优势),只需要写很少的代码就可以实现功能。
当然sailjs也有弱点,就是文档还不是很丰富,中文资料就更少啦。就跟我当初用angularjs一样。
我的研究生同学侯振宇在他的一篇博客中也说明了选择sailjs的理由:http://www.cnblogs.com/sskyy/p/3498273.html。

5.我推荐的nodejs后端开发套件
追求实时操作的dashboard webApp,同时兼顾性能和扩展性:linux + sailjs + nodejs + mongodb
挑战最新的前后端全MVVM开发模式: linux + meteor.js + nodejs + mongodb

(Meteor专注于创建一个完全新型的实时web应用框架,它会令webApp的开发和使用更像一个本地App,特别有创新性,让人看到了全新开发模式的可能性。具体请去https://www.meteor.com/查看)

从现在开始使用nodejs开发的几点答疑的更多相关文章

  1. NodeJs 开发微信公众号(四)微信网页授权

    微信的网页授权指的是在微信公众号中访问第三方网页时获取用户地理.个人等信息的权限.对于开发了自己的网页app应用时,获取个人的信息非常重要.上篇博客讲到了注册时可以获取用户的信息,很多人会问为什么还需 ...

  2. Win7搭建NodeJs开发环境以及HelloWorld展示—图解

    Windows 7系统下搭建NodeJs开发环境(NodeJs+WebStrom)以及Hello World!展示,大体思路如下:第一步:安装NodeJs运行环境.第二步:安装WebStrom开发工具 ...

  3. ionic+nodejs开发遇到的跨域和post请求数据问题

    最近学习ionic+nodejs开发混合app中遇到了一些问题,在此总结一下. 开发环境搭建 项目地址 https://github.com/ytudt/nodejsApp 代码和问题都会在之后的学习 ...

  4. nodejs开发指南读后感

    nodejs开发指南读后感 阅读目录 使用nodejs创建http服务器; supervisor的使用及nodejs常见的调式代码命令了解; 了解Node核心模块; ejs模板引擎 Express 理 ...

  5. CentOS 7快速搭建Nodejs开发环境

    Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好.学习Nodejs首先需要会安装环境.这里我介绍如 ...

  6. 《Nodejs开发加密货币》之二十七:开发通用的HTML组件

    人的懒惰常常是麻烦的开始.多数程序员都希望自己的工作一劳永逸,一次开发,到处使用,成了人人追逐的目标,我也不例外.最初写<Nodejs开发加密货币>系列文章,因为不喜欢设定好了去写,所以目 ...

  7. Win7搭建NodeJs开发环境

    Win7搭建NodeJs开发环境以及HelloWorld展示—图解 Windows 7系统下搭建NodeJs开发环境(NodeJs+WebStrom)以及Hello World!展示,大体思路如下:第 ...

  8. nodejs开发aspnet5项目

    结合nodejs开发aspnet5项目 1.安装kvm   官方教程地址:https://github.com/ligershark/Kulture 打开 powershell命令窗口,找不到可以在开 ...

  9. 转载:ionic+nodejs开发遇到的跨域和post请求数据问题

    转载自:http://www.cnblogs.com/ytu2010dt/p/5471366.html 最近学习ionic+nodejs开发混合app中遇到了一些问题,在此总结一下. 项目地址 htt ...

随机推荐

  1. TCP粘包的拆包处理

    因为TCP是流式处理的,所以包没有边界,必须设计一个包头,里面表示包的长度(一般用字节表示),根据这个来逐个拆包.如果对于发送/接收频率不高的话,一般也就不做拆包处理了,因为不大可能有粘包现象. 以下 ...

  2. COJ 0020 30201象棋中的皇后

    30201象棋中的皇后 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 在n×m的棋盘上放置两个相互攻击的皇后,总共有多少种不同 ...

  3. 设计模式(十五):Iterator迭代器模式 -- 行为型模式

    1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...

  4. 【转】Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)

    原文网址:http://embed.21ic.com/software/android/201403/31603.html 1 :Android中Spinner下拉列表(使用ArrayAdapter和 ...

  5. Delphi 调试Dll报错 通过GetLastError显示错误信息。

    LibHandle := LoadLibrary('c:\windows\system32\SpcClass.dll');  ShowMessage(SysErrorMessage(GetLastEr ...

  6. 安卓,分享到facebook的若干种方法汇总

    近期做了facebook的分享功能,遇到了很多问题,这里总结一下,供大家参考,不足之处还请大家指正. facebook分享方式: 1.通过intent调用调用本地facebook应用方式 支持单独分享 ...

  7. linux串口驱动分析——打开设备

    串口驱动是由tty_driver架构实现的.一个应用程序中的函数要操作硬件,首先会经过tty,级级调用之后才会到达驱动之中.本文先介绍应用程序中打开设备的open函数的整个历程. 首先在串口初始化中会 ...

  8. MYSQL视图的学习笔记

    MYSQL视图的学习笔记,学至Tarena金牌讲师,金色晨曦科技公司技术总监沙利穆 课程笔记的综合. 视图及图形化工具   1.       视图的定义 视图就是从一个或多个表中,导出来的表,是一个虚 ...

  9. C语言自动类型转换

    自动转换遵循以下规则: 1) 若参与运算量的类型不同,则先转换成同一类型,然后进行运算. 2) 转换按数据长度增加的方向进行,以保证精度不降低.(eg:int型和long型运算时,先把int量转成lo ...

  10. Spring3 MVC 使用JSON进行前后台数据交互

    http://wbj0110.iteye.com/blog/2007918 在 Spring3 中,响应.接受 JSON都十分方便.向前台返回 JSON 格式的数据: 1 2 3 4 5 6 7 8 ...