Nodejs 是跨平臺、開源的 JavaScript 執行環境，可在 Windows、Linux、macOS 等作業系統上執行。Nodejs 由 OpenJS Foundation （原為 Nodejs Foundation，已與 JS Foundation 合併）持有和維護，亦為 Linux 基金會的專案。Nodejs 採用 Google 開發的 V8 執行程式碼，使用事件驅動和非同步輸入輸出模型等技術來提高效能，可最佳化應用程式的傳輸量和規模。這些技術通常用於資料密集的即時應用程式。 Nodejs 大部分基本模組都用 JavaScript 語言編寫。在 Nodejs 出現之前，JavaScript 通常作為使用者端程式設計語言使用，以 JavaScript 寫出的程式常在使用者的瀏覽器上執行。Nodejs 的出現使 JavaScript 也能用於伺服器端程式設計。Nodejs 含有一系列內建模組，使得程式可以脫離 Apache HTTP Server 或 IIS，作為獨立伺服器執行。 目前，Nodejs 已被 IBM、Microsoft、Yahoo、Walmart、Groupon、SAP、LinkedIn、Rakuten、PayPal、VoxerThe Node Ahead JavaScript leaps from browser into future The Register March 1 2011、GoDaddyWhy GoDaddys Nodejitsu deal is great for Nodejs VentureBeat February 10 2015 等企業採用。 概覽 Nodejs 可透過 JavaScript 和一系列模組來編寫伺服器端應用和網路相關的應用。Smashing Nodejs JavaScript Everywhere John Wiley Sons 14Aug2012 核心模組包括檔案系統 IO、網路（HTTP、TCP、UDP、DNS、TLSSSL 等）、二進位制資料流、加密演算法、資料流等等。Modules Nodejs WebsiteNode 模組的 API 形式簡單，降低了程式設計的複雜度。Nodejs Essentials Packt Publishing 09Sep2014 使用框架可以加速開發。常用的框架有 Expressjs、SocketIO 和 Connect 等。Nodejs 的程式可以在 Microsoft Windows、Linux、Unix、Mac OS X 等伺服器上執行。Nodejs 也可以使用 CoffeeScript（一種旨在簡化 JavaScript 的替代語言，其程式碼可按照一定規則轉化為合法的 JavaScript 程式碼）、TypeScript（微軟開發的強化了資料型別的 JavaScript 變體）、Dart 語言，以及其他能夠編譯成 JavaScript 的語言程式設計。 Nodejs 主要用於編寫像 Web 伺服器一樣的網路應用，這和 PHP 和 Python 是類似的。Nodejs for PHP Developers OReilly Media Inc 2013 但是 Nodejs 與其他語言最大的不同之處在於，PHP 等語言是阻塞的（只有前一條命令執行完畢才會執行後面的命令），而 Nodejs 是非阻塞的（多條命令可以同時被執行，透過回撥函式得知命令已結束執行）。 Nodejs 是事件驅動的。開發者可以在不使用執行緒的情況下開發出一個能夠承載高併發的伺服器。其他伺服器端語言難以開發高併發應用，而且即使開發出來，效能也不盡如人意。Nodejs 正是在這個前提下被創造出來。Nodejs 把 JavaScript 的易學易用和 Unix 網路程式設計的強大結合起來。 Nodejs 使用 Google V8 JavaScript 引擎，因為： V8 是基於 BSD 許可證的開源軟體 V8 速度非常快 V8 專注於網路功能，在 HTTP、DNS、TCP 等方面更加成熟 Nodejs 已經有數十萬模組，它們可以透過一個名為 npm 的管理器免費下載。Nodejs 開發社群主要有兩個郵件列表、一個在 freenode 的名為 nodejs 的 IRC 頻道。社群集中在 NodeConfNodeConf 。 歷史 Nodejs 於 2009 年寫成，原始作者是美國軟體工程師瑞安達爾。Nodejs 結合了 Google 的 V8、事件驅動模式和低階 IO 介面 Professional Nodejs Building JavaScript Based Scalable Software John Wiley Sons 01Oct2012，其設計靈感源自 Flickr 的一款上傳進度欄：在上傳過程中，瀏覽器並不清楚有多少檔案已經發送到伺服器，除非向伺服器進行查詢，於是達爾想出了一個更簡便的方法。Nodejs 的開發和維護工作由達爾本人主持，而他所在的 Joyent 公司也提供了贊助。2009 年 11 月 8 日，達爾在歐洲 JSConf 大會上展示了 Nodejs 專案 Sams Teach Yourself Nodejs in 24 Hours Sams Publishing 05Sep2012，並受到了觀眾讚賞。在演講中，達爾針對 Apache HTTP Server 和順序程式設計方式提出了批評，認為 Apache 處理大量併發連線（10000 甚至更多）的可能性有限，而且順序程式設計方式在多連線情況下會造成阻塞，或者消耗更多資源；而 Nodejs 提供了基於事件驅動和非阻塞的介面，可用於編寫高併發狀態下的程式，而且 JavaScript 的匿名函式、閉包、回撥函式等特性就是為事件驅動而設計的。 2010 年 1 月，一款名為 npm 的軟體包管理系統誕生。npm 使程式設計師能夠更方便地釋出和分享 Nodejs 類庫及原始碼，而且簡化了類庫安裝、升級與解除安裝的過程。Nodejs 最初只支援 Linux 和 Mac OS X 作業系統。2011 年 6 月，微軟和 Joyent 共同合作，把 Nodejs 移植到了 Windows 系統上面，並且在 7 月釋出了第一個正式支援 Windows 系統的版本。 2012 年 1 月，達爾離開了 Nodejs 專案，開發工作由他的同事以及 npm 創始人艾薩克施呂特（Isaac Schlueter）繼續主持。2014 年 2 月，蒂莫西費里斯（Timothy J Fontaine）接任專案主管。 由於長期對 Joyent 的管理感到不滿，Nodejs 核心開發者 Fedor Indutny 在 2014 年 12 月製作了分支版本，並起名 iojs。與 Nodejs 相對的是，iojs 採用開放管理模式進行管理 QA Why iojs decided to fork Nodejs Infoworld Tech Watch，並計劃始終採用最新版的 V8 引擎。為了在使用者、廠商和開發者之間取得平衡，Nodejs 基金會於 2015 年初成立。基金會得到了 IBM、Intel、微軟、Joyent 等公司的支援。6 月，Nodejs 和 iojs 開發者社群共同決定合併到 Nodejs 基金會之下。同年 9 月，Node 40 釋出，Nodejs 和 iojs 正式合併。40 版引入了 ES6 的語言特性和 長期支援版本 的釋出週期。到了 2016 年，iojs 宣佈不再發布新版本，並建議開發者換回 NodejsIojs JavaScript IO iojs has merged with the Nodejs project again There wont be any further iojs releases All of the features in iojs are available in Nodejs v4 and above。 程式範例 用 Nodejs 撰寫的 HTTP Server 版 hello world 範例： const http require http httpcreateServer request response responsewriteHead 200 ContentType textplain responseend Hello World listen 8000 consolelog Server running at http1270018000 另一個簡單的 TCP 伺服器範例，監聽（Listening）埠 7000 並輸出（echo）之前輸入的訊息： const net require net netcreateServer stream streamwrite hellorn streamon end streamend goodbyern streampipe stream listen 7000 技術 執行緒 Nodejs 以單執行緒執行，使用非阻塞 IO 呼叫，這樣既可以支援數以萬計的並行連線，又不會因多執行緒本身的特點而帶來麻煩。眾多請求只使用單執行緒的設計意味著可以用於建立高並行應用程式。Nodejs 應用程式的設計目標是任何需要操作 IO 的函式都使用回呼函式。 這種設計的缺點是，如果不使用 clustercluster 、StrongLoop Process ManagerStrongLoop Process Manager 或 pm2pm2 等模組，Nodejs 就難以處理多核或多執行緒等情況。 V8 V8 是為 Google Chrome 設計的 JavaScript 執行引擎，Google 於 2008 年將其開源。V8 用 C 寫成，它將 JavaScript 原始碼編譯成本地機器碼而不是解釋執行。 Nodejs 用 libuv 來處理非同步事件，而 V8 提供了 JavaScript 的即時執行環境。libuv 是一個網路和檔案系統功能的抽象層，既可以用於 Windows 又可以用於符合 POSIX 標準的系統，例如 Linux、OS X 和 Unix。 Nodejs 的核心功能被包含進一個 JavaScript 庫，並透過 C 將各部分與作業系統進行聯絡。 npm npm 是 Nodejs 附帶的包管理器。npm 是一個命令列工具，用於從 NPM Registry 中下載、安裝 Nodejs 程式，同時解決依賴問題。npm 提高了開發的速度，因為它能夠負責第三方 Nodejs 程式的安裝與管理。 統一 API Nodejs 將瀏覽器、資料（例如 MongoDB 或 CouchDB）等組合到一起，透過 JSON 提供一個統一的介面。由於前端框架和一些基本的後端開發技術（如 MVC、MVP、MVVM 等）變得流行，Nodejs 也支援客戶端和伺服器端重新利用相同的模型和介面。 事件迴圈 Nodejs 將其註冊到作業系統中，這樣可以及時注意到新連線的產生。當新連線產生時，作業系統會產生一個回撥。在 Nodejs 執行時內部，每個連線都被分配一個小型的堆。與其他伺服器程式不同的是，Nodejs 不使用程序或執行緒處理連線，而是採用事件迴圈來處理併發連線。About Nodejs Nodejs Website 而且 Nodejs 的事件迴圈不需要手動呼叫。在回撥函式定義之後，伺服器進入事件迴圈。當回撥函式均被執行完畢之後，Nodejs 結束事件迴圈。 開發工具 桌面 IDE Atom（免費、開源軟體） Brackets（免費、開源軟體） Sublime Text（商業軟體） JetBrains IntelliJ IDEA（商業軟體） JetBrains WebStorm（商業軟體） Microsoft Visual Studio with Nodejs Tools for Visual Studio（商業軟體） Microsoft Visual Studio with TypeScript（商業軟體） Nodeclipse Enide Studio（免費、開源軟體、在 Eclipse 基礎上開發） NoFlo 與 GNOME API 整合的流式開發環境 Visual Studio Code（免費、開源軟體） 線上編輯器 Koding Codenvy IDE Cloud9 IDE CodiadCodiad 執行時和偵錯程式 Microsoft Visual Studio（商業）with Nodejs Tools for Visual Studio（免費） Microsoft WebMatrix（免費、閉源軟體） Visual Studio Code 框架 伺服器端框架：Expressjs SocketIO KoajsKoajs HapijsHapijs TotaljsNodejs Framework Comparison Express vs Koa vs Hapi AirPair MVC 框架：MeteorMeteor DerbyDerby SailsSails MeanMean MeanJSMeanJS TowerjsTowerjs NomboNombo GeddyGeddy CompoundCompound Yahoo MojitoYahoo Mojito 替代品 以下是相容 Nodejs 程式碼的執行時。 Bun Bun 是用 Zig 語言編寫的 JavaScript 執行時，支援 JavaScript 和 TypeScript 專案的測試、編譯和執行。首個對外版本於 2022 年 7 月釋出。 參見 Rhino JavaScript 引擎 npm：廣泛使用的 Nodejs 安裝包管理器 MEAN JSAN（JavaScript Archive Network），一個不太常用的 JavaScript 安裝包管理器 參考文獻 外部連結 Nodejs 原始碼 Also Read Best Magento 2 Extensions CategoryJavaScript 函式庫 Category 使用 MIT 許可證的軟體 Category 用 JavaScript 程式設計的自由軟體