Добавить родной модуль
Если вам нужны какие-то функциональные возможности помимо тех, которые предоставляет собственный модуль fibjs, или если вы хотите добавить код в fibjs, эта статья может быть вам полезна.
Записать idl-файл
IDL — это описательный язык, используемый в fibjs для определения собственных модулей и методов объекта.
Прежде чем приступить к написанию собственного модуля fibjs, вам необходимо написать описательный язык idl. В качестве примера возьмем имя пользовательского модуля. Мне нужно написать описательное имя языка name.idl и поместить этот файл в каталог ${{fibjs_project_dir}}/idl/zh-cn/, где ${{fibjs_project_dir}} представляет каталог, в котором находится проект fibjs.
Наш модуль имени очень прост.Есть только один метод тестирования, параметром которого является строка.Эта строка является текстом песни.Метод тестирования определяет, правильный ли текст песни или нет, а возвращаемое значение имеет логический тип. 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);
};
Создать заголовочный файл
Выполните команду в каталоге инструментов fibjs idlc.js
. Это прочитает и проанализирует все файлы idl в каталоге idl и создаст соответствующие файлы заголовков и документы. Сгенерированные файлы заголовков будут храниться в каталоге «fibjs/include/ifs/». Например, name.idl автоматически создаст заголовочный файл ${{fibjs_project_dir}}/fibjs/include/ifs/name.h, который определяет класс 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/***************************************************************************
* *
* 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, который оборачивает тест метода. Здесь нам нужно реализовать только метод тестирования.Метод тестирования имеет два параметра: v0 — входной текст песни и vr — возвращаемое значение. Мы помещаем файл cpp в каталог ${{fibjs_project_dir}}/fibjs/src/, а файл заголовка — в каталог ${{fibjs_project_dir}}/fibjs/include. Для этого примера не требуются дополнительные файлы заголовков. Мы создаем новый файл с именем.cpp в каталоге fibjs/src/ со следующим содержимым:
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);
это предложение, которое объявляет модуль «name» и регистрирует его с помощью объекта javascript. Вам необходимо добавить это предложение при написании исходного кода. В v0.25.0
и более поздних версиях мы отделим модуль fibjs для более удобного повторного использования, поэтому вам все равно нужно добавить к функции fibjs/program/src/fibjs.cpp
в файле importModule
следующее предложение : IMPORT_MODULE(name);
to install the custom Module.
Скомпилируйте и протестируйте
Прежде чем компилировать в Windows, вам необходимо сначала выполнить его fibjs tools/vsmake.js
, а затем собрать. Результаты компиляции и запуска следующие:
Подведем итог
Научились добавлять и изменять собственные модули и объекты fibjs. Мы можем писать различные сложные модули, а также портировать сторонние библиотеки на fibjs в качестве поддержки для написания наших модулей. Вы можете внести свой вклад в fibjs.