使用 Flutter 构建的应用程序是否存在死代码?
Do apps built with Flutter suffer from dead code?
Flutter 在技术上可能允许您编写一次代码并为多个平台构建应用程序,但实际上您不希望在移动设备上拥有与在 Web 或桌面上相同的体验。很容易想到解决方案 - “如果在 iOS 上使用此小部件,否则使用此小部件”,或“如果在移动设备或桌面上使用移动视图”。
flutter 是否也会处理机器代码的 treeshaking,以便 web 应用程序的捆绑包不会比需要的大 5 倍?
treeshaker 仅删除已知在编译时不使用的代码。
您在编写代码时需要注意这一点,因为它并不神奇。
您可以对常量使用条件分支来实现此目的。
const isPlatform = true;
class SomeWidget extends StatelessWidget {
@override
Widget build(context) {
if (isPlatform) {
return PlatformWidget(); // will appear in build
} else {
return SomeOtherWidget(); // will be removed from build
}
}
}
对于网络,我们有 kIsWeb 但对于其他平台,遗憾的是没有编译时间常量。
但是您可以使用 dart-define 将常量传递给构建。
const isAndroid = bool.fromEnvironment('IS_ANDROID'); // defaults to false if not supplied
class SomeWidget extends StatelessWidget {
@override
Widget build(context) {
if (isAndroid) {
return AndroidWidget(); // will appear in build
} else {
return SomeOtherWidget(); // will be removed from build
}
}
}
flutter build apk --dart-define=IS_ANDROID=true
Treeshaking 仅在发布版本上执行。
Flutter 在技术上可能允许您编写一次代码并为多个平台构建应用程序,但实际上您不希望在移动设备上拥有与在 Web 或桌面上相同的体验。很容易想到解决方案 - “如果在 iOS 上使用此小部件,否则使用此小部件”,或“如果在移动设备或桌面上使用移动视图”。
flutter 是否也会处理机器代码的 treeshaking,以便 web 应用程序的捆绑包不会比需要的大 5 倍?
treeshaker 仅删除已知在编译时不使用的代码。 您在编写代码时需要注意这一点,因为它并不神奇。
您可以对常量使用条件分支来实现此目的。
const isPlatform = true;
class SomeWidget extends StatelessWidget {
@override
Widget build(context) {
if (isPlatform) {
return PlatformWidget(); // will appear in build
} else {
return SomeOtherWidget(); // will be removed from build
}
}
}
对于网络,我们有 kIsWeb 但对于其他平台,遗憾的是没有编译时间常量。
但是您可以使用 dart-define 将常量传递给构建。
const isAndroid = bool.fromEnvironment('IS_ANDROID'); // defaults to false if not supplied
class SomeWidget extends StatelessWidget {
@override
Widget build(context) {
if (isAndroid) {
return AndroidWidget(); // will appear in build
} else {
return SomeOtherWidget(); // will be removed from build
}
}
}
flutter build apk --dart-define=IS_ANDROID=true
Treeshaking 仅在发布版本上执行。