Node.js

JavaScript运行环境

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

Node.js
原作者瑞安·達爾
開發者OpenJS Foundation英語OpenJS Foundation
首次釋出2009年5月28日,​15年前​(2009-05-28[1]
目前版本
  • 23.5.0(2024年12月19日;穩定版本)[2]
編輯維基數據連結
原始碼庫 編輯維基數據連結
程式語言CC++JavaScript
作業系統macOS, Linux, Windows, FreeBSD, OpenBSD[3]
類型事件驅動網絡
特許條款 編輯維基數據連結
網站nodejs.org 編輯維基數據

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

目前,Node.js 已被IBM[7]Microsoft[8][9]Yahoo![10]Walmart[11]Groupon[12]SAP[13]LinkedIn[14][15]RakutenPayPal[16][17]Voxer[18]GoDaddy[19]等企業採用。

概覽

Node.js可透過JavaScript和一系列模組來編寫伺服器端應用和網絡相關的應用。[20][21][22]核心模組包括檔案系統I/O、網絡(HTTPTCPUDPDNSTLS/SSL等)、二進制數據流、加密演算法、數據流等等。[21][23]Node模組的API形式簡單,降低了編程的複雜度。[21]

使用框架可以加速開發。常用的框架有Express.jsSocket.IO和Connect等。[24]Node.js的程式可以在Microsoft WindowsLinuxUnixMac OS X等伺服器上執行。Node.js也可以使用CoffeeScript(一種旨在簡化JavaScript的替代語言,其代碼可按照一定規則轉化為合法的JavaScript代碼)、TypeScript(微軟開發的強化了資料類型的JavaScript變體)、Dart語言,以及其他能夠編譯成JavaScript的語言編程。[25][25]

Node.js主要用於編寫像Web伺服器一樣的網絡應用,這和PHPPython是類似的。[20]但是Node.js與其他語言最大的不同之處在於,PHP等語言是阻塞的(只有前一條命令執行完畢才會執行後面的命令),而Node.js是非阻塞的(多條命令可以同時被執行,通過回呼函數得知命令已結束執行)。[20]

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[26][27]

歷史

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

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

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

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

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

程式範例

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

開發工具

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

替代品

以下是相容Node.js代碼的執行時。

Bun

Bun是用Zig語言編寫的JavaScript執行時,支援JavaScript和TypeScript專案的測試、編譯和執行。首個對外版本於2022年7月釋出。[69]

參見

參考文獻

  1. ^ Ry Dahl. Release v0.0.1 · nodejs/node. GitHub. 28 May 2009 [2019-12-24]. (原始內容存檔於2020-04-09) (英語). First! 
  2. ^ Release 23.5.0. 2024年12月19日 [2024年12月26日]. 
  3. ^ nodejs/node. GitHub. [2019-04-09]. (原始內容存檔於2019-04-22). 
  4. ^ The Linux Foundation. Node.js Foundation and JS Foundation Merge to Form OpenJS Foundation. Linux Foundation. The Linux Foundation. March 12, 2019 [2019-12-24]. (原始內容存檔於2020-08-03) (英語). 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]. (原始內容存檔於2019-12-06) (英語). the Node.js Foundation and the JS Foundation are merging to form the OpenJS Foundation. 
  5. ^ Node.js Foundation. Node.js. [4 July 2015]. (原始內容存檔於2015-07-05) (英語). 
  6. ^ Linux Foundation Collaborative Projects. Linux Foundation. [4 July 2015]. (原始內容存檔於2016-03-07) (英語). 
    Open Source Projects. Linux 基金會. [2019-12-24]. (原始內容存檔於2019-12-23) (中文(中國大陸)). 
  7. ^ IBM Bluemix. [4 July 2015]. (原始內容存檔於2019-10-18). 
  8. ^ Here's why you should be happy that Microsoft is embracing Node.js. The Guardian. November 9, 2011 [May 10, 2012]. (原始內容存檔於2013-07-25). 
  9. ^ WebMatrix - Front End Web Developers take note(ASP.NET, PHP, node.js and more). [2 August 2014]. (原始內容存檔於2015-08-03). 
  10. ^ Yahoo! Announces Cocktails Shaken, Not Stirred. [7 April 2015]. (原始內容存檔於2015年4月8日). 
  11. ^ Why Walmart is using Node.js. VentureBeat. January 24, 2012 [May 10, 2012]. (原始內容存檔於2015-08-29). 
  12. ^ Geitgey, Adam. I-Tier: Dismantling the Monoliths. Groupon. 30 October 2013 [30 April 2014]. (原始內容存檔於2015-09-10). 
  13. ^ SAP AppBuilder. SAP. March 10, 2014 [March 10, 2014]. (原始內容存檔於2015-08-17). 
  14. ^ You'll never believe how LinkedIn built its new iPad app. VentureBeat. May 2, 2012 [May 10, 2012]. (原始內容存檔於2015-08-12). 
  15. ^ Blazing fast node.js: 10 performance tips from LinkedIn Mobile. [7 April 2015]. (原始內容存檔於2015-09-10). 
  16. ^ Clash of the Titans: Releasing the Kraken, NodeJS @paypal. fluentconf.com. May 28, 2013 [September 11, 2013]. (原始內容存檔於2015-07-25). 
  17. ^ All such companies and their products in which Node.js is used. [2 August 2014]. (原始內容存檔於2015-08-10). 
  18. ^ The Node Ahead: JavaScript leaps from browser into future頁面存檔備份,存於互聯網檔案館), The Register, March 1, 2011
  19. ^ Why GoDaddy’s Nodejitsu deal is great for Node.js頁面存檔備份,存於互聯網檔案館) , VentureBeat, February 10, 2015
  20. ^ 20.0 20.1 20.2 Node.js for PHP Developers頁面存檔備份,存於互聯網檔案館) , O'Reilly Media, Inc., 2013
  21. ^ 21.0 21.1 21.2 Node.js Essentials頁面存檔備份,存於互聯網檔案館) , Packt Publishing, 09-Sep-2014
  22. ^ Smashing Node.js: JavaScript Everywhere頁面存檔備份,存於互聯網檔案館) , John Wiley & Sons, 14-Aug-2012
  23. ^ Modules頁面存檔備份,存於互聯網檔案館) }, Nodejs Website
  24. ^ Azat Mardan. Express.js Guide: The Comprehensive Book on Express.js. Azat Mardan, 2014. 2014-05-28 [2015-08-14]. (原始內容存檔於2015-07-13). 
  25. ^ 25.0 25.1 CoffeeScript on Node.js. O'Reilly Media, Inc. April 15, 2013 [May 17, 2015]. (原始內容存檔於2015-07-02). 
  26. ^ NodeConf頁面存檔備份,存於互聯網檔案館
  27. ^ Finley, Klint. NodeConf Schedule Announced. ReadWriteHack. April 7, 2011 [2 August 2014]. (原始內容存檔於2012年9月17日). 
  28. ^ About Node.js, and why you should add Node.js to your skill set?. Training.com. Training.com. [23 October 2016]. (原始內容存檔於2017-04-01). 
  29. ^ 29.0 29.1 Professional Node.js: Building JavaScript Based Scalable Software頁面存檔備份,存於互聯網檔案館) , John Wiley & Sons, 01-Oct-2012
  30. ^ 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]. (原始內容存檔於2014-10-18). 
  31. ^ Ryan Dahl. Joyent and Node. Google Groups. 2010-11-09 [2015-02-05]. (原始內容存檔於2011-01-22). 
  32. ^ Sams Teach Yourself Node.js in 24 Hours頁面存檔備份,存於互聯網檔案館) , Sams Publishing, 05-Sep-2012
  33. ^ Ryan Dahl at JSConf EU 2009. [2017-05-04]. (原始內容存檔於2017-05-14). 
  34. ^ Ryan Dahl at JSConf EU 2009 Video. [2017-05-04]. (原始內容存檔於2017-05-15). 
  35. ^ Video: Node.js by Ryan Dahl. [2017-05-04]. (原始內容存檔於2017-05-11). 
  36. ^ PHP 7 vs Node.js? They Can Be Partners, Not Competitors For a Developer!. [21 December 2016]. (原始內容存檔於2017-02-23). 
  37. ^ Earliest releases of npm. GitHub. [27 July 2016]. (原始內容存檔於2017-03-01). 
  38. ^ Porting Node to Windows With Microsoft's Help. [17 April 2016]. (原始內容存檔於2017-07-14). 
  39. ^ Dahl, Ryan. New gatekeeper. [26 October 2013]. (原始內容存檔於2011-01-22). 
  40. ^ Schlueter, Isaac. The Next Phase of Node.js. January 15, 2014 [21 January 2014]. (原始內容存檔於2017-07-14). 
  41. ^ Krill, Paul. Why io.js Decided to Fork Node.js. JavaWorld. Dec 4, 2014 [Dec 15, 2014]. (原始內容存檔於2017-06-30). 
  42. ^ Q&A: Why io.js decided to fork Node.js頁面存檔備份,存於互聯網檔案館) , Infoworld Tech Watch
  43. ^ Ben Noordhuis. Issue 3692: function suddenly becomes. V8 JavaScript Engine Issues. Nov 12, 2014 [2 February 2015]. (原始內容存檔於2015-11-01). 
  44. ^ Mikeal, Rogers. State of io.js. January 28, 2015 [2 February 2015]. (原始內容存檔於2015-08-30). 
  45. ^ Node.js Foundation Advances Community Collaboration, Announces New Members and Ratified Technical Governance. [4 July 2015]. (原始內容存檔於2015年6月24日). 
  46. ^ 46.0 46.1 Node.js Foundation Combines Node.js and io.js Into Single Codebase in New Release. [28 Jan 2016]. (原始內容存檔於2017-01-07). 
  47. ^ 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."
  48. ^ cluster頁面存檔備份,存於互聯網檔案館
  49. ^ StrongLoop Process Manager頁面存檔備份,存於互聯網檔案館
  50. ^ pm2頁面存檔備份,存於互聯網檔案館
  51. ^ About Node.js頁面存檔備份,存於互聯網檔案館) , Node.js Website
  52. ^ Node.js Tools for Visual Studio. Codeplex. [2 August 2014]. (原始內容存檔於2018-01-16). 
  53. ^ Bergius: Flowhub and the GNOME Developer Experience. LWN.net. 2014-05-02 [2014-05-24]. (原始內容存檔於2018-12-26). 
  54. ^ Codiad頁面存檔備份,存於互聯網檔案館
  55. ^ Koa.js頁面存檔備份,存於互聯網檔案館
  56. ^ Hapi.js頁面存檔備份,存於互聯網檔案館
  57. ^ Node.js Framework Comparison: Express vs. Koa vs. Hapi頁面存檔備份,存於互聯網檔案館), AirPair
  58. ^ Peter Wayner. 13 fabulous frameworks for Node.js. InfoWorld. 21 May 2014 [4 July 2015]. (原始內容存檔於2015-08-09). 
  59. ^ Meteor頁面存檔備份,存於互聯網檔案館
  60. ^ Derby頁面存檔備份,存於互聯網檔案館
  61. ^ Sails
  62. ^ Mean
  63. ^ MeanJS頁面存檔備份,存於互聯網檔案館
  64. ^ Tower.js頁面存檔備份,存於互聯網檔案館
  65. ^ Nombo
  66. ^ Geddy
  67. ^ Compound頁面存檔備份,存於互聯網檔案館
  68. ^ Yahoo! Mojito
  69. ^ Jarred Sumner. Bun v0.1.1. Bun. 2022-07-05 [2023-06-19]. (原始內容存檔於2023-09-26) (英語). 

外部連結