理解node.js(Understanding node.js)

因为最近自己在学习node.js,刚开始学。看到这篇文章挺有意思,介绍了一下node.js有助于理解基于事件驱动的回调,就翻译了一下。

英文原文: Understanding node.js





理解node.js


当我介绍node.js的时候,人们一般会有两种反应,要么很快就理解了要么会感到很困惑。如果你是第二种情况,这里我会尝试给你解释一下node。

  • 它是一个命令行工具,你下载一个tar形式的文件,编译并安装。
  • 它使你能够在终端敲 ‘node my_app.js’这样的命令就可以运行JavaScript程序。
  • JS通过V8 Javascript引擎执行(Javascript引擎是谷歌浏览器运行如此之快的原因)
  • Node 提供了访问网络和访问文件系统的API


“我是否能用它来做我在用ruby, python, php, java, ...时需要的一切呢?”

你说得对!但是Node不是独角怪兽,它不会过去主动帮你做工作。它只不过是一个工具,而且它不会完全取代你的常规工具,至少现在。


“那说重点吧”

好吧,当你需要在同一时间做几件事情时,Node总体上都是非常好的。你是否曾经写过一段代码并说道“我希望我的代码能并行运行”。好了,在node中除了代码,所有一切都是并行执行的。


“蛤??”

还是这样说,在node中除了你的代码,所有一切都是并行执行的。要理解这一点,你可以想象你是代码王国的国王,而node是你的仆从。一天的开始,一个仆人叫醒国王并问他需要做什么。国王给了仆人一个任务列表然后去睡了一会儿回笼觉,然后这个仆人把这些任务分配给自己的同伴,他们就开始工作了。一旦一个仆人做完了一个任务,他就排在王宫外面等着汇报。国王每次只让一个仆人进来,然后听他汇报。生活是美好的,因为国王的仆人们并行地执行所有的任务,但每次只报告一个结果,所以国王可以集中精力。


“这真是太棒了,但是我不喜欢这个比喻,能不能说点实在的?”

当然。一个简单的node程序看起来像这样:

const fs = require('fs');

fs.readFile('treasure-chamber-report.txt', function(report) {
  console.log("oh, look at all my money: "+report);
});

fs.writeFile('letter-to-princess.txt', '...', function() {
  console.log("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中获取DOM吗?”
很好的问题!不能,DOM是浏览器的东西,node的JS引擎(V8)和这堆东西是完全分开的。然而,也有人致力于实现将DOM作为一个node的一个模块。


“事件驱动编程是不是很难?”
这就要看你了。如果你已经学会了如何在浏览器中熟练使用ajax和用户事件,那么使用node就不是什么问题。



阅读更多

没有更多推荐了,返回首页