內容

使用 dart compile 指令將 Dart 程式編譯成 目標平台。輸出(使用子指令指定)可以包含 Dart 執行時期,或是一個模組(又稱為快照)。

以下是使用 exe 子指令產生獨立可執行檔 (myapp.exe) 的範例:

$ dart compile exe bin/myapp.dart
Generated: /Users/me/myapp/bin/myapp.exe

以下範例使用 aot-snapshot 子指令產生即時 (AOT) 編譯的模組 (myapp.aot)。然後使用 dartaotruntime 指令(提供 Dart 執行時期)來執行 AOT 模組

$ dart compile aot-snapshot bin/myapp.dart
Generated: /Users/me/myapp/bin/myapp.aot
$ dartaotruntime bin/myapp.aot

若要指定輸出檔案路徑,請使用 -o--output 選項

$ dart compile exe bin/myapp.dart -o bin/runme

如需更多選項和使用資訊,請執行 dart compile [<subcommand>] --help

$ dart compile exe --help

dart compile 指令取代了 dart2nativedart2aotdart2js 指令。

請參閱 native_app 範例,了解使用 dart compile 編譯原生應用程式的簡單範例,接著是執行該應用程式的範例。

子指令

#

下表顯示 dart compile 的子指令。

子指令輸出更多資訊
exe獨立 可執行檔一個獨立的特定於架構的可執行檔,包含編譯成機器碼的原始碼和一個小型 Dart 執行時期
深入了解。
aot-snapshotAOT 模組一個特定於架構的檔案,包含編譯成機器碼的原始碼,但沒有 Dart 執行時期
深入了解。
jit-snapshotJIT 模組一個特定於架構的檔案,包含所有原始碼的中間表示形式,以及在程式訓練執行期間執行的原始碼的最佳化表示形式。如果訓練資料良好,JIT 編譯的程式碼可能比 AOT 程式碼有更快的峰值效能。
深入了解。
kernelKernel 模組一個可攜式的 中間表示形式 的原始碼。
深入了解。
jsJavaScript一個可部署的 JavaScript 檔案,從原始碼編譯而來。
深入了解。

輸出類型

#

以下各節說明 dart compile 可以產生的每種類型輸出的詳細資訊。

獨立可執行檔 (exe)

#

exe 子指令會產生 Windows、macOS 或 Linux 的獨立可執行檔。獨立可執行檔是從指定的 Dart 檔案及其相依性編譯而成的原生機器碼,加上一個小型 Dart 執行時期,用於處理類型檢查和垃圾回收。

您可以像執行任何其他可執行檔一樣,來散佈和執行輸出檔案。

編譯您的應用程式並設定輸出檔案

$ dart compile exe bin/myapp.dart -o /tmp/myapp

成功時,此命令會輸出下列內容

Generated: /tmp/myapp

/tmp 目錄執行已編譯的應用程式

$ ./tmp/myapp

簽署

#

使用 dart compile exe 建立的可執行檔支援在 macOS 和 Windows 上簽署。

如需瞭解更多關於平台特定程式碼簽署的資訊,請參閱這些作業系統的平台文件

已知限制

#

exe 子命令有一些已知限制

不支援跨編譯 (問題 28617)
編譯器只能為您編譯作業系統建立機器碼。若要為 macOS、Windows 和 Linux 建立可執行檔,您需要執行編譯器三次。您也可以使用支援所有三個作業系統的持續整合 (CI) 提供者。
不支援 dart:mirrorsdart:developer
如需可使用核心函式庫的完整清單,請參閱 多平台原生平台 函式庫表格。

AOT 模組 (aot-snapshot)

#

使用 AOT 模組來減少在配送多個命令列應用程式時所需的磁碟空間。aot-snapshot 子命令會產生特定於您編譯應用程式時所使用之當前架構的輸出檔案。

例如,如果您使用 macOS 建立 .aot 檔案,則該檔案只能在 macOS 上執行。Dart 在 Windows、macOS 和 Linux 上支援 AOT 模組。

$ dart compile aot-snapshot bin/myapp.dart
Generated: /Users/me/myapp/bin/myapp.aot
$ dartaotruntime bin/myapp.aot

aot-snapshot 子命令有一些已知限制。

不支援跨編譯 (問題 28617)
編譯器只能為您編譯作業系統建立機器碼。若要為 macOS、Windows 和 Linux 建立可執行檔,您需要執行編譯器三次。您也可以使用支援所有三個作業系統的持續整合 (CI) 提供者。
不支援 dart:mirrorsdart:developer
如需可使用核心函式庫的完整清單,請參閱 多平台原生平台 函式庫表格。

如需瞭解更多資訊,請參閱 dartaotruntime 文件

JIT 模組 (jit-snapshot)

#

JIT 模組包含在程式訓練執行期間所產生的所有已剖析類別和已編譯程式碼。

$ dart compile jit-snapshot bin/myapp.dart
Compiling bin/myapp.dart to jit-snapshot file bin/myapp.jit.
Hello world!
$ dart run bin/myapp.jit
Hello world!

從應用程式模組執行時,Dart VM 不需要剖析或編譯在訓練執行期間已使用的類別和函式,因此 VM 會更快開始執行使用者程式碼。

與使用 kernel 子命令 所產生的模組不同,這些模組是特定於架構的。

可攜式模組 (kernel)

#

使用 kernel 子命令將應用程式封裝成單一可攜式檔案,可在所有作業系統和 CPU 架構上執行。核心模組包含 Dart 程式的抽象語法樹 (核心 AST) 的二進位形式。

以下是建立和執行核心模組的範例

$ dart compile kernel bin/myapp.dart
Compiling bin/myapp.dart to kernel file bin/myapp.dill.
$ dart run bin/myapp.dill

雖然核心模組與 Dart 程式碼相比,減少了啟動時間,但它們的啟動速度可能遠低於特定於架構的 AOT 輸出格式。

JavaScript (js)

#

js 子指令會將 Dart 程式碼編譯為可部署的 JavaScript。

選項

#

dart compile js 指令有多個選項,可自訂 javascript 程式碼編譯。

基本選項
#

常見選項包括

-o <file>--output=<file>

將輸出產生到 <file>。如果未指定,輸出會進入名為 out.js 的檔案。

--enable-asserts

啟用宣告檢查。

-O{0|1|2|3|4}

控制最佳化,以縮小檔案大小並改善程式碼效能。若要深入了解這些最佳化,請執行 dart compile js -hv

  • -O0:停用許多最佳化。

  • -O1:啟用預設最佳化。

  • -O2:啟用 -O1 最佳化,以及其他尊重語言語意且對所有程式安全的最佳化(例如縮小化)。

  • -O3:啟用 -O2 最佳化,以及略過隱式類型檢查。

  • -O4:啟用比 -O3 更積極的最佳化,但假設條件相同。

--no-source-maps

不要產生原始碼對應檔。

-h--help

顯示說明。若要取得所有選項的資訊,請使用 -hv

路徑和環境選項
#

其他一些實用的選項包括

--packages=<path>
指定套件解析設定檔的路徑。如需更多資訊,請查看 Dart 套件設定檔 規範。
-D<flag>=<value>
定義環境宣告和值對,可以使用 String.fromEnvironmentint.fromEnvironmentbool.fromEnvironmentbool.hasEnvironment 來存取。若要深入了解環境宣告,請參閱 使用編譯環境宣告設定應用程式
--version
顯示 dart 的版本資訊。
顯示選項
#

下列選項可協助您控制編譯器輸出。

--suppress-warnings
不顯示警告。
--suppress-hints
不顯示提示。
--terse
發出診斷,而不建議如何解決診斷問題。
-v--verbose
顯示大量資訊。
分析選項
#

下列選項控制對 Dart 程式碼執行的分析。

--fatal-warnings
將警告視為編譯錯誤。
--enable-diagnostic-colors
在診斷訊息中加入色彩。
--show-package-warnings
顯示套件產生的警告和提示。
--csp
停用在產生的輸出中動態產生程式碼。這是為了符合 CSP 限制(請參閱 W3C 內容安全政策)。
--dump-info
產生一個檔案(副檔名為 .info.json),其中包含有關產生的程式碼的資訊。您可以使用 dart2js_info 中的工具來檢查產生的檔案。

編譯網頁應用程式範例

#

例如,若要將 Dart 應用程式編譯為最佳化的 JavaScript,請執行下列指令

$ dart compile js -O2 -o out/main.js web/main.dart

改善產品網頁編譯

#

遵循這些做法,以改善類型推論、縮小檔案大小和改善 JavaScript 效能

  • 不要使用 Function.apply()
  • 不要覆寫 noSuchMethod()
  • 避免將變數設定為 null
  • 傳遞到每個函式或方法中的引數類型要一致。

若要深入了解如何建置和部署 JavaScript 應用程式,請查看 網頁部署