本页使用了标题或全文手工转换

Node.js

维基百科,自由的百科全书
跳转至: 导航搜索
Node.js
Node.js Logo
原作者 Ryan Lienhart Dahl
開發者 Node.js Developers
穩定版本 4.4.5 LTS
6.2.1(2016年6月2日,​2個月前​(2016-06-02[1]
預覽版本 版本列表
開發狀態 活躍
编程语言 C++JavaScript
操作系统 Mac OS XLinuxSolarisFreeBSDOpenBSDWindows(較舊的版本需要Cygwin)、webOS
类型 事件驅動網路
许可协议 MIT許可證
網站 http://nodejs.org/

Node.js是一个开放源代码跨平台的、可用于伺服器端和网络应用的运行环境。Node.js应用JavaScript语言写成,在Node.js运行时运行。它支持OS XMicrosoft WindowsLinuxFreeBSDNonStopIBM AIXIBM System zIBM i。Node.js由Node.js基金会拥有和维护[2],该基金会与Linux基金会有合作关系[3]

Node.js提供事件驱动非阻塞I/O API,可优化应用程序的吞吐量和规模。这些技术通常被用于实时应用程序。

Node.js采用GoogleV8引擎来执行代码。Node.js的大部分基本模块都是用JavaScript写成的。Node.js含有一系列内置模块,使得程序可以作为独立服务器运行,从而脱离Apache HTTP ServerIIS运行。

Node.js正在向服务器端平台发展[4],并已被IBM[5]Microsoft[6][7]Yahoo![8]Walmart[9]Groupon[10]SAP[11]LinkedIn[12][13]RakutenPayPal[14][15]Voxer[16]GoDaddy[17]等采用。

概览[编辑]

Node.js允许通过JavaScript和一系列模块来编写服务器端应用和网络相关的应用。[18][19][20]核心模块包括文件系统I/O、网络(HTTPTCPUDPDNSTLS/SSL等)、二进制数据流、加密算法、数据流等等。[19][21]Node模块的API形式简单,降低了编程的复杂度。[19]

使用框架可以加速开发。常用的框架有Express.jsSocket.IO和Connect等。[22]Node.js的程序可以在Microsoft WindowsLinuxUnixMac OS X等服务器上运行。Node.js也可以使用CoffeeScript(一种旨在简化JavaScript的替代语言,其代码可按照一定规则转化为合法的JavaScript代码)、TypeScript(微软开发的强化了数据类型的JavaScript变体)、Dart语言,以及其他能够编译成JavaScript的语言编程。[23][23]

Node.js主要用于编写像Web服务器一样的网络应用,这和PHPPython是类似的。[18]但是Node.js与其他语言最大的不同之处在于,PHP等语言是阻塞的(只有前一条命令执行完毕才会执行后面的命令),而Node.js是非阻塞的(多条命令可以同时被运行,通过回调函数得知命令已结束运行)。[18]

Node.js是事件驱动的。开发者可以在不使用线程的情况下开发出一个能够承载高并发的服务器。其他服务器端语言难以开发高并发应用,而且即使开发出来,性能也不尽人意。Node.js正是在这个前提下被创造出来。Node.js把JavaScript的易学易用和Unix网络编程的强大结合到了一起。

Node.js使用Google V8 JavaScript 引擎,因为:

  • V8是基于BSD许可证的开源软件
  • V8速度非常快
  • V8专注于网络功能,在HTTP、DNS、TCP等方面更加成熟

Node.js已经有数十万模块,它们可以通过一个名为npm的管理器免费下载。Node.js开发社区主要有两个邮件列表、一个在freenode的名为#node.js的IRC频道。社区集中在NodeConf[24]

历史[编辑]

Node.js 由 Ryan Dahl 和一些其他的开发者于2009年在 Joyent 工作时发明。Node.js 在2009年初次发布于Linux。 开发和维护工作由 Dahl 主持,其工作单位 Joyent英语Joyent 同时赞助这些工作。

Dahl 设计 Node.js 的灵感来自于 Flickr 上的一款上传进度栏,浏览器并不清楚多少文件内容已被上传,除非向服务器进行查询。Dahl 于是设计了一个更简便的方法。

这个集成了 Google V8 JavaScript 引擎和一个底层 I/O API 的项目由 Dahl 在 inaugural European JSConf 向公众进行展示。项目受到了很多赞赏。

程式範例[编辑]

用Node.js撰寫的HTTP Serverhello world範例:

var http = require('http');

http.createServer(function (request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Hello World\n');
}).listen(8000);

console.log('Server running at http://127.0.0.1:8000/');

另一個簡單的TCP伺服器範例,監聽(Listening)端口7000並輸出 (echo)之前輸入的訊息:

var net = require('net');

net.createServer(function (stream) {
    stream.write('hello\r\n');

    stream.on('end', function () {
        stream.end('goodbye\r\n');
    });

    stream.pipe(stream);
}).listen(7000);

技术[编辑]

线程[编辑]

Node.js以单线程运行,使用非阻塞I/O调用,这样既可以支持数以万计的并发连接,又不会因多线程本身的特点而带来麻烦。众多请求只使用单线程的设计意味着可以用于建立高并发应用程序。Node.js应用程序的设计目标是任何需要操作I/O的函数都使用回调函数

这种设计的缺点是,如果不使用clusterStrongLoop Process Managerpm2等模块,Node.js就难以处理多核或多线程等情况。

V8[编辑]

V8是为Google Chrome设计的JavaScript运行引擎,Google于2008年将其开源。V8用C++写成,它将JavaScript源代码编译成本地机器码而不是随时解释。

Node.js用libuv来处理异步事件,而V8提供了JavaScript的实时运行环境。libuv是一个网络和文件系统功能的抽象层,既可以用于Windows又可以用于符合POSIX标准的系统,例如Linux、OS X和Unix。

Node.js的核心功能被包含进一个JavaScript库,并通过C++将各部分与操作系统进行联系。

npm[编辑]

npm是Node.js附带的包管理器。npm是一个命令行工具,用于从NPM Registry中下载、安装Node.js程序,同时解决依赖问题。npm提高了开发的速度,因为它能够负责第三方Node.js程序的安装与管理。

统一API[编辑]

Node.js将浏览器、数据(例如MongoDBCouchDB)等组合到一起,通过JSON提供一个统一的接口。由于前端框架和一些基本的后端开发技术(如MVCMVPMVVM等)变得流行,Node.js也支持客户端和服务器端重新利用相同的模型和接口。

事件循环[编辑]

Node.js将其注册到操作系统中,这样可以及时注意到新连接的产生。当新连接产生时,操作系统会产生一个回调。在Node.js运行时内部,每个连接都被分配一个小型的堆。与其他服务器程序不同的是,Node.js不使用进程或线程处理连接,而是采用事件循环来处理并发连接。[25]而且Node.js的事件循环不需要手动调用。在回调函数定义之后,服务器进入事件循环。当回调函数均被执行完毕之后,Node.js结束事件循环。

开发工具[编辑]

桌面IDE
在线编辑器
运行时和调试器
框架

替代品[编辑]

io.js[编辑]

io.js
io.js logo
原作者 Fedor Indutny
開發者 io.js Developers, GitHub Contributors
初始版本 2015年1月14日 (2015-01-14)[30]
穩定版本 2.0.1(2015年5月7日 (2015-05-07)[31]
預覽版本 2.0.2-nightly20150512c58264e58b(2015年5月12日 (2015-05-12)[32]
開發狀態 活跃的
编程语言 C, C++, JavaScript
操作系统 OS X, Linux, Microsoft Windows
类型 事件驱动
许可协议 MIT
網站 iojs.org

io.js由Node.js分支而来。最早于2014年12月被一个Node.js项目的贡献者分支出来。[33]io.js希望在2015年3月能够发布稳定版本。[34]io.js从Node.js独立出来,因为作者对Node.js的管理模式感到不满,希望能够采用开放治理模式进行管理。[35]

和Node.js一样,io.js也是开放源代码的、跨平台的实时运行环境,用于服务器端和网络应用程序,并且也是用JavaScript写成。io.js同样提供事件驱动和非阻塞I/O的API。

io.js也使用Google V8 JavaScript引擎来执行代码,但是和Node.js不同的是,io.js倾向于不断更新以使用最新版本的引擎。[36][34]

在2015年5月15日,io.js组织发起了一次投票并决定将io.js重新合并到Node.js中,并成立一个新的Node基金会。[37]合并后的组织被称作“nodejs”。

JXcore[编辑]

JXcore是一个开放源代码的Node.js的分支,旨在支持移动设备和物联网。第一个Beta版本于2014年1月发布。它于2015年2月13日开源[38]并且可从GitHub repository获得。JXcore同时使用Google V8Mozilla SpiderMonkey两个引擎。因此JXcore可以通过Mozilla SpiderMonkey在iOS设备上运行Node应用程序。

其他语言[编辑]

类似的语言和开发环境有:

社群[编辑]

一个十分活跃的Node.js社群集中在nodejsnodejs-dev这两个邮件列表上。Node.js的IRC频道#node.js在freenode上。

NodeConf是一个开发者们集中讨论Node.js的社群年度聚会。[39]

Node.js中文社區是由中國開發者發起的社區。

Node.js Taiwan是由台灣開發者的Node.js社群,每兩週會在Changee舉行Node.js Taiwan Party。

参考文献[编辑]

  1. ^ Node.js ChangeLog. [2016-06-02]. 
  2. ^ Node.js Foundation - Node.js. [4 July 2015]. 
  3. ^ Linux Foundation Collaborative Projects. [4 July 2015]. 
  4. ^ Industry Usage, Node.js Website
  5. ^ IBM Bluemix. [4 July 2015]. 
  6. ^ Here's why you should be happy that Microsoft is embracing Node.js. The Guardian. November 9, 2011 [May 10, 2012]. 
  7. ^ WebMatrix - Front End Web Developers take note(ASP.NET, PHP, node.js and more). [2 August 2014]. 
  8. ^ Yahoo! Announces Cocktails Shaken, Not Stirred. [7 April 2015]. 
  9. ^ Why Walmart is using Node.js. VentureBeat. January 24, 2012 [May 10, 2012]. 
  10. ^ Geitgey, Adam. I-Tier: Dismantling the Monoliths. Groupon. 30 October 2013 [30 April 2014]. 
  11. ^ SAP AppBuilder. SAP. March 10, 2014 [March 10, 2014]. 
  12. ^ You'll never believe how LinkedIn built its new iPad app. VentureBeat. May 2, 2012 [May 10, 2012]. 
  13. ^ Blazing fast node.js: 10 performance tips from LinkedIn Mobile. [7 April 2015]. 
  14. ^ Clash of the Titans: Releasing the Kraken, NodeJS @paypal. fluentconf.com. May 28, 2013 [September 11, 2013]. 
  15. ^ All such companies and their products in which Node.js is used. [2 August 2014]. 
  16. ^ The Node Ahead: JavaScript leaps from browser into future, The Register, March 1, 2011
  17. ^ Why GoDaddy’s Nodejitsu deal is great for Node.js, VentureBeat, February 10, 2015
  18. ^ 18.0 18.1 18.2 Node.js for PHP Developers, O'Reilly Media, Inc., 2013
  19. ^ 19.0 19.1 19.2 Node.js Essentials, Packt Publishing, 09-Sep-2014
  20. ^ Smashing Node.js: JavaScript Everywhere, John Wiley & Sons, 14-Aug-2012
  21. ^ Modules, Nodejs Website
  22. ^ Express.js Guide: The Comprehensive Book on Express.js, Azat Mardan, 28-May-2014
  23. ^ 23.0 23.1 CoffeeScript on Node.js. O'Reilly Media, Inc. April 15, 2013 [May 17, 2015]. 
  24. ^ Finley, Klint. NodeConf Schedule Announced. ReadWriteHack. April 7, 2011 [2 August 2014]. 
  25. ^ About Node.js, Node.js Website
  26. ^ Node.js Tools for Visual Studio. Codeplex. [2 August 2014]. 
  27. ^ Bergius: Flowhub and the GNOME Developer Experience. LWN.net. 2014-05-02 [2014-05-24]. 
  28. ^ Node.js Framework Comparison: Express vs. Koa vs. Hapi, AirPair
  29. ^ Peter Wayner. 13 fabulous frameworks for Node.js. InfoWorld. 21 May 2014 [4 July 2015]. 
  30. ^ Release v1.0.0-release. [2 February 2015]. 
  31. ^ Release v2.0.1. [13 May 2015]. 
  32. ^ Index of /download/nightly/v2.0.2-nightly20150512c58264e58b/. [13 May 2015]. 
  33. ^ Q&A: Why io.js decided to fork Node.js, Infoworld Tech Watch
  34. ^ 34.0 34.1 Mikeal, Rogers. State of io.js. January 28, 2015 [2 February 2015]. 
  35. ^ Node.js 分裂,开发者创建分支 io.js. 
  36. ^ Ben Noordhuis. Issue 3692: function suddenly becomes undefined. V8 JavaScript Engine Issues. Nov 12, 2014 [2 February 2015]. 
  37. ^ io.js and Node.js merge. [27 June 2015]. 
  38. ^ Serdar Yegulalp. Node.js fork JXcore goes open source, aims for mobile developers. InfoWorld. 20 February 2015 [4 July 2015]. 
  39. ^ http://www.readwriteweb.com/hack/2011/04/nodeconf-schedule-announced.php

外部連結[编辑]

参见[编辑]