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.
Everything inside this repository is MIT licensed.