Skip to content

ライブラリとインポート

importディレクティブとlibraryディレクティブは、モジュール化された共有可能なコードベースを作成するのに役立ちます。ライブラリはAPIを提供するだけでなく、プライバシーの単位でもあります: アンダースコア(_)で始まる識別子は、ライブラリ内部でのみ見ることができます。たとえ library ディレクティブを使用していなくても、すべての Dart ファイル(とそのパーツ)はライブラリです。

ライブラリはパッケージを使って配布できる。

Note

Dartがpublicやprivateのようなアクセス修飾キーワードの代わりにアンダースコアを使用する理由を知りたい場合は、SDK issue 33383を参照してください。

ライブラリの利用

あるライブラリーの名前空間を、別のライブラリーのスコープでどのように使うかを指定するには、importを使う。

例えば、DartのWebアプリは一般的にdart:htmlライブラリを使用し、次のようにインポートすることができます:

dart
import 'dart:html';

インポートに必要な唯一の引数は、ライブラリを指定するURIです。組み込みライブラリの場合、URIは特別なdart:スキームを持ちます。その他のライブラリについては、ファイルシステムのパスまたは package: スキームを使用できます。package:スキームは、pubツールなどのパッケージマネージャが提供するライブラリを指定します。例えば

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

Note

URIはuniform resource identifierの略。URL(ユニフォーム・リソース・ロケータ)は一般的なURIの一種です。

ライブラリ接頭辞の指定

競合する識別子を持つ2つのライブラリをインポートする場合、一方または両方のライブラリに接頭辞を指定することができます。例えば、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
// 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 を使ってライブラリをインポートしなければならない。

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

ライブラリーが必要になったら、ライブラリーの識別子を使ってloadLibrary()を呼び出す。

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

先のコードでは、awaitキーワードはライブラリがロードされるまで実行を一時停止する。asyncとawaitの詳細については、asynchrony supportを参照してください。

1つのライブラリに対してloadLibrary()を複数回起動しても問題はない。ライブラリがロードされるのは1回だけである。

遅延ローディングを使用する際には、以下の点に注意してください:

  • 遅延ライブラリの定数は、インポートファイルの定数ではありません。これらの定数は、遅延ライブラリがロードされるまで存在しないことを覚えておいてください。
  • 遅延ライブラリの型をインポートファイルで使用することはできません。代わりに、遅延ライブラリとインポートファイルの両方によってインポートされるライブラリにインターフェイス型を移動することを検討してください。
  • Dartは、deferredを名前空間として使用して定義した名前空間に、暗黙的にloadLibrary()を挿入します。loadLibrary() 関数は Future を返します。

ライブラリ指令

ライブラリレベルのdocコメントやメタデータ注釈を指定するには、ファイルの冒頭でライブラリ宣言に添付します。

dart
/// 本当に素晴らしいテストライブラリだ。
@TestOn('browser')
library;

ライブラリの実装

パッケージの実装方法については、「パッケージの作成」を参照してください:

  • ライブラリーのソースコードを整理する方法
  • exportディレクティブの使い方
  • パート指示文を使うとき
  • 複数のプラットフォームをサポートするライブラリを実装するために、条件付きインポートおよびエクスポートを使用する方法。