<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yayin</title>
    <description>The latest articles on DEV Community by Yayin (@yayin).</description>
    <link>https://dev.to/yayin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3946300%2F50a8d5a0-997a-42c8-b8fc-4a84ca704b6a.jpg</url>
      <title>DEV Community: Yayin</title>
      <link>https://dev.to/yayin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yayin"/>
    <language>en</language>
    <item>
      <title>TV Yayın Akışı Sitesi Geliştirirken Öğrendiğim Teknik Dersler</title>
      <dc:creator>Yayin</dc:creator>
      <pubDate>Fri, 22 May 2026 14:54:33 +0000</pubDate>
      <link>https://dev.to/yayin/tv-yayin-akisi-sitesi-gelistirirken-ogrendigim-teknik-dersler-1gea</link>
      <guid>https://dev.to/yayin/tv-yayin-akisi-sitesi-gelistirirken-ogrendigim-teknik-dersler-1gea</guid>
      <description>&lt;p&gt;Televizyon yayın akışı sitesi geliştirmeye başladığımda bunun basit bir içerik projesi olacağını düşünmüştüm. İlk bakışta mantık oldukça düz görünüyordu:&lt;/p&gt;

&lt;p&gt;Kanal listesi&lt;br&gt;
Yayın saatleri&lt;br&gt;
Program başlıkları&lt;br&gt;
Kullanıcıya hızlı erişim&lt;/p&gt;

&lt;p&gt;Fakat iş geliştirme tarafına geçince durum farklılaştı.&lt;/p&gt;

&lt;p&gt;Özellikle mobil trafik, performans, SEO ve sürekli güncellenen veriler bir araya gelince küçük görünen bir proje zamanla ciddi optimizasyon gerektiren bir sisteme dönüştü.&lt;/p&gt;

&lt;p&gt;Bu yazıda TV yayın akışı projesi geliştirirken karşılaştığım teknik sorunları ve uyguladığım çözümleri paylaşacağım.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sürekli Değişen Veri Yapısı Beklediğimden Zor Çıktı&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Yayın akışları statik içerik değil.&lt;/p&gt;

&lt;p&gt;Her gün:&lt;/p&gt;

&lt;p&gt;yeni programlar ekleniyor&lt;br&gt;
saatler değişiyor&lt;br&gt;
özel yayınlar geliyor&lt;br&gt;
içerikler güncelleniyor&lt;/p&gt;

&lt;p&gt;Başta verileri doğrudan HTML içine yazmayı denedim. Fakat kısa sürede yönetilemez hale geldi.&lt;/p&gt;

&lt;p&gt;İlk yaklaşım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"program"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;20:00&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;Ana Haber&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"program"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;22:00&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;Film Kuşağı&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yöntem küçük ölçek için çalışıyor ancak kanal sayısı arttığında bakım zorlaşıyor.&lt;/p&gt;

&lt;p&gt;Daha sürdürülebilir yapı JSON tabanlı veri modeli oldu:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[&lt;br&gt;
 {&lt;br&gt;
   "time":"20:00",&lt;br&gt;
   "title":"Ana Haber"&lt;br&gt;
 },&lt;br&gt;
 {&lt;br&gt;
   "time":"22:00",&lt;br&gt;
   "title":"Film Kuşağı"&lt;br&gt;
 }&lt;br&gt;
]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Frontend tarafında:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`
&amp;lt;div class="program"&amp;gt;

&amp;lt;span&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/span&amp;gt;

&amp;lt;span&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/span&amp;gt;

&amp;lt;/div&amp;gt;
`&lt;/span&gt;

&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arayüzü veriden ayırmak bakım sürecini ciddi şekilde kolaylaştırdı.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mobilde Yatay Kaydırma Beklediğimden Fazla Maliyet Oluşturdu&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;TV projelerinde genelde çok sayıda kanal logosu bulunuyor.&lt;/p&gt;

&lt;p&gt;İlk çözüm klasik yatay kaydırma alanıydı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.channels&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;overflow-x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nl"&gt;white-space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;nowrap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Başlangıçta çalışıyordu fakat kanal sayısı büyüdükçe mobil cihazlarda bazı sorunlar ortaya çıktı:&lt;/p&gt;

&lt;p&gt;fazla DOM yükü&lt;br&gt;
kaydırma takılmaları&lt;br&gt;
düşük FPS&lt;br&gt;
gereksiz render işlemleri&lt;/p&gt;

&lt;p&gt;Sonrasında görünmeyen öğeleri yüklememeye başladım.&lt;/p&gt;

&lt;p&gt;Örnek:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const visibleItems = channels.slice(start,end);&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Basit görünse de özellikle düşük donanımlı cihazlarda fark hissedildi.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lazy Loading Olmadan Sayfa Ağırlığı Hızla Artıyor&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Kanal sitelerinde logo sayısı çok yüksek olabiliyor.&lt;/p&gt;

&lt;p&gt;İlk sürüm:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;img src="kanal-logo.png"&amp;gt;&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Yüzlerce logo yüklenmeye başladığında ağ yükü hızla arttı.&lt;/p&gt;

&lt;p&gt;Daha sonra:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;img&lt;br&gt;
loading="lazy"&lt;br&gt;
src="kanal-logo.png"&lt;br&gt;
alt="kanal logosu"&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Tarayıcının yerleşik lazy loading desteği ciddi fayda sağladı.&lt;/p&gt;

&lt;p&gt;Ekstra JavaScript kullanmadan ilk yükleme süresi azaldı.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tekrarlanan HTML Yerine Bileşen Mantığı Daha Temiz Oldu&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;İlk sürümlerde her kanal kartı manuel yazılıyordu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"channel"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"kanald-logo.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Kanal D&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bir süre sonra yüzlerce tekrar oluştu.&lt;/p&gt;

&lt;p&gt;Daha sonra yapı fonksiyonlaştırıldı:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;channelCard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`
    &amp;lt;div class="channel"&amp;gt;
      &amp;lt;img src="kanald-logo.png"&amp;gt;
      &amp;lt;h3&amp;gt;Kanal D&amp;lt;/h3&amp;gt;
    &amp;lt;/div&amp;gt;
  `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yaklaşım:&lt;/p&gt;

&lt;p&gt;kod tekrarını azalttı&lt;br&gt;
bakım sürecini kolaylaştırdı&lt;br&gt;
ölçeklenebilirliği artırdı&lt;/p&gt;

&lt;p&gt;Ayrıca Dev.to editöründe bazı template literal örneklerinin sorun çıkarabildiğini fark ettim. Bu yüzden örnek kodlarda sade yapı kullanmak daha güvenli olabiliyor.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SEO Tarafında En Büyük Sorun Dinamik İçerik Oldu&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Yayın akışı siteleri her gün değişiyor.&lt;/p&gt;

&lt;p&gt;Burada temel soru şuydu:&lt;/p&gt;

&lt;p&gt;Arama motorları sürekli güncellenen içeriği ne kadar sağlıklı algılıyor?&lt;/p&gt;

&lt;p&gt;Bazı çözümler:&lt;/p&gt;

&lt;p&gt;anlamlı URL yapıları&lt;br&gt;
yapılandırılmış veriler&lt;br&gt;
sitemap güncellemeleri&lt;br&gt;
hızlı sayfa yüklenmesi&lt;br&gt;
gereksiz JavaScript azaltılması&lt;/p&gt;

&lt;p&gt;Örnek:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;script type="application/ld+json"&amp;gt;&lt;br&gt;
{&lt;br&gt;
"@context":"https://schema.org",&lt;br&gt;
"@type":"TVSeries",&lt;br&gt;
"name":"Örnek Program"&lt;br&gt;
}&lt;br&gt;
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Yapısal veriler küçük görünse de arama motorlarının içeriği anlamasında yardımcı olabiliyor.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fazla JavaScript Her Zaman Çözüm Değil&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bir noktada fark ettiğim önemli şeylerden biri:&lt;/p&gt;

&lt;p&gt;Sorunların çoğu daha fazla JavaScript eklenerek çözülmüyor.&lt;/p&gt;

&lt;p&gt;Bazen:&lt;/p&gt;

&lt;p&gt;daha az DOM&lt;br&gt;
daha az istek&lt;br&gt;
daha küçük CSS&lt;br&gt;
daha sade yapı&lt;/p&gt;

&lt;p&gt;çok daha iyi sonuç verebiliyor.&lt;/p&gt;

&lt;p&gt;Özellikle mobil ağırlıklı projelerde hafiflik önemli hale geliyor.&lt;/p&gt;

&lt;p&gt;Sonuç&lt;/p&gt;

&lt;p&gt;TV yayın akışı sitesi ilk bakışta basit görünüyor.&lt;/p&gt;

&lt;p&gt;Ancak kullanıcı sayısı ve veri miktarı arttığında:&lt;/p&gt;

&lt;p&gt;performans&lt;br&gt;
veri yönetimi&lt;br&gt;
SEO&lt;br&gt;
mobil optimizasyon&lt;br&gt;
ölçeklenebilirlik&lt;/p&gt;

&lt;p&gt;bir anda projenin merkezine yerleşiyor.&lt;/p&gt;

&lt;p&gt;Küçük görünen projeler bazen büyük sistemlerden daha fazla optimizasyon gerektirebiliyor.&lt;/p&gt;

&lt;p&gt;Kullanılan Kaynaklar:&lt;/p&gt;

&lt;p&gt;• Schema.org — BroadcastService: &lt;a href="https://schema.org/BroadcastService" rel="noopener noreferrer"&gt;https://schema.org/BroadcastService&lt;/a&gt;&lt;br&gt;
• Schema.org — TelevisionChannel: &lt;a href="https://schema.org/TelevisionChannel" rel="noopener noreferrer"&gt;https://schema.org/TelevisionChannel&lt;/a&gt;&lt;br&gt;
• Örnek Çalışma - &lt;a href="https://www.yayinakisi.net/" rel="noopener noreferrer"&gt;TV Yayın Akışı&lt;/a&gt;&lt;br&gt;
• Google Search Central — Video Structured Data: &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/video" rel="noopener noreferrer"&gt;https://developers.google.com/search/docs/appearance/structured-data/video&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tv</category>
    </item>
  </channel>
</rss>
