{"id":33064,"date":"2025-10-29T04:40:54","date_gmt":"2025-10-29T01:40:54","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33064"},"modified":"2025-10-29T04:40:54","modified_gmt":"2025-10-29T01:40:54","slug":"react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/","title":{"rendered":"React Uygulamalar\u0131nda Vanilla JavaScript Paketlerini Kullanma Sanat\u0131: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>React Uygulamalar\u0131nda Vanilla JavaScript Paketlerini Kullanma Sanat\u0131: Kapsaml\u0131 Bir Rehber<\/h2>\n<h3>Giri\u015f: Neden Vanilla JS Paketlerini React&#8217;e Entegre Edelim?<\/h3>\n<p>Modern web geli\u015ftirme d\u00fcnyas\u0131nda React gibi k\u00fct\u00fcphaneler, kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in deklaratif ve bile\u015fen tabanl\u0131 bir yakla\u015f\u0131m sunar. Ancak, bazen projelerimizde vanilla JavaScript ile yaz\u0131lm\u0131\u015f, g\u00fc\u00e7l\u00fc ve olgun k\u00fct\u00fcphaneleri kullanma ihtiyac\u0131 do\u011fabilir. Bu durumun birka\u00e7 temel nedeni vard\u0131r:<\/p>\n<p>*   <strong>Mevcut K\u00fct\u00fcphanelerden Yararlanma:<\/strong> Y\u0131llard\u0131r geli\u015ftirilmi\u015f, test edilmi\u015f ve geni\u015f bir topluluk taraf\u0131ndan kullan\u0131lan bir\u00e7ok harika vanilla JavaScript k\u00fct\u00fcphanesi bulunmaktad\u0131r (\u00f6rne\u011fin, Chart.js, Leaflet, D3.js, Cropper.js). Bu k\u00fct\u00fcphanelerin React&#8217;e \u00f6zel bir sarmalay\u0131c\u0131s\u0131 (wrapper) olmayabilir veya mevcut sarmalay\u0131c\u0131lar projenizin ihtiya\u00e7lar\u0131n\u0131 tam olarak kar\u015f\u0131lamayabilir. Bu durumda, do\u011frudan vanilla JS k\u00fct\u00fcphanesini entegre etmek en mant\u0131kl\u0131 \u00e7\u00f6z\u00fcm olabilir.<br \/>\n*   <strong>Performans ve Optimizasyon:<\/strong> Baz\u0131 durumlarda, vanilla JS k\u00fct\u00fcphaneleri, React sarmalay\u0131c\u0131lar\u0131na g\u00f6re daha d\u00fc\u015f\u00fck seviyeli DOM manip\u00fclasyonu yaparak daha y\u00fcksek performans sunabilir. \u00d6zellikle yo\u011fun grafikler, haritalar veya animasyonlar i\u00e7eren uygulamalarda bu fark hissedilebilir. Kendi sarmalay\u0131c\u0131n\u0131z\u0131 yazarak, k\u00fct\u00fcphanenin performans \u00f6zelliklerini daha iyi kontrol edebilirsiniz.<br \/>\n*   <strong>React Alternatifi Olmayan \u00d6zel K\u00fct\u00fcphaneler:<\/strong> Belirli bir ni\u015f alana odaklanm\u0131\u015f veya \u015firket i\u00e7i geli\u015ftirilmi\u015f vanilla JS k\u00fct\u00fcphaneleri bulunabilir. Bu t\u00fcr k\u00fct\u00fcphanelerin React entegrasyonu i\u00e7in \u00f6zel bir \u00e7\u00f6z\u00fcme ihtiyac\u0131 vard\u0131r.<br \/>\n*   <strong>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Kontrol Alt\u0131nda Tutma:<\/strong> Bazen, bir k\u00fct\u00fcphanenin React sarmalay\u0131c\u0131s\u0131, vanilla JS k\u00fct\u00fcphanesinin kendisinden daha fazla ba\u011f\u0131ml\u0131l\u0131k i\u00e7erebilir. Kendi entegrasyonunuzu yaparak, projenizin ba\u011f\u0131ml\u0131l\u0131k a\u011fac\u0131n\u0131 daha yal\u0131n tutabilirsiniz.<\/p>\n<p>Bu rehber, React&#8217;in deklaratif yap\u0131s\u0131yla vanilla JavaScript&#8217;in imperatif DOM manip\u00fclasyonu aras\u0131ndaki bo\u015flu\u011fu nas\u0131l dolduraca\u011f\u0131n\u0131z\u0131, <code>useEffect<\/code> ve <code>useRef<\/code> gibi temel React Hook&#8217;lar\u0131n\u0131 kullanarak bu entegrasyonu nas\u0131l ba\u015far\u0131l\u0131 bir \u015fekilde ger\u00e7ekle\u015ftirece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r.<\/p>\n<h3>Temel Zorluk: React&#8217;in Deklaratif Do\u011fas\u0131 ve Imperatif DOM Manip\u00fclasyonu<\/h3>\n<p>React, kullan\u0131c\u0131 aray\u00fczlerini &#8220;state&#8221; (durum) temelinde tan\u0131mlaman\u0131z\u0131 ister. Bile\u015feninizin durumu de\u011fi\u015fti\u011finde, React sanal DOM&#8217;u g\u00fcnceller ve yaln\u0131zca gerekli DOM de\u011fi\u015fikliklerini ger\u00e7ek DOM&#8217;a uygular. Bu deklaratif yakla\u015f\u0131m, aray\u00fcz\u00fcn nas\u0131l g\u00f6r\u00fcnece\u011fini tan\u0131mlaman\u0131z\u0131 sa\u011flar, React ise &#8220;nas\u0131l&#8221; yap\u0131laca\u011f\u0131n\u0131 halleder.<\/p>\n<p>\u00d6te yandan, bir\u00e7ok vanilla JavaScript k\u00fct\u00fcphanesi, do\u011frudan DOM&#8217;u manip\u00fcle ederek veya belirli bir DOM elementine ba\u011flanarak \u00e7al\u0131\u015f\u0131r. Bu, &#8220;imperatif&#8221; bir yakla\u015f\u0131md\u0131r; yani, k\u00fct\u00fcphaneye ne yapmas\u0131 gerekti\u011fini (\u00f6rne\u011fin, &#8220;bu <code>div<\/code> elementine bir grafik \u00e7iz&#8221;) a\u00e7\u0131k\u00e7a s\u00f6ylersiniz.<\/p>\n<p>Bu iki farkl\u0131 d\u00fcnya aras\u0131nda bir k\u00f6pr\u00fc kurmak, entegrasyonun ana zorlu\u011fudur. React&#8217;in kontrol\u00fcndeki bir DOM elementini, vanilla JS k\u00fct\u00fcphanesinin imperatif olarak manip\u00fcle edebilece\u011fi bir &#8220;alan&#8221; olarak sa\u011flamam\u0131z gerekir. Bu bo\u015flu\u011fu doldurmak i\u00e7in React&#8217;in ya\u015fam d\u00f6ng\u00fcs\u00fc hook&#8217;lar\u0131na ve DOM referanslar\u0131na ihtiyac\u0131m\u0131z olacak.<\/p>\n<h3>Entegrasyon \u0130\u00e7in Temel React Hook&#8217;lar\u0131<\/h3>\n<p>Vanilla JS k\u00fct\u00fcphanelerini React bile\u015fenlerine entegre ederken en \u00e7ok ba\u015fvuraca\u011f\u0131m\u0131z iki temel React Hook&#8217;u <code>useRef<\/code> ve <code>useEffect<\/code>&#8216;tir. <code>useState<\/code> ise React state&#8217;ini vanilla JS k\u00fct\u00fcphanesinin verileriyle senkronize etmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>*   <strong><code>useRef<\/code><\/strong>: Bu hook, DOM elementlerine veya React bile\u015fenleri aras\u0131nda kal\u0131c\u0131 olmas\u0131n\u0131 istedi\u011finiz herhangi bir de\u011fere do\u011frudan referans alman\u0131z\u0131 sa\u011flar. Vanilla JS k\u00fct\u00fcphanelerinin belirli bir DOM elementine ba\u011flanmas\u0131 gerekti\u011finde, <code>useRef<\/code> ile bu elemente bir referans olu\u015ftururuz ve bu referans\u0131 k\u00fct\u00fcphaneye iletiriz. Bu referans, bile\u015fen yeniden render edildi\u011finde bile ayn\u0131 kal\u0131r.<br \/>\n*   <strong><code>useEffect<\/code><\/strong>: React&#8217;in ya\u015fam d\u00f6ng\u00fcs\u00fc olaylar\u0131n\u0131 (bile\u015fenin mount edilmesi, g\u00fcncellenmesi, unmount edilmesi) y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. Vanilla JS k\u00fct\u00fcphanesini ba\u015flatma, g\u00fcncelleme ve temizleme i\u015flemleri <code>useEffect<\/code> i\u00e7inde ger\u00e7ekle\u015ftirilir. Ba\u011f\u0131ml\u0131l\u0131k dizisi sayesinde, hangi prop&#8217;lar veya state&#8217;ler de\u011fi\u015fti\u011finde bu yan etkinin yeniden \u00e7al\u0131\u015faca\u011f\u0131n\u0131 kontrol edebiliriz.<br \/>\n*   <strong><code>useState<\/code><\/strong>: React bile\u015feninin i\u00e7 durumunu y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. Vanilla JS k\u00fct\u00fcphanesinden gelen verileri React state&#8217;ine aktarman\u0131z veya React state&#8217;indeki verileri vanilla JS k\u00fct\u00fcphanesine aktarman\u0131z gerekti\u011finde bu hook&#8217;u kullan\u0131rs\u0131n\u0131z.<\/p>\n<h3>Ad\u0131m Ad\u0131m Entegrasyon Rehberi<\/h3>\n<h4>Ad\u0131m 1: Vanilla JS Paketini Kurma ve \u0130\u00e7eri Aktarma<\/h4>\n<p>\u0130lk ad\u0131m, entegre etmek istedi\u011finiz vanilla JavaScript k\u00fct\u00fcphanesini projenize dahil etmektir. \u00c7o\u011fu modern k\u00fct\u00fcphane npm veya yarn \u00fczerinden kurulabilir.<\/p>\n<pre><code class=\"language-bash\">npm install your-vanilla-js-package\n<h2>veya<\/h2>\nyarn add your-vanilla-js-package<\/code><\/pre>\n<p>Ard\u0131ndan, React bile\u015feninizde bu k\u00fct\u00fcphaneyi i\u00e7eri aktarman\u0131z gerekir:<\/p>\n<pre><code class=\"language-javascript\">import YourVanillaJSPackage from 'your-vanilla-js-package';\n\/\/ Baz\u0131 k\u00fct\u00fcphaneler varsay\u0131lan d\u0131\u015fa aktar\u0131m yapmaz,\n\/\/ bu durumda s\u00fcsl\u00fc parantezlerle i\u00e7eri aktarman\u0131z gerekebilir:\n\/\/ import { SpecificModule } from 'your-vanilla-js-package';<\/code><\/pre>\n<h4>Ad\u0131m 2: DOM Referans\u0131 Olu\u015fturma ve Paketi Ba\u015flatma<\/h4>\n<p>Vanilla JS k\u00fct\u00fcphanelerinin \u00e7o\u011fu, belirli bir DOM elementine (genellikle bir <code>div<\/code>, <code>canvas<\/code> veya <code>svg<\/code>) ihtiya\u00e7 duyar. Bu elemente bir referans almak i\u00e7in <code>useRef<\/code> kullan\u0131r\u0131z. K\u00fct\u00fcphaneyi ba\u015flatma i\u015flemi ise <code>useEffect<\/code> i\u00e7inde ger\u00e7ekle\u015ftirilir.<\/p>\n<pre><code class=\"language-javascript\">import React, { useRef, useEffect } from 'react';\nimport YourVanillaJSPackage from 'your-vanilla-js-package';\n\nfunction MyVanillaJSWrapper() {\n  const containerRef = useRef(null); \/\/ DOM elementine referans almak i\u00e7in\n\n  useEffect(() => {\n    \/\/ Bile\u015fen mount edildi\u011finde \u00e7al\u0131\u015facak\n    if (containerRef.current) {\n      \/\/ Vanilla JS k\u00fct\u00fcphanesini ba\u015flatma\n      const instance = new YourVanillaJSPackage(containerRef.current, {\n        \/\/ K\u00fct\u00fcphanenin se\u00e7enekleri buraya gelir\n        \/\/ \u00d6rne\u011fin: width: 300, height: 200\n      });\n\n      \/\/ K\u00fct\u00fcphane \u00f6rne\u011fini daha sonra kullanmak \u00fczere saklamak isteyebilirsiniz\n      \/\/ \u00d6rne\u011fin: instanceRef.current = instance;\n\n      \/\/ Temizlik fonksiyonu d\u00f6nd\u00fcrme (bir sonraki ad\u0131mda detayl\u0131)\n      return () => {\n        \/\/ Bile\u015fen unmount edildi\u011finde veya ba\u011f\u0131ml\u0131l\u0131klar de\u011fi\u015fti\u011finde \u00e7al\u0131\u015facak\n        \/\/ K\u00fct\u00fcphane \u00f6rne\u011fini yok etme veya temizleme\n        \/\/ \u00d6rne\u011fin: instance.destroy();\n      };\n    }\n  }, []); \/\/ Bo\u015f ba\u011f\u0131ml\u0131l\u0131k dizisi, sadece mount ve unmount'ta \u00e7al\u0131\u015f\u0131r\n\n  return <div ref={containerRef} style={{ width: '100%', height: '300px' }} \/>;\n}\n\nexport default MyVanillaJSWrapper;<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>containerRef<\/code> ad\u0131nda bir referans olu\u015fturduk ve bunu <code>div<\/code> elementine atad\u0131k. <code>useEffect<\/code> hook&#8217;u, bile\u015fen ilk kez DOM&#8217;a yerle\u015ftirildi\u011finde (mount edildi\u011finde) \u00e7al\u0131\u015f\u0131r. <code>containerRef.current<\/code> ile ger\u00e7ek DOM elementine eri\u015firiz ve <code>YourVanillaJSPackage<\/code>&#8216;\u0131 bu element \u00fczerinde ba\u015flat\u0131r\u0131z.<\/p>\n<h4>Ad\u0131m 3: Temizlik \u0130\u015flemleri (Cleanup)<\/h4>\n<p>Bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 ve istenmeyen davran\u0131\u015flar\u0131 \u00f6nlemek i\u00e7in, React bile\u015feni DOM&#8217;dan kald\u0131r\u0131ld\u0131\u011f\u0131nda (unmount edildi\u011finde) veya <code>useEffect<\/code>&#8216;in ba\u011f\u0131ml\u0131l\u0131klar\u0131 de\u011fi\u015fti\u011finde vanilla JS k\u00fct\u00fcphanesinin olu\u015fturdu\u011fu kaynaklar\u0131 temizlemek \u00e7ok \u00f6nemlidir. <code>useEffect<\/code>&#8216;ten bir fonksiyon d\u00f6nd\u00fcrerek bu temizlik i\u015flemini ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<p>\u00c7o\u011fu vanilla JS k\u00fct\u00fcphanesi, olu\u015fturdu\u011fu \u00f6rne\u011fi yok etmek i\u00e7in bir <code>destroy()<\/code> veya benzeri bir metoda sahiptir.<\/p>\n<pre><code class=\"language-javascript\">import React, { useRef, useEffect } from 'react';\nimport YourVanillaJSPackage from 'your-vanilla-js-package';\n\nfunction MyVanillaJSWrapper() {\n  const containerRef = useRef(null);\n  const instanceRef = useRef(null); \/\/ K\u00fct\u00fcphane \u00f6rne\u011fini saklamak i\u00e7in\n\n  useEffect(() => {\n    if (containerRef.current) {\n      \/\/ K\u00fct\u00fcphaneyi ba\u015flat\n      const instance = new YourVanillaJSPackage(containerRef.current, {\n        \/\/ Se\u00e7enekler\n      });\n      instanceRef.current = instance; \/\/ \u00d6rne\u011fi sakla\n\n      \/\/ Temizlik fonksiyonu\n      return () => {\n        if (instanceRef.current) {\n          \/\/ K\u00fct\u00fcphane \u00f6rne\u011fini yok et\n          \/\/ \u00d6nemli: K\u00fct\u00fcphanenizin cleanup metodunu kullan\u0131n!\n          if (typeof instanceRef.current.destroy === 'function') {\n            instanceRef.current.destroy();\n          }\n          instanceRef.current = null; \/\/ Referans\u0131 temizle\n        }\n      };\n    }\n  }, []); \/\/ Bo\u015f ba\u011f\u0131ml\u0131l\u0131k dizisi\n\n  return <div ref={containerRef} \/>;\n}<\/code><\/pre>\n<h4>Ad\u0131m 4: React Props&#8217;lar\u0131n\u0131 Vanilla JS Paketine Aktarma ve G\u00fcncelleme<\/h4>\n<p>React bile\u015feninizin dinamik olmas\u0131 i\u00e7in, props&#8217;lar arac\u0131l\u0131\u011f\u0131yla vanilla JS k\u00fct\u00fcphanesine veri veya se\u00e7enekler aktarman\u0131z gerekir. Bu veriler de\u011fi\u015fti\u011finde, vanilla JS k\u00fct\u00fcphanesini de g\u00fcncellemeniz gerekecektir. Bunu, <code>useEffect<\/code>&#8216;in ba\u011f\u0131ml\u0131l\u0131k dizisine ilgili props&#8217;lar\u0131 ekleyerek ve k\u00fct\u00fcphanenin g\u00fcncelleme metotlar\u0131n\u0131 \u00e7a\u011f\u0131rarak yapar\u0131z.<\/p>\n<pre><code class=\"language-javascript\">import React, { useRef, useEffect } from 'react';\nimport YourVanillaJSPackage from 'your-vanilla-js-package';\n\nfunction MyVanillaJSWrapper({ data, options }) { \/\/ data ve options props olarak al\u0131n\u0131yor\n  const containerRef = useRef(null);\n  const instanceRef = useRef(null);\n\n  useEffect(() => {\n    if (containerRef.current) {\n      \/\/ \u0130lk ba\u015flatma\n      if (!instanceRef.current) { \/\/ Hen\u00fcz ba\u015flat\u0131lmam\u0131\u015fsa\n        instanceRef.current = new YourVanillaJSPackage(containerRef.current, { ...options, data });\n      } else {\n        \/\/ Zaten ba\u015flat\u0131lm\u0131\u015fsa, g\u00fcncelle\n        \/\/ K\u00fct\u00fcphanenizin g\u00fcncelleme metotlar\u0131n\u0131 kullan\u0131n\n        \/\/ \u00d6rne\u011fin: instanceRef.current.updateData(data);\n        \/\/ \u00d6rne\u011fin: instanceRef.current.setOptions(options);\n        \/\/ Bir\u00e7ok k\u00fct\u00fcphane, sadece update() \u00e7a\u011fr\u0131s\u0131yla yeni verileri veya se\u00e7enekleri kabul edebilir.\n        if (typeof instanceRef.current.update === 'function') {\n            instanceRef.current.update({ ...options, data }); \/\/ Varsay\u0131msal bir update metodu\n        }\n      }\n    }\n  }, [data, options]); \/\/ data veya options de\u011fi\u015fti\u011finde bu useEffect tekrar \u00e7al\u0131\u015f\u0131r\n\n  useEffect(() => {\n    \/\/ Sadece mount ve unmount i\u00e7in temizlik\n    return () => {\n      if (instanceRef.current) {\n        if (typeof instanceRef.current.destroy === 'function') {\n          instanceRef.current.destroy();\n        }\n        instanceRef.current = null;\n      }\n    };\n  }, []); \/\/ Bo\u015f ba\u011f\u0131ml\u0131l\u0131k dizisi\n\n  return <div ref={containerRef} \/>;\n}<\/code><\/pre>\n<p><strong>\u00d6nemli Not:<\/strong> E\u011fer <code>data<\/code> veya <code>options<\/code> gibi props&#8217;lar karma\u015f\u0131k objelerse, React her render&#8217;da yeni bir obje referans\u0131 olu\u015fturabilir (obje i\u00e7eri\u011fi de\u011fi\u015fmese bile). Bu durum, <code>useEffect<\/code>&#8216;in gereksiz yere tekrar \u00e7al\u0131\u015fmas\u0131na neden olabilir. Bu t\u00fcr durumlar i\u00e7in <code>useMemo<\/code> kullanarak objeleri memoize edebilir veya bir derin kar\u015f\u0131la\u015ft\u0131rma (deep comparison) fonksiyonu kullanarak sadece obje i\u00e7eri\u011fi de\u011fi\u015fti\u011finde <code>useEffect<\/code>&#8216;in \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayabilirsiniz. Ancak, \u00e7o\u011fu durumda, k\u00fct\u00fcphanenin <code>update<\/code> metodunun sadece ger\u00e7ekten de\u011fi\u015fen veriyi i\u015flemesi beklenir.<\/p>\n<h4>Ad\u0131m 5: Vanilla JS Olaylar\u0131n\u0131 React&#8217;e Aktarma<\/h4>\n<p>Vanilla JS k\u00fct\u00fcphaneleri genellikle kendi olay sistemlerine sahiptir (\u00f6rne\u011fin, bir grafi\u011fe t\u0131kland\u0131\u011f\u0131nda, bir harita \u00fczerinde bir i\u015faretleyiciye bas\u0131ld\u0131\u011f\u0131nda). Bu olaylar\u0131 React bile\u015feninize aktarmak ve React&#8217;in olay i\u015fleme mekanizmas\u0131yla entegre etmek isteyebilirsiniz.<\/p>\n<p>Bu, <code>useEffect<\/code> i\u00e7inde k\u00fct\u00fcphanenin olay dinleme metotlar\u0131n\u0131 kullanarak ve bu olaylar\u0131 React props olarak gelen callback fonksiyonlar\u0131na y\u00f6nlendirerek yap\u0131l\u0131r.<\/p>\n<pre><code class=\"language-javascript\">import React, { useRef, useEffect } from 'react';\nimport YourVanillaJSPackage from 'your-vanilla-js-package';\n\nfunction MyVanillaJSWrapper({ onEventOccurred, ...props }) { \/\/ onEventOccurred bir callback prop'u\n  const containerRef = useRef(null);\n  const instanceRef = useRef(null);\n\n  useEffect(() => {\n    if (containerRef.current && !instanceRef.current) {\n      instanceRef.current = new YourVanillaJSPackage(containerRef.current, props);\n\n      \/\/ K\u00fct\u00fcphanenin olay dinleme metodunu kullanma\n      if (typeof instanceRef.current.on === 'function') {\n        instanceRef.current.on('someEvent', (eventData) => {\n          if (onEventOccurred) {\n            onEventOccurred(eventData); \/\/ React prop'u olarak gelen callback'i \u00e7a\u011f\u0131r\n          }\n        });\n      }\n    }\n\n    return () => {\n      if (instanceRef.current) {\n        \/\/ Olay dinleyicilerini temizleme (e\u011fer k\u00fct\u00fcphane bir .off() metodu sa\u011fl\u0131yorsa)\n        if (typeof instanceRef.current.off === 'function') {\n          instanceRef.current.off('someEvent');\n        }\n        if (typeof instanceRef.current.destroy === 'function') {\n          instanceRef.current.destroy();\n        }\n        instanceRef.current = null;\n      }\n    };\n  }, [onEventOccurred, props]); \/\/ onEventOccurred de\u011fi\u015fti\u011finde de bu useEffect tekrar \u00e7al\u0131\u015f\u0131r\n\n  return <div ref={containerRef} \/>;\n}<\/code><\/pre>\n<p><strong>Not:<\/strong> <code>onEventOccurred<\/code> gibi callback fonksiyonlar\u0131, React her render&#8217;da yeni bir fonksiyon referans\u0131 olu\u015fturabilir. Bu, <code>useEffect<\/code>&#8216;in gereksiz yere yeniden \u00e7al\u0131\u015fmas\u0131na neden olabilir. Bu durumu \u00f6nlemek i\u00e7in <code>useCallback<\/code> hook&#8217;unu kullanabilirsiniz: <code>const handleEvent = useCallback((data) => { \/<em> ... <\/em>\/ }, []);<\/code><\/p>\n<h4>Ad\u0131m 6: Vanilla JS Metotlar\u0131n\u0131 React&#8217;ten \u00c7a\u011f\u0131rma (\u0130ste\u011fe Ba\u011fl\u0131)<\/h4>\n<p>Bazen, sar\u0131lm\u0131\u015f vanilla JS bile\u015feninizin i\u00e7indeki k\u00fct\u00fcphane \u00f6rne\u011finin belirli metotlar\u0131n\u0131 (\u00f6rne\u011fin, bir grafi\u011fi yeniden \u00e7izme, bir haritada yak\u0131nla\u015ft\u0131rma) \u00fcst bile\u015fenlerden \u00e7a\u011f\u0131rmak isteyebilirsiniz. Bu, <code>forwardRef<\/code> ve <code>useImperativeHandle<\/code> hook&#8217;lar\u0131 kullan\u0131larak ger\u00e7ekle\u015ftirilebilir.<\/p>\n<pre><code class=\"language-javascript\">import React, { useRef, useEffect, useImperativeHandle, forwardRef } from 'react';\nimport YourVanillaJSPackage from 'your-vanilla-js-package';\n\nconst MyVanillaJSWrapper = forwardRef(({ data, options }, ref) => {\n  const containerRef = useRef(null);\n  const instanceRef = useRef(null);\n\n  useEffect(() => {\n    if (containerRef.current && !instanceRef.current) {\n      instanceRef.current = new YourVanillaJSPackage(containerRef.current, { ...options, data });\n    } else if (instanceRef.current) {\n      \/\/ G\u00fcncelleme mant\u0131\u011f\u0131\n      if (typeof instanceRef.current.update === 'function') {\n          instanceRef.current.update({ ...options, data });\n      }\n    }\n  }, [data, options]);\n\n  useEffect(() => {\n    return () => {\n      if (instanceRef.current) {\n        if (typeof instanceRef.current.destroy === 'function') {\n          instanceRef.current.destroy();\n        }\n        instanceRef.current = null;\n      }\n    };\n  }, []);\n\n  \/\/ \u00dcst bile\u015fenin ref'i arac\u0131l\u0131\u011f\u0131yla \u00e7a\u011fr\u0131labilecek metotlar\u0131 tan\u0131mla\n  useImperativeHandle(ref, () => ({\n    \/\/ \u00d6rne\u011fin, k\u00fct\u00fcphanenin 'reset' metodunu d\u0131\u015far\u0131ya a\u00e7al\u0131m\n    reset: () => {\n      if (instanceRef.current && typeof instanceRef.current.reset === 'function') {\n        instanceRef.current.reset();\n      }\n    },\n    \/\/ K\u00fct\u00fcphane \u00f6rne\u011finin kendisine eri\u015fim de sa\u011flayabiliriz (dikkatli kullan\u0131lmal\u0131)\n    getNativeInstance: () => instanceRef.current,\n  }));\n\n  return <div ref={containerRef} \/>;\n});\n\nexport default MyVanillaJSWrapper;<\/code><\/pre>\n<p>\u015eimdi, bu bile\u015feni kullanan bir \u00fcst bile\u015fen, <code>useRef<\/code> kullanarak <code>MyVanillaJSWrapper<\/code>&#8216;a bir referans alabilir ve tan\u0131mlad\u0131\u011f\u0131m\u0131z metotlar\u0131 \u00e7a\u011f\u0131rabilir:<\/p>\n<pre><code class=\"language-javascript\">import React, { useRef } from 'react';\nimport MyVanillaJSWrapper from '.\/MyVanillaJSWrapper';\n\nfunction ParentComponent() {\n  const wrapperRef = useRef(null);\n\n  const handleResetClick = () => {\n    if (wrapperRef.current) {\n      wrapperRef.current.reset(); \/\/ Vanilla JS metodunu \u00e7a\u011f\u0131r\n    }\n  };\n\n  return (\n    <div>\n      <MyVanillaJSWrapper ref={wrapperRef} data={\/<em> ... <\/em>\/} options={\/<em> ... <\/em>\/} \/>\n      <button onClick={handleResetClick}>Grafi\u011fi S\u0131f\u0131rla<\/button>\n    <\/div>\n  );\n}<\/code><\/pre>\n<h3>Pratik \u00d6rnek: Chart.js K\u00fct\u00fcphanesini React&#8217;e Entegre Etme<\/h3>\n<p>Chart.js, modern web i\u00e7in harika, a\u00e7\u0131k kaynakl\u0131 bir \u00e7izelgeleme k\u00fct\u00fcphanesidir. React&#8217;e entegrasyonu, yukar\u0131da a\u00e7\u0131klanan prensipleri uygulamak i\u00e7in iyi bir \u00f6rnektir.<\/p>\n<h4>Giri\u015f ve Kurulum<\/h4>\n<p>Chart.js, \u00e7e\u015fitli grafik t\u00fcrlerini (\u00e7ubuk, \u00e7izgi, pasta vb.) kolayca olu\u015fturman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">npm install chart.js\n<h2>veya<\/h2>\nyarn add chart.js<\/code><\/pre>\n<h4>Temel Chart Bile\u015feni Olu\u015fturma<\/h4>\n<p>Bir <code><canvas><\/code> elementine ihtiyac\u0131m\u0131z var ve bu canvas&#8217;a bir referans alarak Chart.js&#8217;i ba\u015flataca\u011f\u0131z.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/components\/MyChart.js\nimport React, { useRef, useEffect } from 'react';\nimport { Chart, registerables } from 'chart.js';\n\n\/\/ Chart.js'in t\u00fcm bile\u015fenlerini kaydetmek \u00f6nemlidir\nChart.register(...registerables);\n\nfunction MyChart({ type, data, options }) {\n  const canvasRef = useRef(null);\n  const chartInstanceRef = useRef(null); \/\/ Chart.js \u00f6rne\u011fini saklamak i\u00e7in\n\n  useEffect(() => {\n    if (canvasRef.current) {\n      const ctx = canvasRef.current.getContext('2d');\n\n      \/\/ E\u011fer daha \u00f6nce bir chart \u00f6rne\u011fi varsa, onu yok et\n      if (chartInstanceRef.current) {\n        chartInstanceRef.current.destroy();\n      }\n\n      \/\/ Yeni bir chart \u00f6rne\u011fi olu\u015ftur\n      chartInstanceRef.current = new Chart(ctx, {\n        type: type, \/\/ 'bar', 'line', 'pie' vb.\n        data: data,\n        options: options,\n      });\n    }\n\n    \/\/ Temizlik fonksiyonu\n    return () => {\n      if (chartInstanceRef.current) {\n        chartInstanceRef.current.destroy();\n        chartInstanceRef.current = null;\n      }\n    };\n  }, [type, data, options]); \/\/ type, data veya options de\u011fi\u015fti\u011finde chart'\u0131 yeniden olu\u015ftur\n\n  return <canvas ref={canvasRef} style={{ maxWidth: '600px', maxHeight: '400px' }} \/>;\n}\n\nexport default MyChart;<\/code><\/pre>\n<h4>Dinamik Veri ve Se\u00e7enekler<\/h4>\n<p>Yukar\u0131daki \u00f6rnekte <code>type<\/code>, <code>data<\/code> ve <code>options<\/code> prop&#8217;lar\u0131n\u0131 <code>useEffect<\/code> ba\u011f\u0131ml\u0131l\u0131k dizisine ekleyerek, bu prop&#8217;lardan herhangi biri de\u011fi\u015fti\u011finde Chart.js \u00f6rne\u011finin yeniden olu\u015fturulmas\u0131n\u0131 sa\u011flad\u0131k. Bu, genellikle grafik k\u00fct\u00fcphanelerinde dinamik g\u00fcncellemeler i\u00e7in en basit ve g\u00fcvenli yakla\u015f\u0131md\u0131r.<\/p>\n<p>Ancak, her veri veya se\u00e7enek de\u011fi\u015fikli\u011finde chart&#8217;\u0131 tamamen yeniden olu\u015fturmak yerine, Chart.js&#8217;in kendi <code>update()<\/code> metodunu kullanmak daha verimli olabilir.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/components\/MyChart.js (Daha verimli g\u00fcncelleme)\nimport React, { useRef, useEffect } from 'react';\nimport { Chart, registerables } from 'chart.js';\n\nChart.register(...registerables);\n\nfunction MyChart({ type, data, options }) {\n  const canvasRef = useRef(null);\n  const chartInstanceRef = useRef(null);\n\n  useEffect(() => {\n    if (canvasRef.current) {\n      const ctx = canvasRef.current.getContext('2d');\n\n      if (!chartInstanceRef.current) {\n        \/\/ \u0130lk ba\u015flatma\n        chartInstanceRef.current = new Chart(ctx, {\n          type: type,\n          data: data,\n          options: options,\n        });\n      } else {\n        \/\/ Chart zaten varsa, verileri ve se\u00e7enekleri g\u00fcncelle\n        chartInstanceRef.current.data = data;\n        chartInstanceRef.current.options = options;\n        chartInstanceRef.current.update(); \/\/ Chart'\u0131 g\u00fcncelle\n      }\n    }\n  }, [type, data, options]); \/\/ data veya options de\u011fi\u015fti\u011finde update \u00e7a\u011fr\u0131l\u0131r\n\n  useEffect(() => {\n    \/\/ Temizlik sadece mount\/unmount i\u00e7in\n    return () => {\n      if (chartInstanceRef.current) {\n        chartInstanceRef.current.destroy();\n        chartInstanceRef.current = null;\n      }\n    };\n  }, []); \/\/ Bo\u015f ba\u011f\u0131ml\u0131l\u0131k dizisi\n\n  return <canvas ref={canvasRef} style={{ maxWidth: '600px', maxHeight: '400px' }} \/>;\n}\n\nexport default MyChart;<\/code><\/pre>\n<p>Bu daha verimli versiyonda, <code>chartInstanceRef.current.data = data;<\/code> ve <code>chartInstanceRef.current.options = options;<\/code> sat\u0131rlar\u0131yla chart \u00f6rne\u011finin <code>data<\/code> ve <code>options<\/code> \u00f6zelliklerini do\u011frudan g\u00fcncelliyoruz, ard\u0131ndan <code>chartInstanceRef.current.update();<\/code> \u00e7a\u011fr\u0131s\u0131yla Chart.js&#8217;in DOM&#8217;u verimli bir \u015fekilde g\u00fcncellemesini sa\u011fl\u0131yoruz.<\/p>\n<p><strong>Kullan\u0131m \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/App.js\nimport React, { useState } from 'react';\nimport MyChart from '.\/components\/MyChart';\n\nfunction App() {\n  const [chartData, setChartData] = useState({\n    labels: ['Ocak', '\u015eubat', 'Mart', 'Nisan'],\n    datasets: [{\n      label: 'Sat\u0131\u015flar',\n      data: [65, 59, 80, 81],\n      backgroundColor: 'rgba(75, 192, 192, 0.6)',\n      borderColor: 'rgba(75, 192, 192, 1)',\n      borderWidth: 1,\n    }],\n  });\n\n  const [chartOptions, setChartOptions] = useState({\n    responsive: true,\n    scales: {\n      y: {\n        beginAtZero: true,\n      },\n    },\n  });\n\n  const updateData = () => {\n    setChartData(prevData => ({\n      ...prevData,\n      datasets: [{\n        ...prevData.datasets[0],\n        data: prevData.datasets[0].data.map(d => Math.floor(Math.random() * 100)),\n      }],\n    }));\n  };\n\n  return (\n    <div>\n      \n      <MyChart type=\"bar\" data={chartData} options={chartOptions} \/>\n      <button onClick={updateData}>Veriyi G\u00fcncelle<\/button>\n    <\/div>\n  );\n}\n\nexport default App;<\/code><\/pre>\n<p>Bu \u00f6rnek, <code>MyChart<\/code> bile\u015feninin nas\u0131l kullan\u0131labilece\u011fini ve <code>data<\/code> prop&#8217;u de\u011fi\u015fti\u011finde chart&#8217;\u0131n nas\u0131l dinamik olarak g\u00fcncellendi\u011fini g\u00f6stermektedir.<\/p>\n<h3>Geli\u015fmi\u015f Konular ve En \u0130yi Uygulamalar<\/h3>\n<h4>Performans Optimizasyonlar\u0131<\/h4>\n<p>*   <strong>Gereksiz Yeniden Ba\u015flatmalar\u0131 \u00d6nleme:<\/strong> <code>useEffect<\/code> ba\u011f\u0131ml\u0131l\u0131k dizisini do\u011fru ayarlamak, vanilla JS k\u00fct\u00fcphanesinin gereksiz yere yeniden ba\u015flat\u0131lmas\u0131n\u0131 \u00f6nler. E\u011fer sadece veriler de\u011fi\u015fiyorsa ve k\u00fct\u00fcphane bir <code>update<\/code> metodu sa\u011fl\u0131yorsa, bu metodu kullanmak tam yeniden ba\u015flatmadan daha verimlidir.<br \/>\n*   <strong>Debouncing\/Throttling:<\/strong> E\u011fer vanilla JS k\u00fct\u00fcphanesi \u00e7ok s\u0131k g\u00fcncelleniyorsa (\u00f6rne\u011fin, bir kayd\u0131rma olay\u0131 veya pencere boyutu de\u011fi\u015fti\u011finde), <code>lodash.debounce<\/code> veya <code>lodash.throttle<\/code> gibi yard\u0131mc\u0131 fonksiyonlar\u0131 kullanarak g\u00fcncellemeleri s\u0131n\u0131rlayabilirsiniz.<\/p>\n<h4>CSS Entegrasyonu<\/h4>\n<p>Vanilla JS k\u00fct\u00fcphaneleri genellikle kendi CSS dosyalar\u0131yla gelir. Bu CSS dosyalar\u0131n\u0131 projenize dahil etmeniz gerekebilir:<\/p>\n<pre><code class=\"language-javascript\">\/\/ Index.js veya App.js dosyan\u0131zda\nimport 'your-vanilla-js-package\/dist\/style.css';\n\/\/ Veya React bile\u015feninizin i\u00e7inde\nimport '.\/my-chart-styles.css'; \/\/ Kendi \u00f6zel stiliniz<\/code><\/pre>\n<p>Webpack veya Vite gibi modern derleyiciler, bu CSS dosyalar\u0131n\u0131 otomatik olarak i\u015fleyecektir.<\/p>\n<h4>TypeScript ile Tip G\u00fcvenli\u011fi<\/h4>\n<p>E\u011fer projeniz TypeScript kullan\u0131yorsa, vanilla JS k\u00fct\u00fcphaneleri i\u00e7in tip tan\u0131mlamalar\u0131na ihtiyac\u0131n\u0131z olacakt\u0131r.<br \/>\n*   <strong><code>@types<\/code> Paketleri:<\/strong> Bir\u00e7ok pop\u00fcler vanilla JS k\u00fct\u00fcphanesi i\u00e7in <code>npm install @types\/your-vanilla-js-package<\/code> komutuyla y\u00fcklenebilen <code>@types<\/code> paketleri mevcuttur.<br \/>\n*   <strong>Manuel Tip Tan\u0131mlamalar\u0131:<\/strong> E\u011fer <code>@types<\/code> paketi yoksa, k\u00fct\u00fcphanenin API&#8217;sine g\u00f6re kendi <code>.d.ts<\/code> dosyan\u0131z\u0131 olu\u015fturman\u0131z gerekebilir.<\/p>\n<h4>Hata Y\u00f6netimi<\/h4>\n<p>Vanilla JS k\u00fct\u00fcphanesi ba\u015flat\u0131l\u0131rken veya g\u00fcncellenirken hatalar olu\u015fabilir (\u00f6rne\u011fin, ge\u00e7ersiz se\u00e7enekler). Bu durumlar\u0131 <code>try-catch<\/code> bloklar\u0131 veya k\u00fct\u00fcphanenin kendi hata i\u015fleme mekanizmalar\u0131yla y\u00f6netmek \u00f6nemlidir.<\/p>\n<pre><code class=\"language-javascript\">useEffect(() => {\n  if (containerRef.current) {\n    try {\n      if (!instanceRef.current) {\n        instanceRef.current = new YourVanillaJSPackage(containerRef.current, props);\n      } else {\n        instanceRef.current.update(props);\n      }\n    } catch (error) {\n      console.error(\"Vanilla JS k\u00fct\u00fcphanesi ba\u015flat\u0131l\u0131rken\/g\u00fcncellenirken hata olu\u015ftu:\", error);\n      \/\/ Hata durumunda kullan\u0131c\u0131ya bilgi verebilir veya bile\u015feni farkl\u0131 render edebilirsiniz.\n    }\n  }\n}, [props]);<\/code><\/pre>\n<h4>Alternatif Yakla\u015f\u0131mlar<\/h4>\n<p>*   <strong>Mevcut React Sarmalay\u0131c\u0131lar\u0131:<\/strong> Vanilla JS k\u00fct\u00fcphanesini sarmalamaya ba\u015flamadan \u00f6nce, projenizin ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131layabilecek bir React sarmalay\u0131c\u0131s\u0131n\u0131n zaten var olup olmad\u0131\u011f\u0131n\u0131 kontrol edin. <code>react-chartjs-2<\/code> gibi k\u00fct\u00fcphaneler, Chart.js&#8217;i React&#8217;e entegre etmenin daha kolay bir yolunu sunar.<br \/>\n*   <strong>K\u00fct\u00fcphanenin Do\u011fas\u0131n\u0131 Anlama:<\/strong> Baz\u0131 vanilla JS k\u00fct\u00fcphaneleri, React&#8217;in sanal DOM&#8217;uyla \u00e7at\u0131\u015fabilecek kadar yo\u011fun DOM manip\u00fclasyonu yapar (\u00f6rne\u011fin, kendi sanal DOM benzeri mekanizmalar\u0131n\u0131 kullananlar). Bu t\u00fcr k\u00fct\u00fcphaneleri sarmalamak daha zor olabilir ve bazen k\u00fct\u00fcphanenin kendi mant\u0131\u011f\u0131n\u0131 React bile\u015feninin d\u0131\u015f\u0131na ta\u015f\u0131mak daha iyi bir \u00e7\u00f6z\u00fcm olabilir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Vanilla JavaScript paketlerini React uygulamalar\u0131na entegre etmek, ba\u015flang\u0131\u00e7ta g\u00f6z korkutucu g\u00f6r\u00fcnse de, React&#8217;in <code>useEffect<\/code> ve <code>useRef<\/code> gibi g\u00fc\u00e7l\u00fc hook&#8217;lar\u0131 sayesinde olduk\u00e7a y\u00f6netilebilir bir s\u00fcre\u00e7tir. Bu entegrasyon, mevcut, olgun ve performansl\u0131 k\u00fct\u00fcphanelerden yararlanman\u0131z\u0131 sa\u011flayarak geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131rabilir ve uygulaman\u0131z\u0131n yeteneklerini geni\u015fletebilir.<\/p>\n<p>Ba\u015far\u0131l\u0131 bir entegrasyon i\u00e7in anahtar noktalar \u015funlard\u0131r:<br \/>\n*   <strong><code>useRef<\/code> ile DOM referans\u0131 almak:<\/strong> Vanilla JS k\u00fct\u00fcphanesinin ba\u011flanaca\u011f\u0131 ger\u00e7ek DOM elementini sa\u011flamak.<br \/>\n*   <strong><code>useEffect<\/code> ile ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc y\u00f6netmek:<\/strong> K\u00fct\u00fcphaneyi ba\u015flatmak, props de\u011fi\u015fikliklerinde g\u00fcncellemek ve bile\u015fen kald\u0131r\u0131ld\u0131\u011f\u0131nda temizlemek.<br \/>\n*   <strong>Temizlik i\u015flemlerini unutmamak:<\/strong> Bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 ve istenmeyen davran\u0131\u015flar\u0131 \u00f6nlemek i\u00e7in <code>useEffect<\/code>&#8216;in d\u00f6n\u00fc\u015f fonksiyonunu kullanmak.<br \/>\n*   <strong>K\u00fct\u00fcphanenin API&#8217;sini anlamak:<\/strong> G\u00fcncelleme, olay dinleme ve yok etme metotlar\u0131n\u0131 do\u011fru kullanmak.<\/p>\n<p>React&#8217;in esnekli\u011fi sayesinde, deklaratif ve imperatif paradigmalar aras\u0131ndaki bu k\u00f6pr\u00fc, web geli\u015ftiricilerine g\u00fc\u00e7l\u00fc ara\u00e7lar sunar. Bu rehberdeki ad\u0131mlar\u0131 ve prensipleri uygulayarak, herhangi bir vanilla JavaScript k\u00fct\u00fcphanesini React projenize g\u00fcvenle entegre edebilirsiniz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"React Uygulamalar\u0131nda Vanilla JavaScript Paketlerini Kullanma Sanat\u0131: Kapsaml\u0131 Bir Rehber\nGiri\u015f: Neden Vanilla JS Paketlerini React&#8217;e Entegre Ede","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[129],"tags":[],"class_list":{"0":"post-33064","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-javascript","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>React Uygulamalar\u0131nda Vanilla JavaScript Paketlerini Kullanma Sanat\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React Uygulamalar\u0131nda Vanilla JavaScript Paketlerini Kullanma Sanat\u0131: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"React Uygulamalar\u0131nda Vanilla JavaScript Paketlerini Kullanma Sanat\u0131: Kapsaml\u0131 Bir Rehber Giri\u015f: Neden Vanilla JS Paketlerini React&#039;e Entegre Ede\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-29T01:40:54+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"React Uygulamalar\u0131nda Vanilla JavaScript Paketlerini Kullanma Sanat\u0131: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-10-29T01:40:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/\"},\"wordCount\":2173,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Javascript\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/\",\"name\":\"React Uygulamalar\u0131nda Vanilla JavaScript Paketlerini Kullanma Sanat\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-29T01:40:54+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React Uygulamalar\u0131nda Vanilla JavaScript Paketlerini Kullanma Sanat\u0131: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"React Uygulamalar\u0131nda Vanilla JavaScript Paketlerini Kullanma Sanat\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"React Uygulamalar\u0131nda Vanilla JavaScript Paketlerini Kullanma Sanat\u0131: Kapsaml\u0131 Bir Rehber","og_description":"React Uygulamalar\u0131nda Vanilla JavaScript Paketlerini Kullanma Sanat\u0131: Kapsaml\u0131 Bir Rehber Giri\u015f: Neden Vanilla JS Paketlerini React'e Entegre Ede","og_url":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-29T01:40:54+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"React Uygulamalar\u0131nda Vanilla JavaScript Paketlerini Kullanma Sanat\u0131: Kapsaml\u0131 Bir Rehber","datePublished":"2025-10-29T01:40:54+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/"},"wordCount":2173,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Javascript"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/","name":"React Uygulamalar\u0131nda Vanilla JavaScript Paketlerini Kullanma Sanat\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-29T01:40:54+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/react-uygulamalarinda-vanilla-javascript-paketlerini-kullanma-sanati-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"React Uygulamalar\u0131nda Vanilla JavaScript Paketlerini Kullanma Sanat\u0131: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33064","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33064"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33064\/revisions"}],"predecessor-version":[{"id":33065,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33064\/revisions\/33065"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33064"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33064"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33064"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}