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”这个模块。