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」這個模塊。