mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Allow taking control of bundle loading on new arch (#46731)
Summary:
On the old architecture you could take control of loading the bundle by implementing
```objc
- (void)loadSourceForBridge:(RCTBridge *)bridge
onProgress:(RCTSourceLoadProgressBlock)onProgress
onComplete:(RCTSourceLoadBlock)loadCallback;
```
in your `RCTBridgeDelegate`. This is not currently possible in the new architecture.
I've added this using a pretty much identical api by adding a function to both the `RCTInstanceDelegate` and `RCTHostDelegate` protocols. This will be called on the `RCTRootViewFactory`. I've added two properties to the `RCTRootViewFactoryConfiguration`, `loadSourceForHost` and `loadSourceWithProgressForHost`. If one is present, we call it, otherwise we fallback to the normal loading process
## Changelog:
[iOS] [Breaking] - Add ability to control bundle loading on the new architecture similar to `loadSourceForBridge`. Removed some properties from the `RCTRootViewFactory`.
Pull Request resolved: https://github.com/facebook/react-native/pull/46731
Test Plan: Rn-tester works as normal and it is working for our use case in expo go.
Reviewed By: blakef
Differential Revision: D63755188
Pulled By: cipolleschi
fbshipit-source-id: f1f26b2775b9e547ce7a23028665797c19bfdd9b
This commit is contained in:
committed by
Facebook GitHub Bot
parent
6a09fc09af
commit
7487a2c277
@@ -275,19 +275,6 @@
|
||||
return [weakSelf sourceURLForBridge:bridge];
|
||||
};
|
||||
|
||||
configuration.hostDidStartBlock = ^(RCTHost *_Nonnull host) {
|
||||
[weakSelf hostDidStart:host];
|
||||
};
|
||||
|
||||
configuration.hostDidReceiveJSErrorStackBlock =
|
||||
^(RCTHost *_Nonnull host,
|
||||
NSArray<NSDictionary<NSString *, id> *> *_Nonnull stack,
|
||||
NSString *_Nonnull message,
|
||||
NSUInteger exceptionId,
|
||||
BOOL isFatal) {
|
||||
[weakSelf host:host didReceiveJSErrorStack:stack message:message exceptionId:exceptionId isFatal:isFatal];
|
||||
};
|
||||
|
||||
if ([self respondsToSelector:@selector(extraModulesForBridge:)]) {
|
||||
configuration.extraModulesForBridge = ^NSArray<id<RCTBridgeModule>> *_Nonnull(RCTBridge *_Nonnull bridge)
|
||||
{
|
||||
@@ -309,7 +296,7 @@
|
||||
};
|
||||
}
|
||||
|
||||
return [[RCTRootViewFactory alloc] initWithConfiguration:configuration andTurboModuleManagerDelegate:self];
|
||||
return [[RCTRootViewFactory alloc] initWithTurboModuleDelegate:self hostDelegate:self configuration:configuration];
|
||||
}
|
||||
|
||||
#pragma mark - Feature Flags
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
@protocol RCTCxxBridgeDelegate;
|
||||
@protocol RCTComponentViewFactoryComponentProvider;
|
||||
@protocol RCTTurboModuleManagerDelegate;
|
||||
@protocol RCTHostDelegate;
|
||||
@class RCTBridge;
|
||||
@class RCTHost;
|
||||
@class RCTRootView;
|
||||
@@ -30,13 +31,6 @@ typedef NSURL *_Nullable (^RCTBundleURLBlock)(void);
|
||||
typedef NSArray<id<RCTBridgeModule>> *_Nonnull (^RCTExtraModulesForBridgeBlock)(RCTBridge *bridge);
|
||||
typedef NSDictionary<NSString *, Class> *_Nonnull (^RCTExtraLazyModuleClassesForBridge)(RCTBridge *bridge);
|
||||
typedef BOOL (^RCTBridgeDidNotFindModuleBlock)(RCTBridge *bridge, NSString *moduleName);
|
||||
typedef void (^RCTHostDidStartBlock)(RCTHost *host);
|
||||
typedef void (^RCTHostDidReceiveJSErrorStackBlock)(
|
||||
RCTHost *host,
|
||||
NSArray<NSDictionary<NSString *, id> *> *stack,
|
||||
NSString *message,
|
||||
NSUInteger exceptionId,
|
||||
BOOL isFatal);
|
||||
|
||||
#pragma mark - RCTRootViewFactory Configuration
|
||||
@interface RCTRootViewFactoryConfiguration : NSObject
|
||||
@@ -147,22 +141,6 @@ typedef void (^RCTHostDidReceiveJSErrorStackBlock)(
|
||||
*/
|
||||
@property (nonatomic, nullable) RCTBridgeDidNotFindModuleBlock bridgeDidNotFindModule;
|
||||
|
||||
/**
|
||||
* Called when `RCTHost` started.
|
||||
* @parameter: host - The started `RCTHost`.
|
||||
*/
|
||||
@property (nonatomic, nullable) RCTHostDidStartBlock hostDidStartBlock;
|
||||
|
||||
/**
|
||||
* Called when `RCTHost` received JS error.
|
||||
* @parameter: host - `RCTHost` which received js error.
|
||||
* @parameter: stack - JS error stack.
|
||||
* @parameter: message - Error message.
|
||||
* @parameter: exceptionId - Exception ID.
|
||||
* @parameter: isFatal - YES if JS error is fatal.
|
||||
*/
|
||||
@property (nonatomic, nullable) RCTHostDidReceiveJSErrorStackBlock hostDidReceiveJSErrorStackBlock;
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark - RCTRootViewFactory
|
||||
@@ -187,6 +165,10 @@ typedef void (^RCTHostDidReceiveJSErrorStackBlock)(
|
||||
|
||||
- (instancetype)initWithConfiguration:(RCTRootViewFactoryConfiguration *)configuration;
|
||||
|
||||
- (instancetype)initWithTurboModuleDelegate:(id<RCTTurboModuleManagerDelegate>)turboModuleManagerDelegate
|
||||
hostDelegate:(id<RCTHostDelegate>)hostdelegate
|
||||
configuration:(RCTRootViewFactoryConfiguration *)configuration;
|
||||
|
||||
/**
|
||||
* This method can be used to create new RCTRootViews on demand.
|
||||
*
|
||||
|
||||
@@ -83,7 +83,7 @@ static NSDictionary *updateInitialProps(NSDictionary *initialProps, BOOL isFabri
|
||||
|
||||
@end
|
||||
|
||||
@interface RCTRootViewFactory () <RCTContextContainerHandling, RCTHostDelegate> {
|
||||
@interface RCTRootViewFactory () <RCTContextContainerHandling> {
|
||||
std::shared_ptr<const facebook::react::ReactNativeConfig> _reactNativeConfig;
|
||||
facebook::react::ContextContainer::Shared _contextContainer;
|
||||
}
|
||||
@@ -95,15 +95,18 @@ static NSDictionary *updateInitialProps(NSDictionary *initialProps, BOOL isFabri
|
||||
@end
|
||||
|
||||
@implementation RCTRootViewFactory {
|
||||
RCTRootViewFactoryConfiguration *_configuration;
|
||||
__weak id<RCTTurboModuleManagerDelegate> _turboModuleManagerDelegate;
|
||||
__weak id<RCTHostDelegate> _hostDelegate;
|
||||
RCTRootViewFactoryConfiguration *_configuration;
|
||||
}
|
||||
|
||||
- (instancetype)initWithConfiguration:(RCTRootViewFactoryConfiguration *)configuration
|
||||
andTurboModuleManagerDelegate:(id<RCTTurboModuleManagerDelegate>)turboModuleManagerDelegate
|
||||
- (instancetype)initWithTurboModuleDelegate:(id<RCTTurboModuleManagerDelegate>)turboModuleManagerDelegate
|
||||
hostDelegate:(id<RCTHostDelegate>)hostdelegate
|
||||
configuration:(RCTRootViewFactoryConfiguration *)configuration
|
||||
{
|
||||
if (self = [super init]) {
|
||||
_configuration = configuration;
|
||||
_hostDelegate = hostdelegate;
|
||||
_contextContainer = std::make_shared<const facebook::react::ContextContainer>();
|
||||
_reactNativeConfig = std::make_shared<const facebook::react::EmptyReactNativeConfig>();
|
||||
_contextContainer->insert("ReactNativeConfig", _reactNativeConfig);
|
||||
@@ -112,6 +115,17 @@ static NSDictionary *updateInitialProps(NSDictionary *initialProps, BOOL isFabri
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithConfiguration:(RCTRootViewFactoryConfiguration *)configuration
|
||||
andTurboModuleManagerDelegate:(id<RCTTurboModuleManagerDelegate>)turboModuleManagerDelegate
|
||||
{
|
||||
id<RCTHostDelegate> hostDelegate = [turboModuleManagerDelegate conformsToProtocol:@protocol(RCTHostDelegate)]
|
||||
? (id<RCTHostDelegate>)turboModuleManagerDelegate
|
||||
: nil;
|
||||
return [self initWithTurboModuleDelegate:turboModuleManagerDelegate
|
||||
hostDelegate:hostDelegate
|
||||
configuration:configuration];
|
||||
}
|
||||
|
||||
- (instancetype)initWithConfiguration:(RCTRootViewFactoryConfiguration *)configuration
|
||||
{
|
||||
return [self initWithConfiguration:configuration andTurboModuleManagerDelegate:nil];
|
||||
@@ -188,26 +202,6 @@ static NSDictionary *updateInitialProps(NSDictionary *initialProps, BOOL isFabri
|
||||
return rootView;
|
||||
}
|
||||
|
||||
#pragma mark - RCTHostDelegate
|
||||
|
||||
- (void)hostDidStart:(RCTHost *)host
|
||||
{
|
||||
if (self->_configuration.hostDidStartBlock) {
|
||||
self->_configuration.hostDidStartBlock(host);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)host:(RCTHost *)host
|
||||
didReceiveJSErrorStack:(NSArray<NSDictionary<NSString *, id> *> *)stack
|
||||
message:(NSString *)message
|
||||
exceptionId:(NSUInteger)exceptionId
|
||||
isFatal:(BOOL)isFatal
|
||||
{
|
||||
if (self->_configuration.hostDidReceiveJSErrorStackBlock) {
|
||||
self->_configuration.hostDidReceiveJSErrorStackBlock(host, stack, message, exceptionId, isFatal);
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - RCTCxxBridgeDelegate
|
||||
- (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge
|
||||
{
|
||||
@@ -266,7 +260,7 @@ static NSDictionary *updateInitialProps(NSDictionary *initialProps, BOOL isFabri
|
||||
__weak __typeof(self) weakSelf = self;
|
||||
RCTHost *reactHost =
|
||||
[[RCTHost alloc] initWithBundleURLProvider:self->_configuration.bundleURLBlock
|
||||
hostDelegate:self
|
||||
hostDelegate:_hostDelegate
|
||||
turboModuleManagerDelegate:_turboModuleManagerDelegate
|
||||
jsEngineProvider:^std::shared_ptr<facebook::react::JSRuntimeFactory>() {
|
||||
return [weakSelf createJSRuntimeFactory];
|
||||
|
||||
@@ -35,6 +35,11 @@ typedef NSURL *_Nullable (^RCTHostBundleURLProvider)(void);
|
||||
|
||||
- (void)hostDidStart:(RCTHost *)host;
|
||||
|
||||
@optional
|
||||
- (void)loadBundleAtURL:(NSURL *)sourceURL
|
||||
onProgress:(RCTSourceLoadProgressBlock)onProgress
|
||||
onComplete:(RCTSourceLoadBlock)loadCallback;
|
||||
|
||||
@end
|
||||
|
||||
@protocol RCTHostRuntimeDelegate <NSObject>
|
||||
|
||||
@@ -329,6 +329,17 @@ class RCTHostHostTargetDelegate : public facebook::react::jsinspector_modern::Ho
|
||||
[self.runtimeDelegate host:self didInitializeRuntime:runtime];
|
||||
}
|
||||
|
||||
- (void)loadBundleAtURL:(NSURL *)sourceURL
|
||||
onProgress:(RCTSourceLoadProgressBlock)onProgress
|
||||
onComplete:(RCTSourceLoadBlock)loadCallback
|
||||
{
|
||||
if ([_hostDelegate respondsToSelector:@selector(loadBundleAtURL:onProgress:onComplete:)]) {
|
||||
[_hostDelegate loadBundleAtURL:sourceURL onProgress:onProgress onComplete:loadCallback];
|
||||
} else {
|
||||
[RCTJavaScriptLoader loadBundleAtURL:sourceURL onProgress:onProgress onComplete:loadCallback];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - RCTContextContainerHandling
|
||||
|
||||
- (void)didCreateContextContainer:(std::shared_ptr<facebook::react::ContextContainer>)contextContainer
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#import <React/RCTDefines.h>
|
||||
#import <React/RCTJavaScriptLoader.h>
|
||||
#import <jsinspector-modern/ReactCdp.h>
|
||||
#import <react/runtime/JSRuntimeFactory.h>
|
||||
#import <react/runtime/ReactInstance.h>
|
||||
@@ -44,6 +45,10 @@ RCT_EXTERN void RCTInstanceSetRuntimeDiagnosticFlags(NSString *_Nullable flags);
|
||||
|
||||
- (void)instance:(RCTInstance *)instance didInitializeRuntime:(facebook::jsi::Runtime &)runtime;
|
||||
|
||||
- (void)loadBundleAtURL:(NSURL *)sourceURL
|
||||
onProgress:(RCTSourceLoadProgressBlock)onProgress
|
||||
onComplete:(RCTSourceLoadBlock)loadCallback;
|
||||
|
||||
@end
|
||||
|
||||
/**
|
||||
|
||||
+1
-2
@@ -25,7 +25,6 @@
|
||||
#import <React/RCTDisplayLink.h>
|
||||
#import <React/RCTEventDispatcherProtocol.h>
|
||||
#import <React/RCTFollyConvert.h>
|
||||
#import <React/RCTJavaScriptLoader.h>
|
||||
#import <React/RCTLog.h>
|
||||
#import <React/RCTLogBox.h>
|
||||
#import <React/RCTModuleData.h>
|
||||
@@ -416,7 +415,7 @@ void RCTInstanceSetRuntimeDiagnosticFlags(NSString *flags)
|
||||
#endif
|
||||
|
||||
__weak __typeof(self) weakSelf = self;
|
||||
[RCTJavaScriptLoader loadBundleAtURL:sourceURL
|
||||
[_delegate loadBundleAtURL:sourceURL
|
||||
onProgress:^(RCTLoadingProgress *progressData) {
|
||||
__typeof(self) strongSelf = weakSelf;
|
||||
if (!strongSelf) {
|
||||
|
||||
Reference in New Issue
Block a user