阅读说明:本文借鉴了后文末尾列出的学习资料的相关内容,鼠标指上某些文本会有一些提示。分享促进进步~
1 概述
1.1 定义
Node.js 官方网站给出了如下定义:
Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.
Node.js 是建立在 Chrome 的 JavaScript 运行时环境上的平台,目标是为能够简单地构建快速、可扩展的网络应用程序。 Node.js 利用事件驱动、非阻塞 I/O 模型的特点使得它能够轻量级、高效并且完美地应对分布式设备上运行的数据密集型实时应用程序。
1.2 特点
Node.js 最为关键的三个特点:
- 非阻塞 I/O
- 事件驱动
- 单线程
1.2.1 非阻塞 I/O
我们知道在操作系统中,程序运行的空间分为内核空间和用户空间。非阻塞 I/O 的实质是用户空间中的程序不用依赖内核空间中的 I/O 操作实际完成,就可以进行后续操作。
关于阻塞 I/O 和非阻塞 I/O 的伪代码说明:
// 阻塞 I/O
result = db.query('select * from user');
print(result);
print('next statement');
// 非阻塞 I/O
db.query('select * from user', function(result){
print(result);
});
print('next statement');
非阻塞 I/O 在分布式环境中非常重要,这也是为什么有很多云计算厂商对 Node.js 青睐的根本原因。(参见 3 企业级应用)
1.2.2 事件驱动
事件驱动是 Node.js 的核心设计思想,Node.js 提供的绝大多数 API 都是基于事件的、异步的风格。
关于事件驱动的代码片段说明:
request.on('connect', function(res, socket, head){
var allData = '';
socket.on('data', function(chunk){
allData += chunk.toString();
});
socket.on('end', function(){
console.log(allData);
})
});
磁盘 I/O 、网络通信、数据库查询等操作都会产生相对应的事件,可以将事件绑定上需要处理的回调函数。
Node.js 的 libev 会不断检查是否有活动的、可供检测的事件监听器,直到检测不到时才退出事件循环。Node.js 凭借事件驱动搞定大规模的 http 请求。
编程风格?瓶颈?
1.2.3 单线程
Node.js 进程在同一时刻只会处理一个事件,完成后立即进入事件循环检查并处理后面的事件。Node.js 通过内部单线程高效率地维护事件循环队列来实现的,没有多线程的资源占用和上下文切换。
单线程单进程的方案(和 JavaScript 的运行方式一致)显然不能充分利用上多核CPU硬件。创始人Ryan Dahl建议,运行多个Node.js进程,利用某些通信机制来协调各项任务。目前,已经有不少第三方的Node.js多进程支持模块发布。
我们可以看看国内工程师 Snoopyxd 做的一次 Node.js 与 PHP 的性能对比测试:http://snoopyxdy.blog.163.com/blog/static/60117440201183101319257/
1.3 发展历史
Node.js 最初是由 Ryan Dahl 发起的开源项目,后来被 Joyent 公司(云计算服务商)注意到:Joyent 公司将 Ryan Dahl 招入旗下, Node.js 也交由 Joyent 公司管理并维护。尽管 Node.js 诞生的时间(2009年)还不长, 在2011年 Node.js 在 github 的访问量就已经超越了 Rails,并且在它的周围形成了一个庞大的生态系统。Node.js 第一个企业级应用是由 VMware 公司建立的云计算平台 Cloud Foundry。
2 架构
我们知道使用 C/C++ 可以编写网络相关的 Server,前端工程师通常所说的在 Node.js 里可以用 JavaScript 编写 Server ,实际上调用的就是 C/C++ 封装好的接口。实际上最快的 JavaScript 引擎—— V8 也是用 C++ 编写的。
Libeio 和 Libev 分别支持的是 Linux 、 Unix 、 Mac 等 POSIX 的异步式 I/O 和事件触发, IOCP 是 Windows 下的相关库, Libuv 对以上三者进行了一层封装。
2.1 核心API
见名知意,了解 Node.js 的开发者的关注点:
- Assertion Testing
- Buffer
- C/C++ Addons
- Child Processes
- Cluster
- Crypto
- Debugger
- DNS
- Domain
- Events
- File System
- Globals
- HTTP
- HTTPS
- Modules
- Net
- OS
- Path
- Process
- Punycode
- Query Strings
- Readline
- REPL
- STDIO
- Stream
- String Decoder
- Timers
- TLS/SSL
- TTY
- UDP/Datagram
- URL
- Utilities
- VM
- ZLIB
2.2 第三方模块
Node.js 有着强大而灵活的包管理器( node package manager , npm ),目前已经有20000+个第三方模块。其中有网站开发框架,有 MySQL、PostgreSQL、MongoDB 数据库接口,有模板语言解析、CSS 生成工具、邮件、加密、图形、调试支持,甚至还有图形用户界面和操作系统 API 工具。
3 企业级应用
3.1 LinkedIn
LinkedIn 是全球最大的职业社交网站(用户两亿以上)。其采用 Node 替代 Rails:减少了27台服务器,速度提升20倍。其移动开发主管Kiran Prasad如是说:
LinkedIn内部使用了大量的技术,但是在移动服务器这一块,我们完全基于Node。
(使用它的原因)第一,是因为其灵活性。第二,如果你了解Node,就会发现它最擅长的事情是与其他服务通信。移动应用必须与我们的平台API和数据库交互。我们没有做太多数据分析。相比之前采用的Ruby on Rails技术,开发团队发现Node在性能方面提高很多。他们在每台物理机上跑了15个虚拟服务器(15个实例),其中4个实例即可处理双倍流量。容量评估基于负载测试的结果。
3.2 Node Club
Node Club是用 Node.js 和 MongoDB 开发的新型社区软件,界面优雅,功能丰富,小巧迅速, 已在 Node.js 中文技术社区—— CNode 得到应用,但你完全可以用它搭建自己的社区。
3.3 Trello
Trello是团队流程协作和列表管理平台。
以下是 Trello 核心看开发者对 nodejs 的评论:
服务器端我们使用 Node.js 。我们知道我们需要将 client 端的更新即时传播出去。 这就意味着我们需要保持大量连接。因此,我们需要寻找一个事件驱动且无阻塞服务器。同时, Node 对于单页面应用也是个非常好的原型设计工具。最开始的 Trello Server基本上就是一个包含了一些函数的库。它们运行在一个单个的 Node.js 进程里,操作在内存中的一组 Model 对象。同时,客户端通过一个非 常轻的 WebSocket 封装接口可以直接调用这些函数。这让我们做 demo 的速度非常快,并且可以保证我们始终工作在正确的方向上。我们开始使用还在原 型中 Trello 去管理 Trello 和 Frog Creek 里其他项目的开发。
当我们完成原型之后,我们已经可以熟练的使用 Node 了。使用 Node 写程序的过程非常欢乐,而且我们也非常满意它的功能与性能。唔,是时候将 Trello 变成一个真正意义上的应用了。为了做到这一点,我们需要:
- 一个真实 DB 和 Schema
- 一个基本的 server, 支持分发和 cookie.
- 多个服务器进程与零宕机重启
- 通过 Redis 实现进程间 pubsub 和结构化数据的共享
Node 非常棒。同时,因为有活跃的开发社区大量推出新鲜实用的库, Node 将变得越来越好。我们使用了一个非常棒的异步库( async library ) 来保证我们的代码可控。
3.4 淘宝
淘宝是国内企业使用 Node.js 的主力,
- http://cnodejs.org 就是淘宝程序猿志愿搭建的国内最大的Node.js社区。
- 淘宝前端应用框架也有对应的 node 版本 nodejs-kissy
- 淘宝建设有 mysql 分布式集群的查询系统 node-myfox 。
node-myfox 是一个数据处理中间件,负责从一个MySQL集群中提取数据、计算并输出统计结果。用户提交一段SQL语句,node-myfox 根据该 SQL 命令的语义,生成各个数据库分片所需要执行的查询语句,并发送至各个分片,再将结果进行汇总和计算。 node-myfox 的特点是 CPU 密集,无文件 IO ,并只处理只读数据。node-myfox 应用于 淘宝指数 中。
3.5 Microsoft
微软也在 Node.js 上大作文章,Windows Azure(基于云计算的操作系统) 、 Skype 都在利用 Node.js 为其服务。
一向不喜欢开源软件微软与开源社区开展合作,建立一个 Node.js 的核心团队,为 Windows 打造 Node.js (2011年7月Node.js在微软的支持下发布Windows版本),并且在积极招聘全职的 Node.js 程序员。
... ...(游戏服务器、静态文件分发器)
4 动手实践
4.1 安装
Windows、*nix 以及 Mac OS X等都支持 Node.js,
- Windows下安装Node.js非常简单,直接从官网上(http://nodejs.org/download/)下载安装 .msi 文件即可。
- Linux下的安装依赖于C++编译器、Python_V[2.6,3.0)、libssl-dev。Ubuntu 下 直接输入
sudo apt-get install nodejs
命令即可完成安装。 - 无Mac,无真像。
Node.js的安装都会附带着安装包管理器 —— npm ,利用 npm 可以安装第三方包。
npm install [-g] xxxxx
4.2 Hello World
直接进入第一个 Demo(由 Node.js 官网提供),Programing 领域中著名的 Hello World 程序:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
将以上代码保存为 demo.js,开启命令终端输入:node demo.js,然后在浏览器中输入:http://127.0.0.1:1337/,你就完成了所谓的 Javascript 编写 WebServer 的整个过程。
4.3 文件管理器
现在我们要进一步深入,做一个带有实质功能的 Web 程序。该文件管理应用程序的功能点包括: Linux 操作系统下的文件列表展示、下载查看文件以及删除文件。
代码明天附上。
编写 Web 应用的缺点?
4.4 微博
绝大多数的 Web 程序是离不开数据库的。在这个微博项目里我们要较多的利用第三方包,包括 Web 框架 Express 、数据库 MongoDB以及ejs模版等。同时将前端框架 Bootstrap 整合进来减少开发量。
代码明天附上。
5 其他
5.1 待深入
Node.js 还有很多需要去学习和考虑的领域:
- CommonJS 规范
- Node.js 调试
- 编写模块和发布包
- 与其它 Server 的性能测试对比
- 后台工程师利用其进行云计算
5.2 学习资料
- 官方网站 —— http://nodejs.org
- CNode社区 —— http://cnodejs.org
- 深入浅出 Node.js 系列 —— InfoQ
- 《Node.js开发指南》
5.3 结束语
Node.js 不仅可以是前端工程师和后台开发工程师的有利工具,也可以是两者相互接触了解的一个桥梁。
路漫漫其修远兮,吾将上下而求索!
相关推荐
Full Stack Javascript - Learn Backbone.js, Node.js and MongoDB (APress 2015).epub Learning Node.js for Mobile Application Development (Packt 2015).pdf Microsoft Press Node.js for .NET Developers (2015...
Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...
Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...
Node.js 是一个开源、跨平台的 JavaScript 运行环境,它允许开发者在服务器端执行 JavaScript 代码。Node.js 使用 V8 引擎,这是 Google 为 Chrome 浏览器开发的高性能 JavaScript 和 WebAssembly 引擎。Node.js 的...
Node.js 是一个基于 JavaScript 的服务器端运行平台,允许开发者使用 JavaScript 语言来编写服务器端应用程序。 Node.js 的出现使得 JavaScript 成为服务器端脚本语言。 Node.js 的主要特点是非阻塞 I/O 和事件驱动...
Node.js 是一个开源、跨平台的 JavaScript 运行环境,它让开发者可以在服务器端执行 JavaScript 代码。Node.js 使用了 Google V8 引擎,这个引擎是为 Chrome 浏览器设计的,因此 Node.js 具有高性能和高效性的特点。...
Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...
总的来说,这个项目为移动开发者提供了一种新的可能性,即使用熟悉的JavaScript和Node.js工具链开发原生移动应用,这将降低跨平台开发的门槛,提高开发效率,并促进JavaScript生态系统在移动领域的进一步发展。
Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...
Node.js是一种开源、跨平台的JavaScript运行环境,它允许开发者在服务器端运行JavaScript代码,极大地扩展了JavaScript的应用领域。Node.js基于Chrome V8引擎,因此它具有高性能和高效的特性。标题提到的是Node.js的...
Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...
这个资料包包含了五本关于Node.js的电子书籍,涵盖了从基础到进阶的各个层面,对于学习和提升Node.js技术能力非常有帮助。 1. 《Node.js Web开发》 这本书全面介绍了使用Node.js构建Web应用程序的方法,包括Express...
Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...
《Node.JS Cookbook 2nd with source code》是由PACKT出版社出版的一本关于Node.js的实战指南,旨在帮助开发者深入理解和高效使用Node.js这一强大的服务器端JavaScript运行环境。本书是第二版,相较于第一版,应该...
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它让JavaScript开发者可以在服务器端执行代码,打破了传统的JavaScript只能在浏览器端运行的限制。这本《Node.js开发实战详解》电子书,显然是为了帮助那些...
Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...
From this book you will learn how to write maintainable server-side JavaScript using Node.js, how to test your code and deploy it on the internet. Table of Contents Chapter 1: Setting up for Node.js...
Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...
书由浅入深,全面、系统地介绍了Node.js开发技术。书中提供了大量有针对性的实例,供读者实践学习,同时提供了大量的实践练习题及详尽的解答,帮助读者进一步巩固和提高。本书重在代码实践,阅读时应多注重实践编程...