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(PR).
Important
This library only supports React Native 0.79 and above with new architecture enabled.
yarn add @react-native-community/javascriptcoreInstall pods:
cd ios && USE_THIRD_PARTY_JSC=1 USE_HERMES=0 bundle exec pod installNote
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=trueOpen AppDelegate.swift and overwrite createJSRuntimeFactory method:
import React import React_RCTAppDelegate import ReactAppDependencyProvider import UIKit +import ReactJSC // 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() -> JSRuntimeFactoryRef { + 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 +import com.facebook.react.bridge.JavaScriptExecutorFactory +import com.facebook.react.modules.systeminfo.AndroidInfoHelpers 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.