新しい Electron ブラウザモジュールの作成
Electron API ガイドへようこそ!browser
ディレクトリ内に新しい Electron API モジュールを作成することに慣れていない場合、このガイドは、実装する必要があるいくつかの必要な手順のチェックリストとして役立ちます。
これは、Electron Browser API の作成に関する包括的な最終ガイドではなく、どちらかというと、いくつかの直感的でない手順を文書化した概要です。
Electron のプロジェクト構成にファイルを追加する
Electron は、コンパイラ用のファイルを生成するために、メタビルドシステムとしてGN を使用します。Ninja。つまり、Electron にコードをコンパイルするように指示するには、API のコードとヘッダーファイル名を filenames.gni
に追加する必要があります。
次のように、API ファイル名を適切なファイルにアルファベット順に追加する必要があります。
lib_sources = [
"path/to/api/api_name.cc",
"path/to/api/api_name.h",
]
lib_sources_mac = [
"path/to/api/api_name_mac.h",
"path/to/api/api_name_mac.mm",
]
lib_sources_win = [
"path/to/api/api_name_win.cc",
"path/to/api/api_name_win.h",
]
lib_sources_linux = [
"path/to/api/api_name_linux.cc",
"path/to/api/api_name_linux.h",
]
Windows、macOS、Linux 配列の追加はオプションであり、API に特定のプラットフォーム実装がある場合にのみ追加する必要があることに注意してください。
API ドキュメントを作成する
型定義は、@electron/docs-parser
および @electron/typescript-definitions
を使用して Electron によって生成されます。このステップは、Electron の API ドキュメント全体で一貫性を確保するために必要です。つまり、API 型定義を electron.d.ts
ファイルに表示するには、.md
ファイルを作成する必要があります。例は このフォルダ にあります。
ObjectTemplateBuilder
と Wrappable
を設定する
Electron は、object_template_builder
を使用してモジュールを構築します。
wrappable
は、対応する v8 ラッパーオブジェクトを持つ C++ オブジェクトの基本クラスです。
以下に、API に object_template_builder
と wrappable
を組み込むために追加する必要がある可能性がある基本的なコードの例を示します。詳細については、こちら でより多くの実装を見つけることができます。
api_name.h
ファイル内
#ifndef ELECTRON_SHELL_BROWSER_API_ELECTRON_API_{API_NAME}_H_
#define ELECTRON_SHELL_BROWSER_API_ELECTRON_API_{API_NAME}_H_
#include "gin/handle.h"
#include "gin/wrappable.h"
namespace electron {
namespace api {
class ApiName : public gin::Wrappable<ApiName> {
public:
static gin::Handle<ApiName> Create(v8::Isolate* isolate);
// gin::Wrappable
static gin::WrapperInfo kWrapperInfo;
gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate) override;
const char* GetTypeName() override;
} // namespace api
} // namespace electron
api_name.cc
ファイル内
#include "shell/browser/api/electron_api_safe_storage.h"
#include "shell/browser/browser.h"
#include "shell/common/gin_converters/base_converter.h"
#include "shell/common/gin_converters/callback_converter.h"
#include "shell/common/gin_helper/dictionary.h"
#include "shell/common/gin_helper/object_template_builder.h"
#include "shell/common/node_includes.h"
#include "shell/common/platform_util.h"
namespace electron {
namespace api {
gin::WrapperInfo ApiName::kWrapperInfo = {gin::kEmbedderNativeGin};
gin::ObjectTemplateBuilder ApiName::GetObjectTemplateBuilder(
v8::Isolate* isolate) {
return gin::ObjectTemplateBuilder(isolate)
.SetMethod("methodName", &ApiName::methodName);
}
const char* ApiName::GetTypeName() {
return "ApiName";
}
// static
gin::Handle<ApiName> ApiName::Create(v8::Isolate* isolate) {
return gin::CreateHandle(isolate, new ApiName());
}
} // namespace api
} // namespace electron
namespace {
void Initialize(v8::Local<v8::Object> exports,
v8::Local<v8::Value> unused,
v8::Local<v8::Context> context,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
gin_helper::Dictionary dict(isolate, exports);
dict.Set("apiName", electron::api::ApiName::Create(isolate));
}
} // namespace
Electron API を Node にリンクする
typings/internal-ambient.d.ts
ファイルで、次のように、新しいプロパティを Process
インターフェースに追加する必要があります。
interface Process {
_linkedBinding(name: 'electron_browser_{api_name}'): Electron.ApiName;
}
api_name.cc
ファイルの最下部
NODE_LINKED_BINDING_CONTEXT_AWARE(electron_browser_{api_name},Initialize)
shell/common/node_bindings.cc
ファイルで、Node バインディング名を Electron の組み込みモジュールに追加します。
#define ELECTRON_BROWSER_MODULES(V) \
V(electron_browser_{api_name})
注:Node が Electron とどのようにリンクするかに関する技術的な詳細については、ブログ をご覧ください。
TypeScript に API を公開する
API をモジュールとしてエクスポートする
次のパスに新しい TypeScript ファイルを作成する必要があります。
"lib/browser/api/{electron_browser_{api_name}}.ts"
このファイルの内容の例は、こちら で確認できます。
TypeScript にモジュールを公開する
次のように、"lib/browser/api/module-list.ts"
にあるモジュールリストにモジュールを追加します。
export const browserModuleList: ElectronInternal.ModuleEntry[] = [
{ name: 'apiName', loader: () => require('./api-name') },
];