Node.js是什么[译]
当我向人们介绍Node.js的时候,一般会有两种反应:多数立刻表示“哦,这样啊”,另外的则会感到困惑。
如果你是第二种的话,我会试着这样解释node:
- 这是一个命令行工具。你可以下载一个tar包,然后编译安装。
- 在terminal中输入“node my_app.js”就可以运行起来你的javascript代码。
- JS都是在V8引擎(这也是Google Chrome这么快的原因)中运行的。
- Node提供了访问文件和文件系统的API。
“但是我可以用ruby、python、php、java。。。处理任何事!”
是的,你说得对。Node实在是太独特了。而且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完成一个任务,回调就会触发。但是每次只可以有一个回调被触发,直到这个回调执行完成。其他回调都需要等待。另外,回调执行的顺序是不能保证一定和调用回调的顺序相同的。
“所以,我不用担心代码同事访问同一个数据结构了?”
是额,这就是Node.js的单线程、时间循环的魅力所在了。
“很好,但是我为什么要用它?”
第一个原因就在于效率。在一个web应用中,你主要的时间消耗就在于数据库查询。使用node,你可以同时执行你的全部查询,时间可以压缩到只需要用最慢的查询消耗的时间就可以返回。
另一个原因是javascript。你可以用node分享前后端的代码。Javascript已经在成为全站语言的路上了。无论你使用过python、ruby、php还是java,你都会在开发中或多或少的接触过javascript。
最后一个原因是速度。V8不是地球最快的动态语言解释器也非常的接近了。我还真是想不出任何语言能像javascript一样如此大刀阔斧的提高执行速度。而且,node的I/O组件非常轻量级,可以最佳的发挥你的系统的I/O能力。
“所以你是说我应该使用node来开发我的web app了吗?”
是也不是。Node.js显然可以胜任你需要完成的任何工作。但是,如果这事还有deadline的话,你就需要考虑一下的东西了:
- 高并发,低返回时间是否必要。这是node的擅长领域。
- 项目有多大?小的项目还好,大项目的话就需要考虑可用的库,修改bug的资源等的问题了。
“Node在Windows上可以运行吗?”
是的。在0.6之后的版本可以在Windows上运行。你不会再想用老旧版本的node了吧。
“我可以在node中访问HTML DOM吗?”
好问题。但是不可以。DOM是浏览器的东西了。node的JS引擎(V8)和那些东西是相互独立的。但是有人试图开发这么一个模块。
“事件驱动的变成难吗?”
这就要看你了。如果你已经使用了AJAX调用,处理浏览器里的用户事件,那么这就不会成为一个问题。
无论如何,测试驱动的开发可以让你形成一个可维护的设计。
“谁在用?”
你可以参考node的“使用Node的公司”列表。很多的公司已经在使用了。
“接下来去哪儿学习?”
Tim Caswell的博客不错。
好了就写到这里了。
原文:http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb
Node.js是什么[译]的更多相关文章
- [译]Node.js - Event Loop
介绍 在读这篇博客之前,我强列建议先阅读我的前两篇文章: Getting Started With Node.js Node.js - Modules 在这篇文章中,我们将学习 Node.js 中的事 ...
- [译]Node.js Interview Questions and Answers (2017 Edition)
原文 Node.js Interview Questions for 2017 什么是error-first callback? 如何避免无止境的callback? 什么是Promises? 用什么工 ...
- 译\Node.js应用的持续部署
Node.js应用的持续部署 翻译前 翻译自:https://blog.risingstack.com/continuous-deployment-of-node-js-applications/ 正 ...
- [译]How to Install Node.js on Ubuntu 14.04 如何在ubuntu14.04上安装node.js
原文链接为 http://www.hostingadvice.com/how-to/install-nodejs-ubuntu-14-04/ 由作者Jacob Nicholson 发表于October ...
- [译]Node.js : Building RESTful APIs using Loopback and MySQL
国庆后可能就要使用StrongLoop那套东西来做项目了 原文:http://www.javabeat.net/loopback-mysql/ Loopback是什么? Loopback是一个开源的N ...
- [译]Node.js Best Practices - Part 2
原文: https://blog.risingstack.com/node-js-best-practices-part-2/ 统一风格 在大团队开发JS应用, 创建一个风格指南是很有必要的. 推荐看 ...
- [译]Node.js面试问与答
原文: http://blog.risingstack.com/node-js-interview-questions/ 什么是error-first callback? 如何避免无休止的callba ...
- [译]我是怎么构建Node.js程序的
原文: http://blog.ragingflame.co.za/2015/4/1/how-i-build-nodejs-applications "保持简单, 保持模块化." ...
- [译]简单得不得了的教程-一步一步用 NODE.JS, EXPRESS, JADE, MONGODB 搭建一个网站
原文: http://cwbuecheler.com/web/tutorials/2013/node-express-mongo/ 原文的源代码在此 太多的教程教你些一个Hello, World!了, ...
随机推荐
- Scrapy简单入门及实例讲解-转载
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...
- linux安装本地blast
1)wget ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/2.8.0alpha/ncbi-blast-2.8.0-alpha+-x64-li ...
- css学习-css引入&css选择
一.引入css的方式,一共有4种,我们只需要掌握三种就可以了,@import的方法我们不做掌握 1.第一种引入的方法 <!--1.第一种引入css的方法--> <h1 style=& ...
- swift UITextfield 添加点击方法 - 简单实现
1. 真正在任何系统上都有效的方法 1./// 城市选择 private lazy var cityTextfield:UITextField = { let tf = UITextField() t ...
- [leetcode]680. Valid Palindrome II有效回文II(可至多删一原字符)
Given a non-empty string s, you may delete at most one character. Judge whether you can make it a pa ...
- Python学习记录day7
目录 Python学习记录day7 1. 面向过程 VS 面向对象 编程范式 2. 面向对象特性 3. 类的定义.构造函数和公有属性 4. 类的析构函数 5. 类的继承 6. 经典类vs新式类 7. ...
- windows 10 WSL 安装 Centos
1. 打开 WSL,没啥好说的 使用管理员权限打开 powershell,执行 Enable-WindowsOptionalFeature -Online -FeatureName Microsoft ...
- Spring框架的AOP技术(注解方式)
1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * sp ...
- MVC4升级到MVC5未能加载文件或程序集System.Web.WebPages.Razor, Version=3.0.0.0
首先,我并没有升级他,头一天还是好好的,用的都是2.0.0.0版本的,今天来打开就出现了这个错误: 未能加载文件或程序集“System.Web.WebPages.Razor, Version=3.0. ...
- item2
一.简介 iTerm2 是 OS X 下一款开源免费的的终端工具,很多人基本用它替代了原生的 Terminal. 二.特色功能 https://www.zhihu.com/question/274 ...