Aggiungi modulo nativo
Se hai bisogno di alcune funzionalità diverse da quelle fornite dal modulo nativo fibjs, o vuoi contribuire con il codice a fibjs, allora questo articolo potrebbe esserti utile.
Scrivi file idl
idl è un linguaggio descrittivo utilizzato per definire moduli nativi e metodi oggetto in fibjs.
Prima di iniziare a scrivere il tuo modulo fibjs, devi scrivere il linguaggio descrittivo idl. Prendiamo come esempio il nome del modulo personalizzato. Devo scrivere un linguaggio descrittivo name.idl e mettere questo file nella directory ${{fibjs_project_dir}}/idl/zh-cn/, dove ${{fibjs_project_dir}} rappresenta la directory in cui si trova il progetto fibjs.
Il nostro modulo del nome è molto semplice, c'è un solo metodo di test, il parametro è una stringa, questa stringa è il testo, il metodo di test giudica se i testi sono corretti e il valore restituito è di tipo booleano. name.idl è scritto come segue
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);
};
Genera file di intestazione
Eseguito nel fibjs idlc.js
comando directory degli strumenti , che legge tutti i file nella directory idl idl e analizza, genera i file di intestazione e la documentazione corrispondenti, i file di intestazione generati sono memorizzati nella directory "fibjs / include / ifs /". Ad esempio, name.idl genererà automaticamente il file di intestazione ${{fibjs_project_dir}}/fibjs/include/ifs/name.h, che definisce la classe 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
Scrivi il codice sorgente
Il metodo s_test è una funzione di accesso v8, che racchiude il test del metodo. Qui abbiamo solo bisogno di implementare il metodo di test, il metodo di test ha due parametri, v0 è il testo di input e vr è il valore restituito. Mettiamo il file cpp nella directory ${{fibjs_project_dir}}/fibjs/src/ e il file di intestazione nella directory ${{fibjs_project_dir}}/fibjs/include. Per questo esempio non sono necessari file di intestazione aggiuntivi. Creiamo un nuovo file name.cpp nella directory fibjs/src/ con il seguente contenuto:
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;
}
}
Nota che DECLARE_MODULE(name);
questa frase, la frase dichiara il "nome" di questo modulo e lo registra nell'oggetto javascript. Questa frase deve essere aggiunta quando si scrive il codice sorgente. Nelle v0.25.0
versioni future e i moduli fibjs verranno eliminati per poterli riutilizzare meglio, quindi è ancora necessario fibjs/program/src/fibjs.cpp
file importModule
, aggiungere la seguente funzione di frase: IMPORT_MODULE(name);
per installare un modulo personalizzato.
Compila e prova
Prima di compilare su Windows, è necessario eseguirlo di nuovo fibjs tools/vsmake.js
e quindi creare. I risultati di compilazione ed esecuzione sono i seguenti:
Ricapitolare
Imparato come aggiungere e modificare moduli nativi e oggetti di fibjs. Possiamo scrivere tutti i tipi di moduli complessi e possiamo anche trapiantare librerie di terze parti su fibjs come supporto per scrivere i nostri moduli. Sei libero di contribuire di più a fibjs.