ライブラリとインポート
importディレクティブとlibraryディレクティブは、モジュール化された共有可能なコードベースを作成するのに役立ちます。ライブラリはAPIを提供するだけでなく、プライバシーの単位でもあります: アンダースコア(_)で始まる識別子は、ライブラリ内部でのみ見ることができます。たとえ library ディレクティブを使用していなくても、すべての Dart ファイル(とそのパーツ)はライブラリです。
ライブラリはパッケージを使って配布できる。
Note
Dartがpublicやprivateのようなアクセス修飾キーワードの代わりにアンダースコアを使用する理由を知りたい場合は、SDK issue 33383を参照してください。
ライブラリの利用
あるライブラリーの名前空間を、別のライブラリーのスコープでどのように使うかを指定するには、importを使う。
例えば、DartのWebアプリは一般的にdart:htmlライブラリを使用し、次のようにインポートすることができます:
import 'dart:html';
インポートに必要な唯一の引数は、ライブラリを指定するURIです。組み込みライブラリの場合、URIは特別なdart:スキームを持ちます。その他のライブラリについては、ファイルシステムのパスまたは package: スキームを使用できます。package:スキームは、pubツールなどのパッケージマネージャが提供するライブラリを指定します。例えば
import 'package:test/test.dart';
Note
URIはuniform resource identifierの略。URL(ユニフォーム・リソース・ロケータ)は一般的なURIの一種です。
ライブラリ接頭辞の指定
競合する識別子を持つ2つのライブラリをインポートする場合、一方または両方のライブラリに接頭辞を指定することができます。例えば、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();
ライブラリの一部だけをインポートする
ライブラリの一部だけを使用したい場合は、選択的にライブラリをインポートすることができます。例えば
// foo のみインポートする。
import 'package:lib1/lib1.dart' show foo;
// foo を除くすべての名前をインポートする。
import 'package:lib2/lib2.dart' hide foo;
ライブラリの遅延ロード
遅延ロード(lazy loading)は、ライブラリが必要な時に、ウェブアプリがオンデマンドでライブラリをロードすることを可能にします。ここでは、遅延ロードを使用するいくつかのケースを紹介します:
- ウェブアプリの初期起動時間を短縮する。
- A/Bテストの実施-例えばアルゴリズムの代替実装を試す。
- オプションの画面やダイアログなど、使用頻度の低い機能をロードする。
Warning
dart compile jsだけが遅延ロードをサポートしている。FlutterとDart VMは遅延ロードをサポートしていない。詳しくは issue #33118 と issue #27776 を参照してください。
ライブラリを遅延ロードするには、まず deferred as を使ってライブラリをインポートしなければならない。
import 'package:greetings/hello.dart' deferred as hello;
ライブラリーが必要になったら、ライブラリーの識別子を使ってloadLibrary()を呼び出す。
Future<void> greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
先のコードでは、awaitキーワードはライブラリがロードされるまで実行を一時停止する。asyncとawaitの詳細については、asynchrony supportを参照してください。
1つのライブラリに対してloadLibrary()を複数回起動しても問題はない。ライブラリがロードされるのは1回だけである。
遅延ローディングを使用する際には、以下の点に注意してください:
- 遅延ライブラリの定数は、インポートファイルの定数ではありません。これらの定数は、遅延ライブラリがロードされるまで存在しないことを覚えておいてください。
- 遅延ライブラリの型をインポートファイルで使用することはできません。代わりに、遅延ライブラリとインポートファイルの両方によってインポートされるライブラリにインターフェイス型を移動することを検討してください。
- Dartは、deferredを名前空間として使用して定義した名前空間に、暗黙的にloadLibrary()を挿入します。loadLibrary() 関数は Future を返します。
ライブラリ指令
ライブラリレベルのdocコメントやメタデータ注釈を指定するには、ファイルの冒頭でライブラリ宣言に添付します。
/// 本当に素晴らしいテストライブラリだ。
@TestOn('browser')
library;
ライブラリの実装
パッケージの実装方法については、「パッケージの作成」を参照してください:
- ライブラリーのソースコードを整理する方法
- exportディレクティブの使い方
- パート指示文を使うとき
- 複数のプラットフォームをサポートするライブラリを実装するために、条件付きインポートおよびエクスポートを使用する方法。