內容

函式庫和匯入

importlibrary 指令可以協助您建立模組化且可共用的程式碼庫。函式庫不僅提供 API,也是一個私密性單位:以底線 (_) 開頭的識別碼僅在函式庫內可見。每個 Dart 檔案(加上其部分)都是一個 函式庫,即使它沒有使用 library 指令也是如此。

程式庫可以使用 套件 進行散布。

使用函式庫

#

使用 import 指定如何於另一個程式庫的範圍內使用來自一個程式庫的命名空間。

例如,Dart 網路應用程式通常會使用 dart:html 程式庫,他們可以像這樣匯入

dart
import 'dart:html';

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;

延遲載入程式庫

#

延遲載入 (也稱為懶惰載入) 允許網路應用程式在需要時按需載入程式庫。當您想滿足以下一個或多個需求時,請使用延遲載入。

  • 減少網路應用程式的初始啟動時間。
  • 執行 A/B 測試,例如嘗試演算法的替代實作。
  • 載入很少使用的功能,例如選用畫面和對話方塊。

這並不表示 Dart 會在啟動時載入所有延遲組件。網路應用程式可以在需要時透過網路下載延遲組件。

dart 工具不支援針對網路以外目標的延遲載入。如果您正在建置 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 namespace 定義的命名空間。loadLibrary() 函式會傳回 Future

library 指令

#

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

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

實作函式庫

#

請參閱 建立套件,以取得如何實作套件的建議,包括

  • 如何整理函式庫原始碼。
  • 如何使用 export 指令。
  • 何時使用 part 指令。
  • 如何使用條件式匯入和匯出,來實作支援多個平台的函式庫。