From 6353c6e8b0b44fee270d25acb9ac254341785a65 Mon Sep 17 00:00:00 2001 From: Andrew Coates <30809111+acoates-ms@users.noreply.github.com> Date: Wed, 6 May 2026 09:37:58 -0700 Subject: [PATCH 1/2] Add ability to register modules as eager init --- .../ModuleRegistration.cpp | 10 +++++++-- .../ModuleRegistration.h | 21 +++++++++++++++---- .../Microsoft.ReactNative.Cxx/NativeModules.h | 5 +++++ .../IReactPackageBuilder.idl | 6 ++++++ .../ReactHost/ReactInstanceWin.cpp | 1 + .../ReactPackageBuilder.cpp | 7 +++++++ .../ReactPackageBuilder.h | 1 + .../TurboModulesProvider.cpp | 15 +++++-------- .../TurboModulesProvider.h | 2 ++ 9 files changed, 52 insertions(+), 16 deletions(-) diff --git a/vnext/Microsoft.ReactNative.Cxx/ModuleRegistration.cpp b/vnext/Microsoft.ReactNative.Cxx/ModuleRegistration.cpp index 485c38b9c2a..0b895e0749f 100644 --- a/vnext/Microsoft.ReactNative.Cxx/ModuleRegistration.cpp +++ b/vnext/Microsoft.ReactNative.Cxx/ModuleRegistration.cpp @@ -18,7 +18,10 @@ ModuleRegistration::ModuleRegistration(wchar_t const *moduleName) noexcept : m_m void AddAttributedModules(IReactPackageBuilder const &packageBuilder, bool useTurboModules) noexcept { for (auto const *reg = ModuleRegistration::Head(); reg != nullptr; reg = reg->Next()) { if (useTurboModules || reg->ShouldRegisterAsTurboModule()) - packageBuilder.AddTurboModule(reg->ModuleName(), reg->MakeModuleProvider()); + if (reg->IsEagerInit()) + packageBuilder.AddEagerInitTurboModule(reg->ModuleName(), reg->MakeModuleProvider()); + else + packageBuilder.AddTurboModule(reg->ModuleName(), reg->MakeModuleProvider()); else packageBuilder.AddModule(reg->ModuleName(), reg->MakeModuleProvider()); } @@ -31,7 +34,10 @@ bool TryAddAttributedModule( for (auto const *reg = ModuleRegistration::Head(); reg != nullptr; reg = reg->Next()) { if (moduleName == reg->ModuleName()) { if (useTurboModule || reg->ShouldRegisterAsTurboModule()) { - packageBuilder.AddTurboModule(moduleName, reg->MakeModuleProvider()); + if (reg->IsEagerInit()) + packageBuilder.AddEagerInitTurboModule(moduleName, reg->MakeModuleProvider()); + else + packageBuilder.AddTurboModule(moduleName, reg->MakeModuleProvider()); } else { packageBuilder.AddModule(moduleName, reg->MakeModuleProvider()); } diff --git a/vnext/Microsoft.ReactNative.Cxx/ModuleRegistration.h b/vnext/Microsoft.ReactNative.Cxx/ModuleRegistration.h index 16745d8888d..669a3c02135 100644 --- a/vnext/Microsoft.ReactNative.Cxx/ModuleRegistration.h +++ b/vnext/Microsoft.ReactNative.Cxx/ModuleRegistration.h @@ -30,10 +30,11 @@ template struct IsReactTurboModule : std::bool_constant(nullptr))> {}; #define INTERNAL_REACT_MODULE_REGISTRATION_AND_PROVIDER( \ - moduleStruct, moduleName, eventEmitterName, isReactTurboModule) \ + moduleStruct, moduleName, eventEmitterName, isReactTurboModule, isEagerInit) \ struct moduleStruct; \ \ constexpr bool ReactIsReactTurboModuleImpl(moduleStruct *) noexcept { return isReactTurboModule; } \ + constexpr bool ReactIsEagerInitTurboModuleImpl(moduleStruct *) noexcept { return isEagerInit; } \ \ template \ struct moduleStruct##_ModuleRegistration final : winrt::Microsoft::ReactNative::ModuleRegistration { \ @@ -44,6 +45,7 @@ struct IsReactTurboModule : std::bool_constant()); + turboModulesProvider->AddEagerInit("FabricUIManagerBinding"); registerTurboModule( L"AccessibilityInfo", diff --git a/vnext/Microsoft.ReactNative/ReactPackageBuilder.cpp b/vnext/Microsoft.ReactNative/ReactPackageBuilder.cpp index eb92907b30c..8a3828dd3a1 100644 --- a/vnext/Microsoft.ReactNative/ReactPackageBuilder.cpp +++ b/vnext/Microsoft.ReactNative/ReactPackageBuilder.cpp @@ -34,6 +34,13 @@ void ReactPackageBuilder::AddTurboModule( m_turboModulesProvider->AddModuleProvider(moduleName, moduleProvider, true); } +void ReactPackageBuilder::AddEagerInitTurboModule( + hstring const &moduleName, + ReactModuleProvider const &moduleProvider) noexcept { + m_turboModulesProvider->AddModuleProvider(moduleName, moduleProvider, true); + m_turboModulesProvider->AddEagerInit(winrt::to_string(moduleName)); +} + void ReactPackageBuilder::AddViewComponent( winrt::hstring componentName, ReactViewComponentProvider const &viewComponentProvider) noexcept { diff --git a/vnext/Microsoft.ReactNative/ReactPackageBuilder.h b/vnext/Microsoft.ReactNative/ReactPackageBuilder.h index 42dfff59bf7..056b6b148c6 100644 --- a/vnext/Microsoft.ReactNative/ReactPackageBuilder.h +++ b/vnext/Microsoft.ReactNative/ReactPackageBuilder.h @@ -20,6 +20,7 @@ struct ReactPackageBuilder : winrt::implements TurboModulesProvider::getModule( } std::vector TurboModulesProvider::getEagerInitModuleNames() noexcept { - std::vector eagerModules; - auto it = m_moduleProviders.find("UIManager"); - if (it != m_moduleProviders.end()) { - eagerModules.push_back("UIManager"); - } - it = m_moduleProviders.find("FabricUIManagerBinding"); - if (it != m_moduleProviders.end()) { - eagerModules.push_back("FabricUIManagerBinding"); - } - return eagerModules; + return m_eagerInitModuleNames; +} + +void TurboModulesProvider::AddEagerInit(std::string moduleName) noexcept { + m_eagerInitModuleNames.push_back(moduleName); } void TurboModulesProvider::SetReactContext(const IReactContext &reactContext) noexcept { diff --git a/vnext/Microsoft.ReactNative/TurboModulesProvider.h b/vnext/Microsoft.ReactNative/TurboModulesProvider.h index 99436dd82c4..ebaf6f9cf45 100644 --- a/vnext/Microsoft.ReactNative/TurboModulesProvider.h +++ b/vnext/Microsoft.ReactNative/TurboModulesProvider.h @@ -26,6 +26,7 @@ class TurboModulesProvider final : public facebook::react::TurboModuleRegistry { winrt::hstring const &moduleName, ReactModuleProvider const &moduleProvider, bool overwriteExisting) noexcept; + void AddEagerInit(std::string moduleName) noexcept; std::shared_ptr const &LongLivedObjectCollection() noexcept; private: @@ -33,6 +34,7 @@ class TurboModulesProvider final : public facebook::react::TurboModuleRegistry { std::shared_ptr m_longLivedObjectCollection{ std::make_shared()}; std::unordered_map m_moduleProviders; + std::vector m_eagerInitModuleNames; IReactContext m_reactContext; }; From a6976bcc70e0ea77af3bdda2bc239da7a173aee8 Mon Sep 17 00:00:00 2001 From: Andrew Coates <30809111+acoates-ms@users.noreply.github.com> Date: Wed, 6 May 2026 09:38:08 -0700 Subject: [PATCH 2/2] Change files --- ...ative-windows-3f20e903-f2ed-45d8-b852-7408a50c36f2.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 change/react-native-windows-3f20e903-f2ed-45d8-b852-7408a50c36f2.json diff --git a/change/react-native-windows-3f20e903-f2ed-45d8-b852-7408a50c36f2.json b/change/react-native-windows-3f20e903-f2ed-45d8-b852-7408a50c36f2.json new file mode 100644 index 00000000000..d7a7cb5eee1 --- /dev/null +++ b/change/react-native-windows-3f20e903-f2ed-45d8-b852-7408a50c36f2.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Add ability to register modules as eager init", + "packageName": "react-native-windows", + "email": "30809111+acoates-ms@users.noreply.github.com", + "dependentChangeType": "patch" +}