言語編 |
importとlibraryのディレクティブにより、モジュール化された共有可能(shareable )なコード・ベースの作成が可能となる。ライブラリは単にAPIたちを提供するだけでなく、プライバシの単位でもある:アンダスコア(_)で始まる識別子たちはそのライブラリ内でのみ可視である。各Dartのアプリは、例えそれがlibraryディレクティブを使っていなくてもライブラリである。
ライブラリたちはパッケージたちを使って配布可能となる。Pub(SDKのなかに入っているパッケージ・マネージャ)に関してはPub Package and Asset Managerを見ると良い。
ひとつのライブラリからの名前空間が別のライブラリのスコープ内でどのように使われるかを指定するのにimportを使う。
例えば、Dartのウェブ・アプリは通常dart:htmlライブラリを使用するが、それは次のようにインポートできる:
|
必要な引数はそのライブラリを指定するURIである。組込みライブラリの場合は、そのURIは特別なdart:スキームになっている。他のライブラリの場合は、ファイル・システム・パスまたはpackage:スキームが使える。package:スキームはpubツールのようなパッケージ・マネージャが提供しているライブラリたちを指定する。例えば:
|
注意:URIはuniform resource identifierのことである。URL(uniform resource locators)はURIの一般的な形式である。
使われている識別子が互いにぶつかっている二つのライブラリをインポートするときは、そのひとつまたは双方のライブラリにプレフィックスを指定できる。例えば、もしlibrary1とlibrary2の双方がElementクラスを持っていたとすると、以下のようなコードにすることになろう:
|
あるライブラリの一部のみを使いたいときは、そのライブラリを選択的にインポートできる。例えば:
|
後回しのロードは不精なローディング(lazy loading)とも呼ばれ、あるアプリがそのライブラリが必要になったときにオンデマンドでそれをロード出来るようにする:
そのアプリの初期立ち上げ時間を短縮する
A/Bテストを行う—例えばあるアルゴリズムの別の実装を試す
オプショナルなスクリーンやダイヤログのような滅多に使われない機能をロードする
あるライブラリを後回しでロードするには、最初にそれをdeferred asを使ってインポートしなければならない。
|
そのライブラリが必要になったときに、そのライブラリの識別子を使ってloadLibrary()を呼び出す。
|
上のコードでは、awaitキーワードはそのライブラリがロードされるまで実行を休止する。asyncとawaitに関する詳細は「非同期対応」の章を参照のこと。
あるライブラリに複数回loadLibrary()をかけるのは問題ない。そのライブラリは一度のみロードされる。
後回しのローディングを使う際は以下のこと念頭に置く必要がある:
後回しになったライブラリの常数たちはインポートしている側のファイルの中では常数ではない。これらの常数たちはその後回しのライブラリがロードされるまでは存在していない
インポートしている側のファイルの中では後回しになったライブラリからの型を使うことはできない。代替として、後回しのライブラリとインポートする側のファイルの双方によってインポートされているインターフェイス型を検討する
deferred as名前空間を使って定義する名前空間にDartは暗示的にloadLibrary()関数を挿入する。このloadLibrary()関数はFutureを返す
Dart VMでの相違:Dart VMではたとえloadLibrary()の呼び出し前であっても後回しのライブラリたちのメンバへのアクセスが可能である。このふるまいは変更される可能性があるので、現行のふるまいに依存しないようにされたい。
ライブラリ・パッケージの実装に関しては、Create Library Packagesを見ること。これには以下のことが記されている:
ライブラリ・ソース・コードの構成法
exportディレクティブの使い方
何時partディレクティブを使うか
何時libraryディレクティブを使うか