Возможные варианты запуска NodeJS на Android (август 2017 г.)
тирую некоторые пакеты, созданные для NodeJS, на React Native, используяReactNativify переписать объектные зависимости Node API в их эквиваленты для просмотра.
Один из них являетсяcrypto
, Вtransformer.js
(или же.babelrc
) У меня есть:
// The following plugin will rewrite imports. Reimplementations of node
// libraries such as `assert`, `buffer`, etc. will be picked up
// automatically by the React Native packager. All other built-in node
// libraries get rewritten to their browserify counterpart.
[require('babel-plugin-rewrite-require'), {
aliases: {
crypto: 'crypto-browserify',
// ...
},
throwForNonStringLiteral: true,
}],
В ReactNativifyglobal.js
есть этот код (который я исключил, потому что он не предназначен для производства):
// Don't do this in production. You're going to want to patch in
// https://github.com/mvayngrib/react-native-randombytes or similar.
global.crypto = {
getRandomValues(byteArray) {
for (let i = 0; i < byteArray.length; i++) {
byteArray[i] = Math.floor(256 * Math.random());
}
},
};
.
Мой первый вопрос: КакgetRandomValues
правильно исправлено для производства?
Есть второй вариант, который используетreact-native-crypto
(клонcrypto-browserify
)
В идеале я должен быть в состоянии сделать это вtransformer.js
:
aliases: {
crypto: 'react-native-crypto', // instead of 'crypto-browserify'
// ...
},
Ноreact-native-crypto
использованиян-nodeify вместо ReactNativify, который генерируетshim.js
быть импортированным вindex.android.js
/ index.ios.js
с кодом, похожим на это:
if (require('./package.json').dependencies['react-native-crypto']) {
const algos = require('browserify-sign/algos')
if (!algos.sha256) {
algos.sha256 = {
"sign": "ecdsa",
"hash": "sha256",
"id": new Buffer("")
}
}
if (typeof window === 'object') {
const wCrypto = window.crypto = window.crypto || {}
wCrypto.getRandomValues = wCrypto.getRandomValues || getRandomValues
}
const crypto = require('crypto')
const randomBytes = crypto.randomBytes
crypto.randomBytes = function (size, cb) {
if (cb) return randomBytes.apply(crypto, arguments)
const arr = new Buffer(size)
getRandomValues(arr)
return arr
}
crypto.getRandomValues = crypto.getRandomValues || getRandomValues
function getRandomValues (arr) {
// console.warn('WARNING: generating insecure psuedorandom number')
for (var i = 0; i < arr.length; i++) {
arr[i] = Math.random() * 256 | 0
}
return arr
}
}
Я не знаю, нужен ли весь этот shim-код при использовании ReactNativify, и не смог найти хорошие источники, так что ...
Мой второй вопрос: Как пользоватьсяreact-native-crypto
в «правильном пути ReactNativify»?
Я создал проблемы с github в ReactNativify и response-native-crypto repo's:
Как использовать getRandomValues в производстве?Использование ReactNativify вместо rn-nodeify?Версии:
node 7.10.1 /usr/local/bin/node
npm 4.2.0 /usr/local/bin/npm
yarn 0.24.6 /usr/bin/yarn
react-native-cli 2.0.1
app rn version 0.45.1
ignite 2.0.0 /usr/local/bin/ignite