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

Node.js

维基百科,自由的百科全书
跳转至: 导航搜索
Node.js
Node.js logo.svg
原作者 瑞安·達爾(Ryan Lienhart Dahl)
開發者 Node.js开发者Joyent英语Joyent、其他贡献者
穩定版本 8.2.1 & 6.11.1 (LTS)(2017年7月20日,​2個月前​(2017-07-20[1] & 2017年7月11日,​2個月前​(2017-07-11[2]
開發狀態 活躍
编程语言 C++JavaScript
操作系统 Mac OS XLinuxSolaris
FreeBSDOpenBSDWindows(較舊的版本需要Cygwin)、webOS
类型 事件驅動網路
许可协议 MIT許可證
網站 https://nodejs.org/
源代码库 github.com/nodejs/node

Node.js是一個能夠在伺服器端運行JavaScript開放原始碼跨平台JavaScript執行環境。Node.js由Node.js基金會持有和維護[3],並與Linux基金會有合作關係[4]。Node.js採用Google開發的V8執行程式碼,使用事件驅動非阻塞非同步輸入輸出模型等技術來提高效能,可優化應用程式的傳輸量和規模。這些技術通常用於資料密集的事實應用程式。

Node.js大部分基本模組都用JavaScript語言編寫。在Node.js出現之前,JavaScript通常作為用戶端程式設計語言使用,以JavaScript寫出的程式常在用戶的瀏覽器上執行。Node.js的出現使JavaScript也能用於伺服器端編程。Node.js含有一系列內置模組,使得程式可以脫離Apache HTTP ServerIIS,作為獨立伺服器執行。

目前,Node.js已被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),摄于2010年

Node.js于2009年写成,其原始作者是瑞安·达尔(Ryan Dahl),[25]。Node.js结合了GoogleV8引擎、事件驱动模式和低级I/O接口[26],其设计灵感源自Flickr的一款上传进度栏:在上传过程中,浏览器并不清楚有多少文件已经发送到服务器,除非向服务器进行查询,于是达尔想出了一个更简便的方法[27]。Node.js的开发和维护工作由达尔本人主持,而他所在的Joyent英语Joyent公司也提供了赞助[28]。2009年11月8日,Dahl在欧洲JSConf大会上展示了Node.js项目[29][30][31],并受到了观众赞赏[32]。在演讲中,达尔针对Apache HTTP Server和顺序编程方式提出了批评,认为Apache处理大量并发连接(10,000甚至更多)的可能性有限,而且顺序编程方式在多连接情况下会造成阻塞,或者消耗更多资源;而Node.js提供了基于事件驱动和非阻塞的接口,可用于编写高并发状态下的程序,而且JavaScript的匿名函数、闭包、回调函数等特性就是为事件驱动而设计的[33]

2010年1月,一款名为“npm”的软件包管理系统诞生[34]。npm使程序员能够更方便地发布和分享Node.js类库及源代码,而且简化了类库安装、升级与卸载的过程[26]。Node.js最初只支持Linux和Mac OS X操作系统。2011年6月,微软和Joyent共同合作,把Node.js移植到了Windows系统上面[35],并且在7月发布了第一个正式支持Windows系统的版本。

2012年1月,达尔离开了Node.js项目,开发工作由他的同事以及npm创始人艾薩克·施呂特(Isaac Schlueter)继续主持[36]。2014年2月,蒂莫西·费里斯(Timothy J. Fontaine)接任项目主管[37]

由于长期对Joyent的管理感到不满,Node.js核心开发者Fedor Indutny在2014年12月制作了分支版本,并起名“io.js”。与Node.js相对的是,io.js采用开放管理模式进行管理[38][39],并计划始终采用最新版的V8引擎[40][41]。为了在用户、厂商和开发者之间取得平衡,Node.js基金会于2015年初成立。基金会得到了IBM、Intel、微软、Joyent等公司的支持。6月,Node.js和io.js开发者社区共同决定合并到Node.js基金会之下[42]。同年9月,Node 4.0发布,Node.js和io.js正式合并[43]。4.0版引入了ES6的语言特性和“长期支持版本”的发布周期[44]。到了2016年,io.js宣布不再发布新版本,并建议开发者换回Node.js[45]

程式範例[编辑]

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

const http = require('http');

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

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

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

const net = require('net');

net.createServer(stream => {
  stream.write('hello\r\n');
  stream.on('end', () => 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不使用进程或线程处理连接,而是采用事件循环来处理并发连接。[46]而且Node.js的事件循环不需要手动调用。在回调函数定义之后,服务器进入事件循环。当回调函数均被执行完毕之后,Node.js结束事件循环。

开发工具[编辑]

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

替代品[编辑]

JXcore[编辑]

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

其他语言[编辑]

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

参考文献[编辑]

  1. ^ Node.js Changelog. [21 July 2017]. 
  2. ^ Node.js Changelog. [2017-06-27]. 
  3. ^ Node.js Foundation - Node.js. [4 July 2015]. 
  4. ^ Linux Foundation Collaborative Projects. [4 July 2015]. 
  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, and why you should add Node.js to your skill set?. Training.com. Training.com. [23 October 2016]. 
  26. ^ 26.0 26.1 Professional Node.js: Building JavaScript Based Scalable Software, John Wiley & Sons, 01-Oct-2012
  27. ^ Harris, Amber. The Birth of Node: Where Did it Come From? Creator Ryan Dahl Shares the History. Devops Angle. April 1, 2012 [26 October 2013]. 
  28. ^ Ryan Dahl. Joyent and Node. Google Groups. 2010-11-09 [2015-02-05]. 
  29. ^ Sams Teach Yourself Node.js in 24 Hours, Sams Publishing, 05-Sep-2012
  30. ^ Ryan Dahl at JSConf EU 2009. 
  31. ^ Ryan Dahl at JSConf EU 2009 Video. 
  32. ^ Video: Node.js by Ryan Dahl. 
  33. ^ PHP 7 vs Node.js? They Can Be Partners, Not Competitors For a Developer!. [21 December 2016]. 
  34. ^ Earliest releases of npm. GitHub. [27 July 2016]. 
  35. ^ Porting Node to Windows With Microsoft's Help. [17 April 2016]. 
  36. ^ Dahl, Ryan. New gatekeeper. [26 October 2013]. 
  37. ^ Schlueter, Isaac. The Next Phase of Node.js. January 15, 2014 [21 January 2014]. 
  38. ^ Krill, Paul. Why io.js Decided to Fork Node.js. JavaWorld. Dec 4, 2014 [Dec 15, 2014]. 
  39. ^ Q&A: Why io.js decided to fork Node.js, Infoworld Tech Watch
  40. ^ Ben Noordhuis. Issue 3692: function suddenly becomes undefined. V8 JavaScript Engine Issues. Nov 12, 2014 [2 February 2015]. 
  41. ^ Mikeal, Rogers. State of io.js. January 28, 2015 [2 February 2015]. 
  42. ^ Node.js Foundation Advances Community Collaboration, Announces New Members and Ratified Technical Governance. [4 July 2015]. 
  43. ^ Node.js Foundation Combines Node.js and io.js Into Single Codebase in New Release. [28 Jan 2016]. 
  44. ^ Node.js Foundation Combines Node.js and io.js Into Single Codebase in New Release. [28 Jan 2016]. 
  45. ^ Io.js, JavaScript I/O, "io.js has merged with the Node.js project again. There won't be any further io.js releases. All of the features in io.js are available in Node.js v4 and above."
  46. ^ About Node.js, Node.js Website
  47. ^ Node.js Tools for Visual Studio. Codeplex. [2 August 2014]. 
  48. ^ Bergius: Flowhub and the GNOME Developer Experience. LWN.net. 2014-05-02 [2014-05-24]. 
  49. ^ Node.js Framework Comparison: Express vs. Koa vs. Hapi, AirPair
  50. ^ Peter Wayner. 13 fabulous frameworks for Node.js. InfoWorld. 21 May 2014 [4 July 2015]. 
  51. ^ Serdar Yegulalp. Node.js fork JXcore goes open source, aims for mobile developers. InfoWorld. 20 February 2015 [4 July 2015]. 

外部連結[编辑]

参见[编辑]