jaspr-fundamentals について
jaspr-fundamentalsは、Jasprのコンポーネントモデルと基本的なUI実装を扱うスキルです。コンポーネントの状態、型付きHTML要素、ブラウザーAPI、イベント処理について開発者を案内します。
主な機能
- 01ステートレス/ステートフルコンポーネント
- 02コンテキストと状態の継承
- 03型付きHTMLコンポーネントの利用
- 04ブラウザーAPIとイベント処理
活用シーン
- 01Jasprのコンポーネントツリーの構成
- 02インタラクティブなHTML要素の実装
- 03各レンダリングモードでのブラウザーAPI利用
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ rodydavis/ signals.dart --skill jaspr-fundamentalsインストール後、Claude Code で/jaspr-fundamentalsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/html/a.mdarticle.mdaside.mdaudio.mdb.mdblockquote.mdbody.mdbr.mdbutton.mdcaption.mdcircle.mdcode.mdcol.mdcolgroup.mddatalist.mddd.mddetails.mddialog.mddiv.mddl.mddt.mdellipse.mdem.mdembed.mdfieldset.mdfigcaption.mdfigure.mdfooter.mdform.mdh1.md詳細
コンポーネント
Jaspr は、Flutter のウィジェットと非常によく似たコンポーネントベースのアーキテクチャを採用しています。UI の構成、アーキテクチャ、状態管理などの概念は、そのまま応用できます。
- StatelessComponent:変更可能な状態を必要としないコンポーネントに使用します。
Component build(BuildContext context)をオーバーライドする必要があります。 - StatefulComponent:変更可能な状態を持つコンポーネントに使用します。対応する
Stateクラスが必要です。状態にはinitState()やdispose()などのライフサイクルメソッドがあります。状態クラスでComponent build(BuildContext context)をオーバーライドする必要があります。 - InheritedComponent:コンポーネントツリーの下層へコンテキストや状態を効率よく伝播させるために使用します。
build からコンポーネントを返す
Jaspr で UI を構築するには、build() から単一の Component を返す必要があります。
- ルール 1:
Iterable<Component> build(BuildContext context) sync*は使用してはいけません。これはレガシーコードです。 - ルール 2: フラグメント、テキスト、空のノードには、大文字で始まるコンポーネント名ではなく、ドット短縮記法を使用してください。
.fragment([...])を使用します(Fragment([...])やfragment([...])は使用しないでください)。.text('...')を使用します(Text('...')やtext('...')は使用しないでください)。- 空のスペースを安全に返すには
.empty()を使用します。
使用例:
import 'package:jaspr/jaspr.dart';
import 'package:jaspr/dom.dart';
class MyComponent extends StatelessComponent {
const MyComponent({super.key});
@override
Component build(BuildContext context) {
// 1. Return a single component (e.g. div)
// 2. Use dot-shorthand (.text) instead of Text()
return div(classes: 'my-class', [
.text('Hello World'),
]);
}
}
HTML コンポーネント
Jaspr は、標準的な HTML 要素(例:div()、p()、a()、button())に対応する型付きコンポーネントを提供します。これらを使用するには、package:jaspr/dom.dart をインポートします。
すべての HTML コンポーネントは、標準的な名前付きパラメーター Key? key、String? id、String? classes、Styles? style、Map<String, String>? attributes、Map<String, void Function(Event)>? events を受け取ります。
ほとんどの HTML コンポーネントは、位置引数の List<Component> children パラメーターを受け取ります(img、input、br などの自己終了タグを除きます)。
- ルール 1:
childrenリストは、すべての名前付きパラメーターの後、必ず最後に指定してください。 - ルール 2: 生の
attributes:マップやevents:マップを使用するより、利用可能な型付きパラメーター(例:href、src、onClick)を必ず優先してください。 - ルール 3: HTML コンポーネントで利用できる型付きパラメーターがわからない場合は、このスキルとともに提供されている該当のリファレンスファイルを必ず確認してください。
references/html/<tag>.mdには、指定したタグのコンポーネントのシグネチャーと使用例がすべて記載されています(例:div()のreferences/html/div.md、button()のreferences/html/button.mdなど)。
- ルール 4: タグに対応するリファレンスファイルが存在しない場合(したがって、そのコンポーネント自体も存在しない場合)は、代わりに汎用の
.element(tag: '...', /* other standard params, */ children: [ /* ... */ ])コンストラクターを必ず使用してください。
使用例:
import 'package:jaspr/jaspr.dart';
import 'package:jaspr/dom.dart';
class MyHtmlComponent extends StatelessComponent {
const MyHtmlComponent({super.key});
@override
Component build(BuildContext context) {
return div(id: 'my-container', classes: 'my-class', [
p(attributes: {'aria-label': 'Example Paragraph'}, [
.text('Hello World'),
]),
// E.g. signature as found at 'references/html/a.md'
a(href: 'https://example.com', [
.text('Click me'),
]),
]);
}
}
コンポーネントのスタイリング
Jaspr は、CSS-in-Dart を使用したコンポーネントのスタイリングを標準でサポートしています。 詳しくは、jaspr-styling スキルを参照してください。
インタラクティブ機能とイベント
1. ブラウザー API へのアクセス
- ルール 1: server モードまたは static モードでは、ブラウザー API へのアクセスに
package:universal_web/web.dartを、js interop API へのアクセスにpackage:universal_web/js_interop.dartを必ず使用してください。 - ルール 2: server モードまたは static モードで
package:universal_webを使用する場合は、サーバーのレンダリング時にクラッシュしないよう、すべての API 呼び出しをif (kIsWeb)チェックで必ず囲んでください。 - ルール 3: client モードでは、
dart:js_interopとpackage:webを直接使用できます。 - ルール 4: グローバルイベントを扱う場合、
windowまたはdocumentのイベントをリッスンするには、型付きの DartStreamを提供するweb.EventStreamProvidersを必ず使用してください。
// Example of safe usage in server/static mode:
import 'package:universal_web/web.dart' as web;
void logSize() {
if (kIsWeb) {
print('Window size: ${web.window.innerWidth}x${web.window.innerHeight}');
// Example of global event listener
final sub = web.EventStreamProviders.resizeEvent.forTarget(web.window).listen((event) {
print('Window resized');
});
}
}
2. イベントの処理
すべての DOM コンポーネントは events: パラメーターに対応しており、インタラクティブなコンポーネントは onClick や onChange などの型付きイベントコールバックを備えています。
- ルール 1: 生のイベントに型を指定する場合は、必ず
web.Eventを使用してください。 - ルール 2: 必要に応じて、型安全なコールバックを作成するために
events()ヘルパー関数を使用してください。
import 'package:jaspr/jaspr.dart';
import 'package:jaspr/dom.dart';
import 'package:universal_web/web.dart' as web;
class MyButton extends StatelessComponent {
@override
Component build(BuildContext context) {
return div(
// Using raw events
events: {'click': (web.Event event) {
print('Div clicked');
}},
[
// Using typed parameters
button(
onClick: () => print('Button clicked'),
[.text('Click me')]
)
]
);
}
}
3. 要素へのアクセス(GlobalNodeKey)
Jaspr がレンダリングした DOM 要素を直接参照する必要がある場合は、GlobalNodeKey を割り当てることができます。
import 'package:jaspr/jaspr.dart';
import 'package:jaspr/dom.dart';
import 'package:universal_web/web.dart' as web;
class MyInput extends StatefulComponent {
@override
State<MyInput> createState() => _MyInputState();
}
class _MyInputState extends State<MyInput> {
final GlobalNodeKey<web.HTMLInputElement> inputKey = GlobalNodeKey();
void focusInput() {
inputKey.currentNode?.focus();
}
@override
Component build(BuildContext context) {
return input(key: inputKey, type: .text);
}
}
参考資料
- プリレンダリング、非同期データ取得、ハイドレーション、
@clientアノテーションについては、関連スキル jaspr-pre-rendering-and-hydration をご覧ください。 - コンポーネントのスタイリングについては、関連スキル jaspr-styling をご覧ください。
- HTML を Jaspr コードに変換する方法については、関連スキル jaspr-convert-html をご覧ください。
- 利用可能なドキュメントの一覧は、https://jaspr.site/llms.txt でご確認いただけます。