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

时间:2019-04-25 07:35:54

标签: react-native babeljs bundler assets preprocessor

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

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文件(并且不将其包括在捆绑软件中)?

1 个答案:

答案 0 :(得分:0)

我只是通过构建一个无符号发布的APK(如another post中所述)自己进行了两次测试,一次使用下面的代码(第一种情况):

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

在上面,将!添加到if语句中,例如if ( ! __DEV__ ) { ...,导致APK的大小增加50 mb(即{{1的大小}}。


再一次,使用下面的代码(第二种情况)进行了测试:

./big-file.dat

无论我做什么,let bigFile = require('./big-file.dat'); if ( ! __DEV__ ) { bigFile = null; } 大小都在不断扩大。

结论:

根据APK的大小变化,我确定并且可以告诉您(在撰写本文时,APK):

  • 捆绑程序具有足够的智能来处理First-Case,并从捆绑中排除仅在非活动if语句内部使用的文件。
  • 但另一方面,它无法优化文件,该文件曾在稍微复杂一点的Second-Case中使用(它根本无法跟踪变量)。

考虑到上述问题,并且捆绑器足够智能,在某些情况下甚至可以从捆绑中排除文件,在其他情况下,我们可以安全地使用常量2019__DEV__框架为我们提供了常量

  

注意:我正在将react-native与类型脚本模板一起使用,例如“ react-native”,但我希望对于在非类型脚本模板中使用的捆绑器也是如此! !