目錄

dart compile

使用 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 檔案。
瞭解詳情。
wasmWebAssembly堆疊式虛擬機器的可攜式二進位指令格式。目前正在開發中。
瞭解詳情。

輸出類型

#

以下各節詳細說明 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 架構上執行的單一可攜式檔案中。Kernel 模組包含 Dart 程式的抽象語法樹狀結構 (Kernel AST) 的二進位格式。

以下範例示範如何建立和執行 Kernel 模組

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

雖然與 Dart 程式碼相比,Kernel 模組的啟動時間已縮短,但其啟動速度可能比特定於架構的 AOT 輸出格式慢得多。

JavaScript (js)

#

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

選項

#

dart compile js 命令有多個選項可以自訂 JavaScript 程式碼編譯。

基本選項
#

常見選項包括:

-o <檔案>--output=<檔案>

將輸出結果產生至 <檔案>。如果未指定,輸出結果將寫入名為 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=<路徑>
指定套件解析組態檔案的路徑。如需更多資訊,請查閱 Dart 套件組態檔案 規格。
-D<旗標>=<值>
定義可使用 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 應用程式,請查閱網頁部署