JavaScriptCore engine for React Native
npm install @react-native-community/javascriptcoreOpt-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.
``sh`
yarn add @react-native-community/javascriptcore
Install pods:
`sh`
cd ios && USE_THIRD_PARTY_JSC=1 USE_HERMES=0 bundle exec pod installUSE_THIRD_PARTY_JSC=1
> [!NOTE]
> Note: is required to use JavaScriptCore from this package until JavaScriptCore is removed from core react-native.
Add the following to your android/gradle.properties:
`propertiesDisable Hermes
hermesEnabled=false
Usage
$3
Open AppDelegate.swift and overwrite
createJSRuntimeFactory method:`diff
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() -> JSRuntimeFactory {
+ jsrt_create_jsc_factory() // Use JavaScriptCore runtime
+ }
}
`$3
Open
MainApplication.java and overwrite getJavaScriptExecutorFactory method:`diff
+import io.github.reactnativecommunity.javascriptcore.JSCExecutorFactory
+import io.github.reactnativecommunity.javascriptcore.JSCRuntimeFactoryclass MainApplication : Application(), ReactApplication {
override val reactNativeHost: ReactNativeHost =
object : DefaultReactNativeHost(this) {
override fun getPackages(): List =
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.