react-native捆绑程序可以检测未使用的文件吗?

Top*_*ter 5 preprocessor assets bundler babeljs react-native

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

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

我的问题是,都将debug-image.pngreal-image.png获得捆绑到APK(即使debug-image.png是从未使用过其他任何地方),还是所述捆绑检测该debug-image.png文件没有使用(不包括成捆)?

Top*_*ter 6

手动测试:

我们可以简单地自己测试一下,通过构建一个未签名的发布APK(如另一篇文章中提到),两次,一次使用如下代码(第一种情况):

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

其中,添加!到上面的 if 语句,例如if ( ! __DEV__ ) { ...,导致APK-size 增加50 MB(即 的大小./big-file.dat)。


还有一次,使用如下代码进行测试(第二种情况):

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

无论我做什么,APK-size 都保持巨大。

结论:

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

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

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

注意:我正在使用react-nativetype-script 模板,例如“ react-native init MyApp --template typescript”,但我希望这对于在 none-typescript 模板中使用的 bundler 也是如此!