最近尝试了使用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. centos安装UCenter 和 UCenter_Home

    1.搭建lamp环境yum  –y  install  httpd  php  php-mysql  mysql  mysql-server 2启动服务   3.设置服务开机自动启动 4.上传UCEN ...

  2. 如何用js实现自适应,原来只是几行代码的事(╯‵□′)╯︵┻━┻

    在javascript写下如下几行:   (function (doc, win, undefined) {            var docEl = doc.documentElement,   ...

  3. TJOI2015 day1解题报告

    博客园的编辑器真的是太蛋疼了= =,想用tex然后上jpg又贴不了链接,真的很纠结啊= = T1:[TJOI2015]线性代数 描述:戳上面吧= = 首先这道题我觉得是这套题最漂亮的一道题了(虽然说学 ...

  4. C语言的基本概念

    1.经典入门:hello world #include <stdio.h> int main(void) { printf("hello world.\n"); ; } ...

  5. 在ZendStudio中增加新的php模板

    步骤: 找到目录:D:\Program Files\Zend\Zend Studio 12.5.1\plugins , 这要根据自己的安装情况来找,再找到以下文件org.eclipse.php.ui_ ...

  6. nginx配置参数详解

    配置参数详解 user nginx nginx ; Nginx用户及组:用户 组.window下不指定 worker_processes 8; 工作进程:数目.根据硬件调整,通常等于CPU数量或者2倍 ...

  7. x86_64的内存映射

    对于x86_64来说,逻辑地址由16位选择子和64位偏移量组成(而32位时,逻辑地址由16位段选择符和32位偏移量组成),段寄存器仅仅存放选择子.CPU的分段单元(SU)执行以下操作:[1] 先检查选 ...

  8. 程序员的自我修养:高效使用Google解决问题

    如果票选近二十年最伟大的发明,我相信搜索引擎肯定会占据一个不容小觑的位置,它不单是一项发明,更是一项成就,最大程度消灭了信息的不平等.既然人人都可以接触到海量的信息,那么衡量信息财富多寡就只剩下技巧这 ...

  9. Search a 2D Matrix leetcode

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  10. 入坑系列之HAProxy负载均衡

    在大型系统设计中用代理在负载均衡是最常见的一种方式,而相对靠谱的解决方案中Nginx.HAProxy.LVS.F5在各大场中用得比较普遍,各有各的优势和使用场景,由于本次要使用到TCP,因此Nginx ...