یک خواننده RSS ثابت برای مبارزه با FOMO درونی خود بسازید - مجله Smashing
انتشار: مهر 16، 1403
بروزرسانی: 08 اردیبهشت 1404

یک خواننده RSS ثابت برای مبارزه با FOMO درونی خود بسازید - مجله Smashing


در صنعت پر سرعتی مانند فناوری، مقابله با ترس از دست دادن اخبار مهم دشوار است. اما، همانطور که بسیاری از ما می دانیم، روزانه حجم عظیمی از اطلاعات وارد می شود، و یافتن زمان و تعادل مناسب برای ادامه دادن می تواند دشوار باشد، اگر استرس زا نباشد. یک قطعه کلاسیک از تکنولوژی مانند فید RSS راهی لذت بخش برای پس گرفتن مالکیت زمان خودمان است. در این مقاله، ما یک خواننده استاتیک Really Simple Syndication (RSS) ایجاد خواهیم کرد که آخرین اخبار مدیریت شده را تنها یک بار برای شما به ارمغان می آورد (بله: یک بار) یک روز

بدیهی است که در این فرآیند با فناوری RSS کار خواهیم کرد، اما همچنین قصد داریم آن را با مواردی که شاید قبلاً امتحان نکرده اید ترکیب کنیم، از جمله Astro (چارچوب سایت استاتیک)، TypeScript (برای چیزهای جاوا اسکریپت)، بسته ای به نام rss-parser (برای اتصال چیزها به یکدیگر)، و همچنین توابع برنامه ریزی شده و ساخت قلاب ارائه شده توسط Netlify (اگرچه خدمات دیگری نیز وجود دارد که این کار را انجام می دهند).

من این فناوری ها را صرفاً به این دلیل انتخاب کردم که واقعاً از آنها لذت می برم! ممکن است راه حل های دیگری نیز وجود داشته باشد که کارایی بیشتری داشته باشند، ویژگی های بیشتری داشته باشند یا به سادگی برای شما راحت تر باشند - و در این موارد، من شما را تشویق می کنم که هر چیزی را که می خواهید عوض کنید. مهمترین چیز رسیدن به نتیجه نهایی است!

طرح

در اینجا نحوه انجام این کار آمده است. Astro وب سایت را تولید می کند. من عمداً تصمیم گرفتم از یک سایت ثابت استفاده کنم، زیرا می خواهم فیدهای RSS مختلف فقط یک بار در طول زمان ساخت واکشی شوند، و این چیزی است که ما می توانیم هر بار که سایت «بازسازی» می شود و با به روزرسانی ها دوباره مستقر می شود، کنترل کنیم. اینجاست که توابع برنامه ریزی شده Netlify وارد عمل می شوند، زیرا به ما اجازه می دهند بازسازی ها را به طور خودکار در زمان های خاص آغاز کنیم. نیازی به بررسی دستی به روز رسانی و استقرار آنها نیست! اگر راه حل سمت سرور را ترجیح می دهید، Cron jobs به همین راحتی می تواند این کار را انجام دهد.

در طول بازسازی آغاز شده، به بسته rss-parser اجازه می دهیم دقیقاً همان کاری را انجام دهد که می گوید: تجزیه لیستی از فیدهای RSS که در یک آرایه موجود است. این بسته همچنین به ما امکان می دهد فیلتری را برای نتایج واکشی شده تنظیم کنیم تا فقط موارد روز، هفته و غیره را دریافت کنیم. من شخصا فقط اخبار هفت روز گذشته را برای جلوگیری از اضافه بار محتوا ارائه می کنم. ما به آنجا می رسیم!

اما ابتدا…

RSS یک فناوری فید وب است که می توانید آن را به خواننده یا جمع آوری اخبار وارد کنید. از آنجایی که RSS استاندارد است، می دانید که در مورد قالب فید چه انتظاری دارید. این بدان معناست که ما در هنگام مدیریت داده هایی که فید ارائه می کند، فرصت های سرگرم کننده زیادی داریم. اکثر وب سایت های خبری فید RSS خود را دارند که می توانید در آن مشترک شوید (این است فید RSS مجله Smashing: https://www.smashingmagazine.com/feed/). یک فید RSS می تواند هر بار که سایتی محتوای جدید منتشر می کند به روزرسانی شود، به این معنی که می تواند منبع سریع آخرین اخبار باشد، اما ما می توانیم این فرکانس را نیز تنظیم کنیم.

فیدهای RSS در قالب زبان نشانه گذاری توسعه پذیر (XML) نوشته شده اند و دارای عناصر خاصی هستند که می توان در آن استفاده کرد. به جای تمرکز بیش از حد بر روی نکات فنی در اینجا، من به شما یک لینک به مشخصات RSS می دهم. نگران نباشید؛ آن صفحه باید به اندازه کافی قابل اسکن باشد تا بتوانید مرتبط ترین اطلاعات مورد نیاز خود را بیابید، مانند انواع عناصری که پشتیبانی می شوند و چه چیزی را نشان می دهند. برای این آموزش، ما فقط از عناصر زیر استفاده می کنیم: </code></strong>، <strong><code><link/></code></strong>، <strong><code><description/></code></strong>، <strong><code><item/></code></strong>، و <strong><code><pubdate/></code></strong>. ما همچنین به بسته تجزیه کننده RSS خود اجازه می دهیم تا برخی از کارها را برای ما انجام دهد.</p><div data-audience="non-subscriber" data-remove="true" class="feature-panel-container"><aside class="feature-panel"><div class="feature-panel-right-col"><div class="feature-panel-image"><picture><source type="image/avif" srcset="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/64e57b41-b7f1-4ae3-886a-806cce580ef9/form-design-patterns-shop-image-1-1.avif"><img loading="lazy" decoding="async" class="feature-panel-image-img" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/51e0f837-d85d-4b28-bfab-1c9a47f0ce33/form-design-patterns-shop-image.png" alt="پنل ویژگی" width="481" height="698"/></source></picture></div></div></aside></div><h2 id="creating-the-state-site" id='title2'>ایجاد سایت دولتی</h2><p>ما با ایجاد سایت Astro خود شروع می کنیم! در اجرای ترمینال شما <code>pnpm create astro@latest</code>. شما می توانید از هر مدیر بسته ای که می خواهید استفاده کنید - من فقط pnpm را برای خودم امتحان می کنم.</p><p>پس از اجرای دستور، کمک کننده مبتنی بر چت Astro، هیوستون، برخی از سوالات راه اندازی را برای شروع کار بررسی می کند.</p><pre><code class="language-bash"> astro Launch sequence initiated. dir Where should we create your new project? ./rss-buddy tmpl How would you like to start your new project? Include sample files ts Do you plan to write TypeScript? Yes use How strict should TypeScript be? Strict deps Install dependencies? Yes git Initialize a new git repository? Yes</code></pre><p>من دوست دارم از فایل های نمونه Astro استفاده کنم تا بتوانم سریع شروع به کار کنم، اما در این فرآیند کمی آنها را پاکسازی می کنیم. بیایید تمیز کنیم <code>src/pages/index.astro</code> با حذف همه چیز داخل فایل <code><main/></code> برچسب ها پس ما خوب هستیم که برویم!</p><p>از آنجا، ما می توانیم چیزها را با دویدن بچرخانیم <code>pnpm start</code>. ترمینال شما به شما می گوید که در کدام آدرس لوکال هاست می توانید سایت خود را پیدا کنید.</p><p>این <code>src/pages/index.astro</code> فایل جایی است که آرایه ای از فیدهای RSS را که می خواهیم دنبال کنیم ایجاد می کنیم. ما از نحو الگوی Astro استفاده خواهیم کرد، بنابراین بین دو حصار کد (-)، یک آرایه از <code>feedSources</code> و چند فید اضافه کنید. اگر به الهام نیاز دارید، می توانید این را کپی کنید:</p><pre><code class="language-javascript">const feedSources = ( \'https://www.smashingmagazine.com/feed/\', \'https://developer.mozilla.org/en-US/blog/rss.xml\', // etc.)</code></pre><p>اکنون بسته rss-parser را با اجرا در پروژه خود نصب می کنیم <code>pnpm install rss-parser</code>. این بسته یک کتابخانه کوچک است که XML را که از واکشی فید RSS بدست می آوریم به اشیاء جاوا اسکریپت تبدیل می کند. این کار خواندن فیدهای RSS و دستکاری داده ها را به هر طریقی که می خواهیم برای ما آسان می کند.</p><p>پس از نصب بسته، آن را باز کنید <code>src/pages/index.astro</code> فایل، و در بالا، rss-parser را وارد کرده و نمونه سازی می کنیم <code>Partner</code> کلاس</p><pre><code class="language-javascript">import Parser from \'rss-parser\';const parser = new Parser();</code></pre><p>ما از این تجزیه کننده برای خواندن فیدهای RSS خود استفاده می کنیم و (تعجب!) <em>تجزیه</em> آنها را به جاوا اسکریپت. ما در اینجا با لیستی از وعده ها سر و کار خواهیم داشت. به طور معمول، من احتمالا استفاده می کنم <code>Promise.all()</code>، اما موضوع این است که این یک تجربه پیچیده است. اگر یکی از فیدها به دلایلی کار نمی کند، ترجیح می دهم به سادگی آن را نادیده بگیرم.</p><p>چرا؟ خوب، چون <code>Promise.all()</code> همه چیز را رد می کند حتی اگر فقط یکی از وعده هایش رد شود. این ممکن است به این معنی باشد که اگر یک فید آنطور که من انتظار دارم رفتار نکند، وقتی صبح نوشابه داغم را می گیرم و اخبار را می خوانم، کل صفحه من خالی می شود. نمی خواهم روزم را با اشتباه شروع کنم.</p><p>در عوض، استفاده از آن را انتخاب می کنم <code>Promise.allSettled()</code>. این روش در واقع به همه وعده ها اجازه می دهد حتی اگر یکی از آنها شکست بخورد. در مورد ما، این بدان معنی است که هر گونه فید که خطاها صرفاً نادیده گرفته می شوند، که عالی است.</p><p>بیایید این را به <code>src/pages/index.astro</code> فایل:</p><div class="break-out"><pre><code class="language-typescript">interface FeedItem { feed?: string; title?: string; link?: string; date?: Date;}const feedItems: FeedItem() = ();await Promise.allSettled( feedSources.map(async (source) => { try { const feed = await parser.parseURL(source); feed.items.forEach((item) => { const date = item.pubDate ? new Date(item.pubDate) : undefined; feedItems.push({ feed: feed.title, title: item.title, link: item.link, date,}); }); } catch (error) { console.error(`Error fetching feed from ${source}:`, error); } }));</code></pre></div><p>این یک آرایه (یا بیشتر) به نام ایجاد می کند <code>feedItems</code>. برای هر URL در <code>feedSources</code> آرایه ای که قبلا ایجاد کردیم، تجزیه کننده rss آیتم ها را بازیابی می کند و، بله، آنها را در جاوا اسکریپت تجزیه می کند. سپس، ما هر داده ای را که می خواهیم برمی گردانیم! فعلاً آن را ساده نگه می داریم و فقط موارد زیر را برمی گردانیم:</p><ul><li>عنوان خوراک،</li><li>عنوان آیتم خوراک،</li><li>لینک مورد،</li><li>و تاریخ انتشار آیتم</li></ul><p>گام بعدی این است که اطمینان حاصل کنیم که همه موارد بر اساس تاریخ مرتب شده اند، بنابراین ما واقعاً "آخرین" اخبار را دریافت خواهیم کرد. این کد کوچک را به کار خود اضافه کنید:</p><div class="break-out"><pre><code class="language-typescript">const sortedFeedItems = feedItems.sort((a, b) => (b.date ?? new Date()).getTime() - (a.date ?? new Date()).getTime());</code></pre></div><p>اوه، و… یادتان هست وقتی گفتم نمی خواهم این RSS خوان چیزی قدیمی تر از هفت روز را رندر کند؟ بیایید در حال حاضر با آن مقابله کنیم زیرا ما قبلاً در این کد هستیم.</p><p>یک متغیر جدید به نام می سازیم <code>sevenDaysAgo</code> و برای آن تاریخ تعیین کنید. سپس آن تاریخ را بر روی هفت روز پیش تنظیم می کنیم و قبل از اینکه یک آیتم جدید به خود اضافه کنیم از آن منطق استفاده می کنیم <code>feedItems</code> آرایه</p><p>این چیزی است که <code>src/pages/index.astro</code> اکنون فایل باید به این صورت باشد:</p><div class="break-out"><pre><code class="language-typescript">---import Layout from \'../layouts/Layout.astro\';import Parser from \'rss-parser\';const parser = new Parser();const sevenDaysAgo = new Date();sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);const feedSources = ( \'https://www.smashingmagazine.com/feed/\', \'https://developer.mozilla.org/en-US/blog/rss.xml\',)interface FeedItem { feed?: string; title?: string; link?: string; date?: Date;}const feedItems: FeedItem() = ();await Promise.allSettled( feedSources.map(async (source) => { try { const feed = await parser.parseURL(source); feed.items.forEach((item) => { const date = item.pubDate ? new Date(item.pubDate) : undefined; if (date && date >= sevenDaysAgo) {feedItems.push({ feed: feed.title, title: item.title, link: item.link, date,}); } }); } catch (error) { console.error(`Error fetching feed from ${source}:`, error); } }));const sortedFeedItems = feedItems.sort((a, b) => (b.date ?? new Date()).getTime() - (a.date ?? new Date()).getTime());---<layout title="Welcome to Astro."> <main> </main></layout></code></pre></div><h2 id="rendering-xml-data" id='title3'>ارائه داده های XML</h2><p>وقت آن است که مقالات خبری خود را در سایت Astro نشان دهیم! برای ساده نگه داشتن این موضوع، موارد را در یک لیست نامرتب به جای طرح بندی فانتزی دیگر قالب بندی می کنیم.</p><p>تنها کاری که باید انجام دهیم این است که به روز رسانی کنیم <code><layout/></code> عنصر موجود در فایل با اشیاء XML برای عنوان، URL و تاریخ انتشار یک آیتم فید پاشیده شده است.</p><pre><code class="language-html"><layout title="Welcome to Astro."> <main> {sortedFeedItems.map(item => ( ))} </main></layout></code></pre><p>برو جلو و بدو <code>pnpm start</code> از ترمینال صفحه باید فهرست نامرتب اقلام فید را نمایش دهد. البته، همه چیز در حال حاضر سبک است، اما خوشبختانه برای شما، می توانید با CSS آن را دقیقاً همانطور که می خواهید جلوه دهید!</p><p>و به یاد داشته باشید که حتی وجود دارد <strong>فیلدهای بیشتری در XML برای هر مورد موجود است</strong> اگر می خواهید اطلاعات بیشتری را نمایش دهید. اگر قطعه زیر را در کنسول DevTools خود اجرا کنید، تمام فیلدهایی را که در اختیار دارید مشاهده خواهید کرد:</p><pre><code class="language-javascript">feed.items.forEach(item => {}</code></pre><h2 id="scheduling-daily-static-site-builds" id='title4'>برنامه ریزی ساخت سایت استاتیک روزانه</h2><p>ما تقریباً تمام شده ایم! فیدها در حال واکشی هستند، و داده ها را در جاوا اسکریپت برای استفاده در قالب صفحه Astro به ما برمی گردانند. از آنجایی که فیدها هر زمان که محتوای جدید منتشر می شود به روز می شوند، ما به راهی برای واکشی آخرین موارد از آن نیاز داریم.</p><p>ما می خواهیم از انجام هر یک از این کارها به صورت دستی اجتناب کنیم. بنابراین، اجازه دهید این سایت را در Netlify تنظیم کنیم تا به عملکردهای برنامه ریزی شده آنها که باعث بازسازی می شود و قلاب های ساخت آنها که ساختمان را انجام می دهند دسترسی پیدا کنیم. باز هم، سرویس های دیگر این کار را انجام می دهند، و شما می توانید این کار را با ارائه دهنده ای دیگر انجام دهید - از آنجایی که من در آنجا کار می کنم فقط به Netlify علاقه مند هستم. در هر صورت می توانید مستندات نتلیفای را برای راه اندازی سایت جدید دنبال کنید.</p><p>هنگامی که سایت شما میزبانی و زنده شد، آماده برنامه ریزی برای بازسازی خود هستید. یک build hook یک URL به شما می دهد تا از آن برای راه اندازی ساخت جدید استفاده کنید، چیزی شبیه به این:</p><pre><code class="language-html">https://api.netlify.com/build_hooks/your-build-hook-id</code></pre><p>بیایید هر روز در نیمه شب بیلدها را راه اندازی کنیم. ما از توابع برنامه ریزی شده Netlify استفاده خواهیم کرد. به همین دلیل است که در وهله اول از Netlify برای میزبانی این برنامه استفاده می کنم. آماده بودن آنها از طریق میزبان کارها را بسیار ساده می کند زیرا هیچ کار سرور یا پیکربندی پیچیده ای برای انجام این کار وجود ندارد. تنظیمش کن و فراموشش کن!</p><p>نصب می کنیم <code>@netlify/functions</code> (دستورالعمل) به پروژه و سپس فایل زیر را در پوشه اصلی پروژه ایجاد کنید: <code>netlify/functions/deploy.ts</code>.</p><p>این چیزی است که می خواهیم به آن فایل اضافه کنیم:</p><div class="break-out"><pre><code class="language-typescript">// netlify/functions/deploy.tsimport type { Config } from \'@netlify/functions\';const BUILD_HOOK = \'https://api.netlify.com/build_hooks/your-build-hook-id\'; // replace me!export default async (req: Request) => { await fetch(BUILD_HOOK, { method: \'POST\', })};export const config: Config = { schedule: \'0 0 * * *\',};</code></pre></div><p>اگر کد خود را commit کنید و آن را فشار دهید، سایت شما باید به طور خودکار دوباره مستقر شود. از آن نقطه به بعد، برنامه ای را دنبال می کند که هر روز در نیمه شب سایت را بازسازی می کند، تا شما آماده باشید تا دم نوش صبحگاهی تان را مصرف کنید و همه چیز را دنبال کنید. <em>شما</em> فکر کن مهم است</p><div class="signature"><img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="سرمقاله Smashing" width="35" height="46" loading="lazy" decoding="async"/><span>(gg, yk)</span></div></div><br>منبع: https://smashingmagazine.com/2024/10/build-static-rss-reader-fight-fomo/ </div> </article> <div class="bg-white rounded mt-3 p-3"> <h5>نویسنده: <a href="https://abtintheme.ir/author/%D8%AA%DB%8C%D9%85-%D8%AA%D8%AD%D8%B1%DB%8C%D8%B1%DB%8C%D9%87-%D8%B1%D9%88%D8%AD%D8%A7%D9%86%DB%8C-%D9%86%DA%98%D8%A7%D8%AF" target="_blank">تیم تحریریه روحانی نژاد</a></h5> <p class="mb-0"> </p> </div> </main> </div> </div> </div> <footer class="bg-light shadow"> <div class="container py-3 text-center"> تمام حقوق محفوظ است © <a href="https://abtintheme.ir" class="text-decoration-none">مجله اینترنتی آبتین تم</a> , <a href="https://abtintheme.ir/sitemap.xml">Sitemap</a> </div> </footer> </body> </html>