Gids voor ontwikkeling

Voeg native module toe

Als je functionaliteit nodig hebt die verder gaat dan wat de native module van fibjs biedt, of als je code aan fibjs wilt bijdragen, dan kan dit artikel nuttig voor je zijn.

Schrijf een IDL-bestand

IDL is een beschrijvende taal die in fibjs wordt gebruikt om native modules en objectmethoden te definiëren.

Voordat u begint met het schrijven van uw eigen fibjs-module, moet u de idl-beschrijvende taal schrijven. Laten we de aangepaste modulenaam als voorbeeld nemen. Ik moet een beschrijvende taal name.idl schrijven en dit bestand in de map ${{fibjs_project_dir}}/idl/zh-cn/ plaatsen, waarbij ${{fibjs_project_dir}} de map vertegenwoordigt waarin het fibjs-project zich bevindt.

Onze naammodule is heel eenvoudig. Er is slechts één testmethode waarvan de parameter een string is. Deze string is de songtekst. De testmethode bepaalt of de songtekst correct is of niet, en de geretourneerde waarde is van het booleaanse type. naam.idl wordt als volgt geschreven

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

Headerbestand genereren

Voer de opdracht uit in de map tools fibjs idlc.js. Hiermee worden alle idl-bestanden in de map idl gelezen en geparseerd en worden overeenkomstige headerbestanden en documenten gegenereerd. De gegenereerde headerbestanden worden opgeslagen in de map 'fibjs/include/ifs/'. name.idl genereert bijvoorbeeld automatisch het headerbestand ${{fibjs_project_dir}}/fibjs/include/ifs/name.h, dat de klasse name_base definieert.

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
/*************************************************************************** * * * 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

Broncode schrijven

De methode s_test is de accessor van v8, die de methodetest omhult. Hier hoeven we alleen de testmethode te implementeren. De testmethode heeft twee parameters: v0 is de invoertekst en vr is de retourwaarde. We plaatsen het cpp-bestand in de map ${{fibjs_project_dir}}/fibjs/src/, en het headerbestand in de map ${{fibjs_project_dir}}/fibjs/include. Voor dit voorbeeld zijn geen extra headerbestanden vereist. We maken een nieuwe bestandsnaam.cpp in de map fibjs/src/ met de volgende inhoud:

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

Wat moet worden opgemerkt, is DECLARE_MODULE(name);deze zin, die de module "naam" declareert en registreert bij het javascript-object. U moet deze zin toevoegen wanneer u de broncode schrijft. In v0.25.0en latere versies zullen we de fibjs-module scheiden voor beter hergebruik, dus je moet nog steeds de volgende zin toevoegen aan de functie fibjs/program/src/fibjs.cppin het bestand : om de aangepaste module te installeren.importModuleIMPORT_MODULE(name);

Compileren en testen

Voordat u op Windows compileert, moet u het eerst uitvoeren fibjs tools/vsmake.jsen vervolgens bouwen. De compilatie- en lopende resultaten zijn als volgt: naam

Samenvatten

Geleerd hoe je native modules en objecten van fibjs kunt toevoegen en wijzigen. We kunnen een verscheidenheid aan complexe modules schrijven, en we kunnen ook bibliotheken van derden naar fibjs porten als ondersteuning bij het schrijven van onze modules. U bent van harte welkom om meer bij te dragen aan fibjs.