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.png
和 real-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 !!
考虑一个场景,我们使用 release
模式构建 react-native
应用程序,同时使用如下代码:
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
文件未被使用(并且未将其包含在捆绑包中)?
手动测试:
我们可以简单地自己测试一下,通过构建一个未签名的版本 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 !!