Electron extensions to React Native for Web
This project aims to provide extensions to React Native for Web targeted to the Electron environment to support additional modules exposed by React Native (ex Clipboard, WebView) using Electron APIs.
This is very early stage, not fully tested, and APIs will likely change between releases, so don't use this library if you need something stable.
npm install react-native-electronelectron, react and react-native-web are required peer dependencies, make sure to install them as well:
npm install electron react react-native-webreact-art is also needed if you use ART.
See the example directory for the source code and Webpack config.
To run the demo app, fork this repository and run:
npm installnpm run example:server- In another terminal instance,
npm run example:electron
This module can be used with Expo application (created by expo-cli) using the following steps:
- Follow this guide's setup
- Run
yarn expo-electron customizein order to eject expo-electron's webpack configuration - Edit
./electron/webpack.config.jsas follows:
const { withExpoWebpack } = require('@expo/electron-adapter');
module.exports = config => {
let expoConfig = withExpoWebpack(config);
expoConfig.resolve.alias['react-native$'] = 'react-native-electron';
return expoConfig;
};
Note this is a partial solution, as Expo's default webpack configuration includes more aliases to react-native, but it should cover all of react-native-electron's APIs.
React Native's Alert implementation using Electron's dialog
Alert.alert(
title: string,
message: ?string,
buttons: ?Array<{text: string, onPress?: () => void}> = [],
type: ?('none' | 'info' | 'error' | 'question' | 'warning') = 'none'
): void
React Native's Appearance implementation using Electron's nativeTheme
Appearance.getColorScheme(): 'light' | 'dark' | null
React Native's Clipboard implementation using Electron's clipboard.
Clipboard.getString(type: ?string): Promise<?string>
Clipboard.setString(text: string, type: ?string): void
React Native's Linking implementation using Electron's app and shell APIs.
Linking.openURL(url: string): Promise<void>
Linking.addEventListener(type: string, handler: Function): void
Linking.removeEventListener(type: string, handler: Function): void
Linking.canOpenURL(): Promise<true>: always resolves to true
Linking.getInitialURL(): Promise<?string>: resolves with the process.argv[1] value, expecting the app to be opened by a command such as myapp myapp://test
useColorScheme(): 'light' | 'dark' | null
MIT
See LICENSE file.