🫴
Nostr投稿をWebサイトに簡単埋め込み!Web Componentsライブラリを作った
概要
WebサイトにNostrの投稿やプロフィールを簡単に埋め込めるWeb Componentsライブラリ「nostr-web-components」を作りました。
HTMLに1行タグを書くだけで、Twitterのツイート埋め込みのような感覚でNostrコンテンツを表示できます。
実際の表示例
こんな感じでサイトにNostrの投稿やプロフィールを埋め込むことができます。
使用例1
使用例2
投稿の埋め込み、プロフィール表示、投稿一覧など、1行のHTMLタグを書くだけでリアルタイムでNostrから情報を取得して表示されます。
作った理由
- ブログやサイトにNostrの投稿を引用したい
- フレームワークに依存しないコンポーネントが欲しかった
- CDNで手軽に使えるようにしたかった
使い方
1. CDNから読み込み
<script src="https://cdn.jsdelivr.net/npm/@konemono/nostr-web-components@latest/dist/nostr-web-components.iife.js"></script>
2. HTMLタグで投稿を埋め込み
<!-- 投稿の埋め込み -->
<nostr-note id="nevent1qvzqqqqq9gpzq2aj4wlutzft00dg77x4x6pdjy7vnfzxk30pry5lpy6a3l0uks9aqyxhwumn8ghj77tpvf6jumt9qys8wumn8ghj7un9d3shjtt2wqhxummnw3ezuamfwfjkgmn9wshx5uqpr4mhxue69uhhyetvv9ujumn0wd68ytnhd9ex2erwv46zu6nsqyxhwumn8ghj7mn0wvhxcmmvqyghwumn8ghj7mnxwfjkccte9eshquqqyqv8dx4g48jf0gwdyldmsde4z0wpqj65wkpzq3a0d7zjqeacc43huavy3te"></nostr-note>
<!-- プロフィールの埋め込み -->
<nostr-profile user="npub1fuffhzfv7xdrm5htde4mp9e5n6ywn763cq6mzxtetyqvsg66kkasp9zzyz"></nostr-profile>
たったこれだけで、リアルタイムでNostrから投稿を取得して表示されます。
主要機能
nostr-note(投稿表示)
<!-- カード表示 -->
<nostr-note id="nevent1..." display="card"></nostr-note>
<!-- コンパクト表示 -->
<nostr-note id="nevent1..." display="compact"></nostr-note>
<!-- ダークテーマ -->
<nostr-note id="nevent1..." theme="dark"></nostr-note>
<!-- リンク無効化 -->
<nostr-note id="nevent1..." noLink="true"></nostr-note>
<!-- 高さ指定 -->
<nostr-note id="nevent1..." height="200px"></nostr-note>
nostr-profile(プロフィール表示)
<!-- npubでの指定 -->
<nostr-profile user="npub1..."></nostr-profile>
<!-- NIP-05での指定 -->
<nostr-profile user="mono@tsukemonogit.github.io"></nostr-profile>
<!-- 表示形式の選択 -->
<nostr-profile user="npub1..." display="card"></nostr-profile>
<nostr-profile user="npub1..." display="compact"></nostr-profile>
<nostr-profile user="npub1..." display="name"></nostr-profile>
nostr-list(投稿一覧)
Nostrのフィルター機能を使って、条件に合う投稿を一覧表示できます。
<!-- 特定ユーザーの投稿 -->
<nostr-list
filters='[{"kinds":[1],"authors":["84b0c46ab699ac35eb2ca286470b85e081db2087cdef63932236c397417782f5"],"limit":10}]'
limit="10">
</nostr-list>
<!-- ハッシュタグ検索 -->
<nostr-list
filters='[{"kinds":[1],"#t":["nostr"],"limit":8}]'
limit="8">
</nostr-list>
nostr-stream(リアルタイムストリーミング)
Nostrイベントのリアルタイムストリーミング表示用のコンポーネントです。1ページに1つのみ利用可能です。
<!-- リアルタイムストリーミング表示 -->
<nostr-stream
filters='[{"kinds":[1],"#t":["nostr"],"limit":10}]'>
</nostr-stream>
<!-- 特定ユーザーのストリーミング -->
<nostr-stream
filters='[{"kinds":[1],"authors":["84b0c46ab699ac35eb2ca286470b85e081db2087cdef63932236c397417782f5"],"limit":20}]'>
</nostr-stream>
技術的な特徴
Web Components採用
- React、Vue、Angular などのフレームワークを選ばない
- 既存のHTML/CSS/JSプロジェクトにそのまま組み込める
- Shadow DOMによるスタイルの分離
リアルタイム通信
- WebSocketでNostrリレーに接続
- 投稿の更新を自動で反映
- 複数のリレーに同時接続してデータ取得
カスタマイズ性
<!-- カスタムリンク先 -->
<nostr-note id="nevent1..." href="https://lumilumi.app/{id}" target="_blank"></nostr-note>
<!-- 独自のリレー設定 -->
<nostr-container relays='["wss://nos.lol","wss://yabu.me","wss://relay.nostr.band"]'>
<nostr-note id="nevent1..."></nostr-note>
<nostr-profile user="npub1..."></nostr-profile>
<nostr-stream filters='[{"kinds":[1],"limit":10}]'></nostr-stream>
</nostr-container>
使用例
ブログ記事での引用
<p>先日のNostrでの投稿が話題になりました。</p>
<nostr-note id="nevent1..." display="card"></nostr-note>
<p>このように簡単に投稿を埋め込めます。</p>
プロフィールページ
<h2>Nostrでの活動</h2>
<nostr-profile user="npub1..." display="card"></nostr-profile>
<h3>最新の投稿</h3>
<nostr-list
filters='[{"kinds":[1],"authors":["..."],"limit":5}]'
limit="5">
</nostr-list>
リアルタイムフィード
<h2>Nostrリアルタイムフィード</h2>
<nostr-stream
filters='[{"kinds":[1],"#t":["bitcoin","nostr"],"limit":15}]'>
</nostr-stream>
実装の工夫点
パフォーマンス最適化
- 同一投稿の重複取得を避ける
- 不要なリレー接続を最小限に抑制
- レンダリングの最適化
エラーハンドリング
- リレー接続エラーの適切な処理
- 投稿が見つからない場合の表示
- ネットワークエラー時の再試行
今後の予定
- より多くの表示オプション(現在対応kinds:[0,1,6,7])
- パフォーマンスの更なる向上
- コンテントわーにんぐへの対応(nsfw)(2025/07/25 Done)
リンク
- デモサイト: https://tsukemonogit.github.io/nostr-web-components-demo/
- GitHub: https://github.com/TsukemonoGit/nostr-web-components
- npm: https://www.npmjs.com/package/@konemono/nostr-web-components
インストール
CDN (推奨)
<script src="https://cdn.jsdelivr.net/npm/@konemono/nostr-web-components@latest/dist/nostr-web-components.iife.js"></script>
npm
npm install @konemono/nostr-web-components
注意: 現在、npm版は設定が複雑になる可能性があります。CDNからの読み込みが最も簡単で確実です。
最後に
NostrをWebに簡単に統合できるツールを目指して開発しました。
GitHubでのIssueやPull Request、フィードバックをお待ちしています。
Discussion