Opt-in to use JavaScriptCore runtime in React Native.
Note: JavaScriptCore has been extracted from core react-native as a part of Lean Core JSC RFC.
Important
This library only supports React Native 0.79 and above with new architecture enabled.
yarn add @react-native-community/javascriptcore
Install pods:
cd ios && USE_THIRD_PARTY_JSC=1 USE_HERMES=0 bundle exec pod install
Note
Note: USE_THIRD_PARTY_JSC=1
is required to use JavaScriptCore from this package until JavaScriptCore is removed from core react-native.
Add the following to your android/gradle.properties
:
# Disable Hermes
hermesEnabled=false
# Enable third-party JSC
useThirdPartyJSC=true
Open AppDelegate.swift and overwrite createJSRuntimeFactory
method:
import React
import React_RCTAppDelegate
import ReactAppDependencyProvider
import UIKit
+import RCTRuntime
// AppDelegate code
class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate {
override func sourceURL(for bridge: RCTBridge) -> URL? {
self.bundleURL()
}
override func bundleURL() -> URL? {
#if DEBUG
RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index")
#else
Bundle.main.url(forResource: "main", withExtension: "jsbundle")
#endif
}
+ override func createJSRuntimeFactory() -> JSRuntimeFactory {
+ jsrt_create_jsc_factory() // Use JavaScriptCore runtime
+ }
}
Open MainApplication.java
and overwrite getJavaScriptExecutorFactory
method:
+import io.github.reactnativecommunity.javascriptcore.JSCExecutorFactory
+import io.github.reactnativecommunity.javascriptcore.JSCRuntimeFactory
class MainApplication : Application(), ReactApplication {
override val reactNativeHost: ReactNativeHost =
object : DefaultReactNativeHost(this) {
override fun getPackages(): List<ReactPackage> =
PackageList(this).packages.apply {
// Packages that cannot be autolinked yet can be added manually here, for example:
// add(MyReactNativePackage())
}
override fun getJSMainModuleName(): String = "index"
override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
+ override fun getJavaScriptExecutorFactory(): JavaScriptExecutorFactory =
+ JSCExecutorFactory(packageName, AndroidInfoHelpers.getFriendlyDeviceName())
}
+ override val reactHost: ReactHost
+ get() = getDefaultReactHost(applicationContext, reactNativeHost, JSCRuntimeFactory())
override fun onCreate() {
super.onCreate()
SoLoader.init(this, OpenSourceMergedSoMapping)
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
// If you opted-in for the New Architecture, we load the native entry point for this app.
load()
}
}
}
This library is maintained by Callstack a Total Software Engineering Consultancy that transforms organizations and teams through transformative apps.
Special thanks to the team who worked on the initial extraction of JavaScriptCore from core react-native:
Everything inside this repository is MIT licensed.