Guía Guía de desenvolvemento

Engadir módulo nativo

Se precisas algunhas funcións distintas ás proporcionadas polo módulo nativo de fibjs, ou queres contribuír con código a fibjs, este artigo pode serche útil.

Escribe un ficheiro idl

idl é unha linguaxe descritiva empregada para definir módulos nativos e métodos de obxectos en fibjs.

Antes de comezar a escribir o seu propio módulo fibjs, ten que escribir unha linguaxe descritiva idl. Tomemos como exemplo o nome do módulo personalizado. Necesito escribir un idioma descritivo name.idl e colocar este ficheiro no directorio $ {{fibjs_project_dir}} / idl / zh-cn /, onde $ {{fibjs_project_dir}} representa o directorio onde se atopa o proxecto fibjs.

O noso módulo de nome é moi sinxelo, só hai un método de proba, o parámetro é unha cadea, esta cadea é a letra, o método de proba xulga se as letras son correctas e o valor de retorno é de tipo booleano. name.idl escríbese do seguinte xeito

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

Xerar un ficheiro de cabeceira

Executado no fibjs idlc.jscomando directorio de ferramentas , que le todos os ficheiros do directorio idl idl e analiza, xera os ficheiros de cabeceira e documentación correspondentes, que os ficheiros de cabeceira xerados almacénanse no directorio "fibjs / include / ifs /". Por exemplo, name.idl xerará automaticamente o ficheiro de cabeceira $ {{fibjs_project_dir}} / fibjs / include / ifs / name.h, que define a clase name_base.

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

Escribe código fonte

O método s_test é un accesor v8, que envolve a proba do método. Aquí só precisamos implementar o método de proba, o método de proba ten dous parámetros, v0 é a letra de entrada e vr é o valor de retorno. Poñemos o ficheiro cpp no ​​directorio $ {{fibjs_project_dir}} / fibjs / src / e o ficheiro de cabeceira no directorio $ {{fibjs_project_dir}} / fibjs / include. Non se precisan ficheiros de cabeceira adicionais para este exemplo. Creamos un novo ficheiro name.cpp no ​​directorio fibjs / src / co seguinte contido:

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

Teña en conta que DECLARE_MODULE(name);esta frase declara o "nome" deste módulo e rexístrea no obxecto javascript. Esta frase cómpre engadir ao escribir o código fonte. Nas v0.25.0futuras versións e eliminaremos os módulos fibjs para poder reutilizalos mellor, polo que aínda precisa fibjs/program/src/fibjs.cpparquivar importModule, engada a seguinte función de oración: IMPORT_MODULE(name);para instalar un módulo personalizado.

Compilar e probar

Antes de compilar en Windows, debes executalo de novo fibjs tools/vsmake.jse despois construír. Os resultados de compilación e execución son os seguintes: nome

Resume

Aprendín a engadir e modificar módulos e obxectos nativos de fibjs. Podemos escribir todo tipo de módulos complexos e tamén podemos transplantar bibliotecas de terceiros a fibjs como soporte para escribir os nosos módulos. Benvido a contribuír máis a fibjs.