最近尝试了使用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. jquery实现横向导航

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 解决HTML导出Excel表数字变成科学计数法

    - js 中导出excel 较长数字串会变成科学计数法 在做项目中,碰到如题的问题.比如要将居民的信息导出到excel中,居民的身份证号码因为长度过长(大于10位),excel会自动的将过长的数字串转 ...

  3. HNOI2015 Day 2题解

    昨天做了HNOI day 2,感觉好像还是可做的,想当年什么splay还是高级算法,现在点剖什么就老考了简直丧病,虽然第二题还没写那就先当下嘴巴选手吧= = T1:[HNOI2015]落忆枫音 描述: ...

  4. centos快速安装redis

    mkdir redis cd redis wget http://labfile.oss.aliyuncs.com/files0422/redis-2.8.9.tar.gz 解压 tar -xvfz ...

  5. [Linux] PHP程序员玩转Linux系列-备份还原MySQL

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 前几天有个新闻,说是g ...

  6. 卷积神经网络(CNN)模型结构

    在前面我们讲述了DNN的模型与前向反向传播算法.而在DNN大类中,卷积神经网络(Convolutional Neural Networks,以下简称CNN)是最为成功的DNN特例之一.CNN广泛的应用 ...

  7. 关于hession 随笔

    今天遇到一个问题,纠结了很久也没有解决,情况是这样的, 我这个项目使用的是 hession  通信.我做的业务很简单,只是新加了一个接口 ,这 个接口是广告那一块的,数据库在之前的项目里面都没有使用到 ...

  8. 浅析=======Struts2之==========valueStack

    今天刚学习了struts2的valueStack,在这里把自己学到的做个分享,说道valueStack就不得不提OGNL表达式=== struts2工作流程 1.OGNL(Object Graph N ...

  9. git 关键词扩展

    用习惯了svn 的 关键词扩展.自然在git上也会寻找. 不知道啥是svn的关键词扩展? 简单列举下: 对于subversion来说,一些版本信息是不需要手动添加的,subversion提供了关键字替 ...

  10. Visual Studio 2017十五项新功能体验

    Visual Studio 2017正式已经于2017.3.7号正式发布,选在这一天发布也是为了纪念Visual Studio 二十周年.MVP 2017技术峰会将于这个周末(3.17)在北京举办,由 ...