资讯专栏INFORMATION COLUMN

「译文」理解Node.js

jsummer / 476人阅读

摘要:进一步说,对于回调触发的顺序是无法保证的。时刻在向成为全球最快的动态语言解释器之一而努力。正在为对进行实验,正在使用它处理大规模的,并且由于而出名正在创建一个令人兴奋的游戏引擎,其中后端使用了一些代码。

一篇2010年的文章,自己读完后一些对node.js的疑问迎刃而解,由于文章比较旧,所以文中描述的情况有些已经发生了变化,在翻译过程中会一一指出。

原文:http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb

当我把Node.js介绍给人们的时候,通常会产生两种反应。总的来说人们不是可以正确的理解它,就是被搞得非常糊涂。

如果你到目前为止还处于第二组里,下面是我想要用来讲解node的内容:

它是一个命令行工具。你下载一个tarball文件,编译并安装源码。

它可以让你在你的终端中通过输入"node my_app.js"来运行JavaScript程序。

JS是被V8 javascript引擎(使Google Chrome运行如此之快的东西)所执行的。

Node提供了一个用来访问网络和文件系统的JavaScript API。

“但是我可以做任何我想要做的事情用:ruby,python,php,java, ... !”

我听到了你的声音。你是对的。Node不是该死的独角兽,它不会帮你做你自己的工作,抱歉。它只是一个工具,并且它大概也不会完全地替换你常用的工具,至少当前不会。

“说重点!”

好的,我会的。Node总的来说非常优秀当你需要同时做许多事情的时候。你有过写了一部分代码然后说“我想要这个并行执行”吗?好吧,在node中任何东西都是并行运行的,除了你的代码。

“嘿?”

是的没错,任何东西都是并行的,除了你的代码。为了理解它,把你的代码想像成是国王,然后node是它的仆从军队。

新的一天以仆从叫醒国王并且问他是否需要什么而开始了。国王给了这个仆从一个任务列表,然后回去继续睡觉去了(汗)。这个仆从把这些任务分配给了他的同僚,然后他们开始工作。

当一个仆从完成了一个任务,他会在国王领地外边排成一条线来汇报。国王一次让一个仆从进来,然后听取他的报告。有时候国王会在仆从出去的时候给仆从更多的任务。

生活是美好的,因为国王的仆从并行的执行他的任务,但是一次只报告一个结果,所以国王可以专注。*

“那是异想天开,但是你能结束这个愚蠢的比喻并且用geek的方式告诉我吗?”

当然。一个简单的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两个任务用来读写一个文件,然后就休眠了。当node完成了一个任务,跟它对应的回调就会被触发。但是在同一时间只能有一个回调触发。在那个回调完成了执行之前,所有其他的回调不得不排队等待。进一步说,对于回调触发的顺序是无法保证的。

“所以我不必担心代码在同一时间访问同一个数据结构?”

你理解了!这就是JavaScript的单进程/事件循环设计的全部美之所在。

“非常好,但是为什么我应该用它?”

一个原因是效率。在一个web应用中,你主要的响应时间消耗通常是执行数据库查询的时间之和。通过node,你可以一次执行你所有的查询,把响应时间减少为执行最慢查询所花费的时间。

另一个原因是JavaScript。你可以使用node来在浏览器和你的后端之间共享代码。JavaScript也正在变成一个真的通用语言。不管过去你用的是python,ruby,java,php或者其他语言,你都可能用过一些JS,对吗?

最后一个原因是原始速度。V8时刻在向成为全球最快的动态语言解释器之一而努力。我想不到任何其他语言在速度上有像如今的JavaScript一样有如此突飞猛进的提升。进一步说,node的I/O能力非常轻量级,可以使你可以尽可能的完全利用你系统完全的I/O能力。

“所以你在说我应该从现在起用node来写我所有的应用?”

是和不是。一旦你开始抡node这个锤子,那么显然一切开始看起来都像一个钉子。但是如果你当前的工作有一个期限,你可以通过以下来决定:

是否低响应时间/高并发重要?Node真的很擅长它。

项目有多大?小项目问题不大。大项目应该小心的评估(可用的库,修复一个bug所需的资源或者two upstream等等)。

“node能运行在Windows上吗?”

不行。如果你使用的是windows,你需要运行一个Linux虚拟机(我推荐VirtualBox)。node对Windows的支持在计划中了,但是接下来的几个月不要屏住呼吸除非你想对port提供帮助。(译者:现在node可以完美的运行在Windows上)

“我能在node中访问DOM吗?”

好问题!不行,DOM是浏览器中的东东,并且node的JS引擎(V8)幸好跟那些混乱的东西是完全分离的。不过,有人在以node模块的形式来实现DOM,可能带来令人兴奋的可能性比如对客户端代码进行单元测试。

“难道事件驱动编程不是真的非常难吗?”

这取决于你。如果你已经学过如何在浏览器中摆弄AJAX调用和用户事件,那么使用node不会是一个问题。

同时,测试驱动开发可以真正的帮助你以一个可维护的设计做为开始。

“谁在用它?”

在node wiki(滚动到"Companies using Node")有一个小的/不全的列表。Yahoo正在为YUI对node进行实验,Plurk正在使用它处理大规模的comet,并且Paul Bakaus(由于jQuery UI而出名)正在创建一个令人兴奋的游戏引擎,其中后端使用了一些node代码。Joyent已经雇佣了Ryan Dahl(node作者)并且大力资助开发。

对了,Heroku也刚刚声明了支持对node.js的托管。

“我能去哪里学更多?”

Tim Caswell正在运作优秀的How To Node博客。在twitter上Follow #nodejs。订阅邮件列表。然后去IRC频道逛逛,#node.js(是的,名字中包含这个点)。我们在那的划艇分数快达到200了:)。

我也将会继续在debuggable.com这里写文章。

当前就写这么多了。如果你有其他问题欢迎留言。

--注解:

*: 这个比喻显然是太简单了,但是在现实之中找到一个与非阻塞概念相对应的对照物很难。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77930.html

相关文章

  • 理解Node.js(译文)

    摘要:译者觉得作者的比喻很适合初学者理解,特此翻译。进一步说,回调触发的顺序是不能被保证的。所以我不必担心代码在同一时间访问同一个数据结构你确实理解了,这就是的单进程事件循环设计美丽的地方。 前言 总括 :这篇文章十分生动形象的的介绍了Node,满足了读者想去了解Node的需求。作者是Node的第一批贡献者之一,德国前端大神。译者觉得作者的比喻很适合初学者理解Node,特此翻译。 译者 :原...

    SegmentFault 评论0 收藏0
  • 译文Node.js垃圾回收机制-基础

    摘要:正好最近在学习的各种实现原理,在这里斗胆翻译一篇垃圾回收机制原文链接。自动管理的机制中,通常都会包含垃圾回收机制。二垃圾回收机制的概念垃圾回收,是一种自动管理应用程序所占内存的机制,简称方便起见,本文均采用此简写。 最近关注了一个国外技术博客RisingStack里面有很多高质量,且对新手也很friendly的文章。正好最近在学习Node.js的各种实现原理,在这里斗胆翻译一篇Node...

    haobowd 评论0 收藏0
  • 译文Node.js官方文档(前言&目录)

    摘要:毕竟官方文档才是未经提炼的纯技术点,读书不能只读二手书。目前网上能找到的中文文档基本都是基于的,但截至此文发布,最新的稳定版都已经是了。翻译过程中主要参考官方英文文档,以及极客学院的官方文档中文翻译。 前言 相信很多开发者和我一样,在学习一门技术的时候,通过网上的各种教程和视频入门之后会发现自己遇到一个上升瓶颈。造成这个瓶颈的很大一部分原因,我认为是进阶教程的知识点过于分散,同时高质量...

    tinna 评论0 收藏0
  • 译文Node.js官方文档(Part 2 用法与示例)

    摘要:用法具体的参数及脚本运行方式,请参考命令行工具章节。示例用写的一个返回的服务器示例要运行此服务器,将上面所示代码放入文件,并用执行它本文档中所有的示例均可以类似方式运行。全文目录请查看全文目录 用法 node [options] [v8 options] [script.js | -e script] [arguments] 具体的option参数及脚本运行方式,请参考命令行工具章节。...

    tianyu 评论0 收藏0
  • 译文Node.js v7 Nightly版本的async/await小实践

    摘要:正文的实践几个月前,引擎加入了特性。注意目前特性只在非稳定版本的中才有。暂时建议不要用于生产环境。意思是它能以非阻塞的方式暂定代码的执行,以等待上一个结果返回。在此之前,还它只能通过转译器来实现。 来自新手向国外技术博客RisingStack的又一篇Node.js相关技术文章,原文请看此。 正文 Node.js v7的async/await实践 几个月前,JavaScript引擎V8加...

    Little_XM 评论0 收藏0

发表评论

0条评论

jsummer

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<