跳到主要內容

庫與匯入

importlibrary 指令可以幫助你建立模組化和可共享的程式碼庫。庫不僅提供 API,還是一個隱私單元:以下劃線 (_) 開頭的識別符號僅在庫內部可見。每個 Dart 檔案(及其組成部分)都是一個,即使它沒有使用 library 指令。

庫可以使用進行分發。

Dart 使用下劃線代替訪問修飾符關鍵字,如 publicprotectedprivate。雖然其他語言的訪問修飾符關鍵字提供了更細粒度的控制,但 Dart 使用下劃線和基於庫的隱私提供了一種直接的配置機制,有助於實現動態訪問的高效實現,並改進了搖樹最佳化(死程式碼消除)。

使用庫

#

使用 import 來指定一個庫的名稱空間如何在另一個庫的作用域中使用。

例如,Dart Web 應用通常使用 dart:js_interop 庫,它們可以像這樣匯入該庫

dart
import 'dart:js_interop';

import 唯一需要的引數是指定庫的 URI。對於內建庫,URI 具有特殊的 dart: 方案。對於其他庫,你可以使用檔案系統路徑或 package: 方案。package: 方案指定了由包管理器(例如 pub 工具)提供的庫。例如

dart
import 'package:test/test.dart';

指定庫字首

#

如果你匯入的兩個庫有衝突的識別符號,你可以為其中一個或兩個庫指定一個字首。例如,如果 library1 和 library2 都包含一個 Element 類,那麼你的程式碼可能如下所示

dart
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();

使用萬用字元名稱 _ 的匯入字首是非繫結的,但會提供對該庫中非私有擴充套件的訪問。

只匯入庫的一部分

#

如果你只想使用庫的一部分,可以有選擇地匯入該庫。例如

dart
// Import only foo.
import 'package:lib1/lib1.dart' show foo;

// Import all names EXCEPT foo.
import 'package:lib2/lib2.dart' hide foo;

延遲載入庫

#

延遲載入(也稱為懶載入)允許 Web 應用在需要時按需載入庫。當你希望滿足以下一個或多個需求時,請使用延遲載入。

  • 減少 Web 應用的初始啟動時間。
  • 執行 A/B 測試——例如,嘗試演算法的不同實現。
  • 載入不常用功能,例如可選螢幕和對話方塊。

這並不意味著 Dart 在啟動時載入所有延遲元件。Web 應用可以在需要時透過 Web 下載延遲元件。

dart 工具不支援 Web 以外目標的延遲載入。如果你正在構建 Flutter 應用,請查閱 Flutter 指南中關於延遲元件的延遲載入實現。

要延遲載入庫,首先使用 deferred as 匯入它。

dart
import 'package:greetings/hello.dart' deferred as hello;

當你需要該庫時,使用庫的識別符號呼叫 loadLibrary()

dart
Future<void> greet() async {
  await hello.loadLibrary();
  hello.printGreeting();
}

在前面的程式碼中,await 關鍵字會暫停執行,直到庫載入完成。有關 asyncawait 的更多資訊,請查閱非同步程式設計

你可以多次呼叫庫上的 loadLibrary() 而不會出現問題。該庫只會被載入一次。

使用延遲載入時請記住以下幾點

  • 延遲庫中的常量在匯入檔案中不是常量。請記住,這些常量直到延遲庫載入後才存在。
  • 你不能在匯入檔案中使用延遲庫中的型別。相反,請考慮將介面型別移動到一個由延遲庫和匯入檔案都匯入的庫中。
  • Dart 會隱式地將 loadLibrary() 插入到你使用 deferred as 名稱空間 定義的名稱空間中。loadLibrary() 函式返回一個 Future

library 指令

#

要指定庫級別的文件註釋元資料註解,請將它們附加到檔案開頭的 library 宣告中。

dart
/// A really great test library.
@TestOn('browser')
library;

實現庫

#

有關如何實現包的建議,包括以下內容,請參閱建立包

  • 如何組織庫原始碼。
  • 如何使用 export 指令。
  • 何時使用 part 指令。
  • 如何使用條件匯入和匯出實現支援多個平臺的庫。