<?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: Hakan ERSU</title>
    <description>The latest articles on DEV Community by Hakan ERSU (@hakanersu).</description>
    <link>https://dev.to/hakanersu</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%2F117812%2Feafdec36-afae-4e14-9ab9-0b2be119ff2e.jpeg</url>
      <title>DEV Community: Hakan ERSU</title>
      <link>https://dev.to/hakanersu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hakanersu"/>
    <language>en</language>
    <item>
      <title>Chrome eklentileri ile SPA'leri desteklemek</title>
      <dc:creator>Hakan ERSU</dc:creator>
      <pubDate>Wed, 23 Feb 2022 20:49:49 +0000</pubDate>
      <link>https://dev.to/hakanersu/chrome-eklentileri-ile-spaleri-desteklemek-16jj</link>
      <guid>https://dev.to/hakanersu/chrome-eklentileri-ile-spaleri-desteklemek-16jj</guid>
      <description>&lt;p&gt;Chrome eklentileri ile sayfa içeriğini modifiye edebilir ve belirli sınırlar dahilinde sayfa içeriğine müdahale edebilirsiniz. Chrome eklentileri &lt;a href="https://developer.chrome.com/docs/extensions/mv3/content_scripts/"&gt;content-script&lt;/a&gt; adı verilen dosyalar ile DOM API üzerinden değişiklikler yapmanıza olanacak sağlar.&lt;/p&gt;

&lt;p&gt;Örneğin bir sayfa içerisindeki bütün linkleri bularak bunların renklerini content-scriptler ile değiştirebilirsiniz.&lt;/p&gt;

&lt;p&gt;Normal sayfalarda basitçe &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContentLoaded_event"&gt;DOMContentLoaded&lt;/a&gt; olayını (event) yakalayarak işlemimizi yapabiliriz. Aşağıdaki örnekte basitçe "load" olayını yakalarayarak sayfada işlemler gerçekleştirebilirsiniz.&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="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;load&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="c1"&gt;// Kodunuz&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Peki SPA'ler
&lt;/h3&gt;

&lt;p&gt;SPA'lerde sayfa ilk yüklendiğinde &lt;code&gt;content-script&lt;/code&gt;'imiz çalışacaktır. Yine link rengi değiştirme örneğinden gidecek olursak sayfa yüklendiğinde o sayfa içerisindeki bütün linklerin rengini değiştirecektir ancak başka sayfalara geçtiğinizde linklerinin renginin değişmediğini göreceksiniz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Peki çözüm nedir?
&lt;/h3&gt;

&lt;p&gt;Eminim bu problem için birden fazla çözüm vardır ancak ben size kendi kullandığım yöntemden bahsedeceğim. &lt;/p&gt;

&lt;p&gt;Çözüm için birkaç aşamaya ihtiyacımız var. İlk olarak arka plan komut dosyası kullanacağız. Arka plan komut dosyası, yeni bir sayfaya gitme, bir sayfayı kapatma vb. gibi bir tarayıcının tetiklediği olayları izlemek için arka planda çalışan bir programdır.&lt;/p&gt;

&lt;p&gt;Bunun için manifest.json dosyamıza, aşakğıdaki bölümü ve &lt;code&gt;background.js&lt;/code&gt;'i eklenti dosyalarımız arasına eklememiz gerekiyor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"background"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"background.js"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"persistent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu aşamada SPA sayfa değişimlerini yakalamamız için &lt;a href="https://developer.chrome.com/docs/extensions/reference/webNavigation/"&gt;webNavigation API&lt;/a&gt;'ı kullanmamız gerek. Bunun içinse izinlerimizin arasına &lt;code&gt;webNavigation&lt;/code&gt; eklememiz gerekiyor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"tabs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"webNavigation"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Artık &lt;code&gt;background.js&lt;/code&gt; içerisinde adres değişikliklerini takip edebiliriz&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;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;webNavigation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onHistoryStateUpdated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;details&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;tabId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;details&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tabId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tabs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tabId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;page_changed&lt;/span&gt;&lt;span class="dl"&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;Basitçe bu kod parçası Chrome'da geçmiş güncellendiğinde gerçekleşen olayı yakalayarak değişikliğin yapıldığı taba dilediğimiz mesajı yolluyor. &lt;/p&gt;

&lt;p&gt;Artık &lt;code&gt;content-script&lt;/code&gt;imizde bu mesajı dinleyerek dilediğimiz işlemi yapabiliriz.  Unutmayın &lt;code&gt;chrome.runtime.onMessage&lt;/code&gt; birçok mesaj alacaktır bu yüzden mesajınıza bir isim vermenizde bu ismi filtreleyerek işleminizi gerçekleştirmenizde yarar olacaktır.&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;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;_sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;_sendResponse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;page_changed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;convertLinks&lt;/span&gt;&lt;span class="p"&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;



</description>
      <category>chrome</category>
      <category>extension</category>
      <category>spa</category>
    </item>
  </channel>
</rss>
