react-native bundler 可以检测未使用的文件吗?

Can react-native bundler detect unused files?

考虑一个场景,我们使用 release 模式构建 react-native 应用程序,同时使用如下代码:

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

我的问题是,debug-image.pngreal-image.png 会被捆绑到 APK 中(即使 debug-image.png 从未在其他任何地方使用过),还是捆绑程序检测到 debug-image.png 文件未被使用(并且未将其包含在捆绑包中)?

手动测试:

我们可以简单地自己测试一下,通过构建一个未签名的版本 APK(如 another post 中所述),两次,一次使用如下代码(第一种情况):

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-size 确实一直很大。

结论:

根据APK-size的变化,我确定并且可以说(在撰写本文时,即2019):

  • 捆绑器足够智能,可以处理 First-Case 并从捆绑包中排除仅在非活动 if 语句中使用的文件。
  • 但另一方面,它无法优化文件,该文件用于更复杂的 Second-Case(它根本不跟踪变量)。

考虑到打包器足够智能,在某些情况下甚至可以从打包中排除文件,在其他情况下,我们可以安全地使用常量 __DEV__react-native 框架为我们提供).

Note: I am using react-native with the type-script template, like "react-native init MyApp --template typescript", but I hope this is even true for the bundler which is used in none-typescript template as well !!