dart-web-development について
Dart の Web アプリを開発する人向けの実践スキルです。JavaScript 相互運用、Web 開発ツール、テスト、ローカル実行、本番ビルドを扱います。
主な機能
- 01`dart:js_interop` による JavaScript 相互運用
- 02`package:web` によるブラウザー API 利用
- 03extension type による JavaScript オブジェクト連携
- 04`webdev serve` によるローカル実行
- 05テストと本番ビルド
活用シーン
- 01Dart アプリで JavaScript ライブラリを連携
- 02Dart Web プロジェクトのセットアップ
- 03ローカル Web アプリの実行とデバッグ
- 04デプロイ可能な JavaScript ビルドの作成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dart-lang/ skills --skill dart-web-developmentインストール後、Claude Code で/dart-web-developmentを入力して読み込まれたか確認します。
詳細
Dart Web アプリケーションの開発
目次
コアとなる制約
package:webを使用する: レガシーライブラリのdart:html、dart:js、dart:js_utilよりも、常にpackage:webを優先してください。dart:mirrorsは使用しない: Dart の Web コンパイルでは完全にサポートされていないため、Web アプリケーションでdart:mirrorsを使用しないでください。dart:js_interopを使用する: JavaScript との相互運用はすべて、dart:js_interopライブラリを使用して実装してください。- Extension Type を優先する: JavaScript との相互運用の境界や複雑な JS オブジェクトは、
@JSアノテーションと組み合わせた Dart のextension type宣言を使って定義してください。
JavaScript との相互運用
JavaScript との相互運用を実装し、JS ライブラリやブラウザー API を Dart Web アプリにシームレスに統合してください。
- ライブラリまたは外部宣言に
@JS()を付けて、JavaScript オブジェクトにバインドします。 extension typeを使って、JSObjectやその他の JS 型をラップします。これにより、JS との相互運用にゼロコストの抽象化境界を設けられます。- 相互運用の境界を越える際は、ネイティブの Dart 型(
String、int)ではなく、dart:js_interopが提供する特定の JS 型(例:JSString、JSNumber、JSObject、JSAny)を使用します。
Web ツールと環境
webdev と build_runner を使って、開発ライフサイクル、コンパイル、テストを管理します。
- 依存関係:
pubspec.yamlのdev_dependenciesにbuild_runnerとbuild_web_compilersが含まれていることを確認してください。テストを行う場合は、build_testも含めてください。 - ローカル開発:
webdev serveを使って開発サーバーを起動します。これにより開発用コンパイラーが使用され、増分更新と高速なリフレッシュが可能になります。 - デバッグ:
webdev serveに--debugフラグを追加して、Dart DevTools を有効にします。 - 本番ビルド:
webdev buildを使って、デプロイ可能な縮小済み JavaScript アプリケーションを生成します。
ワークフロー
ワークフロー:Dart Web プロジェクトのセットアップ
Dart Web プロジェクトの初期化または設定を行う際は、このチェックリストをコピーして完了してください。
- 必要な開発用依存関係を追加します:
dart pub add build_runner build_web_compilers --dev -
package:webの依存関係を追加します:dart pub add web - webdev をグローバルにインストールします:
dart pub global activate webdev -
pubspec.yamlに正しい依存関係が記載されていることを確認します。 -
dart pub getを実行して依存関係を同期します。
ワークフロー:JS との相互運用の実装
新しい JavaScript ライブラリまたはオブジェクトをバインドする際は、次の手順に従ってください。
-
dart:js_interopをインポートします。 - ライブラリまたは特定の外部関数/クラスに
@JS()アノテーションを追加します。 -
extension type Name._(JSObject _) implements JSObjectを使って、JS オブジェクトとの境界を定義します。 -
extension type内でexternalメソッドとプロパティを宣言し、dart:js_interopの型(例:JSString)を使用します。 - バリデーターを実行し、コンパイルエラーを確認してから、Dart 型と JS 型の不一致を修正します。
ワークフロー:コンパイルとサービング
デプロイ先に応じて条件分岐を適用します。
- ローカルで開発する場合:
-
webdev serveを実行します(デフォルトのポートは 8080 です)。 - DevTools を使うには、
webdev serve --debugを実行します。
-
- テストする場合:
-
dart run build_runner test -- -p chromeを実行します。
-
- 本番用にビルドする場合:
-
webdev build --output web:buildを実行して、webディレクトリをbuildディレクトリにコンパイルします。
-
例
高忠実度の JS 相互運用の実装例
この例では、仮想的な JavaScript の UserAuth オブジェクトをバインドするために、dart:js_interop、package:web、extension type を正しく使用する方法を示します。
@JS()
library user_auth_interop;
import 'dart:js_interop';
import 'package:web/web.dart' as web;
// Bind to a global JavaScript function
@JS('console.log')
external void _log(JSAny? message);
// Define the JS interop boundary using an extension type
@JS('UserAuth')
extension type UserAuth._(JSObject _) implements JSObject {
// External constructor
external UserAuth(JSString apiKey);
// External properties using JS types
external JSString get currentUser;
external set currentUser(JSString value);
// External methods
external void login(JSString username, JSString password);
external JSBoolean isLoggedIn();
}
void main() {
// Interact with the DOM using package:web
final web.HTMLDivElement appDiv = web.document.querySelector('#app') as web.HTMLDivElement;
appDiv.text = 'Initializing Auth...';
// Instantiate and use the JS interop object
final auth = UserAuth('api_key_123'.toJS);
auth.login('admin'.toJS, 'password'.toJS);
if (auth.isLoggedIn().toDart) {
_log('User logged in successfully!'.toJS);
appDiv.text = 'Welcome, ${auth.currentUser.toDart}';
}
}
コメント
Markdown 対応