版權聲明:本文爲博主原創文章,未經博主容許不得轉載。 juejin.im/post/5dc8d0…git
轉載請標明出處: juejin.im/post/5dc8d0… 本文出自 AWeiLoveAndroid的博客github
【Tips:】本文首發在公衆號 Flutter那些事,更多幹貨歡迎多多關注。後端
近日Dart發佈了最新版Dart2.6正式版。此次又有哪些新功能呢?咱們來一塊兒看看。api
Dart針對不一樣系統平臺提供了豐富的編譯器dart.dev/platforms:適用於Android和iOS的「Flutter」,用於Web開發的「Flutter Web」,適用於桌面端的「Flutter」(該功能處於實驗中),使用AngularDart angulardart.dev/ 進行Web開發等,這些都離不開Dart的編譯器。安全
最近Dart團隊推出了最新版本的Dart功能的更新,最大的亮點是:「dart2native」。它是現有編譯器基礎上的一個擴展,可以將Dart程序編譯爲包含預編譯(AOT)機器碼的self-contained的可執行程序。使用dart2native,您可使用Dart 經過macOS,Windows或Linux上的命令行建立工具。此功能的演示圖以下所示:bash
Dart支持將AOT(預編譯)編譯爲本地機器代碼已有多年,所以Dart Native是至關成熟的技術。可是,過去,Dart僅經過Flutter在iOS和Android移動設備上發佈了此功能。服務器
如今藉助dart2native
,擴展了native編譯支持,以支持運行macOS,Windows和Linux的傳統桌面操做系統。因爲使用dart2native
建立的可執行文件是獨立的,所以它們能夠在未安裝Dart SDK的計算機上運行。而且因爲它們是使用Dart的AOT編譯器進行編譯的,所以可執行文件僅在幾毫秒內便可開始運行。與其餘Dart編譯器和運行時同樣,當編譯爲native代碼時,Dart中可使用相同的一套核心庫 core libraries。網絡
若是你之前使用過dart2aot
,那麼從Dart2.6開始,你將使用dart2native
,這個是dart2aot
的超集,比dart2aot
更完善。架構
dart官網已經支持dart2.6的文檔,網址以下: dart.dev/get-dart編輯器
首先咱們找到下載地址,能夠點擊:dart.dev/tools/sdk/a…,在Stable channel裏面,選擇你對應的系統(Windows、Linux、Mac),而後選擇根據你電腦對應的系統架構進行下載對應的文件,好比:X64是64位,ia32是32位。
下好以後,解壓縮,選擇一個英文的安裝路徑(不要是Flutter的安裝路徑,不然會出現錯誤),而後將安裝路徑添加到環境變量「path」裏面,重啓一下電腦,便可使用Dart命令行了。
注意:Dart SDK的安裝和Flutter內置的Dart SDK是不一致的,不能共用。須要單獨設置安裝文件夾分別存放。
輸入dart --version
,查看Dart版本號,輸入where dart
查看Dart安裝路徑。以下圖所示:
dart2native能夠用於構建和部署命令行程序。一般會使用諸如:dart:io
(基本I/O)、package:http
(網絡操做)、package:args
(參數解析)之類的庫。下面看一下dart2native將「 hello,world」應用編譯爲可執行文件簡單的示例代碼:
hello.dart
源代碼:
main(){
print('Hello Dart');
}
複製代碼
編譯hello.dart爲hello可執行文件:
dart2native hello.dart -o hello
複製代碼
編譯過程以下圖所示:
native應用程序一般須要從操做系統訪問本地API功能。這些系統api一般在本地的基於C的庫中存在,而Dart經過dart:ffi
支持與這些庫的互交互性,這是Dart 2.5的預覽版中推出的Dart與C交互的新功能。
Dart2.6對許多dart:ffi
的API進行了重大更改,使咱們的API易於使用,提供更多的類型安全性並提供對內存的便捷訪問。
dart2native編譯器與dart:ffi兼容,所以您能夠建立和編譯使用它的本地的dart應用程序。
Dart的某位團隊成員最近開始使用dart:ffi建立了一個用於控制檯應用程序開發的dart_console庫(pub.dev/packages/da…),它具備諸如獲取窗口尺寸、讀取和設置光標位置、管理顏色、讀取鍵和控制序列等功能。使用dart的能力:ffi使dart成爲一種很是強大的控制檯應用程序語言。dart_console
是Kilo
文本編輯器的Dart版本實現。Kilo
github.com/antirez/kil… 庫使用C語言編寫而成,大約有1000行代碼。
使用Dart核心庫、dart:ffi
和 dart_console
庫,咱們能夠建立很是有趣的控制檯應用程序。dart_console
庫包括一個完整的 Kilo
演示,這是一個用大約500行Dart代碼編寫的控制檯文本編輯器。
使用新的dart2native編譯器,咱們能夠輕鬆地打包它,最後獲得一個7MB的self-contained代碼編輯器。下圖是一個編譯編輯器的演示,而後使用編譯的編輯器編輯本身的源代碼來修復錯誤:
對於無服務器後端,服務快速啓動相當重要。傳統上,基於Dart的服務與咱們的JIT(即時)編譯器一塊兒運行,可是基於JIT的執行在啓動時會存在較高的延遲,由於須要對其進行編譯和預熱後才能開始執行代碼。經過將服務的代碼提早編譯爲native代碼,您能夠避免這種延遲並當即開始運行。此外,使用native代碼,您能夠建立具備較小磁盤佔用空間且獨立的Dart services,從而大大減少了運行Dart services的容器的大小。實驗代表,使用dart2native編譯器,可以將Docker鏡像的大小減小91%,從使用JIT編譯的220MB的代碼減小至使用native編譯的20MB的代碼!有關服務器端應用程序和軟件包的更多詳細信息,能夠查看如下文檔:
服務器端應用程:dart.dev/tutorials/s… 軟件包:dart.dev/server/libr…
dart2native編譯器僅支持爲其運行的操做系統建立native代碼。所以,若是要爲macOS,Windows和Linux上這三個平臺的程序建立可執行文件,則須要分別在各個平臺運行該編譯器。一種實現方法是使用可以同時支持三種操做系統的CI(連續集成)程序。
生成的可執行文件使用的格式與標準簽名工具(例如codesign和signtool)不兼容。
dart:mirrors
和 dart:developer
這兩個庫。Dart 2.6還包含使人興奮的新語言功能 「靜態擴展方法」的預覽版本,該功能容許像在特殊靜態類型的表達式的實例成員同樣,調用特別聲明的靜態函數。可是此功能仍然須要完善,官方也表示在下一個Dart SDK版本中將會正式啓動這個功能。
Dart類具備虛擬方法。好比就像thing.doStuff()這樣的調用將調用thing表示的對象上的虛擬doStuff方法。向類添加方法的惟一方法是修改類。若是你是否是類的做者,你必須使用靜態輔助函數(functions),而不是方法(methods),所以使用 doMyStuff(thing)
代替 thing.doMyStuff()
。這對於單個功能是能夠接受的。
更多關於「靜態擴展方法」的資料能夠查看官方的文檔介紹:github.com/dart-lang/l…
【Tips:】本文首發在公衆號 Flutter那些事,更多幹貨歡迎多多關注。