Node.js

Node.js 是能夠在伺服器端執行 JavaScript 的開放原始碼、跨平臺執行環境。Node.js 由 OpenJS Foundation 持有和維護，亦為 Linux 基金會的專案。Node.js 採用 Google 開發的 V8 執行程式碼，使用事件驅動、非阻塞和非同步輸入輸出模型等技術來提高效能，可最佳化應用程式的傳輸量和規模。這些技術通常用於資料密集的即時應用程式。Node.js 大部分基本模組都用 JavaScript 語言編寫。在 Node.js 出現之前，JavaScript 通常作為使用者端程式設計語言使用，以JavaScript 寫出的程式常在使用者的瀏覽器上執行。Node.js 的出現使 JavaScript 也能用於伺服器端程式設計。Node.js 含有一系列內建模組，使得程式可以脫離 Apache HTTP Server 或 IIS，作為獨立伺服器執行。目前，Node.js 已被IBM、Microsoft、Yahoo!、Walmart、Groupon、SAP、LinkedIn、Rakuten、PayPal、Voxer、GoDaddy等企業採用。概覽.Node.js可透過JavaScript和一系列模組來編寫伺服器端應用和網路相關的應用。核心模組包括檔案系統I/O、網路、二進位制資料流、加密演算法、資料流等等。Node模組的API形式簡單，降低了程式設計的複雜度。使用框架可以加速開發。常用的框架有Express.js、Socket.IO和Connect等。Node.js的程式可以在Microsoft Windows、Linux、Unix、Mac OS X等伺服器上執行。Node.js也可以使用CoffeeScript、Dart語言，以及其他能夠編譯成JavaScript的語言程式設計。Node.js主要用於編寫像Web伺服器一樣的網路應用，這和PHP和Python是類似的。但是Node.js與其他語言最大的不同之處在於，PHP等語言是阻塞的。Node.js是事件驅動的。開發者可以在不使用執行緒的情況下開發出一個能夠承載高併發的伺服器。其他伺服器端語言難以開發高併發應用，而且即使開發出來，效能也不盡如人意。Node.js正是在這個前提下被創造出來。Node.js把JavaScript的易學易用和Unix網路程式設計的強大結合起來。Node.js使用Google V8 JavaScript引擎，因為：Node.js已經有數十萬模組，它們可以透過一個名為npm的管理器免費下載。Node.js開發社群主要有兩個郵件列表、一個在freenode的名為#node.js的IRC頻道。社群集中在NodeConf。歷史.Node.js於2009年寫成，原始作者是美國軟體工程師瑞安·達爾。Node.js結合了Google的V8、事件驅動模式和低階I/O介面，其設計靈感源自Flickr的一款上傳進度欄：在上傳過程中，瀏覽器並不清楚有多少檔案已經發送到伺服器，除非向伺服器進行查詢，於是達爾想出了一個更簡便的方法。Node.js的開發和維護工作由達爾本人主持，而他所在的Joyent公司也提供了贊助。2009年11月8日，達爾在歐洲JSConf大會上展示了Node.js專案，並受到了觀眾讚賞。在演講中，達爾針對Apache HTTP Server和順序程式設計方式提出了批評，認為Apache處理大量併發連線的可能性有限，而且順序程式設計方式在多連線情況下會造成阻塞，或者消耗更多資源；而Node.js提供了基於事件驅動和非阻塞的介面，可用於編寫高併發狀態下的程式，而且JavaScript的匿名函式、閉包、回撥函式等特性就是為事件驅動而設計的。2010年1月，一款名為“npm”的軟體包管理系統誕生。npm使程式設計師能夠更方便地釋出和分享Node.js類庫及原始碼，而且簡化了類庫安裝、升級與解除安裝的過程。Node.js最初只支援Linux和Mac OS X作業系統。2011年6月，微軟和Joyent共同合作，把Node.js移植到了Windows系統上面，並且在7月釋出了第一個正式支援Windows系統的版本。2012年1月，達爾離開了Node.js專案，開發工作由他的同事以及npm創始人艾薩克·施呂特接任專案主管。由於長期對Joyent的管理感到不滿，Node.js核心開發者Fedor Indutny在2014年12月製作了分支版本，並起名“io.js”。與Node.js相對的是，io.js採用開放管理模式進行管理，並計劃始終採用最新版的V8引擎。為了在使用者、廠商和開發者之間取得平衡，Node.js基金會於2015年初成立。基金會得到了IBM、Intel、微軟、Joyent等公司的支援。6月，Node.js和io.js開發者社群共同決定合併到Node.js基金會之下。同年9月，Node 4.0釋出，Node.js和io.js正式合併。4.0版引入了ES6的語言特性和“長期支援版本”的釋出週期。到了2016年，io.js宣佈不再發布新版本，並建議開發者換回Node.js。程式範例.用Node.js撰寫的HTTP Server版hello world範例：const http = require('http');http.createServer((request, response) =&gt; {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伺服器範例，監聽之前輸入的訊息：const net = require('net');net.createServer(stream =&gt; {stream.write('hello\r\n');stream.on('end', () =&gt; 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將瀏覽器、資料變得流行，Node.js也支援客戶端和伺服器端重新利用相同的模型和介面。事件迴圈.Node.js將其註冊到作業系統中，這樣可以及時注意到新連線的產生。當新連線產生時，作業系統會產生一個回撥。在Node.js執行時內部，每個連線都被分配一個小型的堆。與其他伺服器程式不同的是，Node.js不使用程序或執行緒處理連線，而是採用事件迴圈來處理併發連線。而且Node.js的事件迴圈不需要手動呼叫。在回撥函式定義之後，伺服器進入事件迴圈。當回撥函式均被執行完畢之後，Node.js結束事件迴圈。替代品.JXcore.JXcore是一個開放原始碼的Node.js的分支，旨在支援移動裝置和物聯網。第一個Beta版本於2014年1月釋出。它於2015年2月13日開源並且可從GitHub倉庫獲得。JXcore同時使用Google V8和Mozilla SpiderMonkey兩個引擎。因此JXcore可以透過Mozilla SpiderMonkey在iOS裝置上執行Node應用程式。Bun.Bun是用Zig語言編寫的JavaScript執行時，支援JavaScript和TypeScript專案的測試、編譯和執行。首個對外版本於2022年7月釋出。其他語言.類似的語言和開發環境有：