最近尝试了使用node.js,但因为不是太深入(小项目,还没做完),所以不能谈心得谈经验,就来谈谈使用感想。

node.js和以往的cgi接口的服务器+cgi程序(如apache+phpmod)中的单个角色不同,他自身是一个完整的程序,以库的形式提供了各种各样的功能,如果不写一行代码,apache、nginx等至少能做一个文件服务器,而node.js连端口都没监听。可以这么认为,node.js是一个类似lua/python的interpreter的javascript的interpreter,同时扩展了javascript的库,使其具有socket、文件、二进制buffer等功能。可以这么认为,node.js只是可以用做服务器,而非只是一个服务器。下面谈谈我认为的node.js的优劣。

优点:

  1. node.js以javascript作为唯一支持语言,是他的特点,也是他的之所以能这么成功的原因。web开发人员众多,已经成就了jsp,php,ruby等多个语言,而现在出现了大家一早就熟悉的javascript也可以做后端,自然会受到追棒。node.js满足了javascript进行全栈开发的需求。
  2. 通过异步回调和事件,让当前进程专注于计算,IO之类的费时操作通过其他线程处理之后再回调到当前线程,相比php,每个页面的响应时间都很合理(一个页面不会影响其他页面);相比java的多线程编程,他又没有其复杂性(不用加锁和考虑先后)。

缺点:

  1. 太多的异步回调给书写带来了很大的麻烦,对异常处理也非常不友好,模块间更容易造成耦合,而且看起来相比stackfull的coroutine节省了堆栈的开销,但实际上闭包或者promise会多构造很多个,内存、gc和调用消耗上并不一定能节省。
  2. javascript的版本问题。当前版本的javascript并不是能让人非常舒服的写代码(再没有一个语言有像javascript这么多的compile to js项目),因此有各自编译到javascript的语言,还有ECMAScript6和ECMAScript7。到目前为止,node.js的稳定版(4.2.4)还是默认不支持ECMAScript6的,需要加上--use-strict --harmony参数。当然我推荐把这个参数写到类似gulp的脚本里。
  3. 项目依赖和查找糟糕。开发方面,官方推荐通过package.json设置依赖,npm自动安装依赖包,但是npm里面的包质量参差不齐,我就遇到好几个包在类似socket.on('error')的回调中直接throw异常的,另外还有些有兼容性的问题。而本项目的查找路径和node_modules写法完全不一样,一个是./xxx/xxx一个是xxx,发现包有问题想自己修改放到项目内,还得同时修改众多的require。此外一个不是很影响体验的瑕疵,node_modules里面貌似每个项目都把自己的依赖包给下载到自己的子node_modules文件夹里面,如果依赖包里面还有依赖,又会继续包含进来,导致文件夹层次和路径非常深,不得不说这个做法比较奇葩。
  4. node.js很容易被误用的一点,就是认为他的session具有相关性,从而试图在内存中缓存一些东西,而node.js实际上也没有对这种做法做任何的禁止和警示。不像php等cgi,每次请求都是一次全新的页面解释,不存在任何的全局变量(为了加速可能会缓存解析结果,但只是缓存字节码或者语法树之类的,每次调用的环境肯定是全新的),而node.js的请求并不清空环境。这一条咋看起来毫无问题,说不定还能利用这点做一些一般服务器较难实现的响应(比如实时传输文件等)。但是因为pm2等启动工具,以及node后来版本新增的cluster启动,都会导致同一用户的多次请求会被分发到不同的进程,而你毫不知情。

以上是一个node.js初学者的使用感受,可能看起来满腹牢骚,不过也是因为教训深刻,爱恨交织。至少目前为止已经有2点我始终不会忘了:

  1. 不要在回调函数里面throw异常
  2. 不要试图在全局变量中缓存处理结果,最好连全局变量都不要使用

另外说一句,官方的文档实在太差劲了,连回调函数的参数说明都没有。

[原]node.js使用感想的更多相关文章

  1. node.js 安装方法 以及 用原声搭建服务器

    node.js 安装方法: 第一步: 64位的安装包网址:   https://nodejs.org/dist/v4.4.3/node-v4.4.3-x64.msi 第二步: 进入命令提示框  输入 ...

  2. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  3. Node.js:Buffer浅谈

    Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...

  4. Node.js学习笔记——Node.js开发Web后台服务

    一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...

  5. 基于Node.js实现一个小小的爬虫

    以前一直听说有爬虫这种东西,稍微看了看资料,貌似不是太复杂. 正好了解过node.js,那就基于它来个简单的爬虫. 1.本次爬虫目标: 从拉钩招聘网站中找出“前端开发”这一类岗位的信息,并作相应页面分 ...

  6. Node.js大众点评爬虫

    大众点评上有很多美食餐馆的信息,正好可以拿来练练手Node.js. 1. API分析 大众点评开放了查询商家信息的API,这里给出了城市与cityid之间的对应关系,链接http://m.api.di ...

  7. Node.js抓取网页

    前几天四六级成绩出来(然而我没考),用Node.js做了一个模拟表单提交并抓取数据的Web 总结一下用到的知识,简单的网页抓取大概就是这个流程了 发送Get或Post请求 表单提交,首先弄到原网页提交 ...

  8. Node.js + Web Socket 打造即时聊天程序嗨聊

    前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前 ...

  9. Node.JS 学习路线图

    转载自:http://www.admin10000.com/document/4624.html 从零开始nodejs系列文章, 将介绍如何利Javascript做为服务端脚本,通过Nodejs框架w ...

随机推荐

  1. 改变radio默认样式

    改变radio默认样式,代码如下: <!doctype html> <html> <head> <meta charset="UTF-8" ...

  2. 使用jQuery快速高效制作网页交互特效

    第四章:JQuery选择器 1.Jquery选择器简介 (1) Jquery中的选择器完全继承了CSS的风格,利用Jquery选择器,可以非常便捷和快速的找出特定的Dom元素,然后为他们添加相应的行为 ...

  3. 分别用C/C++实现栈

    用C语言的方式实现栈: #include <stdio.h> #include<stdlib.h> #include<assert.h> struct Link { ...

  4. Linux下自动备份MySQL

    使用expect和mysqldump备份 expect expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预. 例如,执行shell脚本的过程中,需要输入用户名.密码 ...

  5. 【Java基础】String StringBuffer StringBuilder

    String String是不可变的 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的.(public final class String) 查看以下代码: S ...

  6. 每天一个linux命令(40)--route命令

    Linux 系统的route 命令用于显示和操作IP路由表(show /manipulate the ip routing table).要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器, ...

  7. java基础之路(二)上

    &和&&的区别 我们今天就来说一下&与&&运算符的区别 &运算符有两种用法:(1)按位与:(2)逻辑与.&&运算符是短路与运算. ...

  8. 求int型正整数在内存中存储时1的个数

    题目描述: 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: 输入一个整数(int类型) 输出描述: 这个数转换成2进制后,输出1的个数 输入例子: 5 输出例子: ...

  9. ios8指纹识别

    简介 苹果从iPhone5S开始,具有指纹识别技术,从iOS8.0之后苹果允许第三方 App 使用 Touch ID进行身份验证.指纹识别Touch ID提供3+2共5次指纹识别机会(3次识别失败后, ...

  10. C#7的9个新语法

    一.out变量 在c#7之前我们得这样 在c#7中我们可以这样 当然你还可以使用"var" 这算一个小更新,其实这个问题存在很久了,应该也很好解决,不知为何到c#7才开始引入,不管 ...