@smaddock/electron-native-utils
v1.0.0
Published
Additional native utilities for Electron.
Downloads
94
Maintainers
Readme
electron-native-utils
Additional native utilities for Electron.
Building
Requirements
- Windows: Visual Studio 2022
Commands
yarn build
- Incremental builds.yarn build:ci
- Clean and fully rebuild.yarn build:debug
- Debug builds for easier debugging.
Architecture
electron-native-utils uses node-gyp to configure and build .node binaries.
It uses Node-API to provide JavaScript bindings to native code.
Files
src/
- contains C++ source and header fileslib/index.js
- main entry point of the node modulelib/index.d.ts
- TypeScript type definitionsbinding.gyp
- build config for node-gyptest.js
- simple test script to require and invoke the module's API to ensure no crashes occur
API Design
- Group functionality by namespaces
- Prefer promises over callbacks for async
- Reject promises with an
Error
instead of a string - Exported bindings should be available on each platform (Windows, Mac, Linux)
- When a function returns a promise, it should reject on unsupported platforms.
Otherwise, it should throw an exception.
- When a function returns a promise, it should reject on unsupported platforms.
Writing cross-platform code
- Source files can be compiled for specific patterns using a filename postfix.
_win
- Windows_mac
- macOS_linux
- Linux
- Platform-specific macros can be used to export methods which throw on
unsupported platforms.
Napi::Object InitApi(Napi::Env env) { Napi::Object exports = Napi::Object::New(env); // Method throws on non-Windows platforms. METHOD_WIN(winMethodName, WinMethod); // Method throws on non-MacOS platforms. METHOD_MAC(macMethodName, MacMethod); // Async variants which reject returned promise on unsupported platforms. METHOD_ASYNC_WIN(asyncMethod, AsyncMethod); METHOD_ASYNC_MAC(asyncMethod, AsyncMethod); return exports; }
- Platform defines can be used to conditionally include code.
#ifdef _WIN32 // Windows code #endif // _WIN32 // OR #if defined(_WIN32) // Windows code #elif defined(__APPLE__) // Mac code #elif defined(__linux__) // Linux code #endif