Closed
Description
I think the official website is very disordered. Maybe as a veteran, you can't feel it. But for newbie, it seems a total mess. I list some issues:
- Everyone knows that RN's great new architecture. but when I read the official website, I can't tell which part belongs to new arch, which part doesn't. If the document is the old one, where to find the new document?
- If the 0.69 contains the new arch, do we have a dedicated document to explain how to turn on the new arch?
- The scaffold and website are out of sync. I use
npx react-native init TechApp --template react-native-template-typescript
to create a project, then I switch to new arch according to the website's instruction. I have two examples:
- It seems the scaffold already has a switch to turn on new arch: "RCT_NEW_ARCH_ENABLED", but it's not enough, because the document says if you want to enable TurboModule,
RCTEnableTurboModule(YES)
must be called, but the sample code about the switch in scaffold doesn't have this code:
#if RCT_NEW_ARCH_ENABLED
_contextContainer = std::make_shared<facebook::react::ContextContainer const>();
_reactNativeConfig = std::make_shared<facebook::react::EmptyReactNativeConfig const>();
_contextContainer->insert("ReactNativeConfig", _reactNativeConfig);
_bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer];
bridge.surfacePresenter = _bridgeAdapter.surfacePresenter;
#endif
- The document instruction says:" you will create a RCTTurboModuleManager in your bridge delegate’s jsExecutorFactoryForBridge", the code in the document is like this:
#pragma mark - RCTCxxBridgeDelegate
- (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge
{
// Add these lines to create a TurboModuleManager
if (RCTTurboModuleEnabled()) {
_turboModuleManager =
[[RCTTurboModuleManager alloc] initWithBridge:bridge
delegate:self
jsInvoker:bridge.jsCallInvoker];
// Necessary to allow NativeModules to lookup TurboModules
[bridge setRCTTurboModuleRegistry:_turboModuleManager];
if (!RCTTurboModuleEagerInitEnabled()) {
/**
* Instantiating DevMenu has the side-effect of registering
* shortcuts for CMD + d, CMD + i, and CMD + n via RCTDevMenu.
* Therefore, when TurboModules are enabled, we must manually create this
* NativeModule.
*/
[_turboModuleManager moduleForName:"DevMenu"];
}
}
// Add this line...
__weak __typeof(self) weakSelf = self;
// If you want to use the `JSCExecutorFactory`, remember to add the `#import <React/JSCExecutorFactory.h>`
// import statement on top.
return std::make_unique<facebook::react::HermesExecutorFactory>(
facebook::react::RCTJSIExecutorRuntimeInstaller([weakSelf, bridge](facebook::jsi::Runtime &runtime) {
if (!bridge) {
return;
}
// And add these lines to install the bindings...
__typeof(self) strongSelf = weakSelf;
if (strongSelf) {
facebook::react::RuntimeExecutor syncRuntimeExecutor =
[&](std::function<void(facebook::jsi::Runtime & runtime_)> &&callback) { callback(runtime); };
[strongSelf->_turboModuleManager installJSBindingWithRuntimeExecutor:syncRuntimeExecutor];
}
}));
}
but the code in scaffold is like this:
#pragma mark - RCTCxxBridgeDelegate
- (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge
{
_turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge
delegate:self
jsInvoker:bridge.jsCallInvoker];
[bridge setRCTTurboModuleRegistry:_turboModuleManager];
return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager);
}
the biggest difference is the return
, they are totally different. which one should I use?
Please help!!!!!
Metadata
Metadata
Assignees
Labels
No labels