[原]node.js使用感想
最近尝试了使用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的优劣。
优点:
- node.js以javascript作为唯一支持语言,是他的特点,也是他的之所以能这么成功的原因。web开发人员众多,已经成就了jsp,php,ruby等多个语言,而现在出现了大家一早就熟悉的javascript也可以做后端,自然会受到追棒。node.js满足了javascript进行全栈开发的需求。
- 通过异步回调和事件,让当前进程专注于计算,IO之类的费时操作通过其他线程处理之后再回调到当前线程,相比php,每个页面的响应时间都很合理(一个页面不会影响其他页面);相比java的多线程编程,他又没有其复杂性(不用加锁和考虑先后)。
缺点:
- 太多的异步回调给书写带来了很大的麻烦,对异常处理也非常不友好,模块间更容易造成耦合,而且看起来相比stackfull的coroutine节省了堆栈的开销,但实际上闭包或者promise会多构造很多个,内存、gc和调用消耗上并不一定能节省。
- javascript的版本问题。当前版本的javascript并不是能让人非常舒服的写代码(再没有一个语言有像javascript这么多的compile to js项目),因此有各自编译到javascript的语言,还有ECMAScript6和ECMAScript7。到目前为止,node.js的稳定版(4.2.4)还是默认不支持ECMAScript6的,需要加上--use-strict --harmony参数。当然我推荐把这个参数写到类似gulp的脚本里。
- 项目依赖和查找糟糕。开发方面,官方推荐通过package.json设置依赖,npm自动安装依赖包,但是npm里面的包质量参差不齐,我就遇到好几个包在类似socket.on('error')的回调中直接throw异常的,另外还有些有兼容性的问题。而本项目的查找路径和node_modules写法完全不一样,一个是./xxx/xxx一个是xxx,发现包有问题想自己修改放到项目内,还得同时修改众多的require。此外一个不是很影响体验的瑕疵,node_modules里面貌似每个项目都把自己的依赖包给下载到自己的子node_modules文件夹里面,如果依赖包里面还有依赖,又会继续包含进来,导致文件夹层次和路径非常深,不得不说这个做法比较奇葩。
- node.js很容易被误用的一点,就是认为他的session具有相关性,从而试图在内存中缓存一些东西,而node.js实际上也没有对这种做法做任何的禁止和警示。不像php等cgi,每次请求都是一次全新的页面解释,不存在任何的全局变量(为了加速可能会缓存解析结果,但只是缓存字节码或者语法树之类的,每次调用的环境肯定是全新的),而node.js的请求并不清空环境。这一条咋看起来毫无问题,说不定还能利用这点做一些一般服务器较难实现的响应(比如实时传输文件等)。但是因为pm2等启动工具,以及node后来版本新增的cluster启动,都会导致同一用户的多次请求会被分发到不同的进程,而你毫不知情。
以上是一个node.js初学者的使用感受,可能看起来满腹牢骚,不过也是因为教训深刻,爱恨交织。至少目前为止已经有2点我始终不会忘了:
- 不要在回调函数里面throw异常
- 不要试图在全局变量中缓存处理结果,最好连全局变量都不要使用
另外说一句,官方的文档实在太差劲了,连回调函数的参数说明都没有。
[原]node.js使用感想的更多相关文章
- node.js 安装方法 以及 用原声搭建服务器
node.js 安装方法: 第一步: 64位的安装包网址: https://nodejs.org/dist/v4.4.3/node-v4.4.3-x64.msi 第二步: 进入命令提示框 输入 ...
- 利用Node.js的Net模块实现一个命令行多人聊天室
1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...
- Node.js:Buffer浅谈
Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...
- Node.js学习笔记——Node.js开发Web后台服务
一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...
- 基于Node.js实现一个小小的爬虫
以前一直听说有爬虫这种东西,稍微看了看资料,貌似不是太复杂. 正好了解过node.js,那就基于它来个简单的爬虫. 1.本次爬虫目标: 从拉钩招聘网站中找出“前端开发”这一类岗位的信息,并作相应页面分 ...
- Node.js大众点评爬虫
大众点评上有很多美食餐馆的信息,正好可以拿来练练手Node.js. 1. API分析 大众点评开放了查询商家信息的API,这里给出了城市与cityid之间的对应关系,链接http://m.api.di ...
- Node.js抓取网页
前几天四六级成绩出来(然而我没考),用Node.js做了一个模拟表单提交并抓取数据的Web 总结一下用到的知识,简单的网页抓取大概就是这个流程了 发送Get或Post请求 表单提交,首先弄到原网页提交 ...
- Node.js + Web Socket 打造即时聊天程序嗨聊
前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前 ...
- Node.JS 学习路线图
转载自:http://www.admin10000.com/document/4624.html 从零开始nodejs系列文章, 将介绍如何利Javascript做为服务端脚本,通过Nodejs框架w ...
随机推荐
- GridControl 设置自带选中复选框及设置该列列头名称
2.设置该列标题,设置事件CustomDrawColumnHeader 效果图:
- 常用php时间函数用法汇总
1.设置时区的方法: php5后都要自己设置时区,要么修改php.ini的设置,要么在代码里修改. 在PHP.INI中设置时区 date.timezone = PRC 在代码中设置时区 1 date_ ...
- 2017-2-21 C#基础 if条件语句,作用域
今天学了if 条件语句和作用域.作用域可以用一句话来概括:儿子可以用爹的所有东西,爹不可以用儿子的任何东西.If条件语句我用几个练习题来解释. 1."请输入年份:" 判断是否是闰年 ...
- 【openstack N版】——镜像服务glance
一.openstack镜像服务glance 1.1 glance介绍 glance主要是由三部分组成 glance-api:接收云系统镜像的创建,删除,读取请求,类似nova-api,通过其他模块(g ...
- Jsp注册界面——request对象
1. Reg.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...
- 概念 : 过程 : 前台login
为了解决自动登入.访问权限机制.登入权限而诞生了这过程,过程需要概念来维护记忆. 通过singlePageAutoLoginLocalStorage, UIStateLocalStorage, Use ...
- Material Design学习-----CollapsingToolbarLayout
博客引用(http://www.open-open.com/lib/view/open1438265746378.html) CollapsingToolbarLayout为我们提供了一个很方便的顶部 ...
- 第27篇 重复造轮子---模拟IIS服务器
在写程序的时候,重复造轮子是程序员的一个大忌,很多人对重复造轮子持有反对的态度,但是我觉得这个造轮子的过程,是对于现有的知识的一个深入的探索的过程,虽然我们不可能把轮子造的那么的完善,对于现在有的东西 ...
- instance “error” 了怎么办?- 每天5分钟玩转 OpenStack(159)
这是 OpenStack 实施经验分享系列的第 9 篇. OpenStack 用多了,经常会遇到这种情况:对 instance 执行某个操作如果失败了就会处于 "error" 状态 ...
- 详细领悟ThreadLocal变量
关于对ThreadLocal变量的理解,我今天查看一下午的博客,自己也写了demo来测试来看自己的理解到底是不是那么回事.从看到博客引出不解,到仔细查看ThreadLocal源码(JDK1.8),我觉 ...