Dart中庫以及可見性
import 和 library 指定可以幫你創建一個模塊化以及可複用的代碼基礎。Libraries不僅可以提供APIs,也是一個私有單元:以下劃線開始的標識符僅僅在所在的 library 中可見。每一個 Dart 程序都是一個 library ,即使它沒有使用 library 指令。
可以使用 packages 來分發Libraries。
使用Libraries
使用 import 來指定一個 library 的命名空間如何在另一個 library 的範圍內使用。
例如,Dart web 應用程序通常需要使用 dart:html 庫,那麼可以像下面這樣導入:
import 'dart:html';
import 唯一必需的參數是指定庫URI。對於內置庫,它們的URI有一個指定的scheme: dart: 。對於其他庫,你可以使用文件系統路徑或者一個schema: package: 。 scheme package: 指定包管理器所提供的庫(Libraries),例如:
import 'package:test/test.dart';
指定庫的前綴
如果你導入兩個有標識符衝突的庫,此時你可以爲其中一個或者兩個都指定前綴。例如:如果 library1和library2都有一個 Element 類,你可能需要像下面的代碼這樣寫:
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
// Uses Element from lib1.
Element element1 = Element();
// Uses Element from lib2.
lib2.Element element2 = lib2.Element();
僅僅導入庫的一部分
如果你想要使用一個庫的一部分,你可以有選擇性的導入一個庫。例如:
// Import only foo.
import 'package:lib1/lib1.dart' show foo;
// Import all names EXCEPT foo.
import 'package:lib2/lib2.dart' hide foo;
懶加載一個庫
延遲加載(也稱爲懶加載)庫允許一個應用程序在需要的時候纔去加載一個庫。這裏是一些你可能使用延遲加載的場景:
- 要減少一個APP的初始啓動時間。
- A/B測試。
- 加載很少使用的功能。
要懶加載一個庫,你必須在第一次導入時使用 deferred as。
import 'package:greetings/hello.dart' deferred as hello;
當你需要使用延遲加載的庫時,使用庫的標識符調用 loadLibrary() ,例如:
Future greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
在上面的代碼中,關鍵字 await 會暫停代碼的執行直到庫被加載完成。更多關於 async 和 await 的信息,請看asynchrony support 。
你可以調用在一個庫上多次調用 loadLibrary() ,這是不會有問題的,該庫僅僅會被加載一次。
當你使用延遲加載一個庫時,請牢記如下幾點:
- 一個延遲加載的庫的常量在導入該庫的文件中並不屬於常量。記住,這些常量是不存在的,直到延遲加載庫被加載完成。
- 你不能在導入庫的文件中使用延遲庫中的類型。Instead, consider moving interface types to a library imported by both the deferred library and the importing file.
- Dart隱式的將 loadLibrary() 插入到你使用 deferred as namespace 定義的命名空間中。
實現庫
如何實現一個庫請參考 Create Library Package,包含如下幾點:
- 如何組織庫的源代碼
- 如何使用 export 指令
- 何時使用 part 指令
- 何時使用 library 指令