Можно ли использовать 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).

Но я не знаю, как их включить, и будут ли они вообще работать в РН?

Итак, я вижу четыре подхода вперед:

  1. Найдите способ слияния react-native-level-fs а также brfs в удобную замену прокладки
  2. Написать совершенно новый fs шим, что есть все методы
  3. Если синхронный fs невозможен (я думаю, что это так), то каким-то образом переопределить все вхождения функций в дереве транзитивной зависимости, которые вызывают методы синхронизации, и заменить их фрагментами js в локальной кодовой базе.
  4. Если существует слишком много вхождений 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

(И Realm.io, чтобы соединить нативный NodeJS + React Native в толстом клиентском приложении для Android (в стиле CQRS)).

Другие вопросы по тегам