Node.js 是跨平台 、开源 的 JavaScript 运行环境 ,可在 Windows 、Linux 、macOS 等操作系统上运行。Node.js 由 OpenJS Foundation[ 4] (原為 Node.js Foundation,已与 JS Foundation 合并)持有和維護[ 5] ,亦为 Linux 基金會 的项目[ 6] 。Node.js 採用 Google 開發的 V8 執行程式碼,使用事件驅動 和非同步輸入輸出 模型等技術來提高效能,可優化應用程式的傳輸量和規模。這些技術通常用於資料密集的即時應用程式。
Node.js 大部分基本模組都用 JavaScript 語言編寫。在 Node.js 出現之前,JavaScript 通常作為用戶端程式設計語言使用,以JavaScript 寫出的程式常在用戶的瀏覽器上執行。Node.js 的出現使 JavaScript 也能用於伺服器端編程。Node.js 含有一系列內置模組,使得程式可以脫離 Apache HTTP Server 或 IIS ,作為獨立伺服器執行。
目前,Node.js 已被IBM [ 7] 、Microsoft [ 8] [ 9] 、Yahoo! [ 10] 、Walmart [ 11] 、Groupon [ 12] 、SAP [ 13] 、LinkedIn [ 14] [ 15] 、Rakuten 、PayPal [ 16] [ 17] 、Voxer [ 18] 、GoDaddy [ 19] 等企業採用。
概覽
Node.js可透過JavaScript 和一系列模块来编写服务器 端应用和网络相关的应用。[ 20] [ 21] [ 22] 核心模組包括文件系统 I/O、网络(HTTP 、TCP 、UDP 、DNS 、TLS/SSL 等)、二进制 数据流、加密 算法、数据流 等等。[ 21] [ 23] Node模块的API形式简单,降低了编程的复杂度。[ 21]
使用框架可以加速开发。常用的框架有Express.js 、Socket.IO 和Connect等。[ 24] Node.js的程序可以在Microsoft Windows 、Linux 、Unix 、Mac OS X 等服务器上运行。Node.js也可以使用CoffeeScript (一种旨在简化JavaScript的替代语言,其代码可按照一定规则转化为合法的JavaScript代码)、TypeScript (微软开发的强化了数据类型的JavaScript变体)、Dart 语言,以及其他能够编译成JavaScript的语言编程。[ 25] [ 25]
Node.js主要用于编写像Web服务器一样的网络应用,这和PHP 和Python 是类似的。[ 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结合了Google 的V8 、事件驱动模式和低级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 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[ 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将浏览器、数据(例如MongoDB 或CouchDB )等组合到一起,通过JSON 提供一个统一的接口。由于前端 框架和一些基本的后端开发技术(如MVC 、MVP 、MVVM 等)变得流行,Node.js也支持客户端和服务器端重新利用相同的模型和接口。
事件循环
Node.js将其注册到操作系统中,这样可以及时注意到新连接的产生。当新连接产生时,操作系统会产生一个回调。在Node.js运行时内部,每个连接都被分配一个小型的堆。与其他服务器程序不同的是,Node.js不使用进程或线程处理连接,而是采用事件循环来处理并发连接。[ 51] 而且Node.js的事件循环不需要手动调用。在回调函数定义之后,服务器进入事件循环。当回调函数均被执行完毕之后,Node.js结束事件循环。
开发工具
桌面IDE
在线编辑器
运行时和调试器
框架
服务器端框架:Express.js , Socket.IO , Koa.js[ 55] , Hapi.js[ 56] , Total.js[ 57] [ 58]
MVC框架:Meteor[ 59] , Derby[ 60] , Sails[ 61] , Mean[ 62] , MeanJS[ 63] , Tower.js[ 64] , Nombo[ 65] , Geddy[ 66] , Compound[ 67] , Yahoo! Mojito[ 68]
替代品
以下是兼容Node.js代码的运行时。
Bun
Bun 是用Zig 语言编写的JavaScript运行时,支持JavaScript和TypeScript项目的测试、编译和运行。首个对外版本于2022年7月发布。[ 69]
参见
参考文献
^ Ry Dahl. Release v0.0.1 · nodejs/node . GitHub. 28 May 2009 [2019-12-24 ] . (原始内容存档 于2020-04-09) (英语) . First!
^ Release 23.6.1 . 2025年1月21日 [2025年1月26日] .
^ nodejs/node . GitHub. [2019-04-09 ] . (原始内容存档 于2019-04-22).
^ 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.
^ Node.js Foundation . Node.js. [4 July 2015] . (原始内容 存档于2015-07-05) (英语) .
^ Linux Foundation Collaborative Projects . Linux Foundation. [4 July 2015] . (原始内容 存档于2016-03-07) (英语) . Open Source Projects . Linux 基金会. [2019-12-24 ] . (原始内容存档 于2019-12-23) (中文(中国大陆)) .
^ IBM Bluemix . [4 July 2015] . (原始内容存档 于2019-10-18).
^ Here's why you should be happy that Microsoft is embracing Node.js . The Guardian. November 9, 2011 [May 10, 2012] . (原始内容存档 于2013-07-25).
^ WebMatrix - Front End Web Developers take note(ASP.NET, PHP, node.js and more) . [2 August 2014] . (原始内容 存档于2015-08-03).
^ Yahoo! Announces Cocktails Shaken, Not Stirred . [7 April 2015] . (原始内容 存档于2015年4月8日).
^ Why Walmart is using Node.js . VentureBeat. January 24, 2012 [May 10, 2012] . (原始内容存档 于2015-08-29).
^ Geitgey, Adam. I-Tier: Dismantling the Monoliths . Groupon. 30 October 2013 [30 April 2014] . (原始内容 存档于2015-09-10).
^ SAP AppBuilder . SAP. March 10, 2014 [March 10, 2014] . (原始内容存档 于2015-08-17).
^ You'll never believe how LinkedIn built its new iPad app . VentureBeat. May 2, 2012 [May 10, 2012] . (原始内容存档 于2015-08-12).
^ Blazing fast node.js: 10 performance tips from LinkedIn Mobile . [7 April 2015] . (原始内容 存档于2015-09-10).
^ Clash of the Titans: Releasing the Kraken, NodeJS @paypal . fluentconf.com. May 28, 2013 [September 11, 2013] . (原始内容存档 于2015-07-25).
^ All such companies and their products in which Node.js is used . [2 August 2014] . (原始内容存档 于2015-08-10).
^ 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
^ 20.0 20.1 20.2 Node.js for PHP Developers (页面存档备份 ,存于互联网档案馆 ) , O'Reilly Media, Inc., 2013
^ 21.0 21.1 21.2 Node.js Essentials (页面存档备份 ,存于互联网档案馆 ) , Packt Publishing, 09-Sep-2014
^ Smashing Node.js: JavaScript Everywhere (页面存档备份 ,存于互联网档案馆 ) , John Wiley & Sons, 14-Aug-2012
^ Modules (页面存档备份 ,存于互联网档案馆 ) }, Nodejs Website
^ Azat Mardan. Express.js Guide: The Comprehensive Book on Express.js . Azat Mardan, 2014. 2014-05-28 [2015-08-14 ] . (原始内容存档 于2015-07-13).
^ 25.0 25.1 CoffeeScript on Node.js . O'Reilly Media, Inc. April 15, 2013 [May 17, 2015] . (原始内容存档 于2015-07-02).
^ NodeConf (页面存档备份 ,存于互联网档案馆 )
^ Finley, Klint. NodeConf Schedule Announced . ReadWriteHack. April 7, 2011 [2 August 2014] . (原始内容 存档于2012年9月17日).
^ 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.0 29.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] . (原始内容 存档于2014-10-18).
^ Ryan Dahl. Joyent and Node . Google Groups. 2010-11-09 [2015-02-05 ] . (原始内容存档 于2011-01-22).
^ Sams Teach Yourself Node.js in 24 Hours (页面存档备份 ,存于互联网档案馆 ) , Sams Publishing, 05-Sep-2012
^ Ryan Dahl at JSConf EU 2009 . [2017-05-04 ] . (原始内容 存档于2017-05-14).
^ Ryan Dahl at JSConf EU 2009 Video . [2017-05-04 ] . (原始内容存档 于2017-05-15).
^ Video: Node.js by Ryan Dahl . [2017-05-04 ] . (原始内容存档 于2017-05-11).
^ PHP 7 vs Node.js? They Can Be Partners, Not Competitors For a Developer! . [21 December 2016] . (原始内容 存档于2017-02-23).
^ Earliest releases of npm . GitHub. [27 July 2016] . (原始内容存档 于2017-03-01).
^ Porting Node to Windows With Microsoft's Help . [17 April 2016] . (原始内容 存档于2017-07-14).
^ Dahl, Ryan. New gatekeeper . [26 October 2013] . (原始内容存档 于2011-01-22).
^ Schlueter, Isaac. The Next Phase of Node.js . January 15, 2014 [21 January 2014] . (原始内容 存档于2017-07-14).
^ Krill, Paul. Why io.js Decided to Fork Node.js . JavaWorld. Dec 4, 2014 [Dec 15, 2014] . (原始内容 存档于2017-06-30).
^ Q&A: Why io.js decided to fork Node.js (页面存档备份 ,存于互联网档案馆 ) , Infoworld Tech Watch
^ Ben Noordhuis. Issue 3692: function suddenly becomes . V8 JavaScript Engine Issues. Nov 12, 2014 [2 February 2015] . (原始内容存档 于2015-11-01).
^ Mikeal, Rogers. State of io.js . January 28, 2015 [2 February 2015] . (原始内容存档 于2015-08-30).
^ Node.js Foundation Advances Community Collaboration, Announces New Members and Ratified Technical Governance . [4 July 2015] . (原始内容 存档于2015年6月24日).
^ 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).
^ 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."
^ cluster (页面存档备份 ,存于互联网档案馆 )
^ StrongLoop Process Manager (页面存档备份 ,存于互联网档案馆 )
^ pm2 (页面存档备份 ,存于互联网档案馆 )
^ About Node.js (页面存档备份 ,存于互联网档案馆 ) , Node.js Website
^ Node.js Tools for Visual Studio . Codeplex . [2 August 2014] . (原始内容存档 于2018-01-16).
^ Bergius: Flowhub and the GNOME Developer Experience . LWN.net . 2014-05-02 [2014-05-24 ] . (原始内容存档 于2018-12-26).
^ Codiad (页面存档备份 ,存于互联网档案馆 )
^ Koa.js (页面存档备份 ,存于互联网档案馆 )
^ Hapi.js (页面存档备份 ,存于互联网档案馆 )
^ 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] . (原始内容存档 于2015-08-09).
^ Meteor (页面存档备份 ,存于互联网档案馆 )
^ Derby (页面存档备份 ,存于互联网档案馆 )
^ Sails
^ Mean
^ MeanJS (页面存档备份 ,存于互联网档案馆 )
^ Tower.js (页面存档备份 ,存于互联网档案馆 )
^ Nombo
^ Geddy
^ Compound (页面存档备份 ,存于互联网档案馆 )
^ Yahoo! Mojito
^ Jarred Sumner. Bun v0.1.1 . Bun. 2022-07-05 [2023-06-19 ] . (原始内容存档 于2023-09-26) (英语) .
外部連結