Unverified Commit aed96199 authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] supports tree-shake-icons for web builds (#51808)

* [flutter_tools] supports tree-shake-icons for web builds

* Update compile.dart

* fix icon_tree_shaker
parent 1bf6f023
......@@ -289,7 +289,7 @@ class IconTreeShaker {
for (final Map<String, dynamic> iconDataMap in consts.constantInstances) {
if ((iconDataMap['fontPackage'] ?? '') is! String || // Null is ok here.
iconDataMap['fontFamily'] is! String ||
iconDataMap['codePoint'] is! int) {
iconDataMap['codePoint'] is! num) {
throw IconTreeShakerException._(
'Invalid ConstFinder result. Expected "fontPackage" to be a String, '
'"fontFamily" to be a String, and "codePoint" to be an int, '
......@@ -301,7 +301,7 @@ class IconTreeShaker {
? family
: 'packages/$package/$family';
result[key] ??= <int>[];
result[key].add(iconDataMap['codePoint'] as int);
result[key].add((iconDataMap['codePoint'] as num).round());
}
return result;
}
......
......@@ -156,36 +156,51 @@ class Dart2JSTarget extends Target {
final BuildMode buildMode = getBuildModeForName(environment.defines[kBuildMode]);
final String specPath = globals.fs.path.join(globals.artifacts.getArtifactPath(Artifact.flutterWebSdk), 'libraries.json');
final String packageFile = PackageMap.globalPackagesPath;
final File outputKernel = environment.buildDir.childFile('app.dill');
final File outputFile = environment.buildDir.childFile('main.dart.js');
final ProcessResult result = await globals.processManager.run(<String>[
// Run the dart2js compilation in two stages, so that icon tree shaking can
// parse the kernel file for web builds.
final ProcessResult kernelResult = await globals.processManager.run(<String>[
globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
globals.artifacts.getArtifactPath(Artifact.dart2jsSnapshot),
'--libraries-spec=$specPath',
if (dart2jsOptimization != null)
'-$dart2jsOptimization'
else
'-O4',
if (buildMode == BuildMode.profile)
'--no-minify',
'-o',
outputFile.path,
outputKernel.path,
'--packages=$packageFile',
if (buildMode == BuildMode.profile)
'-Ddart.vm.profile=true'
else
'-Ddart.vm.product=true',
if (csp)
'--csp',
for (final String dartDefine in parseDartDefines(environment))
'-D$dartDefine',
'--cfe-only',
environment.buildDir.childFile('main.dart').path,
]);
if (result.exitCode != 0) {
throw Exception(result.stdout + result.stderr);
if (kernelResult.exitCode != 0) {
throw Exception(kernelResult.stdout + kernelResult.stderr);
}
final ProcessResult javaScriptResult = await globals.processManager.run(<String>[
globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
globals.artifacts.getArtifactPath(Artifact.dart2jsSnapshot),
'--libraries-spec=$specPath',
if (dart2jsOptimization != null)
'-$dart2jsOptimization'
else
'-O4',
if (buildMode == BuildMode.profile)
'--no-minify',
if (csp)
'--csp',
'-o',
outputFile.path,
environment.buildDir.childFile('app.dill').path,
]);
if (javaScriptResult.exitCode != 0) {
throw Exception(javaScriptResult.stdout + javaScriptResult.stderr);
}
final File dart2jsDeps = environment.buildDir
.childFile('main.dart.js.deps');
.childFile('app.dill.deps');
if (!dart2jsDeps.existsSync()) {
globals.printError('Warning: dart2js did not produced expected deps list at '
'${dart2jsDeps.path}');
......@@ -197,7 +212,7 @@ class Dart2JSTarget extends Target {
platform: globals.platform,
);
final Depfile depfile = depfileService.parseDart2js(
environment.buildDir.childFile('main.dart.js.deps'),
environment.buildDir.childFile('app.dill.deps'),
outputFile,
);
depfileService.writeToFile(
......
......@@ -11,6 +11,7 @@ import '../base/logger.dart';
import '../build_info.dart';
import '../build_system/build_system.dart';
import '../build_system/targets/dart.dart';
import '../build_system/targets/icon_tree_shaker.dart';
import '../build_system/targets/web.dart';
import '../convert.dart';
import '../globals.dart' as globals;
......@@ -52,8 +53,7 @@ Future<void> buildWeb(
kHasWebPlugins: hasWebPlugins.toString(),
kDartDefines: jsonEncode(dartDefines),
kCspMode: csp.toString(),
// TODO(dnfield): Enable font subset. We need to get a kernel file to do
// that. https://github.com/flutter/flutter/issues/49730
kIconTreeShakerFlag: buildInfo.treeShakeIcons.toString(),
},
));
if (!result.success) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment