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()
}
}
}
- Callstack – A Total Software Engineering Consultancy that transforms organizations and teams through transformative apps.
- Expo - An open-source platform for making universal native apps for Android, iOS, and the web with JavaScript and React.
Special thanks to the team who worked on the initial extraction of JavaScriptCore from core react-native:
- Riccardo Cipolleschi
- Nicola Corti
- Kudo Chien
- Oskar Kwaśniewski
- jsc-android - This project uses jsc-android under the hood, which is supported by Expo, Software Mansion, and Wix.
Everything inside this repository is MIT licensed.