This package provides React Native compatible implementations of Node core modules like stream
and http
. This is a fork of node-libs-browser with a few packages swapped to be compatible in React Native.
npm install --save node-libs-react-native
npm install react-native-quick-crypto react-native-fast-base64 react-native-get-random-values
Don't forget to run pod install
in ios
directory.
This package exports a mapping of absolute paths to each module implementation, keyed by module name. Modules without React Native compatible implementations are null
.
These modules can be used with React Native Packager's metro.config.js
or Webpack's resolve.alias
.
Add a metro.config.js
file in the root directory of your React Native project and set resolver.extraNodeModules
:
// metro.config.js
module.exports = {
resolver: {
extraNodeModules: require('node-libs-react-native'),
},
};
When using ether.js version 5.x, it's pbkdf2 browser version doesn't work well on React-Native (extremely slow). Fortunately there's a workaround:
Create a pbkdf2.js
at root dir:
const crypto = require("react-native-quick-crypto");
exports.pbkdf2 = crypto.pbkdf2Sync;
In metro.config.js
set resolver.resolveRequest
handler:
module.exports = {
resolver: {
...
resolveRequest: (context, moduleName, platform) => {
if (moduleName.startsWith('@ethersproject/pbkdf2')) {
return {
filePath: require.resolve('./pbkdf2.js'),
type: 'sourceFile',
};
}
// Optionally, chain to the standard Metro resolver.
return context.resolveRequest(context, moduleName, platform);
}
}
...
}
For more information, see this post on Node core modules in React Native.
Node has certain globals that modules may expect, such as Buffer
or process
. React Native does not provide these globals. The node-libs-react-native/globals
module in this package will shim the global environment to add these globals. Just require (or import) this module in your app before anything else.
require('node-libs-react-native/globals');
// ...
require('./app.js');
The following are the module implementations provided by this package. Some modules also have a "mock" implementation provided in the mock
directory. These are replacements with minimal functionality.
Additionally, crypto.getRandomValues
is shimed by LinusU/react-native-get-random-values and base64
by alexdonh/react-native-fast-base64
These are other React Native packages that implement Node core related modules. They are not included in node-libs-react-native, but you may find them useful separately.
react-native-udp implements Node's dgram
API, but is not included
here due to its native implementation and need to use react-native link
.
react-native-fs implement's Node's fs
API, but is not included
here due to its native implementation and need to use react-native link
.
react-native-level-fs provides an alternative pure JavaScript implementation, using AsyncStorage as the underlying storage mechanism.
react-native-tcp implement's Node's net
API, but is not included
here due to its native implementation and need to use react-native link
.
This is a fork of node-libs-browser with minor modifications and packages swapped out for React Native implementations. Thanks to those package authors for doing the hard work.
MIT