Skip to content

Commit

Permalink
Bundle flutter.js via esbuild (#47573)
Browse files Browse the repository at this point in the history
* Roll esbuild as a CIPD package along with the browser roller. I renamed `browser_lock`/`browser_roller` etc to `package_lock` and `package_roller` since it will handle more than just browsers now.
* Download the esbuild CIPD package via DEPS.
* Have a build rule for running esbuild on some JavaScript or TypeScript
* Bundle and minify `flutter.js` using esbuild.
* Include in `flutter_web_sdk` the original `flutter.js` source, the minified `flutter.js`, and a sourcemap file to map between thnm.
* Also slightly changed the structure to put the `flutter.js` stuff in `flutter_web_sdk/flutter_js` instead of just at the root level of `flutter_web_sdk`. This should be fine because I haven't merged the change that has the flutter tool consume this yet.
  • Loading branch information
eyebrowsoffire authored Nov 3, 2023
1 parent 035740c commit 43db22e
Show file tree
Hide file tree
Showing 16 changed files with 274 additions and 71 deletions.
47 changes: 47 additions & 0 deletions DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ vars = {

'gcloud_version': 'version:2@444.0.0.chromium.3',

'esbuild_version': '0.19.5',

# When updating the Dart revision, ensure that all entries that are
# dependencies of Dart are also updated to match the entries in the
# Dart SDK's DEPS file for that revision of Dart. The DEPS file for
Expand Down Expand Up @@ -86,6 +88,9 @@ vars = {
# Download a prebuilt Dart SDK by default
'download_dart_sdk': True,

# Download a prebuilt esbuild by default
'download_esbuild': True,

# Checkout Android dependencies only on platforms where we build for Android targets.
'download_android_deps': 'host_os == "mac" or (host_os == "linux" and host_cpu == "x64")',

Expand Down Expand Up @@ -568,6 +573,48 @@ deps = {
'condition': 'host_os == "win" and download_dart_sdk and not release_candidate'
},

# esbuild download
'src/flutter/prebuilts/linux-x64/esbuild': {
'packages': [
{
'package': 'flutter/tools/esbuild/linux-amd64',
'version': Var('esbuild_version')
}
],
'dep_type': 'cipd',
'condition': 'host_os == "linux" and download_esbuild'
},
'src/flutter/prebuilts/macos-x64/esbuild': {
'packages': [
{
'package': 'flutter/tools/esbuild/mac-amd64',
'version': Var('esbuild_version')
}
],
'dep_type': 'cipd',
'condition': 'host_os == "mac" and download_esbuild'
},
'src/flutter/prebuilts/macos-arm64/esbuild': {
'packages': [
{
'package': 'flutter/tools/esbuild/mac-arm64',
'version': Var('esbuild_version')
}
],
'dep_type': 'cipd',
'condition': 'host_os == "mac" and download_esbuild'
},
'src/flutter/prebuilts/windows-x64/esbuild': {
'packages': [
{
'package': 'flutter/tools/esbuild/windows-amd64',
'version': Var('esbuild_version')
}
],
'dep_type': 'cipd',
'condition': 'host_os == "win" and download_esbuild'
},

'src/third_party/colorama/src':
Var('chromium_git') + '/external/colorama.git' + '@' + '799604a1041e9b3bc5d2789ecbd7e8db2e18e6b8',

Expand Down
42 changes: 42 additions & 0 deletions build/esbuild/esbuild.gni
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//flutter/common/config.gni")

template("esbuild") {
assert(defined(invoker.entry_point))
assert(defined(invoker.output_bundle))
action(target_name) {
forward_variables_from(invoker, [ "public_deps" ])
if (host_os == "win") {
executable_subpath = "esbuild.exe"
} else {
executable_subpath = "bin/esbuild"
}
esbuild = "$host_prebuilts_path/esbuild/$executable_subpath"

script = "//build/gn_run_binary.py"
inputs = [
esbuild,
invoker.entry_point,
]
outputs = [ invoker.output_bundle ]
absolute_output = rebase_path(invoker.output_bundle)
args = [ rebase_path(esbuild, root_build_dir) ]
if (defined(invoker.bundle) && invoker.bundle) {
args += [ "--bundle" ]
}
if (defined(invoker.minify) && invoker.minify) {
args += [ "--minify" ]
}
if (defined(invoker.sourcemap) && invoker.sourcemap) {
args += [ "--sourcemap" ]
outputs += [ invoker.output_bundle + ".map" ]
}
args += [
"--outdir=$absolute_output",
rebase_path(invoker.entry_point),
]
}
}
4 changes: 2 additions & 2 deletions ci/licenses_golden/licenses_flutter
Original file line number Diff line number Diff line change
Expand Up @@ -3796,7 +3796,7 @@ ORIGIN: ../../../flutter/lib/ui/window/pointer_data_packet_converter.cc + ../../
ORIGIN: ../../../flutter/lib/ui/window/pointer_data_packet_converter.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/lib/ui/window/viewport_metrics.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/lib/ui/window/viewport_metrics.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/lib/web_ui/flutter_js/flutter.js + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/lib/web_ui/flutter_js/src/flutter.js + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/lib/web_ui/lib/annotations.dart + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/lib/web_ui/lib/canvas.dart + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/lib/web_ui/lib/channel_buffers.dart + ../../../flutter/LICENSE
Expand Down Expand Up @@ -6584,7 +6584,7 @@ FILE: ../../../flutter/lib/ui/window/pointer_data_packet_converter.cc
FILE: ../../../flutter/lib/ui/window/pointer_data_packet_converter.h
FILE: ../../../flutter/lib/ui/window/viewport_metrics.cc
FILE: ../../../flutter/lib/ui/window/viewport_metrics.h
FILE: ../../../flutter/lib/web_ui/flutter_js/flutter.js
FILE: ../../../flutter/lib/web_ui/flutter_js/src/flutter.js
FILE: ../../../flutter/lib/web_ui/lib/annotations.dart
FILE: ../../../flutter/lib/web_ui/lib/canvas.dart
FILE: ../../../flutter/lib/web_ui/lib/channel_buffers.dart
Expand Down
56 changes: 28 additions & 28 deletions common/config.gni
Original file line number Diff line number Diff line change
Expand Up @@ -97,48 +97,48 @@ if (target_platform_name == "mac") {
full_target_platform_name = "$target_platform_name-$target_cpu"

# Prebuilt Dart SDK location
_target_os_name = target_os
if (_target_os_name == "mac") {
_target_os_name = "macos"
} else if (_target_os_name == "win") {
_target_os_name = "windows"
}

if (flutter_prebuilt_dart_sdk) {
_target_os_name = target_os
if (_target_os_name == "mac") {
_target_os_name = "macos"
} else if (_target_os_name == "win") {
_target_os_name = "windows"
}
_host_os_name = host_os
if (_host_os_name == "mac") {
_host_os_name = "macos"
} else if (_host_os_name == "win") {
_host_os_name = "windows"
}

_host_os_name = host_os
if (_host_os_name == "mac") {
_host_os_name = "macos"
} else if (_host_os_name == "win") {
_host_os_name = "windows"
}
# When building 32-bit Android development artifacts for Windows host (like
# gen_snapshot), the host_cpu is set to x86. However, the correct prebuilt
# Dart SDK to use during this build is still the 64-bit one.
_host_cpu = host_cpu
if (host_os == "win" && host_cpu == "x86") {
_host_cpu = "x64"
}

# When building 32-bit Android development artifacts for Windows host (like
# gen_snapshot), the host_cpu is set to x86. However, the correct prebuilt
# Dart SDK to use during this build is still the 64-bit one.
_host_cpu = host_cpu
if (host_os == "win" && host_cpu == "x86") {
_host_cpu = "x64"
}
_target_prebuilt_config = "$_target_os_name-$target_cpu"
_host_prebuilt_config = "$_host_os_name-$_host_cpu"

_target_prebuilt_dart_sdk_config = "$_target_os_name-$target_cpu"
_host_prebuilt_dart_sdk_config = "$_host_os_name-$_host_cpu"
target_prebuilts_path = "//flutter/prebuilts/$_target_prebuilt_config"
host_prebuilts_path = "//flutter/prebuilts/$_host_prebuilt_config"

target_prebuilt_dart_sdk =
"//flutter/prebuilts/$_target_prebuilt_dart_sdk_config/dart-sdk"
host_prebuilt_dart_sdk =
"//flutter/prebuilts/$_host_prebuilt_dart_sdk_config/dart-sdk"
if (flutter_prebuilt_dart_sdk) {
target_prebuilt_dart_sdk = "$target_prebuilts_path/dart-sdk"
host_prebuilt_dart_sdk = "$host_prebuilts_path/dart-sdk"

# There is no prebuilt Dart SDK targeting Fuchsia, iOS, and Android, but we
# also don't need one, so even when the build is targeting one of these
# platforms, we use the prebuilt Dart SDK for the host.
if (current_toolchain == host_toolchain || target_os == "android" ||
target_os == "fuchsia" || target_os == "ios" || target_os == "wasm") {
prebuilt_dart_sdk = host_prebuilt_dart_sdk
prebuilt_dart_sdk_config = _host_prebuilt_dart_sdk_config
prebuilt_dart_sdk_config = _host_prebuilt_config
} else {
prebuilt_dart_sdk = target_prebuilt_dart_sdk
prebuilt_dart_sdk_config = _target_prebuilt_dart_sdk_config
prebuilt_dart_sdk_config = _target_prebuilt_config
}
}

Expand Down
4 changes: 2 additions & 2 deletions lib/web_ui/dev/chrome.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart'
as wip;

import 'browser.dart';
import 'browser_lock.dart';
import 'browser_process.dart';
import 'chrome_installer.dart';
import 'common.dart';
import 'environment.dart';
import 'package_lock.dart';

/// Provides an environment for desktop Chrome.
class ChromeEnvironment implements BrowserEnvironment {
Expand Down Expand Up @@ -52,7 +52,7 @@ class ChromeEnvironment implements BrowserEnvironment {

@override
Future<void> prepare() async {
final String version = browserLock.chromeLock.version;
final String version = packageLock.chromeLock.version;
_installation = await getOrInstallChrome(
version,
infoLog: isCi ? stdout : DevNull(),
Expand Down
16 changes: 16 additions & 0 deletions lib/web_ui/dev/common.dart
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ abstract class PlatformBinding {
String getFirefoxLatestVersionUrl();
String getMacApplicationLauncher();
String getCommandToRunEdge();

String getEsbuildDownloadUrl(String version) =>
'https://registry.npmjs.org/@esbuild/$esbuildPlatformName/-/$esbuildPlatformName-$version.tgz';
String get esbuildPlatformName;
}

class WindowsPlatformBinding extends PlatformBinding {
Expand Down Expand Up @@ -89,6 +93,9 @@ class WindowsPlatformBinding extends PlatformBinding {

@override
String getCommandToRunEdge() => 'MicrosoftEdgeLauncher';

@override
String get esbuildPlatformName => 'win32-x64';
}

class LinuxPlatformBinding extends PlatformBinding {
Expand Down Expand Up @@ -123,6 +130,9 @@ class LinuxPlatformBinding extends PlatformBinding {
@override
String getCommandToRunEdge() =>
throw UnsupportedError('Edge is not supported on Linux');

@override
String get esbuildPlatformName => 'linux-x64';
}

abstract class MacPlatformBinding extends PlatformBinding {
Expand Down Expand Up @@ -162,11 +172,17 @@ abstract class MacPlatformBinding extends PlatformBinding {
class MacArmPlatformBinding extends MacPlatformBinding {
@override
String get chromePlatformString => 'mac-arm64';

@override
String get esbuildPlatformName => 'darwin-arm64';
}

class Macx64PlatformBinding extends MacPlatformBinding {
@override
String get chromePlatformString => 'mac-x64';

@override
String get esbuildPlatformName => 'darwin-x64';
}

class BrowserInstallation {
Expand Down
4 changes: 2 additions & 2 deletions lib/web_ui/dev/edge.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ import 'dart:io';
import 'package:test_api/src/backend/runtime.dart';

import 'browser.dart';
import 'browser_lock.dart';
import 'browser_process.dart';
import 'common.dart';
import 'edge_installation.dart';
import 'package_lock.dart';

/// Provides an environment for the desktop Microsoft Edge (Chromium-based).
class EdgeEnvironment implements BrowserEnvironment {
Expand Down Expand Up @@ -51,7 +51,7 @@ class Edge extends Browser {
factory Edge(Uri url) {
return Edge._(BrowserProcess(() async {
final BrowserInstallation installation = await getEdgeInstallation(
browserLock.edgeLock.launcherVersion,
packageLock.edgeLock.launcherVersion,
infoLog: DevNull(),
);

Expand Down
4 changes: 2 additions & 2 deletions lib/web_ui/dev/edge_installation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import 'dart:io' as io;
import 'package:http/http.dart';
import 'package:path/path.dart' as path;

import 'browser_lock.dart';
import 'common.dart';
import 'environment.dart';
import 'package_lock.dart';

/// Returns the installation of Edge.
///
Expand Down Expand Up @@ -84,7 +84,7 @@ class EdgeLauncher {
bool get isInstalled => executable.existsSync();

/// Version number launcher executable `MicrosoftEdgeLauncher`.
String get version => browserLock.edgeLock.launcherVersion;
String get version => packageLock.edgeLock.launcherVersion;

/// Url for downloading `MicrosoftEdgeLauncher`.
///
Expand Down
4 changes: 2 additions & 2 deletions lib/web_ui/dev/firefox.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ import 'package:test_api/src/backend/runtime.dart';
import 'package:test_core/src/util/io.dart';

import 'browser.dart';
import 'browser_lock.dart';
import 'browser_process.dart';
import 'common.dart';
import 'environment.dart';
import 'firefox_installer.dart';
import 'package_lock.dart';

/// Provides an environment for the desktop Firefox.
class FirefoxEnvironment implements BrowserEnvironment {
Expand All @@ -31,7 +31,7 @@ class FirefoxEnvironment implements BrowserEnvironment {
@override
Future<void> prepare() async {
_installation = await getOrInstallFirefox(
browserLock.firefoxLock.version,
packageLock.firefoxLock.version,
infoLog: isCi ? stdout : DevNull(),
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,30 @@ import 'package:yaml/yaml.dart';

import 'environment.dart';

/// Returns the browser configuration based on the `browser_lock.yaml` file in
/// Returns the browser configuration based on the `package_lock.yaml` file in
/// the current engine workspace.
final BrowserLock browserLock = BrowserLock();
final PackageLock packageLock = PackageLock();

/// Provides access to the contents of the `browser_lock.yaml` file.
class BrowserLock {
factory BrowserLock() {
/// Provides access to the contents of the `package_lock.yaml` file.
class PackageLock {
factory PackageLock() {
final io.File lockFile = io.File(
path.join(environment.webUiRootDir.path, 'dev', 'browser_lock.yaml'),
path.join(environment.webUiRootDir.path, 'dev', 'package_lock.yaml'),
);
final YamlMap yaml = loadYaml(lockFile.readAsStringSync()) as YamlMap;
return BrowserLock._fromYaml(yaml);
return PackageLock._fromYaml(yaml);
}

BrowserLock._fromYaml(YamlMap yaml) :
PackageLock._fromYaml(YamlMap yaml) :
chromeLock = ChromeLock._fromYaml(yaml['chrome'] as YamlMap),
firefoxLock = FirefoxLock._fromYaml(yaml['firefox'] as YamlMap),
edgeLock = EdgeLock._fromYaml(yaml['edge'] as YamlMap);
edgeLock = EdgeLock._fromYaml(yaml['edge'] as YamlMap),
esbuildLock = EsbuildLock._fromYaml(yaml['esbuild'] as YamlMap);

final ChromeLock chromeLock;
final FirefoxLock firefoxLock;
final EdgeLock edgeLock;
final EsbuildLock esbuildLock;
}

class ChromeLock {
Expand All @@ -54,3 +56,10 @@ class EdgeLock {

final String launcherVersion;
}

class EsbuildLock {
EsbuildLock._fromYaml(YamlMap yaml) :
version = yaml['version'] as String;

final String version;
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,6 @@ firefox:

edge:
launcher_version: '1.2.0.0'

esbuild:
version: '0.19.5'
Loading

0 comments on commit 43db22e

Please sign in to comment.