Node.js
| 原作者 | 瑞安·達爾(Ryan Lienhart Dahl) |
|---|---|
| 開發者 | Node.js開發者、Joyent、其他貢獻者 |
| 穩定版本 | 7.10.0 & 6.10.3(LTS)(2017年5月2日[1] & 2017年4月4日[2]) |
| 開發狀態 | 活躍 |
| 編程語言 | C++、JavaScript |
| 操作系統 | Mac OS X、Linux、Solaris、 FreeBSD、OpenBSD、Windows(較舊的版本需要Cygwin)、webOS |
| 類型 | 事件驅動網路 |
| 許可協議 | MIT許可證 |
| 網站 | https://nodejs.org/ |
| 倉庫 | github |
Node.js是一個能夠在伺服器端運行JavaScript的開放原始碼、跨平台JavaScript執行環境。Node.js由Node.js基金會持有和維護[3],並與Linux基金會有合作關係[4]。Node.js採用Google開發的V8執行程式碼,使用事件驅動、非阻塞和非同步輸入輸出模型等技術來提高效能,可優化應用程式的傳輸量和規模。這些技術通常用於資料密集的事實應用程式。
Node.js大部分基本模組都用JavaScript語言編寫。在Node.js出現之前,JavaScript通常作為用戶端程式設計語言使用,以JavaScript寫出的程式常在用戶的瀏覽器上執行。Node.js的出現使JavaScript也能用於伺服器端編程。Node.js含有一系列內置模組,使得程式可以脫離Apache HTTP Server或IIS,作為獨立伺服器執行。
目前,Node.js已被IBM[5]、Microsoft[6][7]、Yahoo![8]、Walmart[9]、Groupon[10]、SAP[11]、 LinkedIn[12][13]、Rakuten、PayPal[14][15]、Voxer[16]和GoDaddy[17]等企業採用。
目錄
概覽[編輯]
Node.js允許通過JavaScript和一系列模塊來編寫服務器端應用和網絡相關的應用。[18][19][20]核心模塊包括文件系統I/O、網絡(HTTP、TCP、UDP、DNS、TLS/SSL等)、二進制數據流、加密算法、數據流等等。[19][21]Node模塊的API形式簡單,降低了編程的複雜度。[19]
使用框架可以加速開發。常用的框架有Express.js、Socket.IO和Connect等。[22]Node.js的程序可以在Microsoft Windows、Linux、Unix、Mac OS X等服務器上運行。Node.js也可以使用CoffeeScript(一種旨在簡化JavaScript的替代語言,其代碼可按照一定規則轉化為合法的JavaScript代碼)、TypeScript(微軟開發的強化了數據類型的JavaScript變體)、Dart語言,以及其他能夠編譯成JavaScript的語言編程。[23][23]
Node.js主要用於編寫像Web服務器一樣的網絡應用,這和PHP和Python是類似的。[18]但是Node.js與其他語言最大的不同之處在於,PHP等語言是阻塞的(只有前一條命令執行完畢才會執行後面的命令),而Node.js是非阻塞的(多條命令可以同時被運行,通過回調函數得知命令已結束運行)。[18]
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。[24]
歷史[編輯]
Node.js於2009年寫成,其原始作者是瑞安·達爾(Ryan Dahl),[25]。Node.js結合了Google的V8引擎、事件驅動模式和低級I/O接口[26],其設計靈感源自Flickr的一款上傳進度欄:在上傳過程中,瀏覽器並不清楚有多少文件已經發送到服務器,除非向服務器進行查詢,於是達爾想出了一個更簡便的方法[27]。Node.js的開發和維護工作由達爾本人主持,而他所在的Joyent公司也提供了贊助[28]。2009年11月8日,Dahl在歐洲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的語言特性和「長期支持版本」的發布周期[44]。到了2016年,io.js宣布不再發布新版本,並建議開發者換回Node.js[45]。
程式範例[編輯]
用Node.js撰寫的HTTP Server版hello 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、StrongLoop Process Manager或pm2等模塊,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將瀏覽器、數據(例如MongoDB或CouchDB)等組合到一起,通過JSON提供一個統一的接口。由於前端框架和一些基本的後端開發技術(如MVC、MVP、MVVM等)變得流行,Node.js也支持客戶端和服務器端重新利用相同的模型和接口。
事件循環[編輯]
Node.js將其註冊到操作系統中,這樣可以及時注意到新連接的產生。當新連接產生時,操作系統會產生一個回調。在Node.js運行時內部,每個連接都被分配一個小型的堆。與其他服務器程序不同的是,Node.js不使用進程或線程處理連接,而是採用事件循環來處理並發連接。[46]而且Node.js的事件循環不需要手動調用。在回調函數定義之後,服務器進入事件循環。當回調函數均被執行完畢之後,Node.js結束事件循環。
開發工具[編輯]
- 桌面IDE
- Atom(免費、開源軟件)
- Brackets(免費、開源軟件)
- Sublime Text(商業軟件)
- JetBrains IntelliJ IDEA(商業軟件)
- JetBrains WebStorm(商業軟件)
- Microsoft Visual Studio with Node.js Tools for Visual Studio[47](商業軟件)
- Microsoft Visual Studio with TypeScript(商業軟件)
- Nodeclipse Enide Studio(免費、開源軟件、在Eclipse基礎上開發)
- NoFlo –與GNOME API集成的流式開發環境[48]
- Visual Studio Code(免費、開源軟件)
- 在線編輯器
- 運行時和調試器
- Microsoft Visual Studio(商業)with Node.js Tools for Visual Studio(免費)
- Microsoft WebMatrix(免費、閉源軟件)
- Visual Studio Code
- 框架
- 服務器端框架:Express.js, Socket.IO, Koa.js, Hapi.js, Total.js[49][50]
- MVC框架:Meteor, Derby, Sails, Mean, MeanJS, Tower.js, Nombo, Geddy, Compound, Yahoo! Mojito
替代品[編輯]
JXcore[編輯]
| 維基共享資源中相關的多媒體資源:Node.js |
JXcore是一個開放源代碼的Node.js的分支,旨在支持移動設備和物聯網。第一個Beta版本於2014年1月發布。它於2015年2月13日開源[51]並且可從GitHub repository獲得。JXcore同時使用Google V8和Mozilla SpiderMonkey兩個引擎。因此JXcore可以通過Mozilla SpiderMonkey在iOS設備上運行Node應用程序。
其他語言[編輯]
類似的語言和開發環境有:
- Python:Tornado和Twisted
- Perl:Perl Object Environment
- C語言:libevent
- Java、JavaScript、Groovy、Python、Scala、Clojure、Ruby、Ceylon等:Vert.x
- Java和Scala:Akka
- Ruby:EventMachine
- D語言:vibe.d
- Lua:Luvit
- OCaml:Ocsigen
參考文獻[編輯]
- ^ Node.js Changelog. [2017-03-30].
- ^ Node.js Changelog. [2017-04-04].
- ^ Node.js Foundation - Node.js. [4 July 2015].
- ^ Linux Foundation Collaborative Projects. [4 July 2015].
- ^ IBM Bluemix. [4 July 2015].
- ^ Here's why you should be happy that Microsoft is embracing Node.js. The Guardian. November 9, 2011 [May 10, 2012].
- ^ WebMatrix - Front End Web Developers take note(ASP.NET, PHP, node.js and more). [2 August 2014].
- ^ Yahoo! Announces Cocktails Shaken, Not Stirred. [7 April 2015].
- ^ Why Walmart is using Node.js. VentureBeat. January 24, 2012 [May 10, 2012].
- ^ Geitgey, Adam. I-Tier: Dismantling the Monoliths. Groupon. 30 October 2013 [30 April 2014].
- ^ SAP AppBuilder. SAP. March 10, 2014 [March 10, 2014].
- ^ You'll never believe how LinkedIn built its new iPad app. VentureBeat. May 2, 2012 [May 10, 2012].
- ^ Blazing fast node.js: 10 performance tips from LinkedIn Mobile. [7 April 2015].
- ^ Clash of the Titans: Releasing the Kraken, NodeJS @paypal. fluentconf.com. May 28, 2013 [September 11, 2013].
- ^ All such companies and their products in which Node.js is used. [2 August 2014].
- ^ The Node Ahead: JavaScript leaps from browser into future, The Register, March 1, 2011
- ^ Why GoDaddy’s Nodejitsu deal is great for Node.js, VentureBeat, February 10, 2015
- ^ 18.0 18.1 18.2 Node.js for PHP Developers, O'Reilly Media, Inc., 2013
- ^ 19.0 19.1 19.2 Node.js Essentials, Packt Publishing, 09-Sep-2014
- ^ Smashing Node.js: JavaScript Everywhere, John Wiley & Sons, 14-Aug-2012
- ^ Modules, Nodejs Website
- ^ Express.js Guide: The Comprehensive Book on Express.js, Azat Mardan, 28-May-2014
- ^ 23.0 23.1 CoffeeScript on Node.js. O'Reilly Media, Inc. April 15, 2013 [May 17, 2015].
- ^ Finley, Klint. NodeConf Schedule Announced. ReadWriteHack. April 7, 2011 [2 August 2014].
- ^ About Node.js, and why you should add Node.js to your skill set?. Training.com. Training.com. [23 October 2016].
- ^ 26.0 26.1 Professional Node.js: Building JavaScript Based Scalable Software, John Wiley & Sons, 01-Oct-2012
- ^ 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].
- ^ Ryan Dahl. Joyent and Node. Google Groups. 2010-11-09 [2015-02-05].
- ^ Sams Teach Yourself Node.js in 24 Hours, Sams Publishing, 05-Sep-2012
- ^ Ryan Dahl at JSConf EU 2009.
- ^ Ryan Dahl at JSConf EU 2009 Video.
- ^ Video: Node.js by Ryan Dahl.
- ^ PHP 7 vs Node.js? They Can Be Partners, Not Competitors For a Developer!. [21 December 2016].
- ^ Earliest releases of npm. GitHub. [27 July 2016].
- ^ Porting Node to Windows With Microsoft's Help. [17 April 2016].
- ^ Dahl, Ryan. New gatekeeper. [26 October 2013].
- ^ Schlueter, Isaac. The Next Phase of Node.js. January 15, 2014 [21 January 2014].
- ^ Krill, Paul. Why io.js Decided to Fork Node.js. JavaWorld. Dec 4, 2014 [Dec 15, 2014].
- ^ Q&A: Why io.js decided to fork Node.js, Infoworld Tech Watch
- ^ Ben Noordhuis. Issue 3692: function suddenly becomes undefined. V8 JavaScript Engine Issues. Nov 12, 2014 [2 February 2015].
- ^ Mikeal, Rogers. State of io.js. January 28, 2015 [2 February 2015].
- ^ Node.js Foundation Advances Community Collaboration, Announces New Members and Ratified Technical Governance. [4 July 2015].
- ^ Node.js Foundation Combines Node.js and io.js Into Single Codebase in New Release. [28 Jan 2016].
- ^ Node.js Foundation Combines Node.js and io.js Into Single Codebase in New Release. [28 Jan 2016].
- ^ 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."
- ^ About Node.js, Node.js Website
- ^ Node.js Tools for Visual Studio. Codeplex. [2 August 2014].
- ^ Bergius: Flowhub and the GNOME Developer Experience. LWN.net. 2014-05-02 [2014-05-24].
- ^ Node.js Framework Comparison: Express vs. Koa vs. Hapi, AirPair
- ^ Peter Wayner. 13 fabulous frameworks for Node.js. InfoWorld. 21 May 2014 [4 July 2015].
- ^ Serdar Yegulalp. Node.js fork JXcore goes open source, aims for mobile developers. InfoWorld. 20 February 2015 [4 July 2015].
外部連結[編輯]
參見[編輯]
- Rhino (JavaScript引擎)
- npm:廣泛使用的Node.js安裝包管理器
- MEAN
- JSAN(JavaScript Archive Network),一個不太常用的JavaScript安裝包管理器
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||