Node.js

来自Local Chinese Wikipedia
跳转到导航 跳转到搜索

Template:NoteTA 脚本错误:没有“Infobox”这个模块。脚本错误:没有“Check for unknown parameters”这个模块。

Node.js跨平台开源JavaScript 运行环境,可在 WindowsLinuxmacOS 等操作系统上运行。Node.js 由 OpenJS Foundation[1] (原为 Node.js Foundation,已与 JS Foundation 合并)持有和维护[2],亦为 Linux 基金会的项目[3]。Node.js 采用 Google 开发的 V8 执行程式码,使用事件驱动异步输入输出模型等技术来提高效能,可优化应用程序的传输量和规模。这些技术通常用于资料密集的即时应用程序。

Node.js 大部分基本模组都用 JavaScript 语言编写。在 Node.js 出现之前,JavaScript 通常作为用户端程式设计语言使用,以JavaScript 写出的程式常在用户的浏览器上执行。Node.js 的出现使 JavaScript 也能用于服务器端编程。Node.js 含有一系列内置模组,使得程式可以脱离 Apache HTTP ServerIIS,作为独立服务器执行。

目前,Node.js 已被IBM[4]Microsoft[5][6]Yahoo![7]Walmart[8]Groupon[9]SAP[10]LinkedIn[11][12]RakutenPayPal[13][14]Voxer[15]GoDaddy[16]等企业采用。

概览[编辑]

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

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

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

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

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

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

历史[编辑]

File:Ryan Dahl.jpg
Node.js的创始人瑞安·达尔,摄于2010年

Node.js于2009年写成,原始作者是美国软件工程师瑞安·达尔脚本错误:没有“Lang”这个模块。[25]。Node.js结合了GoogleV8、事件驱动模式和低级I/O接口[26],其设计灵感源自Flickr的一款上传进度栏:在上传过程中,浏览器并不清楚有多少文件已经发送到服务器,除非向服务器进行查询,于是达尔想出了一个更简便的方法[27]。Node.js的开发和维护工作由达尔本人主持,而他所在的Joyent公司也提供了赞助[28]。2009年11月8日,达尔在欧洲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的语言特性和“长期支持版本”的发布周期[43]。到了2016年,io.js宣布不再发布新版本,并建议开发者换回Node.js[44]

Template:Program execution

程式范例[编辑]

用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的函式都使用回呼函式

这种设计的缺点是,如果不使用cluster[45]、StrongLoop Process Manager[46]或pm2[47]等模组,Node.js就难以处理多核或多执行绪等情况。

V8[编辑]

脚本错误:没有“main”这个模块。 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[编辑]

脚本错误:没有“main”这个模块。

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不使用进程或线程处理连接,而是采用事件循环来处理并发连接。[48]而且Node.js的事件循环不需要手动调用。在回调函数定义之后,服务器进入事件循环。当回调函数均被执行完毕之后,Node.js结束事件循环。

开发工具[编辑]

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

替代品[编辑]

以下是兼容Node.js代码的运行时。

Bun[编辑]

Bun是用Zig语言编写的JavaScript运行时,支持JavaScript和TypeScript项目的测试、编译和运行。首个对外版本于2022年7月发布。[66]

参见[编辑]

脚本错误:没有“Portal”这个模块。

参考文献[编辑]

  1. Template:Cite web
    Template:Cite web
  2. Template:Cite web
  3. Template:Cite web
    Template:Cite web
  4. Template:Cite web
  5. Template:Cite web
  6. Template:Cite web
  7. Template:Cite web
  8. Template:Cite web
  9. Template:Cite web
  10. Template:Cite web
  11. Template:Cite web
  12. Template:Cite web
  13. Template:Cite web
  14. Template:Cite web
  15. The Node Ahead: JavaScript leaps from browser into future页面存档备份,存于互联网档案馆), The Register, March 1, 2011
  16. Why GoDaddy’s Nodejitsu deal is great for Node.js页面存档备份,存于互联网档案馆) , VentureBeat, February 10, 2015
  17. 17.0 17.1 17.2 Node.js for PHP Developers页面存档备份,存于互联网档案馆) , O'Reilly Media, Inc., 2013
  18. 18.0 18.1 18.2 Node.js Essentials页面存档备份,存于互联网档案馆) , Packt Publishing, 09-Sep-2014
  19. Smashing Node.js: JavaScript Everywhere页面存档备份,存于互联网档案馆) , John Wiley & Sons, 14-Aug-2012
  20. Modules页面存档备份,存于互联网档案馆) }, Nodejs Website
  21. Template:Cite book
  22. 22.0 22.1 Template:Cite web
  23. NodeConf页面存档备份,存于互联网档案馆
  24. Template:Cite web
  25. Template:Cite web
  26. 26.0 26.1 Professional Node.js: Building JavaScript Based Scalable Software页面存档备份,存于互联网档案馆) , John Wiley & Sons, 01-Oct-2012
  27. Template:Cite web
  28. Template:Cite web
  29. Sams Teach Yourself Node.js in 24 Hours页面存档备份,存于互联网档案馆) , Sams Publishing, 05-Sep-2012
  30. Template:Cite web
  31. Template:Cite web
  32. Template:Cite web
  33. Template:Cite web
  34. Template:Cite web
  35. Template:Cite web
  36. Template:Cite web
  37. Template:Cite web
  38. Template:Cite web
  39. Q&A: Why io.js decided to fork Node.js页面存档备份,存于互联网档案馆) , Infoworld Tech Watch
  40. Template:Cite web
  41. Template:Cite web
  42. Template:Cite web
  43. 43.0 43.1 Template:Cite web
  44. 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."
  45. cluster页面存档备份,存于互联网档案馆
  46. StrongLoop Process Manager页面存档备份,存于互联网档案馆
  47. pm2页面存档备份,存于互联网档案馆
  48. About Node.js页面存档备份,存于互联网档案馆) , Node.js Website
  49. Template:Cite web
  50. Template:Cite web
  51. Codiad页面存档备份,存于互联网档案馆
  52. Koa.js页面存档备份,存于互联网档案馆
  53. Hapi.js页面存档备份,存于互联网档案馆
  54. Node.js Framework Comparison: Express vs. Koa vs. Hapi页面存档备份,存于互联网档案馆), AirPair
  55. Template:Cite web
  56. Meteor页面存档备份,存于互联网档案馆
  57. Derby页面存档备份,存于互联网档案馆
  58. Sails
  59. Mean
  60. MeanJS页面存档备份,存于互联网档案馆
  61. Tower.js页面存档备份,存于互联网档案馆
  62. Nombo
  63. Geddy
  64. Compound页面存档备份,存于互联网档案馆
  65. Yahoo! Mojito
  66. Template:Cite web

外部链接[编辑]


Template:JavaScript Template:Node.js 脚本错误:没有“Authority control”这个模块。脚本错误:没有“Check for unknown parameters”这个模块。