Guide 開髮指南

添加native 模塊

如果你需要一些fibjs native 模塊所提供功能以外的功能,或者你想為fibjs 貢獻代碼,那麼這篇文章也許對你有幫助。

編寫idl 文件

idl 是fibjs 中用來定義native 模塊和對象方法的描述性語言。

在開始編寫自己的fibjs 模塊的之前你需要先編寫idl 描述性語言。我們以自定義模塊name 為例。我需要編寫描述性語言name.idl ,把這個文件放入${{fibjs_project_dir}}/idl/zh-cn/ 目錄下,其中${{fibjs_project_dir}} 代表fibjs 的項目所在目錄。

我們的name 模塊很簡單,只有一個test 方法,其參數是一個字符串,這個字符串是歌詞, test 方法判斷這歌詞對不對,返回值是boolean 類型。name.idl 編寫如下

1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*! @brief name module how to use @code var name = require('name'); @endcode */ module name { /*! @brief 测试输入的字符串是不是正确的歌词 @param lyrics 歌词 */ static Boolean test(String lyrics); };

生成頭文件

在tools 目錄下執行 例如name.idl 會自動生成${{fibjs_project_dir}}/fibjs/include/ifs/name.h 這個頭文件,其中定義了name_base 這個類。fibjs idlc.js

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
/*************************************************************************** * * * This file was automatically generated using idlc.js * * PLEASE DO NOT EDIT!!!! * * * ***************************************************************************/ #ifndef _name_base_H_ #define _name_base_H_ /** @author Leo Hoo <lion@9465.net> */ #include "../object.h" namespace fibjs { class name_base : public object_base { DECLARE_CLASS(name_base); public: // name_base static result_t test(exlib::string lyrics, bool& retVal); public: static void s__new(const v8::FunctionCallbackInfo<v8::Value>& args) { CONSTRUCT_INIT(); Isolate* isolate = Isolate::current(); isolate->m_isolate->ThrowException( isolate->NewString("not a constructor")); } public: static void s_test(const v8::FunctionCallbackInfo<v8::Value>& args); }; } namespace fibjs { inline ClassInfo& name_base::class_info() { static ClassData::ClassMethod s_method[] = { { "test", s_test, true } }; static ClassData s_cd = { "name", true, s__new, NULL, ARRAYSIZE(s_method), s_method, 0, NULL, 0, NULL, 0, NULL, NULL, NULL, &object_base::class_info() }; static ClassInfo s_ci(s_cd); return s_ci; } inline void name_base::s_test(const v8::FunctionCallbackInfo<v8::Value>& args) { bool vr; METHOD_NAME("name.test"); METHOD_ENTER(); METHOD_OVER(1, 1); ARG(exlib::string, 0); hr = test(v0, vr); METHOD_RETURN(); } } #endif

編寫源代碼

方法s_test 是v8 的訪問器,它包裹了方法test 。這裡我們只要實現test 方法,test 方法有兩個參數,v0 是輸入的歌詞,vr 是返回值。我們將cpp 文件放在${{fibjs_project_dir}}/fibjs/src/ 目錄下, 頭文件放在${{fibjs_project_dir}}/fibjs/include 目錄下。本例不需要額外的頭文件。我們在fibjs/src/ 目錄下新建一個文件name.cpp 內容如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#include "object.h" #include "ifs/name.h" namespace fibjs { DECLARE_MODULE(name); result_t name_base::test(exlib::string lyrics, bool& retVal) { if (lyrics == "youmeiyounameyishougehuirangnituranxiangqiwo") retVal = true; else retVal = false; return 0; } }

需要注意的是 在編寫源代碼的時候需要加上這句話。DECLARE_MODULE(name);v0.25.0fibjs/program/src/fibjs.cppimportModuleIMPORT_MODULE(name);

編譯並測試

在windows 上編譯之前,需要先執行一遍 編譯運行結果如下:fibjs tools/vsmake.jsname

總結

學會瞭如何增加和修改fibjs 的native 模塊和對象。我們可以編寫各種各樣複雜的模塊,還可以移植第三方庫到fibjs 作為支持來編寫我們的模塊。歡迎您來為fibjs 貢獻更多的力量。