Я считаю, что большинство разработчиков React Native включили react-native-code-push в своих проектах, эта библиотека поддерживает так называемые обновления OTA (беспроводные) для приложений Android и IOS, поэтому нет необходимости обновлять .apk или .ipa и дождитесь отзывов, все делается мгновенно с помощью js-bundle.

На раннем этапе наши приложения работали так гладко и радовали всех, разработчики могли доставлять свои работы за считанные минуты, команда контроля качества могла протестировать приложение без хлопот с многократной загрузкой.

Со временем размер нашего проекта становится больше из-за увеличения количества активов и строк кода. Затем мы начинаем понимать, что размер пакета codepush становится настолько большим, что всем приходится так долго ждать загрузки обновлений.

На данный момент красота беспроводных обновлений начинает показывать свое холодное унылое лицо, и это, безусловно, влияет на процесс развития команды. Затем идея вернуться к бинарным обновлениям начинает распространяться по той же причине потребления времени.

Когда я испытал это состояние и задался вопросом, в чем проблема на самом деле. затем я начинаю исследование, начиная с основного курса — самого файла пакета codepush.

Давайте посмотрим на эту команду при создании кода для выпуска обновления с помощью appcenter-cli.

appcenter codepush release-react -a <ownerName>/<appName> -d <deploymentName>

При выполнении команды appcenter-cli создает временную папку для хранения сгенерированных файлов и удаляет ее сразу после завершения процесса загрузки. Поэтому мы не можем видеть, что на самом деле он генерирует.

Эта команда на самом деле сначала запускает этот npx react-native bundle, чтобы сгенерировать файл jsbundle, содержащий весь код javascript, перед его загрузкой.

Итак, чтобы увидеть все файлы, мы можем просто запустить приведенную выше команду и указать вывод в определенный каталог. Вот пример с опциями:

npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/codepush-assets/index.android.bundle --assets-dest android/app/src/main/assets/codepush-assets/

После запуска этой команды вы можете увидеть выходные данные в папке codepush-assets, и сюрприз в том, что есть папки с возможностью рисования, которые содержат файлы статических ресурсов, такие как png. Вот в чем проблема: когда мы импортируем png-изображения с ключевым словом require, react-native будет рассматривать их как статические файлы и перемещать их на родную сторону нашего проекта для окончательной компиляции с двоичным файлом релиза.

На самом деле все, что мне нужно обновить с помощью codepush, — это файл jsbundle. Почему? потому что, с моей точки зрения, мы должны использовать codepush только для исправления ошибок и незначительных изменений. кроме этого, просто используйте бинарные обновления.

С помощью команды appcenter codepush release-react мы не можем отказаться от файлов ресурсов, но с помощью команды npx react-native bundle у нас есть возможность отказаться от этого. посмотрите на эту опцию --asset-dest , удалите опции, и у вас будет только файл jsbundle, сгенерированный в папке codepush-assets (это может быть где угодно.

И, наконец, вы можете запустить команду codepush с этими параметрами

appcenter codepush release -a <ownerName>/<appName> -c <updateContentsPath> -t <targetBinaryVersion> -d <deploymentName>

-c <updateContentsPath> — наша выходная папка назначения, в этом примере (codepush-assets). Затем codepush загрузит только один сгенерированный файл jsbundle, и его размер резко уменьшится.

В этом состоянии вы увидите, что все ваши изображения в формате png исчезают после обновления кода, примененного к вашему приложению, потому что это необходимо для загрузки ресурсов при запуске кода.

Так какого хрена?

Легко .. у всего есть свои жертвы. для меня это удаление всего изображения png и переход на svg. таким образом, я могу продолжать использовать codepush и поддерживать быструю доставку и гибкость.

Бонус.

не только png, но и с такими файлами, как mp3, mp4 и jpeg.

Спасибо.