Skip to content

Commit fff2052

Browse files
authored
fix(0.81): Allow module centralized registration (#2848) (#2849)
1 parent 98b3d58 commit fff2052

3 files changed

Lines changed: 142 additions & 73 deletions

File tree

packages/react-native/React/Base/RCTBridge.mm

Lines changed: 118 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,130 @@
3232
#import "RCTReloadCommand.h"
3333
#import "RCTUtils.h"
3434

35+
// [macOS
36+
/**
37+
* List of core React Native modules.
38+
*
39+
* When RCT_MODULE_NO_SELF_LOAD is set to non-zero, module self-registration via +load is disabled.
40+
* Instead, RCTBridge will register these modules at initialization time.
41+
*/
42+
static NSArray<NSString *> *moduleClassNames = @[
43+
@"RCTViewManager",
44+
@"RCTActivityIndicatorViewManager",
45+
@"RCTDebuggingOverlayManager",
46+
@"RCTModalHostViewManager",
47+
@"RCTModalManager",
48+
@"RCTRefreshControlManager",
49+
@"RCTSafeAreaViewManager",
50+
@"RCTScrollContentViewManager",
51+
@"RCTScrollViewManager",
52+
@"RCTSwitchManager",
53+
@"RCTUIManager",
54+
@"RCTAccessibilityManager",
55+
@"RCTActionSheetManager",
56+
@"RCTAlertManager",
57+
@"RCTAppearance",
58+
@"RCTAppState",
59+
@"RCTClipboard",
60+
@"RCTDeviceInfo",
61+
@"RCTDevLoadingView",
62+
@"RCTDevMenu",
63+
@"RCTDevSettings",
64+
@"RCTDevToolsRuntimeSettingsModule",
65+
@"RCTEventDispatcher",
66+
@"RCTExceptionsManager",
67+
@"RCTI18nManager",
68+
@"RCTKeyboardObserver",
69+
@"RCTLogBox",
70+
@"RCTPerfMonitor",
71+
@"RCTPlatform",
72+
@"RCTRedBox",
73+
@"RCTSourceCode",
74+
@"RCTStatusBarManager",
75+
@"RCTTiming",
76+
@"RCTWebSocketModule",
77+
@"RCTNativeAnimatedModule",
78+
@"RCTNativeAnimatedTurboModule",
79+
@"RCTBlobManager",
80+
@"RCTFileReaderModule",
81+
@"RCTBundleAssetImageLoader",
82+
@"RCTGIFImageDecoder",
83+
@"RCTImageEditingManager",
84+
@"RCTImageLoader",
85+
@"RCTImageStoreManager",
86+
@"RCTImageViewManager",
87+
@"RCTLocalAssetImageLoader",
88+
@"RCTLinkingManager",
89+
@"RCTDataRequestHandler",
90+
@"RCTFileRequestHandler",
91+
@"RCTHTTPRequestHandler",
92+
@"RCTNetworking",
93+
@"RCTPushNotificationManager",
94+
@"RCTSettingsManager",
95+
@"RCTBaseTextViewManager",
96+
@"RCTBaseTextInputViewManager",
97+
@"RCTInputAccessoryViewManager",
98+
@"RCTMultilineTextInputViewManager",
99+
@"RCTRawTextViewManager",
100+
@"RCTSinglelineTextInputViewManager",
101+
@"RCTTextViewManager",
102+
@"RCTVirtualTextViewManager",
103+
@"RCTVibration",
104+
];
105+
// macOS]
106+
35107
static NSMutableArray<Class> *RCTModuleClasses;
36108
static dispatch_queue_t RCTModuleClassesSyncQueue;
109+
110+
// [macOS
111+
/**
112+
* Make sure ModuleClassesSyncQueue is initialized before any referring functions are called.
113+
*/
114+
static void RCTEnsureModuleClassesInitialized(void)
115+
{
116+
static dispatch_once_t onceToken;
117+
dispatch_once(&onceToken, ^{
118+
RCTModuleClasses = [NSMutableArray new];
119+
RCTModuleClassesSyncQueue =
120+
dispatch_queue_create("com.facebook.react.ModuleClassesSyncQueue", DISPATCH_QUEUE_CONCURRENT);
121+
});
122+
}
123+
// macOS]
124+
37125
NSArray<Class> *RCTGetModuleClasses(void)
38126
{
127+
// [macOS
128+
RCTEnsureModuleClassesInitialized();
129+
130+
#if RCT_MODULE_NO_SELF_LOAD
131+
// When RCT_MODULE_NO_SELF_LOAD is enabled, modules don't self-register via +load
132+
// Add core React Native modules here instead
133+
__block NSMutableArray<Class> *result;
134+
dispatch_sync(RCTModuleClassesSyncQueue, ^{
135+
result = [RCTModuleClasses mutableCopy];
136+
});
137+
138+
for (NSString *className in moduleClassNames) {
139+
Class cls = NSClassFromString(className);
140+
if (cls != nil) {
141+
[result addObject:cls];
142+
}
143+
}
144+
145+
NSArray<Class> *finalResult = [result copy];
146+
147+
return finalResult;
148+
#else
149+
// macOS]
39150
__block NSArray<Class> *result;
40151
dispatch_sync(RCTModuleClassesSyncQueue, ^{
41152
result = [RCTModuleClasses copy];
42153
});
154+
43155
return result;
156+
// [macOS
157+
#endif //RCT_MODULE_NO_SELF_LOAD
158+
// macOS]
44159
}
45160

46161
NSSet<NSString *> *getCoreModuleClasses(void);
@@ -49,69 +164,7 @@
49164
static NSSet<NSString *> *coreModuleClasses = nil;
50165
static dispatch_once_t onceToken;
51166
dispatch_once(&onceToken, ^{
52-
coreModuleClasses = [NSSet setWithArray:@[
53-
@"RCTViewManager",
54-
@"RCTActivityIndicatorViewManager",
55-
@"RCTDebuggingOverlayManager",
56-
@"RCTModalHostViewManager",
57-
@"RCTModalManager",
58-
@"RCTRefreshControlManager",
59-
@"RCTSafeAreaViewManager",
60-
@"RCTScrollContentViewManager",
61-
@"RCTScrollViewManager",
62-
@"RCTSwitchManager",
63-
@"RCTUIManager",
64-
@"RCTAccessibilityManager",
65-
@"RCTActionSheetManager",
66-
@"RCTAlertManager",
67-
@"RCTAppearance",
68-
@"RCTAppState",
69-
@"RCTClipboard",
70-
@"RCTDeviceInfo",
71-
@"RCTDevLoadingView",
72-
@"RCTDevMenu",
73-
@"RCTDevSettings",
74-
@"RCTDevToolsRuntimeSettingsModule",
75-
@"RCTEventDispatcher",
76-
@"RCTExceptionsManager",
77-
@"RCTI18nManager",
78-
@"RCTKeyboardObserver",
79-
@"RCTLogBox",
80-
@"RCTPerfMonitor",
81-
@"RCTPlatform",
82-
@"RCTRedBox",
83-
@"RCTSourceCode",
84-
@"RCTStatusBarManager",
85-
@"RCTTiming",
86-
@"RCTWebSocketModule",
87-
@"RCTNativeAnimatedModule",
88-
@"RCTNativeAnimatedTurboModule",
89-
@"RCTBlobManager",
90-
@"RCTFileReaderModule",
91-
@"RCTBundleAssetImageLoader",
92-
@"RCTGIFImageDecoder",
93-
@"RCTImageEditingManager",
94-
@"RCTImageLoader",
95-
@"RCTImageStoreManager",
96-
@"RCTImageViewManager",
97-
@"RCTLocalAssetImageLoader",
98-
@"RCTLinkingManager",
99-
@"RCTDataRequestHandler",
100-
@"RCTFileRequestHandler",
101-
@"RCTHTTPRequestHandler",
102-
@"RCTNetworking",
103-
@"RCTPushNotificationManager",
104-
@"RCTSettingsManager",
105-
@"RCTBaseTextViewManager",
106-
@"RCTBaseTextInputViewManager",
107-
@"RCTInputAccessoryViewManager",
108-
@"RCTMultilineTextInputViewManager",
109-
@"RCTRawTextViewManager",
110-
@"RCTSinglelineTextInputViewManager",
111-
@"RCTTextViewManager",
112-
@"RCTVirtualTextViewManager",
113-
@"RCTVibration",
114-
]];
167+
coreModuleClasses = [NSSet setWithArray:moduleClassNames]; // [macOS]
115168
});
116169

117170
return coreModuleClasses;
@@ -146,12 +199,8 @@ void RCTRegisterModule(Class moduleClass)
146199
![getCoreModuleClasses() containsObject:[moduleClass description]]) {
147200
addModuleLoadedWithOldArch([moduleClass description]);
148201
}
149-
static dispatch_once_t onceToken;
150-
dispatch_once(&onceToken, ^{
151-
RCTModuleClasses = [NSMutableArray new];
152-
RCTModuleClassesSyncQueue =
153-
dispatch_queue_create("com.facebook.react.ModuleClassesSyncQueue", DISPATCH_QUEUE_CONCURRENT);
154-
});
202+
203+
RCTEnsureModuleClassesInitialized(); // [macOS]
155204

156205
RCTAssert(
157206
[moduleClass conformsToProtocol:@protocol(RCTBridgeModule)],

packages/react-native/React/Base/RCTBridgeModule.h

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,18 @@ RCT_EXTERN_C_END
6363
*/
6464
@protocol RCTBridgeModule <NSObject>
6565

66+
// [macOS
67+
#if RCT_MODULE_NO_SELF_LOAD
68+
#define RCT_EXPORT_MODULE_LOAD
69+
#else
70+
#define RCT_EXPORT_MODULE_LOAD \
71+
+(void)load \
72+
{ \
73+
RCTRegisterModule(self); \
74+
}
75+
#endif
76+
// macOS]
77+
6678
/**
6779
* Place this macro in your class implementation to automatically register
6880
* your module with the bridge when it loads. The optional js_name argument
@@ -75,10 +87,7 @@ RCT_EXTERN_C_END
7587
{ \
7688
return @ #js_name; \
7789
} \
78-
+(void)load \
79-
{ \
80-
RCTRegisterModule(self); \
81-
}
90+
RCT_EXPORT_MODULE_LOAD // [macOS]
8291

8392
/**
8493
* Same as RCT_EXPORT_MODULE, but uses __attribute__((constructor)) for module

packages/react-native/React/Base/RCTDefines.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,17 @@
2222
#define RCT_EXTERN_C_END
2323
#endif
2424

25+
// [macOS
26+
/**
27+
* The RCT_MODULE_NO_SELF_LOAD macro can be used to disable module self-registration
28+
* via +load methods. When enabled, modules are registered by RCTBridge instead.
29+
* This can improve performance during module lazy-loading.
30+
*/
31+
#ifndef RCT_MODULE_NO_SELF_LOAD
32+
#define RCT_MODULE_NO_SELF_LOAD 0
33+
#endif
34+
// macOS]
35+
2536
/**
2637
* The RCT_DEBUG macro can be used to exclude error checking and logging code
2738
* from release builds to improve performance and reduce binary size.

0 commit comments

Comments
 (0)