इस प्रोजेक्ट के बारे में

esen_seo एक Flutter पैकेज है जो Flutter Web की संरचनात्मक समस्या को हल करता है: चूंकि Flutter एक विजेट ट्री रेंडर करता है न कि दस्तावेज़, इसलिए क्रॉलर्स को पढ़ने के लिए शीर्षक या लिंक नहीं मिलते हैं। यह पैकेज उस विजेट ट्री को सीधे DOM में सेमांटिक HTML के रूप में दर्शाता है, मेटा टैग्स, OpenGraph और Schema.org JSON-LD का प्रबंधन करता है, और इसमें एक shelf-आधारित सर्वर-साइड रेंडरिंग (SSR) घटक शामिल है जो बॉट्स को पेज स्रोत में पूर्ण HTML दस्तावेज़ प्रदान करता है। यह शुद्ध Dart है और Puppeteer या headless Chrome का उपयोग नहीं करता है। उपयोग क्रमिक है, पुनर्लेखन नहीं: अधिकांश विजेट स्वचालित रूप से दर्शाए जाते हैं, `.seo()` एक्सटेंशन कॉल अर्थपूर्ण महत्व जोड़ते हैं, और लाइब्रेरी विजेट उन मामलों को कवर करते हैं जिन्हें मिरर नहीं देख सकता (बंद ड्रॉपडाउन, वर्चुअलाइज्ड सूचियाँ, निष्क्रिय टैब, चित्रित चार्ट)। iOS, Android और डेस्कटॉप पर हर कॉल एक no-op है और विजेट पहले की तरह ही रेंडर होते हैं; HTML केवल वेब पर मौजूद होता है। मुख्य क्षमताएं: - 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 TextSpans और नेस्टेड strong, em, code और सुरक्षित a तत्व बनाता है। - प्रति पृष्ठ एक EsenSeo.setMeta() कॉल के माध्यम से मेटा टैग्स, OpenGraph और Twitter Cards, title से og:title जैसे फॉलबैक के साथ। - Article, Product (AggregateRating सहित), Review, Event, LocalBusiness, Organization, WebSite, BreadcrumbList और FAQPage के लिए Schema.org JSON-LD बिल्डर, साथ ही एक सामान्य escape hatch। - एक बॉट-जागरूक SSR सर्वर: shelf मिडलवेयर User-Agent द्वारा क्रॉलर्स का पता लगाता है और एक वास्तविक HTML दस्तावेज़ परोसता है, जिसे `dart run` के साथ चलाया जा सकता है। - URL राउटिंग एकल सत्य स्रोत के रूप में: एक शुद्ध-Dart रूट टेबल नेविगेशन पर ऐप मेटा टैग्स और बॉट्स के लिए सर्वर-रेंडर्ड रूट बॉडी को चलाती है, और sitemap.xml (lastmod और hreflang विकल्पों के साथ), robots.txt, कैनोनिकल URLs और वास्तविक HTTP 404 उत्पन्न करती है। - CDN होस्टिंग के लिए बिना सर्वर के स्टैटिक HTML फाइलों में रूट टेबल का स्टैटिक प्रीरेंडरिंग। - वैकल्पिक दृश्य शेल, जहां प्रीरेंडर्ड HTML Flutter इंजन लोड होने से पहले पहला फ्रेम होता है। - ऑप्ट-इन DOM-प्रथम रूट जो Flutter Web लोड किए बिना एक शुद्ध रूट बॉडी को स्थायी पृष्ठ के रूप में रख सकते हैं, SeoTabs, SeoCarousel और बाउंडेड SeoCollection इंटरैक्शन उसी शुद्ध Dart स्रोत से संकलित होते हैं। - रूट टेबल से llms.txt और llms-full.txt उत्पन्न होते हैं, साथ ही तेजी से इंडेक्सिंग के लिए IndexNow पिंग्स। सुरक्षा नीतियां स्पष्ट हैं: टैग एक allow list हैं, इसलिए script, style, iframe, form, plaintext, svg, head-only टैग, कस्टम तत्व और अमान्य नाम रेंडर समय पर अस्वीकार कर दिए जाते हैं और span/div पर वापस आ जाते हैं (SeoMode.strict में एक debug चेतावनी के साथ)। विशेषता हैंडलिंग इवेंट हैंडलर और अमान्य नामों को हटा देती है जबकि data-*, aria-*, id, lang और cite को अनुमति देती है; URL विशेषताओं को सापेक्ष URLs के साथ 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। पांच विजेट उस सामग्री को संबोधित करते हैं जिसे Flutter कभी नहीं बनाता: SeoNavMenu (ड्रॉपडाउन प्रविष्टियां डेटा के रूप में), SeoListView (lazy रेंडरिंग के बावजूद सभी आइटम दर्शाए जाते हैं), SeoCarousel, SeoTabs और SeoStepper। गैर-वेब प्लेटफार्मों पर ये सभी plain Flutter विजेट रेंडर करने वाले no-ops हैं। राउटिंग एक बार एक शुद्ध-Dart फाइल में परिभाषित की जाती है जिसमें Flutter imports नहीं होते हैं, जिसे main.dart और सर्वर द्वारा साझा किया जाता है। SeoRoute.dynamic एकल डेटाबेस पठन से मेटाडेटा और बॉडी को हल करता है, sitemap, llms.txt और prerender के लिए enumeratePaths के साथ। एक SeoRouteObserver मिरर और मेटा टैग्स को नेविगेशन के अनुसार चलता रहता है, और go_router, beamer, auto_route या अन्य Router-आधारित पैकेजों के साथ काम करता है। README नोट करता है कि लाइव DOM मिरर विजेट ट्री से व्युत्पन्न है और दूसरे लेखित सामग्री ट्री की आवश्यकता नहीं है, जबकि सर्वर-रेंडर्ड रूट बॉडी अलग होती हैं जब तक कि दोनों एक साझा शुद्ध डेटा मॉडल से व्युत्पन्न न हों; drift को पकड़ने के लिए auditSeoParity प्रदान किया गया है। README बताता है कि मिरर डिफ़ॉल्ट रूप से छिपा हुआ है (aria-hidden, शून्य आकार) और इसे स्पष्ट रूप से एक पहुंच सुविधा नहीं माना जाता है, क्योंकि Flutter अपनी स्वयं की semantics tree प्रकाशित करता है।