가이드 개발 가이드

네이티브 모듈 추가

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.jsidl idl 디렉토리에 있는 모든 파일을 읽고 구문 분석 하는 도구 디렉토리 명령 에서 실행 하면 해당 헤더 파일과 문서가 생성되며 생성된 헤더 파일은 "fibjs/include/ifs/" 디렉토리에 저장됩니다. 예를 들어, name.idl은 name_base 클래스를 정의하는 헤더 파일 ${{fibjs_project_dir}}/fibjs/include/ifs/name.h를 자동으로 생성합니다.

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 접근자입니다. 여기서 우리는 테스트 메소드를 구현하기만 하면 됩니다. 테스트 메소드에는 두 개의 매개변수가 있습니다. 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.0향후 버전 에서는 더 나은 재사용을 위해 fibjs 모듈을 제거할 것이므로 여전히 fibjs/program/src/fibjs.cppfile 해야 importModule하고 다음 문장 기능을 추가 해야 IMPORT_MODULE(name);합니다. 사용자 정의 모듈을 설치합니다.

컴파일 및 테스트

Windows에서 컴파일하기 전에 다시 실행 fibjs tools/vsmake.js한 다음 빌드해야 합니다. 컴파일 및 실행 결과는 다음과 같습니다. 이름

요약하다

fibjs의 네이티브 모듈과 객체를 추가하고 수정하는 방법을 배웠습니다. 모든 종류의 복잡한 모듈을 작성할 수 있으며 모듈 작성을 지원하기 위해 타사 라이브러리를 fibjs에 이식할 수도 있습니다. fibjs에 더 많은 기여를 하실 수 있습니다.