Node.js
原作者 | 瑞安·达尔 |
---|---|
开发者 | OpenJS Foundation |
首次发布 | 2009年5月28日[1] |
当前版本 |
|
源代码库 | |
编程语言 | C、C++、JavaScript |
操作系统 | macOS, Linux, Windows, FreeBSD, OpenBSD[3] |
类型 | 事件驱动网路 |
许可协议 | |
网站 | nodejs |
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于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
- Atom(免费、开源软件)
- Brackets(免费、开源软件)
- Sublime Text(商业软件)
- JetBrains IntelliJ IDEA(商业软件)
- JetBrains WebStorm(商业软件)
- Microsoft Visual Studio with Node.js Tools for Visual Studio[52](商业软件)
- Microsoft Visual Studio with TypeScript(商业软件)
- Nodeclipse Enide Studio(免费、开源软件、在Eclipse基础上开发)
- NoFlo –与GNOME API集成的流式开发环境[53]
- Visual Studio Code(免费、开源软件)
- 在线编辑器
- Koding
- Codenvy IDE
- Cloud9 IDE
- Codiad[54]
- 运行时和调试器
- Microsoft Visual Studio(商业)with Node.js Tools for Visual Studio(免费)
- Microsoft WebMatrix(免费、闭源软件)
- Visual Studio Code
- 框架
- 服务器端框架: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]
参见
[编辑]- Rhino (JavaScript引擎)
- npm:广泛使用的Node.js安装包管理器
- MEAN
- JSAN(JavaScript Archive Network),一个不太常用的JavaScript安装包管理器
参考文献
[编辑]- ^ Ry Dahl. Release v0.0.1 · nodejs/node. GitHub. 28 May 2009 [2019-12-24]. (原始内容存档于2020-04-09) (英语).
First!
- ^ Release 23.0.0. 2024年10月16日 [2024年10月22日].
- ^ 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) (英语).
外部链接
[编辑]