認識fibjs

jopen 11年前發布 | 45K 次閱讀 fibjs JavaScript開發

fibjs開源至今差不多半年了,越來越多的人知道fibjs。響馬在前些日子的南京源創會上做的fibjs分享,更是讓fibjs推廣進入了一個高潮,就連外國友人都開始密切關注fibjs的動態。下面,我們就來探討一下fibjs的一些問題。

fibjs是什么?

  • fibjs不是前端開發框架,不同于Jquery,Angular等運行在瀏覽器的JS框架,fibjs運行在服務端。
  • fibjs不是Node.js的一個包,和NPM里面的fiber擴展包也沒有關系。
  • fibjs是基于協程和V8,運用C++語言開發的JS運行平臺,和Node.js一樣,都是服務端JS環境。
  • fibjs由西祠胡同創始人,孢子社區創始人,響馬歷時兩年多開發完成。
  • </ul>

    又一個輪子?

    很多人會問,既然已經有了Node.js,為什么還要再造fibjs這個大輪子?難道只是為了造輪子而造輪子嗎?

    其實,實際原因不是這樣。要說fibjs的誕生,不得不說說孢子社區的開發史。

    在早期階段,孢子社區的后端是運用響馬開發的VBS運行環境開發的,后來考慮到前后端代碼復用,方便招聘開發人員等原因,決定后端轉向JS平臺。當時,不選擇Node.js的原因是認為異步開發模式不是一個適合大規模部署的方式,會給開發和維護帶來很大問題。

    既然,Node.js不是一個我們認為的好的選擇,那就自己造輪子吧。最初的技術選型(詳情參見點我)考慮了,v8,JavaScriptCore 和 SpiderMonkey三個JS引擎。

    最終選擇了 v8 作為基礎核心。原因是:

    • 支持多線程重入,協程的堆棧本質是線程,所以要支持協程必須要支持多堆棧重入;
    • 不支持多線程并發,雖然 isolate 支持多堆棧現場,但是 isolate 內部卻為無鎖環境,因此不能接受多線程同時運行,必須在一個線程退出后,另一線程才可進入;
    • </ul>

      在選擇了V8后(不是Node.js用了V8,咱就要用V8,選擇什么都是有原因),再開發協程環境并和V8結合工作,再補上其他基礎模塊,就是fibjs了。

      總的來說,造輪子最初目的是為了自身滿足需求。

      fibjs名字由來?

      fib是fiber的簡稱,fiber就是纖程的意思。JS就是Javascript語言。連起來就是用fiber技術構建起來的JS平臺,簡單而又直白。

      fibjs logo含義

      • fibjs
      • 去除回調,去除層層的 }}}}}}}}}}}}}}}}}}}}}}}}};
      • Javscript
      • 跨平臺,支持Mac OSX, Linux, FreeBSD, Windows
      • </ul>

        fibjs特點

        • 同步編寫異步代碼

          node.js的回調寫法,肯定很多人見識過,層層回調簡直就是項目的災難。雖然,可以通過Asyc,Promise,Generator等手段,在形式上簡化回調寫法,但是本質上沒有變,始終無法靠直覺寫出簡潔優美的代碼。還是少廢話,直接看代碼。

          我們來看一個文件異步讀取的例子:

          Node.js CallBack版本

              var fs = require("fs");
              fs.readFile('file', function(err, data) {
                  if (err) throw err;
                  console.log(data.toString());
              });

          采用CO庫改進的Node.js版本

              var fs = require("fs");
              var co = require("./co");

          function read(file) {
              return function(fn) {
                  fs.readFile(file, function(err, data) {
                      if (err) return fn(err);
                      fn(null, data);
                  });
              }
          }
          
          co(function *() {
              var a = yield read('file');
              console.log(a.toString());
          })();</code></pre> <p>fibjs版本</p>
          

              var fs = require("fs");
              try {
                  var file = fs.readFile('file');
                  console.log(file);
              } catch (e) {
                  console.log(e.number);
              }

          從上面的代碼對比,可以看出,fibjs的同步寫法非常簡潔,而且可以利用try catch來捕獲異常,而node.js必須依賴回調來處理異步,就算采用了Generator,在代碼簡潔和錯誤處理上Node.js還是沒有fibjs來的簡單明了。

          </li>

        • 高性能,整體比Node.js快接近8倍

          相比較Node.js,fibjs具有明顯的性能優勢,測試案例:

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!