このプロジェクトについて

esen_seoは、Flutter Webの構造的な問題に対処するFlutterパッケージです。Flutterアプリはドキュメントではなくウィジェットツリーをレンダリングするため、クローラーが読むべき見出し、段落、リンクを見つけられません。このパッケージはそのウィジェットツリーをDOM内のセマンティックHTMLとして直接ミラーリングし、メタタグ、OpenGraph、Schema.org JSON-LDを管理し、ボットにページソース内の完全なHTMLドキュメントを渡すshelfベースのサーバーサイドレンダリングコンポーネントを含みます。純粋なDartであり、PuppeteerやヘッドレスChromeは使用しません。 使用方法は書き直しではなく段階的です。ほとんどのウィジェットは自動的にミラーリングされ、`.seo()`拡張呼び出しがセマンティックな意味を追加し、ライブラリのウィジェット群がミラーでは見えないケース(閉じたドロップダウン、仮想化リスト、非アクティブタブ、描画されたチャート)をカバーします。iOS、Android、デスクトップではすべての呼び出しがno-opとなり、ウィジェットは従来どおりレンダリングされます。HTMLはWeb上にのみ存在します。 READMEに記載されている主な機能: - Text、Image、Column、Row、GestureDetector向けの`.seo()`拡張。型付きタグ定数(SeoTextTag.h1、SeoContainerTag.section)と、.h1~.h6、.p、.li、.ul、.section、.article、.nav、.trなどの省略形を備えます。 - スマートなデフォルト: `.seo()`呼び出しが一切ないページでもレンダリングされ、最初のテキストがh1、続くテキストがp、画像がsemanticLabelをaltとして使うimgになります。ブロックされたタグや無効なタグは安全な要素にフォールバックします。 - `.seoNodes()`によるカスタム変換。任意のウィジェットが独自のHTMLを宣言できます。SEOウィジェットライブラリは描画されたコンテンツを変換します(例えばSeoBarChartはCSSバーとそのデータの実際のテーブルとしてミラーリング)。 - SeoRichTextは、単一の宣言的なスパンツリーからネイティブのFlutter TextSpanとネストされたstrong、em、code、安全なa要素を構築します。 - ページごとに1回のEsenSeo.setMeta()呼び出しによるメタタグ、OpenGraph、Twitter Cards。titleからog:titleへのフォールバックなどを備えます。 - Article、Product(AggregateRatingを含む)、Review、Event、LocalBusiness、Organization、WebSite、BreadcrumbList、FAQPage向けのSchema.org JSON-LDビルダーと、汎用のエスケープハッチ。 - ボット対応SSRサーバー: shelfミドルウェアがUser-Agentでクローラーを検出し、実際のHTMLドキュメントを配信します。`dart run`で実行可能です。 - 単一の信頼できる情報源としてのURLルーティング: 純粋なDartのルートテーブルが、ナビゲーション時のアプリのメタタグとボット向けのサーバーレンダリングされたルートボディを駆動し、sitemap.xml(lastmodとhreflang代替付き)、robots.txt、canonical URL、実際のHTTP 404を生成します。 - ルートテーブルの静的プリレンダリングにより、サーバーなしのCDNホスティング用に静的HTMLファイルをWebビルドに出力します。 - オプションの可視シェル。プリレンダリングされたHTMLがFlutterエンジンの読み込み前の最初のフレームになります。 - オプトインのDOMファーストルート。Flutter Webを読み込まずに純粋なルートボディを永続ページとして保持でき、SeoTabs、SeoCarousel、境界付きSeoCollectionのインタラクションは同じ純粋なDartソースからコンパイルされます。 - ルートテーブルから生成されるllms.txtとllms-full.txt、およびインデックスを高速化するIndexNow ping。 安全ポリシーは明示的です。タグは許可リストであり、script、style、iframe、form、plaintext、svg、head専用タグ、カスタム要素、無効な名前はレンダリング時に拒否され、span/divにフォールバックします(SeoMode.strictではデバッグ警告付き)。属性処理ではイベントハンドラと無効な名前を削除しつつ、data-*、aria-*、id、lang、citeを許可します。URL属性は相対URLとhttp、https、mailto、tel、sms、ftpに制限され、javascript:などのスキームをブロックします。 READMEはSEOウィジェットライブラリも文書化しています: SeoBarChart、SeoPieChart(純粋なCSS conic-gradientパイとテーブル)、SeoRating、SeoDataTable、SeoFaq(details/summaryアコーディオン)、SeoBreadcrumbs、SeoFigure、SeoResponsiveImage(AVIF/WebPソース付きpicture/srcset)、SeoTestimonial、SeoRichText。5つのウィジェットがFlutterが決して構築しないコンテンツに対処します: SeoNavMenu(ドロップダウン項目をデータとして)、SeoListView(遅延レンダリングにもかかわらず全項目をミラーリング)、SeoCarousel、SeoTabs、SeoStepper。非Webプラットフォームではすべてno-opとなり、通常のFlutterウィジェットをレンダリングします。 ルーティングはFlutterインポートなしの純粋なDartファイルで一度定義され、main.dartとサーバーで共有されます。SeoRoute.dynamicは単一のデータベース読み取りからメタデータとボディを解決し、enumeratePathsはsitemap、llms.txt、プリレンダリング用です。SeoRouteObserverはミラーとメタタグをナビゲーションに追従させ、go_router、beamer、auto_route、その他のRouterベースのパッケージで動作します。READMEは、ライブDOMミラーはウィジェットツリーから派生し、2つ目のオーサリング済みコンテンツツリーを必要としない一方、サーバーレンダリングされたルートボディは両方が共有の純粋なデータモデルから派生しない限り別個であると述べています。ドリフトを検出するためにauditSeoParityが提供されています。 READMEは、ミラーはデフォルトで非表示(aria-hidden、サイズゼロ)であり、Flutterが独自のセマンティクスツリーを公開するため、明示的にアクセシビリティ機能ではないと述べています。