Skip to content

react-native-community/javascriptcore

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

This library is maintained by Callstack a Total Software Engineering Consultancy that transforms organizations and teams through transformative apps.

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

  •  
  •  
  •