了解node.js
转载自http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb
当我向人们介绍node.js时,通常会得到两种反应,一种人马上就能了解,另一种则是非常困惑。
如果你是第二种人,请看一下我对node的解释:
- 它是一个命令行工具。你可以通过下载源码压缩包,编译并安装;
- 它能让你在你的终端上运行JavaScript程序,只需要输入"node my_app.js";
- V8 javascript引擎(Google Chrome的脚本引擎,保证了Chrome的快速运行)负责执行JS文件;
- Node 提供了一个JavaScript API用于访问网络和文件系统。
“但是我用ruby、python、php、java……就可以做所有的事情了!”
我知道。一点也没错!Node并没有神奇到可以帮你完成你的工作,抱歉。它只是一个工具,而它至少现在还不足以完全取代你惯用的工具。
“说重点!”
好的。当你需要同时做几件事情的时候,Node是很好用的。你有没有写过一段代码然后说:”我希望这个可以并行运行“?在node里一切都可以并行运行,除了你的代码。
“啥?”
是的,除了你的代码,一切都可以并行运行。想象一下你的代码是国王,node是他的侍从们。
一个侍从把国王叫醒,看看他有什么需要。国王交给侍从一系列任务后就回去睡觉了。侍从把任务分配给他的同事,大家开始工作了。
一旦某一个侍从完成了一个任务,他就进入一个队列等待向国王报告。国王依次接受每个侍从的报告。有时国王会在听完报告后给侍从更多的任务。
虽然侍从们可以并行地完成任务,但是每次只能报告一个结果,以便让国王保持专注。
“那很棒,不过能不能停止这个愚蠢的比喻,说点专业的?”
当然。一个简单的node程序如下:
var fs = require('fs')
, sys = require('sys');
fs.readFile('treasure-chamber-report.txt', function(report) {
sys.puts("oh, look at all my money: "+report);
});
fs.writeFile('letter-to-princess.txt', '...', function() {
sys.puts("can't wait to hear back from her!");
});
你的代码交给node两个任务,分别是读和写一个文件,然后就sleep了。一旦node完成一个任务,就调用回调函数。但是每次只能调用一个回调函数。在该回调函数执行完之前,其他回调函数必须排队等待。此外,我们无法确定回调函数的执行顺序。
“所以我不用担心数据的并发访问问题?”
对!这正是JavaScript单线程和事件循环设计的美妙之处。
“很好,但我为啥要用它?”
一个原因是执行效率。在一个web应用中,你的总响应时间通常是数据库查询时间的总和。使用node,你可以同时进行所有的查询,将响应时间减少到执行最慢查询的时间。
另一个原因是Javascript。你可以使用node实现浏览器和后端共享代码。JavaScript正在逐步成为一个通用编程语言。无论你过去使用python、ruby、java还是php……你或多或少都用过JS,不是吗?
最后一个原因是运行速度。V8正在持续地提高运行速度以成为最快的动态语言解释器之一。我找不到任何其他语言像JavaScript这样如此激进地提高运行速度。此外,node的I/O工具非常地轻,使你可以尽可能完全利用系统的I/O能力。
“所以你是说将来我应该一直用node编写我的所有程序?”
是又不是。只使用一种编程语言和工具会让我们的眼光变得狭窄。(原文:当你开始挥舞node大锤时,一切事物在你眼里都像是一个钉子)但是如果你面临某个任务的deadline时,你可以基于如下的分析进行选择:
- 低响应时间和高并发是否重要?Node非常擅长这个;
- 工程的规模有多大?小工程还好。大工程则需要认真评估。(可用的库,修正bug和并行开发的资源等)
“node可以在Windows上运行么?”
不行,如果你用的是windows,你需要运行linux的虚拟机。支持Windows是node的开发计划之一。但是不要为此而等待。(PS:这篇文章是2010年写的,现在已经有支持windows的node了)
“我可以通过node访问DOM么?”
好问题!不行,DOM是浏览器的一个接口,node的JS引擎(V8)则完全从那些混乱中分离出来了。但是,有些人在实现DOM的node模块,这将使浏览器端代码的单元测试成为可能。
“事件驱动编程不是很难么?”
这取决于你过去的经验了。如果你已经学过浏览器的AJAX调用和用户事件模型,那么使用node完全不是问题。另外,测试驱动开发可以帮助你进行可维护的设计。
“谁在用node?”
这是一个不完整清单。node wiki(滚动到"Companies using Node")Yahoo正在尝试将node用在YUI上,Plurk正在使用它做大规模评论(原文:massive comet,怀疑是笔误),Paul Bakaus(jQUery UI作者)正在制作一个牛逼的游戏引擎,其中在后端用到了node。Joyent聘请了Ryan Dahl(node创始人)并让其担任主要开发。
噢,Heroku刚宣布支持node.js主机。
“我去哪了解更多信息?”
Time Caswell 的博客How To Node。在twitter上Follow#nodejs。订阅这些邮件清单。加入IRC channel, #node.js。
此外,我也将继续在debuggable.com发表文章。
了解node.js的更多相关文章
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 利用Node.js的Net模块实现一个命令行多人聊天室
1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...
- Node.js:进程、子进程与cluster多核处理模块
1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...
- Node.js:理解stream
Stream在node.js中是一个抽象的接口,基于EventEmitter,也是一种Buffer的高级封装,用来处理流数据.流模块便是提供各种API让我们可以很简单的使用Stream. 流分为四种类 ...
- Node.js:Buffer浅谈
Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...
- node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法
1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...
- Node.js npm 详解
一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...
- Node.js入门(一)
一.Node.js本质上是js的运行环境. 二.可以解析js代码(没有浏览器安全级的限制): 提供系统级的API:1.文件的读写 2.进程的管理 3.网络通信 三.可以关注的四个网站: 1.https ...
- Node.js学习笔记——Node.js开发Web后台服务
一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...
- Node.js入门
开始之前,安利一本正在看的书<站在两个世界的边缘>,作者程浩,上帝丢给他太多理想,却忘了给他完成理想的时间.OK,有兴趣的可以看一看. node.js如标题一样,我也是刚开始接触,大家一起 ...
随机推荐
- 【python之路6】pycharm的使用
1.pycharm简介 PyCharm 是我众多python编辑器中比较好的一个.而且可以跨平台,在macos和windows下面都可以用,这点比较好. PyCharm是一种Python IDE,带有 ...
- designated initializer和secondary initializer是什么?
仅在此简单记录概念,方便以后回顾... ===================================== designated initializer是指定初始化方法,提供所有参数: sec ...
- delphi xe5 android 调用照相机获取拍的照片
本篇文章我们来看一下delphi xe5 在android程序里怎样启动照相机并获取所拍的照片,本代码取自xe自带打sample,路径为: C:\Users\Public\Documents\RAD ...
- python中的字典(dict),列表(list),元组(tuple)
一,List:列表 python内置的一种数据类型是列表:list.list是一种有序的数据集合,可以随意的添加和删除其中的数据.比如列出班里所有的同学的名字,列出所有工厂员工的工号等都是可以用到列表 ...
- BZOJ 1690: [Usaco2007 Dec]奶牛的旅行
Description 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城 ...
- 【整理】各种Python的IDE(集成开发环境)的总结和对比
原地址:http://www.tuicool.com/articles/rMVJNn 原文 http://www.crifan.com/summary_common_python_ide_pyscr ...
- 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)
[题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of ...
- leetcode面试准备:Minimum Size Subarray Sum
leetcode面试准备:Minimum Size Subarray Sum 1 题目 Given an array of n positive integers and a positive int ...
- bzoj1042
首先直接做多重背包肯定会TLE的, 观察这个背包问题有什么特殊性呢 物品种类和重量,价值是一定的,不同的是背包的容量和物品的数量 由于当物品数量没有限制的时候,方案数是可以预处理出来的 所以我们考虑用 ...
- -_-#【video】
视频 HTML5 视频 HTML5的视频格式之争 移动端HTML5<video>视频播放优化实践 后备