Fibjs 是一個能在伺服器端執行 JavaScript 的開放原始碼、跨平臺 JavaScript 執行環境。Fibjs 使用 協程，同步風格 非阻塞 IO 模型來構建可伸縮的高可用的系統 Fibjs 含有一系列內建模組，使得程式可以脫離 Apache HTTP Server 或 IIS，作為獨立的伺服器執行。Fibjs 的出現降低了開發者的開發難度，並大大提升了 javascript 在服務端效能表現。 概覽 Fibjs 允許透過 JavaScript 和一系列模組來編寫伺服器端應用和網路相關的應用。核心模組包括檔案系統 IO、網路（HTTP、TCP、UDP、DNS、TLSSSL 等）、二進位制資料流、加密演算法、影像處理等等。Modules fibjs WebsiteFibjs 模組的 API 形式簡單，降低了程式設計的複雜度。 Fibjs 內建了 ØMQ 提供了鏈式的訊息處理器，因此可以用二十行程式碼開發出擁有動態資料響應和靜態檔案服務功能的服務端框架。Fibjs 的程式可以在 Microsoft Windows、Linux、Unix、Mac OS X、Arch Linux 等伺服器上執行。Fibjs 也可以使用 CoffeeScript（一種旨在簡化 JavaScript 的替代語言，其程式碼可按照一定規則轉化為合法的 JavaScript 程式碼）、TypeScript（微軟開發的強化了資料型別的 JavaScript 變體）、Dart 語言，以及其他能夠編譯成 JavaScript 的語言程式設計。 Fibjs 主要用於編寫像 Web 伺服器一樣的網路應用，這和 Nodejs 是類似的。但是 Fibjs 與 Nodejs 最大的不同在於，Nodejs 是非阻塞的（多條命令可以同時被執行，透過回撥函式得知命令已結束執行），而 Fibjs 是阻塞的，它的風格更接近 C 語言，它的機制和 Go 更像，Fibjs 採用了非阻塞 IO 模型，但是提供給使用者使用的 API 是阻塞的，它的特色是使用 coroutine 中文名字叫協程這和 Go 所採用的 Goroutine 十分相像，使得阻塞 API 不會阻塞 javascript 執行緒，從而達到更大的併發。因此 Fibjs 也非常地適合網路服務。 Coroutine 是類似執行緒的概念（但 Coroutine 並不是執行緒）。執行緒屬於系統層面，通常來說建立一個新的執行緒會消耗較多的資源且管理不易。而 Coroutine 就像輕量級的執行緒，但我們稱其為併發，一個 Fibjs 程式可以執行超過數萬個 Coroutine，並且這些效能都是原生級的，隨時都能夠關閉、結束。一個核心裡面可以有多個 Coroutine。 在內建的官方包中也不時能夠看見 Coroutine 的應用，像是 nethttp 中用來監聽網路服務的函式實際上是建立一個不斷執行迴圈的 Coroutine。 Fibjs 使用 Google V8 JavaScript 引擎，因為： V8 的執行緒支援 Coroutine 重入 V8 是基於 BSD 許可證的開源軟體 V8 速度非常快 V8 專注於網路功能，在 HTTP、DNS、TCP 等方面更加成熟 Fibjs 內建近 150 個內建模組和物件，已經有數十萬個 javascript 模組，它們可以透過一個名為 npm 的管理器免費下載。 歷史 Fibjs 於 2012 年寫成，其作者是劉琥（Leo Hoo），網名叫作響馬，圈內人都尊稱他大叔或馬叔。劉琥同時是開源伺服器應用框架 Netbox 的作者、中國著名社群網站西祠衚衕創始人。 Fibjs 的出現源自於一個名為 孢子社群 的一個專案，在做技術選型的時候考慮到前後端程式碼複用，方便招聘開發人員等原因，決定將後端轉向 JS 平臺。當時，劉琥認為 Nodejs 的非同步開發模式不是一個適合大規模部署的方式，會給開發和維護帶來很大問題。劉琥更傾向於使用 Go 的方式來實現非同步，從而能達到更高的併發，於是 Fibjs 就出現了。 2012 年 2 月，Fibjs 專案啟動 2012 年 9 月，Fibjs 開始在孢子社群生產環境試執行 2013 年初，向外公開 fibjs 資訊 2014 年 5 月，專案推送 Github，徹底開源 2014 年 10 月，南京源創會，首次開講，引起業界轟動 2016 年 7 月，Fibjs 第 4 次 Fiber 改造，實現 MN 多執行緒和多 Fiber 對映模型。 2017 年 3 月，nodejs 南京地下鐵沙龍，Fibjs 作者劉琥作為特邀嘉賓介紹 Fibjs，並和 nodejs 開發者進行了一場激烈的辯論 Fibjs vs Nodejs。 程式示例 用 Fibjs 撰寫的 HTTP Server 版 hello world 示例： const http require http let svr new httpServer 8000 request requestresponsesetHeader ContentTypetextplain requestresponsewrite Hello World consolelog Server running at http1270018000 svrstart 另一個簡單的 TCP 伺服器示例，監聽（Listening）埠 7000 並輸出 echo 之前輸入的資訊： const net require net const coroutine require coroutine let s new netSocket sbind 8000 slisten coroutinestart while 1 coroutinestart cconsolelog cremoteAddress cremotePort clocalAddress clocalPort try var b while b crecv csend b finally cclose cdispose saccept consolelog Tcp Server listen on port 8000 上例中第二個程式，演示瞭如何使用 Coroutine，coroutine 使得 while 1 不會阻塞後面的程式碼從而實現了併發。 技術 Coroutine Fibjs 以單執行緒執行，使用非阻塞 IO 呼叫，這樣既可以支援數以萬計的併發連線，又不會因多執行緒本身的特點而帶來麻煩。眾多請求只使用單執行緒的設計意味著可以用於建立高併發應用程式。Fibjs 應用程式的設計目標是任何需要操作 IO 的函式都使用 Coroutine 協程來完成。當使用 Fibjs 進行伺服器應用開發時，每次和客戶端建立連線都會建立一個 Fiber task 放在佇列中等待，javascript 執行緒依次取 fiber 執行，每當執行到 IO 操作，Coroutine 都會把上下文切換到後臺執行緒 worker thread 來完成相應的操作，並且把 Javascript 的上下文被切換到下一個 fiber 中繼續執行。當後臺執行緒的 fiber 執行完畢之後會重新把 fiber 丟進佇列尾部等待，等待 Javascript 執行到該 fiber。從而完成這個非同步操作。 V8 V8 是為 Google Chrome 設計的 JavaScript 執行引擎，Google 於 2008 年將其開源。V8 用 C 寫成，它將 JavaScript 原始碼編譯成本地機器碼而不是隨時解釋。 Fibjs 的核心功能被包含進一個 JavaScript 庫，並透過 C 將各部分與作業系統進行聯絡。 npm npm 是 Nodejs 附帶的包管理器。Fibjs 高度相容了 npm。npm 是一個命令列工具，用於從 NPM Registry 中下載、安裝 Fibjs 程式，同時解決依賴問題。npm 提高了開發的速度，因為它能夠負責第三方 Fibjs 程式的安裝與管理。 統一 API Fibjs 將瀏覽器、資料（例如 MongoDB 或 Redis）等組合到一起，透過 JSON 提供一個統一的介面。由於前端框架和一些基本的後端開發技術（如 MVC、MVP、MVVM 等）變得流行，Fibjs 也支援客戶端和伺服器端重新利用相同的模型和介面。 參考文獻 Category 帶有程式碼示例的條目 CategoryJavaScript 函式庫