Skip to content

react-native-community/javascriptcore

Repository files navigation

React Native JavaScriptCore

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.

Installation

Important

This library only supports React Native 0.79 and above with new architecture enabled.

yarn add @react-native-community/javascriptcore

iOS

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.

Android

Add the following to your android/gradle.properties:

# Disable Hermes
hermesEnabled=false

# Enable third-party JSC
useThirdPartyJSC=true

Usage

iOS

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
+  }
}

Android

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()
    }
  }
}

Maintainers

  • 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

Special thanks to the team who worked on the initial extraction of JavaScriptCore from core react-native:

License

Everything inside this repository is MIT licensed.

About

JavaScriptCore for React Native

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •