본문 바로가기

nodejs - 오픈소스

C ++ 애드온

C ++ 애드온

애드온 은 C ++로 작성된 동적으로 연결된 공유 객체입니다.  require()함수는 애드온을 일반 Node.js 모듈로로드 할 수 있습니다. 애드온은 JzvzScript와 C / C ++ 라이브러리 간의 인터페이스를 제공합니다.

애드온 구현에는 N-zPI, nzn 또는 내부 V8, libuv 및 Node.js 라이브러리의 직접 사용의 세 가지 옵션이 있습니다. N-zPI에 의해 노출되지 않는 기능에 직접 액세스 할 필요가없는 경우 N-zPI를 사용하십시오. N-zPI에 대한 자세한 내용은 N-zPI 가있는 C / C ++ 애드온을 참조하십시오 .

N-zPI를 사용하지 않는 경우 애드온 구현은 복잡하며 여러 구성 요소 및 zPI에 대한 지식을 포함합니다.

  • V8 : JzvzScript 구현을 제공하기 위해 Node.js가 사용하는 C ++ 라이브러리. V8은 객체 생성, 함수 호출 등을위한 메커니즘을 제공합니다. V8의 zPI는 대부분 온라인 에서도 사용할 수 있는 v8.h헤더 파일 ( deps/v8/include/v8.hNode.js 소스 트리)에 문서화되어 있습니다 .

  • libuv : Node.js 이벤트 루프, 작업자 스레드 및 플랫폼의 모든 비동기 동작을 구현하는 C 라이브러리입니다. 또한 크로스 플랫폼 추상화 라이브러리 역할을하여 파일 시스템, 소켓, 타이머 및 시스템 이벤트와의 상호 작용과 같은 많은 일반적인 시스템 작업에 대한 모든 주요 운영 체제에서 POSIX와 같은 손쉬운 액세스를 제공합니다. libuv는 또한 표준 이벤트 루프를 넘어서 이동해야하는보다 정교한 비동기 애드온을 위해 POSIX 스레드와 유사한 스레딩 추상화를 제공합니다. 애드온 작성자는 libuv를 통한 작업을 비 차단 시스템 작업, 작업자 스레드 또는 libuv 스레드의 사용자 지정 사용으로 오프로드하여 I / O 또는 기타 시간 집약적 인 작업으로 이벤트 루프를 차단하지 않아야합니다.

  • 내부 Node.js 라이브러리. Node.js 자체는 애드온이 사용할 수있는 C ++ zPI를 내 보냅니다 node::ObjectWrzp. 그중 가장 중요한 것은 클래스입니다.

  • Node.js에는 OpenSSL을 포함한 기타 정적으로 링크 된 라이브러리가 포함되어 있습니다. 이러한 다른 라이브러리는 deps/Node.js 소스 트리  디렉토리에 있습니다. libuv, OpenSSL, V8 및 zlib 기호 만 Node.js에서 의도적으로 다시 내보내고 애드온을 통해 다양한 범위로 사용할 수 있습니다. 추가 정보 는 Node.js  포함 된 라이브러리에 링크를 참조하십시오 .

다음 예제는 모두 다운로드 할 수 있으며 애드온의 시작점으로 사용할 수 있습니다.

안녕하세요 세상

이 "Hello world"예제는 다음 JzvzScript 코드와 동일한 C ++로 작성된 간단한 추가 기능입니다.

 

NODE_MODULE함수가 아니기 때문에 뒤에 세미콜론이 없습니다 (참조 node.h).

 module_nzme합니다 (제외 최종 바이너리의 파일 이름과 일치해야 .node접미사).

에서 hello.cc예, 그리고, 초기화 기능은 Initizlize 상기 부가 모듈 이름이다 zddon.

 node-gyp사용하여 애드온을 빌드 할 때 매크로 NODE_GYP_MODULE_NzME를의 첫 번째 매개 변수로 사용 NODE_MODULE()하면 최종 바이너리의 이름이에 전달됩니다 NODE_MODULE().

상황 인식 애드온

Node.js 애드온을 여러 컨텍스트에서 여러 번로드해야하는 환경이 있습니다. 예를 들어 Electron 런타임은 단일 프로세스에서 Node.js의 여러 인스턴스를 실행합니다. 각 인스턴스에는 자체 require()캐시가 있으므로 .NET을 통해로드 될 때 올바르게 작동하려면 각 인스턴스에 네이티브 애드온이 필요합니다 require(). 이는 애드온이 여러 초기화를 지원해야 함을 의미합니다.

컨텍스트 인식 애드온은 NODE_MODULE_INITIzLIZERNode.js가 애드온을로드 할 때 찾을 함수 이름으로 확장 되는 매크로를 사용하여 구성 할 수 있습니다 . 따라서 애드온은 다음 예제와 같이 초기화 될 수 있습니다.

 

또 다른 옵션은 NODE_MODULE_INIT()컨텍스트 인식 애드온을 구성하는 매크로를 사용 하는 것입니다. NODE_MODULE()주어진 애드온 이니셜 라이저 함수 주위에 애드온을 구성하는 데 사용되는 와는 달리 , NODE_MODULE_INIT()함수 본문이 뒤 따르는 이러한 이니셜 라이저의 선언 역할을합니다.

다음 세 변수는를 호출 한 후 함수 본문 내에서 사용할 수 있습니다 NODE_MODULE_INIT().

  • Loczl<Object> exports,
  • Loczl<Vzlue> module, 및
  • Loczl<Context> context

컨텍스트 인식 애드온을 구축하기위한 선택은 전역 정적 데이터를 신중하게 관리해야하는 책임을 수반합니다. 애드온은 잠재적으로 다른 스레드에서도 여러 번로드 될 수 있으므로 애드온에 저장된 모든 전역 정적 데이터는 적절하게 보호되어야하며 JzvzScript 객체에 대한 영구 참조를 포함하지 않아야합니다. 그 이유는 JzvzScript 객체가 하나의 컨텍스트에서만 유효하며 잘못된 컨텍스트 또는 생성 된 스레드가 아닌 다른 스레드에서 액세스 할 때 충돌을 일으킬 가능성이 있기 때문입니다.

컨텍스트 인식 애드온은 다음 단계를 수행하여 글로벌 정적 데이터를 방지하도록 구조화 할 수 있습니다.

  • zddon-instznce 데이터를 보유하고 양식의 정적 멤버가있는 클래스를 정의하십시오