Можно ли использовать Node's fs.readFileSync() в React Native?
Я хочу портировать несколько пакетов, написанных для NodeJS, на React Native.
Для этого я создал проект RN с использованием популярного шаблона Ignite, затем использовал метод ReactNativify и shim- объекты Node API, в основном повторное использование существующих оболочек browserify.
(Подробности и некоторые полезные советы см. Можем ли мы использовать код nodejs внутри собственного приложения реагирования?)
Некоторые объекты Node по-прежнему заменяются пустыми макетами после переноса, такими как fs
, Завершен в .babelrc
следующее:
["module-resolver", {
"alias": {
"fs": "./config/mock",
"sodium-universal": "libsodium"
// etcetera
}
}]
Пакеты для переноса содержат ряд вызовов fs.readFileSync
в его переходных зависимостях.
Например, в одном из них, hypercore-protocol
есть эта строка кода:
module.exports = protobuf(fs.readFileSync(path.join(__dirname, 'schema.proto'), 'utf-8'))
И здесь есть проблема, потому что Android и iOS не поддерживают синхронную передачу файлов. Эта линия выглядит так, как она есть un-shim-able
мне
Теперь, пока существуют прокладки для fs
: response-native-level-fs не реализует методы синхронной файловой системы.
Тогда есть преобразование browserify, как brfs
средство просмотра статических ресурсов browserify fs.readFileSync() и его альтернативы bfrs-babel
а также babel-plugin-static-fs
).
Но я не знаю, как их включить, и будут ли они вообще работать в РН?
Итак, я вижу четыре подхода вперед:
- Найдите способ слияния
react-native-level-fs
а такжеbrfs
в удобную замену прокладки - Написать совершенно новый
fs
шим, что есть все методы - Если синхронный fs невозможен (я думаю, что это так), то каким-то образом переопределить все вхождения функций в дереве транзитивной зависимости, которые вызывают методы синхронизации, и заменить их фрагментами js в локальной кодовой базе.
- Если существует слишком много вхождений 3., тогда решите, что пакет не может быть перенесен в React Native
Я надеюсь, что 1. и альтернативно 3. будут рабочие решения. Кто-нибудь может посоветовать?
Ради полноты. Я нахожусь в этой стадии жизни:
System
platform linux
arch x64
cpu 4 cores Intel(R) Core(TM) i7-4500U CPU @ 1.80GHz
JavaScript
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
react-native-cli 2.0.1
app rn version 0.45.1
Ignite
ignite 2.0.0 /usr/local/bin/ignite
Android
java 1.8.0_111 /usr/bin/java
android home - undefined
1 ответ
Нет. У Node нет разумной альтернативы fs.readFileSync
,
Хотя технически можно написать readFileSync
Шим, который блокирует асинхронную файловую операцию, нецелесообразно вызывать синхронное поведение в асинхронной системе (но вам, возможно, удастся сойти с рук, когда в коде однократной инициализации будет только несколько синхронных методов).
Таким образом, вариант 3 или 4 являются единственными жизнеспособными альтернативами.
В моем случае было слишком много зависимостей Node, так что я отказался от просмотра / выравнивания и выбрал 4. Но...
Это не значит, что все обязательно потеряно. Сейчас я изучаю компиляцию NodeJS как нативной библиотеки в Android