跳到主要內容

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 子命令有一些已知限制

不支援跨平台編譯 (issue 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 子命令有一些已知限制。

不支援跨平台編譯 (issue 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

雖然 Kernel 模組與 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 中的工具檢查產生的檔案。

編譯 Web 應用程式範例

#

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

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

改善生產環境 Web 編譯

#

請遵循以下實務做法來改善類型推斷、縮減檔案大小並提升 JavaScript 效能

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

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