Может ли реагирующий пакет обнаружить неиспользуемые файлы? - PullRequest
5 голосов
/ 25 апреля 2019

Рассмотрим сценарий, в котором мы создаем наше приложение react-native с режимом release, имея код, подобный приведенному ниже:

let img;
if ( __DEV__ ) {
  img = require('./debug-image.png');
} else {
  img = require('./real-image.png');
}

У меня вопрос, будут ли debug-image.png и real-image.png объединены в APK (даже если debug-image.png никогда не используется где-либо еще), или обнаружит, что файл debug-image.png не является файлом используется (и НЕ включает его в комплект)?

1 Ответ

0 голосов
/ 27 апреля 2019

Я просто проверил это сам, построив неподписанный релиз APK (как упомянуто в в другом посте ), два раза, один раз с кодами, подобными приведенным ниже (первый случай):

let bigFile;
if ( __DEV__ ) {
  bigFile = require('./big-file.dat');
} else {
  bigFile = require('./small-file.dat');
}

Выше, добавление ! к оператору if, например if ( ! __DEV__ ) { ..., привело к увеличению размера APK на 50 mb (т. Е. Размер ./big-file.dat).


И в другой раз, проверенный с кодами как ниже (Второй Случай):

let bigFile = require('./big-file.dat');
if ( ! __DEV__ ) {
  bigFile = null;
}

, где независимо от того, что я сделал, размер APK просто оставался огромным.

Вывод:

В соответствии с изменением размера APK я уверен и могу сказать, что (на момент написания, а именно 2019):

  • Пакет достаточно умен, чтобы обрабатывать первый случай и исключает из пакета файл, который используется только внутри неактивного оператора if.
  • Но, с другой стороны, он не может оптимизироватьфайл, который использовался в немного более сложном втором случае (он просто не отслеживает переменную).

МинусыПеречисленные выше и то, что упаковщик достаточно умен, и в некоторых случаях может даже исключить файлы из комплекта, при других условиях мы можем безопасно использовать константу __DEV__, которую нам предоставляет react-native framework.

Примечание: я использую react-native с шаблоном type-script, например, "react-native init MyApp --template typescript", но я надеюсь, что это верно даже для пакета, который также используется в шаблоне без машинописи !!

...