メインコンテンツにスキップ

ライブラリとインポート

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

ライブラリは、パッケージを使用して配布できます。

Dart は、publicprotectedprivate のようなアクセス修飾子キーワードの代わりにアンダースコアを使用します。他の言語のアクセス修飾子キーワードはより詳細な制御を提供しますが、Dart のアンダースコアとライブラリベースのプライバシーの使用は、簡単な設定メカニズムを提供し、動的アクセスの効率的な実装を可能にし、ツリーシェイキング(デッドコード削除)を改善します。

ライブラリの使用

#

import を使用して、あるライブラリの名前空間を別のライブラリのスコープで使用する方法を指定します。

たとえば、Dart ウェブ アプリは通常、dart:js_interop ライブラリを使用し、次のようにインポートできます。

dart
import 'dart:js_interop';

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

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

ライブラリのプレフィックスを指定する

#

競合する識別子を持つ 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
// 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 が開始時にすべての遅延コンポーネントを読み込むという意味ではありません。ウェブ アプリは、必要に応じて 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 キーワードはライブラリが読み込まれるまで実行を一時停止します。async および await の詳細については、非同期プログラミングを確認してください。

ライブラリに対して loadLibrary() を複数回呼び出しても問題ありません。ライブラリは一度しか読み込まれません。

遅延読み込みを使用する際は、以下に注意してください。

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

library ディレクティブ

#

ライブラリレベルの ドキュメントコメントまたは メタデータ注釈を指定するには、ファイルの先頭にある library 宣言にそれらをアタッチします。

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

ライブラリの実装

#

パッケージの実装方法(以下を含む)については、パッケージの作成を参照してください。

  • ライブラリソースコードの編成方法。
  • export ディレクティブの使用方法。
  • part ディレクティブを使用するタイミング。
  • 条件付きインポートとエクスポートを使用して、複数のプラットフォームをサポートするライブラリを実装する方法。