Skip to main content

Entry Point

Nitro is built on top of JSI - while the primary target is React Native, Nitro even works on any other target that provides JSI.

React Native's Entry Point​

In React Native apps, Nitro makes use of the autolinking functionality provided by RN CLI.

Nitro itself is a react-native library - either a Native Module (old arch) or a Turbo Module (new arch) - with a single native method: install(). This native method will be called from JS when importing react-native-nitro-modules, so it will always happen before trying to use the NitroModules JS object.

Manually registering Nitro​

If you are not within a typical React Native environment (e.g. a brownfield app, an out-of-tree platform, or simply a pure JSI environment), you can also use Nitro Modules by just installing Nitro manually.

After creating your jsi::Runtime and an instance of Dispatcher, simply call margelo::nitro::install():

#include <jsi/jsi.h>
#include <NitroModules/InstallNitro.hpp>
#include <NitroModules/Dispatcher.hpp>

jsi::Runtime& runtime = ...
std::shared_ptr<Dispatcher> dispatcher = ...
margelo::nitro::install(runtime, dispatcher);

Your Dispatcher implementation must properly implement runAsync and runSync to schedule calls on a Thread that can safely access the jsi::Runtime.

tip

If your Runtime can be accessed from any Thread, you can also skip Thread-hops here and just call the functions directly in your Dispatcher.

No Dispatcher​

Nitro can also be installed without a Dispatcher:

#include <jsi/jsi.h>
#include <NitroModules/InstallNitro.hpp>

jsi::Runtime& runtime = ...
margelo::nitro::install(runtime);

In this case, all synchronous methods and properties remain in-tact, but any asynchronous hybrid methods (Promise) or callbacks will throw an error that Nitro does not have a Dispatcher to get back to the JS Thread.