Node.js

本页使用了标题或全文手工转换,现处于澳门繁体模式
求聞百科,共筆求聞
Node.js
原作者瑞安·達爾
開發者Node.js開發者Joyent及其他貢獻者
首次釋出2009年5月28日,​14年前​(2009-05-28[1]
程式語言CC++JavaScript
作業系統macOS, Linux, Windows, FreeBSD, OpenBSD[2]
類型事件驅動網路
特許條款MIT特許條款

Node.js 是能夠在伺服器端執行 JavaScript開放原始碼跨平台執行環境。Node.js 由 OpenJS Foundation[3](原為 Node.js Foundation,已與 JS Foundation 合併)持有和維護[4],亦為 Linux 基金會的專案[5]。Node.js 採用 Google 開發的 V8 執行程式碼,使用事件驅動非阻塞非同步輸入輸出模型等技術來提高效能,可最佳化應用程式的傳輸量和規模。這些技術通常用於資料密集的即時應用程式。

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

目前,Node.js 已被IBM[6]Microsoft[7][8]Yahoo!Walmart[9]Groupon[10]SAP[11]LinkedIn[12][13]RakutenPayPal[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引擎,因為:

  • V8是基於BSD特許條款的開源軟件
  • V8速度非常快
  • V8專注於網絡功能,在HTTP、DNS、TCP等方面更加成熟

Node.js已經有數十萬模組,它們可以透過一個名為npm的管理器免費下載。Node.js開發社區主要有兩個郵寄清單、一個在freenode的名為#node.js的IRC頻道。社區集中在NodeConf[23][24]

歷史

Node.js的創始人瑞安·達爾,攝於2010年

Node.js於2009年寫成,原始作者是瑞安·達爾[25]。Node.js結合了GoogleV8、事件驅動模式和低階I/O介面[26],其設計靈感源自Flickr的一款上載進度欄:在上載過程中,瀏覽器並不清楚有多少檔案已經傳送到伺服器,除非向伺服器進行查詢,於是達爾想出了一個更簡便的方法[27]。Node.js的開發和維護工作由達爾本人主持,而他所在的Joyent公司也提供了贊助[28]。2009年11月8日,達爾在歐洲JSConf大會上展示了Node.js專案[29][30],並受到了觀眾讚賞[31]。在演講中,達爾針對Apache HTTP Server和順序編程方式提出了批評,認為Apache處理大量並行連接(10,000甚至更多)的可能性有限,而且順序編程方式在多連接情況下會造成阻塞,或者消耗更多資源;而Node.js提供了基於事件驅動和非阻塞的介面,可用於編寫高並行狀態下的程式,而且JavaScript的匿名函數、閉包、回呼函數等特性就是為事件驅動而設計的[32]

2010年1月,一款名為「npm」的軟件套件管理系統誕生[33]。npm使程式設計師能夠更方便地釋出和分享Node.js類別館及原始碼,而且簡化了類別館安裝、升級與解除安裝的過程[26]。Node.js最初只支援Linux和Mac OS X作業系統。2011年6月,微軟和Joyent共同合作,把Node.js移植到了Windows系統上面[34],並且在7月釋出了第一個正式支援Windows系統的版本。

2012年1月,達爾離開了Node.js專案,開發工作由他的同事以及npm創始人艾薩克·施呂特(Isaac Schlueter)繼續主持[35]。2014年2月,蒂莫西·費里斯(Timothy J. Fontaine)接任專案主管[36]

由於長期對Joyent的管理感到不滿,Node.js核心開發者Fedor Indutny在2014年12月製作了分支版本,並起名「io.js」。與Node.js相對的是,io.js採用開放管理模式進行管理[37][38],並計劃始終採用最新版的V8引擎[39][40]。為了在用戶、廠商和開發者之間取得平衡,Node.js基金會於2015年初成立。基金會得到了IBM、Intel、微軟、Joyent等公司的支援。6月,Node.js和io.js開發者社區共同決定合併到Node.js基金會之下[41]。同年9月,Node 4.0釋出,Node.js和io.js正式合併[42]。4.0版引入了ES6的語言特性和「長期支援版本」的釋出周期[42]。到了2016年,io.js宣佈不再釋出新版本,並建議開發者換回Node.js[43]

程式範例

用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[44]、StrongLoop Process Manager[45]或pm2[46]等模組,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不使用行程或線程處理連接,而是採用事件迴圈來處理並行連接。[47]而且Node.js的事件迴圈不需要手動呼叫。在回呼函數定義之後,伺服器進入事件迴圈。當回呼函數均被執行完畢之後,Node.js結束事件迴圈。

開發工具

桌面IDE
線上編輯器
執行時和除錯器
框架

替代品

JXcore

JXcore是一個開放原始碼的Node.js的分支,旨在支援流動裝置和物聯網。第一個Beta版本於2014年1月釋出。它於2015年2月13日開源[64]並且可從GitHub倉庫[65]獲得。JXcore同時使用Google V8Mozilla SpiderMonkey兩個引擎。因此JXcore可以通過Mozilla SpiderMonkey在iOS裝置上執行Node應用程式。

其他語言

類似的語言和開發環境有:

參見

參考文獻

  1. Ry Dahl. Release v0.0.1 · nodejs/node. GitHub. 2009-05-28 [2019-12-24] (英語). First! 
  2. nodejs/node. GitHub. [2019-04-09]. 
  3. The Linux Foundation. Node.js Foundation and JS Foundation Merge to Form OpenJS Foundation. Linux Foundation. The Linux Foundation. 2019-03-12 [2019-12-24] (英語). OPEN SOURCE LEADERSHIP SUMMIT, Half Moon Bay, Calif. — March 12, 2019 — The Node.js Foundation and the JS Foundation today announced they are merging to form the OpenJS Foundation. 
    Node.js. Introducing the OpenJS Foundation: The Next Phase of JavaScript Ecosystem Growth. Medium. Mar 13, 2019 [2019-12-24] (英語). the Node.js Foundation and the JS Foundation are merging to form the OpenJS Foundation. 
  4. Node.js Foundation. Node.js. [2015-07-04] (英語). 
  5. Linux Foundation Collaborative Projects. Linux Foundation. [2015-07-04] (英語). 
    Open Source Projects. Linux 基金會. [2019-12-24] (簡體中文(中國大陸)). 
  6. IBM Bluemix. [2015-07-04]. 
  7. Here's why you should be happy that Microsoft is embracing Node.js. The Guardian. 2011-11-09 [2012-05-10]. 
  8. WebMatrix - Front End Web Developers take note(ASP.NET, PHP, node.js and more). [2014-08-02]. 
  9. Why Walmart is using Node.js. VentureBeat. 2012-01-24 [2012-05-10]. 
  10. Geitgey, Adam. I-Tier: Dismantling the Monoliths. Groupon. 2013-10-30 [2014-04-30]. 
  11. SAP AppBuilder. SAP. 2014-03-10 [2014-03-10]. 
  12. You'll never believe how LinkedIn built its new iPad app. VentureBeat. 2012-05-02 [2012-05-10]. 
  13. Blazing fast node.js: 10 performance tips from LinkedIn Mobile. [2015-04-07]. 
  14. All such companies and their products in which Node.js is used. [2014-08-02]. 
  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. Azat Mardan. Express.js Guide: The Comprehensive Book on Express.js. Azat Mardan, 2014. 2014-05-28. 
  22. 22.0 22.1 CoffeeScript on Node.js. O'Reilly Media, Inc. 2013-04-15. 
  23. NodeConf
  24. Finley, Klint. NodeConf Schedule Announced. ReadWriteHack. 2011-04-07 [2014-08-02]. 
  25. About Node.js, and why you should add Node.js to your skill set?. Training.com. Training.com. [2016-10-23]. 
  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. 2012-04-01 [2013-10-26]. 
  28. Ryan Dahl. Joyent and Node. Google Groups. 2010-11-09. 
  29. Sams Teach Yourself Node.js in 24 Hours , Sams Publishing, 05-Sep-2012
  30. Ryan Dahl at JSConf EU 2009. [2017-05-04]. 
  31. Video: Node.js by Ryan Dahl. [2017-05-04]. 
  32. PHP 7 vs Node.js? They Can Be Partners, Not Competitors For a Developer!. [2016-12-21]. 
  33. Earliest releases of npm. GitHub. [2016-07-27]. 
  34. Porting Node to Windows With Microsoft's Help. [2016-04-17]. 
  35. Dahl, Ryan. New gatekeeper. [2013-10-26]. 
  36. Schlueter, Isaac. The Next Phase of Node.js. 2014-01-15 [2014-01-21]. 
  37. Krill, Paul. Why io.js Decided to Fork Node.js. JavaWorld. Dec 4, 2014 [Dec 15, 2014]. 
  38. Q&A: Why io.js decided to fork Node.js , Infoworld Tech Watch
  39. Ben Noordhuis. Issue 3692: function suddenly becomes. V8 JavaScript Engine Issues. Nov 12, 2014. 
  40. Mikeal, Rogers. State of io.js. 2015-01-28 [2015-02-02]. 
  41. Node.js Foundation Advances Community Collaboration, Announces New Members and Ratified Technical Governance. [2015-07-04]. 
  42. 42.0 42.1 Node.js Foundation Combines Node.js and io.js Into Single Codebase in New Release. [28 Jan 2016]. 
  43. 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."
  44. cluster
  45. StrongLoop Process Manager
  46. pm2
  47. About Node.js , Node.js Website
  48. Node.js Tools for Visual Studio. Codeplex. [2014-08-02]. 
  49. Bergius: Flowhub and the GNOME Developer Experience. LWN.net. 2014-05-02 [2014-05-24]. 
  50. Codiad
  51. Koa.js
  52. Hapi.js
  53. Node.js Framework Comparison: Express vs. Koa vs. Hapi , AirPair
  54. Peter Wayner. 13 fabulous frameworks for Node.js. InfoWorld. 2014-05-21 [2015-07-04]. 
  55. Meteor
  56. Derby
  57. Sails
  58. Mean
  59. MeanJS
  60. Tower.js
  61. Nombo
  62. Geddy
  63. Compound
  64. Serdar Yegulalp. Node.js fork JXcore goes open source, aims for mobile developers. InfoWorld. 2015-02-20 [2015-07-04]. 
  65. repository
  66. Luvit

外部連結