认识fibjs

jopen 10年前

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由西祠胡同创始人,孢子社区创始人,响马历时两年多开发完成。

又一个轮子?

很多人会问,既然已经有了Node.js,为什么还要再造fibjs这个大轮子?难道只是为了造轮子而造轮子吗?

其实,实际原因不是这样。要说fibjs的诞生,不得不说说孢子社区的开发史。

在早期阶段,孢子社区的后端是运用响马开发的VBS运行环境开发的,后来考虑到前后端代码复用,方便招聘开发人员等原因,决定后端转向JS平台。当时,不选择Node.js的原因是认为异步开发模式不是一个适合大规模部署的方式,会给开发和维护带来很大问题。

既然,Node.js不是一个我们认为的好的选择,那就自己造轮子吧。最初的技术选型(详情参见点我)考虑了,v8,JavaScriptCore 和 SpiderMonkey三个JS引擎。

最终选择了 v8 作为基础核心。原因是:

  • 支持多线程重入,协程的堆栈本质是线程,所以要支持协程必须要支持多堆栈重入;
  • 不支持多线程并发,虽然 isolate 支持多堆栈现场,但是 isolate 内部却为无锁环境,因此不能接受多线程同时运行,必须在一个线程退出后,另一线程才可进入;

在选择了V8后(不是Node.js用了V8,咱就要用V8,选择什么都是有原因),再开发协程环境并和V8结合工作,再补上其他基础模块,就是fibjs了。

总的来说,造轮子最初目的是为了自身满足需求。

fibjs名字由来?

fib是fiber的简称,fiber就是纤程的意思。JS就是Javascript语言。连起来就是用fiber技术构建起来的JS平台,简单而又直白。

fibjs logo含义

  • fibjs
  • 去除回调,去除层层的 }}}}}}}}}}}}}}}}}}}}}}}}};
  • Javscript
  • 跨平台,支持Mac OSX, Linux, FreeBSD, Windows

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());      })();

    fibjs版本

        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来的简单明了。

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

    相比较Node.js,fibjs具有明显的性能优势,测试案例:

    </li>
  • 前后统一语言
    这个优点还是非常诱人的,前端和后端不需要跨语言开发,许多代码库可以共享,更有利于开发人员往全栈方向发展。

  • </ul>

    fibjs发展史

    • 2012年2月,项目启动
    • 2012年9月,开始在孢子社区生产环境试运行
    • 2013年初,向外公开fibjs信息
    • 2014年5月,项目推送Github,彻底开源
    • 2014年10月,南京源创会,首次开讲,引起业界轰动
    • 还在继续...

    应用案例

    如何安装fibjs