{"id":37434,"date":"2026-01-04T15:41:29","date_gmt":"2026-01-04T12:41:29","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37434"},"modified":"2026-01-04T15:41:29","modified_gmt":"2026-01-04T12:41:29","slug":"proje-kurulumu-ve-temel-yapilandirma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/","title":{"rendered":"Proje Kurulumu ve Temel Yap\u0131land\u0131rma"},"content":{"rendered":"<p><body><\/p>\n<p>G\u00fcn\u00fcm\u00fczde web uygulamalar\u0131, kullan\u0131c\u0131lara \u00e7e\u015fitli g\u00fc\u00e7l\u00fc ara\u00e7lar sunarak deneyimlerini zenginle\u015ftirmektedir. Bu ara\u00e7lardan biri de ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma yetene\u011fidir. \u0130ster bir hata raporlamak, ister bir i\u00e7eri\u011fi kaydetmek, isterse de bir an\u0131 yakalamak olsun, ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma i\u015flevi bir\u00e7ok senaryoda kritik \u00f6neme sahiptir. Bu teknik rehberde, Vue.js kullanarak bir ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma arac\u0131n\u0131n \u00f6n y\u00fcz (front-end) kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc (UI) nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu rehber, Vue.js&#8217;in g\u00fcc\u00fcn\u00fc kullanarak modern, reaktif ve kullan\u0131c\u0131 dostu bir aray\u00fcz in\u015fa etmeye odaklanacakt\u0131r.<\/p>\n<p>Unutmamak gerekir ki, taray\u0131c\u0131 tabanl\u0131 JavaScript&#8217;in do\u011frudan i\u015fletim sisteminin veya ba\u015fka bir uygulaman\u0131n ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc almas\u0131 g\u00fcvenlik k\u0131s\u0131tlamalar\u0131 nedeniyle m\u00fcmk\u00fcn de\u011fildir. Genellikle bu t\u00fcr bir i\u015flevsellik, bir arka u\u00e7 (backend) servisi (\u00f6rne\u011fin, Node.js ile Puppeteer\/Playwright gibi ara\u00e7lar) veya taray\u0131c\u0131n\u0131n kendi ekran payla\u015f\u0131m API&#8217;leri (<code>navigator.mediaDevices.getDisplayMedia()<\/code>) arac\u0131l\u0131\u011f\u0131yla ger\u00e7ekle\u015ftirilir. Biz bu rehberde, \u00f6n y\u00fczdeki &#8220;ekran g\u00f6r\u00fcnt\u00fcs\u00fc al&#8221; d\u00fc\u011fmesine bas\u0131ld\u0131\u011f\u0131nda bir arka u\u00e7tan g\u00f6r\u00fcnt\u00fc URL&#8217;si al\u0131p bunu g\u00f6steren bir aray\u00fcz olu\u015fturmaya odaklanaca\u011f\u0131z. Ger\u00e7ek ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma mekanizmas\u0131, bu rehberin kapsam\u0131 d\u0131\u015f\u0131ndad\u0131r ve genellikle arka u\u00e7ta halledilir veya sayfa i\u00e7eri\u011fini yakalamak i\u00e7in <code>html2canvas<\/code> gibi k\u00fct\u00fcphaneler kullan\u0131l\u0131r.<\/p>\n<h2>Proje Kurulumu ve Temel Yap\u0131land\u0131rma<\/h2>\n<p>Yeni bir Vue.js projesi olu\u015fturarak i\u015fe ba\u015flayal\u0131m. Modern Vue projeleri i\u00e7in Vite&#8217;\u0131 kullanmak, daha h\u0131zl\u0131 geli\u015ftirme deneyimi sa\u011flar.<\/p>\n<h3>Vue Projesi Olu\u015fturma<\/h3>\n<p>Terminalinizde a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rarak yeni bir Vue projesi olu\u015fturabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">npm init vue@latest\n<h2>Proje ad\u0131n\u0131 girin (\u00f6rn: screenshot-tool-ui)<\/h2>\n<h2>TypeScript, JSX, Router, Pinia vb. i\u00e7in varsay\u0131lan se\u00e7enekleri kabul edebilir veya reddedebilirsiniz.<\/h2>\ncd screenshot-tool-ui\nnpm install\nnpm run dev\n<\/code><\/pre>\n<p>Bu komutlar, temel bir Vue 3 projesi olu\u015fturacak ve geli\u015ftirme sunucusunu ba\u015flatacakt\u0131r. Taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:5173\/<\/code> adresine giderek varsay\u0131lan Vue uygulamas\u0131n\u0131 g\u00f6rebilirsiniz.<\/p>\n<h3>Temel Bile\u015fen Yap\u0131s\u0131<\/h3>\n<p>Uygulamam\u0131z i\u00e7in ana bile\u015fenimiz <code>App.vue<\/code> olacak. Ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma d\u00fc\u011fmesi ve \u00e7ekilen g\u00f6r\u00fcnt\u00fcy\u00fc g\u00f6sterecek ayr\u0131 bile\u015fenler olu\u015fturarak kodumuzu daha d\u00fczenli hale getirece\u011fiz.<\/p>\n<ul>\n<li><code>src\/App.vue<\/code>: Ana uygulama bile\u015feni.<\/li>\n<li><code>src\/components\/ScreenshotButton.vue<\/code>: Ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma d\u00fc\u011fmesi.<\/li>\n<li><code>src\/components\/ScreenshotPreview.vue<\/code>: \u00c7ekilen ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc g\u00f6steren alan.<\/li>\n<\/ul>\n<p>\u0130lk olarak, <code>App.vue<\/code> dosyam\u0131z\u0131n i\u00e7eri\u011fini basitle\u015ftirelim:<\/p>\n<pre><code class=\"language-html\"><template>\n  <div id=\"app\">\n    <h2>Ekran G\u00f6r\u00fcnt\u00fcs\u00fc Alma Arac\u0131<\/h2>\n    <!-- Bile\u015fenler buraya gelecek -->\n  <\/div>\n<\/template>\n\n<script setup>\n\/\/ Script logic buraya gelecek\n<\/script>\n\n<style>\n#app {\n  font-family: Avenir, Helvetica, Arial, sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  text-align: center;\n  color: #2c3e50;\n  margin-top: 60px;\n}\n<\/style>\n<\/code><\/pre>\n<h2>Ekran G\u00f6r\u00fcnt\u00fcs\u00fc Alma Mekanizmas\u0131 ve Vue Entegrasyonu<\/h2>\n<p>\u015eimdi ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma i\u015flevselli\u011fini ve bunun Vue bile\u015fenleri arac\u0131l\u0131\u011f\u0131yla nas\u0131l y\u00f6netilece\u011fini olu\u015ftural\u0131m. Bu k\u0131s\u0131mda, bir arka u\u00e7tan (veya sim\u00fcle edilmi\u015f bir kaynaktan) bir g\u00f6r\u00fcnt\u00fc URL&#8217;si almay\u0131 ve bunu kullan\u0131c\u0131ya g\u00f6stermeyi ele alaca\u011f\u0131z.<\/p>\n<h3>ScreenshotButton Bile\u015feni<\/h3>\n<p>Bu bile\u015fen, ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma i\u015flemini tetikleyecek bir d\u00fc\u011fme i\u00e7erecektir. \u0130\u015flem devam ederken d\u00fc\u011fmeyi devre d\u0131\u015f\u0131 b\u0131rakmak i\u00e7in bir y\u00fckleme durumu da g\u00f6sterebiliriz.<\/p>\n<p><code>src\/components\/ScreenshotButton.vue<\/code> dosyas\u0131n\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-html\"><template>\n  <button\n    @click=\"handleClick\"\n    :disabled=\"isLoading\"\n    :class=\"{ 'loading': isLoading }\"\n  >\n    <span v-if=\"isLoading\">Y\u00fckleniyor...<\/span>\n    <span v-else>Ekran G\u00f6r\u00fcnt\u00fcs\u00fc Al<\/span>\n  <\/button>\n<\/template<\n\n<script setup>\nimport { defineProps, defineEmits } from 'vue';\n\nconst props = defineProps({\n  isLoading: {\n    type: Boolean,\n    default: false\n  }\n});\n\nconst emit = defineEmits(['takeScreenshot']);\n\nconst handleClick = () => {\n  if (!props.isLoading) {\n    emit('takeScreenshot');\n  }\n};\n<\/script>\n\n<style scoped>\nbutton {\n  background-color: #42b983;\n  color: white;\n  padding: 12px 20px;\n  border: none;\n  border-radius: 8px;\n  cursor: pointer;\n  font-size: 1.1em;\n  transition: background-color 0.3s ease;\n  min-width: 180px; \/<em> Sabit geni\u015flik i\u00e7in <\/em>\/\n}\n\nbutton:hover:not(:disabled) {\n  background-color: #36a374;\n}\n\nbutton:disabled {\n  background-color: #a0a0a0;\n  cursor: not-allowed;\n}\n\nbutton.loading {\n  background-color: #6c757d;\n}\n<\/style>\n<\/code><\/pre>\n<h3>ScreenshotPreview Bile\u015feni<\/h3>\n<p>Bu bile\u015fen, \u00e7ekilen ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc g\u00f6sterecek ve kullan\u0131c\u0131ya g\u00f6r\u00fcnt\u00fcy\u00fc indirme se\u00e7ene\u011fi sunacakt\u0131r.<\/p>\n<p><code>src\/components\/ScreenshotPreview.vue<\/code> dosyas\u0131n\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-html\"><template>\n  <div v-if=\"imageUrl\" class=\"screenshot-preview\">\n    <h3>\u00c7ekilen Ekran G\u00f6r\u00fcnt\u00fcs\u00fc<\/h3>\n    <img :src=\"imageUrl\" alt=\"Ekran G\u00f6r\u00fcnt\u00fcs\u00fc\" class=\"screenshot-image\" \/>\n    <div class=\"actions\">\n      <a :href=\"imageUrl\" download=\"ekran-goruntusu.png\" class=\"download-button\">\u0130ndir<\/a>\n      <button @click=\"clearPreview\" class=\"clear-button\">Temizle<\/button>\n    <\/div>\n  <\/div>\n<\/template>\n\n<script setup>\nimport { defineProps, defineEmits } from 'vue';\n\nconst props = defineProps({\n  imageUrl: {\n    type: String,\n    default: ''\n  }\n});\n\nconst emit = defineEmits(['clear']);\n\nconst clearPreview = () => {\n  emit('clear');\n};\n<\/script>\n\n<style scoped>\n.screenshot-preview {\n  margin-top: 30px;\n  padding: 20px;\n  border: 1px solid #ddd;\n  border-radius: 8px;\n  background-color: #f9f9f9;\n  max-width: 800px;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.screenshot-image {\n  max-width: 100%;\n  height: auto;\n  border-radius: 4px;\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n  margin-bottom: 20px;\n}\n\n.actions {\n  display: flex;\n  justify-content: center;\n  gap: 15px;\n}\n\n.download-button, .clear-button {\n  padding: 10px 18px;\n  border-radius: 6px;\n  text-decoration: none;\n  font-size: 1em;\n  cursor: pointer;\n  transition: background-color 0.3s ease;\n}\n\n.download-button {\n  background-color: #007bff;\n  color: white;\n  border: none;\n}\n\n.download-button:hover {\n  background-color: #0056b3;\n}\n\n.clear-button {\n  background-color: #dc3545;\n  color: white;\n  border: none;\n}\n\n.clear-button:hover {\n  background-color: #c82333;\n}\n<\/style>\n<\/code><\/pre>\n<h3>App.vue&#8217;da Entegrasyon<\/h3>\n<p>\u015eimdi bu iki bile\u015feni <code>App.vue<\/code> i\u00e7ine entegre edelim ve ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma mant\u0131\u011f\u0131n\u0131 y\u00f6netelim. Bu mant\u0131k, bir API \u00e7a\u011fr\u0131s\u0131n\u0131 sim\u00fcle edecek ve bir g\u00f6r\u00fcnt\u00fc URL&#8217;si d\u00f6nd\u00fcrecektir.<\/p>\n<pre><code class=\"language-html\"><template>\n  <div id=\"app\">\n    <h2>Vue.js Ekran G\u00f6r\u00fcnt\u00fcs\u00fc Arac\u0131<\/h2>\n\n    <ScreenshotButton\n      :isLoading=\"isLoading\"\n      @takeScreenshot=\"handleTakeScreenshot\"\n    \/>\n\n    <ScreenshotPreview\n      :imageUrl=\"screenshotUrl\"\n      @clear=\"clearScreenshot\"\n    \/>\n\n    <p v-if=\"error\" class=\"error-message\">Hata: {{ error }}<\/p>\n  <\/div>\n<\/template>\n\n<script setup>\nimport { ref } from 'vue';\nimport ScreenshotButton from '.\/components\/ScreenshotButton.vue';\nimport ScreenshotPreview from '.\/components\/ScreenshotPreview.vue';\n\nconst isLoading = ref(false);\nconst screenshotUrl = ref('');\nconst error = ref('');\n\nconst handleTakeScreenshot = async () => {\n  isLoading.value = true;\n  error.value = '';\n  screenshotUrl.value = ''; \/\/ \u00d6nceki g\u00f6r\u00fcnt\u00fcy\u00fc temizle\n\n  \/\/ Ger\u00e7ek bir API \u00e7a\u011fr\u0131s\u0131 yerine bir gecikme ile sim\u00fclasyon yap\u0131yoruz.\n  \/\/ Normalde burada bir fetch\/axios iste\u011fi ile arka uca ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma iste\u011fi g\u00f6nderilir.\n  try {\n    \/\/ \u00d6rnek bir g\u00f6r\u00fcnt\u00fc URL'si\n    const dummyImageUrl = 'https:\/\/picsum.photos\/800\/600?random=' + Math.random();\n\n    \/\/ Arka u\u00e7tan yan\u0131t gelmesini sim\u00fcle etmek i\u00e7in 2 saniye bekleyelim\n    await new Promise(resolve => setTimeout(resolve, 2000));\n\n    \/\/ Ger\u00e7ek bir senaryoda, arka u\u00e7tan gelen g\u00f6r\u00fcnt\u00fc URL'sini burada ayarlars\u0131n\u0131z.\n    screenshotUrl.value = dummyImageUrl;\n    console.log('Ekran g\u00f6r\u00fcnt\u00fcs\u00fc al\u0131nd\u0131:', screenshotUrl.value);\n\n  } catch (err) {\n    console.error('Ekran g\u00f6r\u00fcnt\u00fcs\u00fc al\u0131n\u0131rken hata olu\u015ftu:', err);\n    error.value = 'Ekran g\u00f6r\u00fcnt\u00fcs\u00fc al\u0131namad\u0131. L\u00fctfen tekrar deneyin.';\n  } finally {\n    isLoading.value = false;\n  }\n};\n\nconst clearScreenshot = () => {\n  screenshotUrl.value = '';\n  error.value = '';\n};\n<\/script>\n\n<style>\n#app {\n  font-family: Avenir, Helvetica, Arial, sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  text-align: center;\n  color: #2c3e50;\n  margin-top: 60px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: 25px; \/<em> Bile\u015fenler aras\u0131 bo\u015fluk <\/em>\/\n}\n\nh2 {\n  color: #34495e;\n  margin-bottom: 30px;\n}\n\n.error-message {\n  color: #dc3545;\n  font-weight: bold;\n  margin-top: 20px;\n}\n<\/style>\n<\/code><\/pre>\n<h2>Kullan\u0131c\u0131 Deneyimi ve Stil \u0130yile\u015ftirmeleri<\/h2>\n<p>Yukar\u0131daki kod \u00f6rneklerinde temel stil tan\u0131mlamalar\u0131 eklenmi\u015f olsa da, daha iyi bir kullan\u0131c\u0131 deneyimi i\u00e7in ek stil ve etkile\u015fimler d\u00fc\u015f\u00fcnebiliriz.<\/p>\n<h3>Duyarl\u0131 Tasar\u0131m (Responsive Design)<\/h3>\n<p>Uygulaman\u0131z\u0131n farkl\u0131 ekran boyutlar\u0131nda iyi g\u00f6r\u00fcnmesini sa\u011flamak i\u00e7in CSS media query&#8217;lerini kullanabilirsiniz. \u00d6rne\u011fin, k\u00fc\u00e7\u00fck ekranlarda d\u00fc\u011fmelerin veya g\u00f6r\u00fcnt\u00fclerin boyutunu ayarlamak gerekebilir.<\/p>\n<pre><code class=\"language-css\">\/<em> \u00d6rnek: K\u00fc\u00e7\u00fck ekranlar i\u00e7in <\/em>\/\n@media (max-width: 768px) {\n  #app {\n    margin-top: 30px;\n    padding: 0 15px;\n  }\n\n  .screenshot-preview {\n    padding: 15px;\n  }\n\n  .actions {\n    flex-direction: column;\n    gap: 10px;\n  }\n}\n<\/code><\/pre>\n<h3>Y\u00fckleme G\u00f6stergeleri<\/h3>\n<p><code>ScreenshotButton<\/code> bile\u015fenimizde <code>isLoading<\/code> durumu ile basit bir y\u00fckleme metni kulland\u0131k. Daha geli\u015fmi\u015f bir y\u00fckleme g\u00f6stergesi (\u00f6rne\u011fin, bir spinner) eklemek, kullan\u0131c\u0131ya i\u015flemin devam etti\u011fini daha net bir \u015fekilde g\u00f6sterebilir. Basit bir CSS spinner&#8217;\u0131 veya bir k\u00fct\u00fcphane (\u00f6rne\u011fin, Font Awesome ikonlar\u0131) entegre edilebilir.<\/p>\n<h3>Hata Mesajlar\u0131<\/h3>\n<p>API \u00e7a\u011fr\u0131s\u0131nda bir sorun olu\u015ftu\u011funda kullan\u0131c\u0131ya anla\u015f\u0131l\u0131r hata mesajlar\u0131 g\u00f6stermek \u00f6nemlidir. <code>App.vue<\/code> i\u00e7inde <code>error<\/code> ref&#8217;i ile basit bir hata mesaj\u0131 g\u00f6sterimi zaten bulunmaktad\u0131r. Bu mesajlar\u0131 daha belirgin hale getirebilir veya kullan\u0131c\u0131ya yeniden deneme se\u00e7enekleri sunabilirsiniz.<\/p>\n<h2>Geli\u015fmi\u015f \u00d6zellikler ve \u0130yile\u015ftirmeler<\/h2>\n<p>Temel bir ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma aray\u00fcz\u00fcn\u00fc olu\u015fturduktan sonra, uygulamay\u0131 daha g\u00fc\u00e7l\u00fc ve kullan\u0131\u015fl\u0131 hale getirmek i\u00e7in \u00e7e\u015fitli \u00f6zellikler ekleyebilirsiniz.<\/p>\n<h3>Belirli Alan Se\u00e7imi<\/h3>\n<p>Kullan\u0131c\u0131n\u0131n ekran\u0131n belirli bir b\u00f6l\u00fcm\u00fcn\u00fc se\u00e7mesine izin vermek, bu t\u00fcr ara\u00e7lar\u0131n en \u00e7ok aranan \u00f6zelliklerinden biridir. Bu, \u00f6n y\u00fczde karma\u015f\u0131k DOM manip\u00fclasyonu (bir se\u00e7im kutusu \u00e7izme ve boyutland\u0131rma) ve arka u\u00e7ta bu koordinatlara g\u00f6re ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma yetene\u011fi gerektirir. \u00d6rne\u011fin, kullan\u0131c\u0131 bir alan se\u00e7er, bu koordinatlar arka uca g\u00f6nderilir ve arka u\u00e7 sadece o b\u00f6lgenin ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc al\u0131r.<\/p>\n<h3>G\u00f6r\u00fcnt\u00fc D\u00fczenleme Ara\u00e7lar\u0131<\/h3>\n<p>\u00c7ekilen g\u00f6r\u00fcnt\u00fcler \u00fczerinde basit d\u00fczenlemeler (k\u0131rpma, metin ekleme, \u00e7izim yapma vb.) yapma yetene\u011fi sunmak kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir. Bu t\u00fcr \u00f6zellikler genellikle HTML Canvas API&#8217;si kullan\u0131larak \u00f6n y\u00fczde uygulan\u0131r. Bir g\u00f6r\u00fcnt\u00fc d\u00fczenleyici k\u00fct\u00fcphanesi (\u00f6rn. Fabric.js) entegre edilebilir.<\/p>\n<h3>Ge\u00e7mi\u015f ve Y\u00f6netim<\/h3>\n<p>\u00c7ekilen ekran g\u00f6r\u00fcnt\u00fclerinin bir ge\u00e7mi\u015fini tutmak ve kullan\u0131c\u0131n\u0131n bunlar\u0131 daha sonra incelemesine, indirmesine veya silmesine olanak tan\u0131mak faydal\u0131 olabilir. Bu, genellikle bir depolama \u00e7\u00f6z\u00fcm\u00fc (yerel depolama, IndexedDB veya bir arka u\u00e7 veritaban\u0131) gerektirir.<\/p>\n<h3>Farkl\u0131 Kaydetme Se\u00e7enekleri<\/h3>\n<p>G\u00f6r\u00fcnt\u00fcleri farkl\u0131 formatlarda (PNG, JPG, WebP) kaydetme veya do\u011frudan bulut depolama servislerine (Dropbox, Google Drive) y\u00fckleme se\u00e7enekleri sunmak uygulaman\u0131n esnekli\u011fini art\u0131r\u0131r.<\/p>\n<h3>Klavye K\u0131sayollar\u0131<\/h3>\n<p>Belirli klavye k\u0131sayollar\u0131 (\u00f6rne\u011fin, &#8220;Print Screen&#8221; tu\u015fu veya \u00f6zel bir kombinasyon) ile ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma i\u015flemini tetiklemek, profesyonel ara\u00e7larda yayg\u0131n olarak bulunan bir \u00f6zelliktir. Bu, taray\u0131c\u0131 olay dinleyicileriyle (<code>keydown<\/code>) y\u00f6netilebilir.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Bu rehberde, Vue.js kullanarak basit ama i\u015flevsel bir ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma arac\u0131n\u0131n \u00f6n y\u00fcz UI&#8217;sini nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131 \u00f6\u011frendik. Proje kurulumundan temel bile\u015fenlerin olu\u015fturulmas\u0131na, API entegrasyonu sim\u00fclasyonundan kullan\u0131c\u0131 deneyimi iyile\u015ftirmelerine kadar bir\u00e7ok konuya de\u011findik. Unutmay\u0131n ki, ger\u00e7ek bir ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma uygulamas\u0131 genellikle g\u00fc\u00e7l\u00fc bir arka u\u00e7 servisi ile birlikte \u00e7al\u0131\u015f\u0131r. Bu rehber, \u00f6n y\u00fcz geli\u015ftirme becerilerinizi kullanarak modern ve etkile\u015fimli web uygulamalar\u0131 olu\u015fturma yolunda size sa\u011flam bir ba\u015flang\u0131\u00e7 noktas\u0131 sunmu\u015ftur.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. Bu ara\u00e7 ger\u00e7ekten ekran\u0131m\u0131n g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc al\u0131yor mu?<\/strong><br \/>\nHay\u0131r, bu rehberde olu\u015fturdu\u011fumuz \u00f6n y\u00fcz uygulamas\u0131 do\u011frudan bilgisayar\u0131n\u0131z\u0131n ekran\u0131n\u0131n g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc almaz. Taray\u0131c\u0131lar\u0131n g\u00fcvenlik politikalar\u0131 nedeniyle JavaScript&#8217;in buna do\u011frudan eri\u015fimi yoktur. Bizim uygulamam\u0131z, bir arka u\u00e7 servisine ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma iste\u011fi g\u00f6nderdi\u011fini sim\u00fcle eder ve o servisten gelen bir g\u00f6r\u00fcnt\u00fc URL&#8217;sini g\u00f6sterir. Ger\u00e7ek ekran g\u00f6r\u00fcnt\u00fcs\u00fc alma i\u015flemi genellikle arka u\u00e7ta (\u00f6rne\u011fin, Node.js ile Puppeteer veya Playwright) veya taray\u0131c\u0131n\u0131n ekran payla\u015f\u0131m API&#8217;leri (<code>navigator.mediaDevices.getDisplayMedia()<\/code>) ile yap\u0131l\u0131r.<\/p>\n<p><strong>2. Sadece web sayfas\u0131n\u0131n belirli bir alan\u0131n\u0131n ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc alabilir miyim?<\/strong><br \/>\nEvet, ancak bu daha karma\u015f\u0131k bir \u00f6zelliktir. E\u011fer sadece mevcut web sayfas\u0131n\u0131n bir b\u00f6l\u00fcm\u00fcn\u00fc yakalamak istiyorsan\u0131z, <code>html2canvas<\/code> gibi bir JavaScript k\u00fct\u00fcphanesi kullanarak DOM&#8217;u bir canvas&#8217;a d\u00f6n\u00fc\u015ft\u00fcr\u00fcp sonra belirli bir alan\u0131 k\u0131rpabilirsiniz. E\u011fer ekran\u0131n herhangi bir yerinden bir alan \u00e7ekmek istiyorsan\u0131z, bu yine arka u\u00e7ta veya <code>getDisplayMedia()<\/code> API&#8217;si ile ekran payla\u015f\u0131m\u0131 s\u0131ras\u0131nda kullan\u0131c\u0131n\u0131n bir b\u00f6lge se\u00e7mesine izin verilerek yap\u0131labilir.<\/p>\n<p><strong>3. \u00c7ekilen g\u00f6r\u00fcnt\u00fcy\u00fc d\u00fczenleyebilir miyim?<\/strong><br \/>\nEvet, \u00f6n y\u00fczde HTML Canvas API&#8217;sini kullanarak veya Fabric.js gibi k\u00fct\u00fcphaneleri entegre ederek g\u00f6r\u00fcnt\u00fcler \u00fczerinde k\u0131rpma, \u00e7izim, metin ekleme gibi d\u00fczenlemeler yapabilirsiniz. Bu, uygulaman\u0131za ekleyebilece\u011finiz geli\u015fmi\u015f bir \u00f6zelliktir.<\/p>\n<p><strong>4. Taray\u0131c\u0131 uyumlulu\u011fu konusunda dikkat etmem gereken bir \u015fey var m\u0131?<\/strong><br \/>\nVue.js uygulamalar\u0131 modern taray\u0131c\u0131lar\u0131n \u00e7o\u011fuyla uyumludur. Ancak, e\u011fer <code>navigator.mediaDevices.getDisplayMedia()<\/code> gibi taray\u0131c\u0131 API&#8217;lerini kullanmay\u0131 d\u00fc\u015f\u00fcn\u00fcyorsan\u0131z, bu API&#8217;lerin taray\u0131c\u0131 deste\u011fini kontrol etmeniz (\u00f6rn. Can I use) ve gerekli durumlarda yedek \u00e7\u00f6z\u00fcmler (polyfills) sa\u011flaman\u0131z gerekebilir.<\/p>\n<p><strong>5. Uygulaman\u0131n performans\u0131n\u0131 nas\u0131l art\u0131rabilirim?<\/strong><br \/>\nPerformans, \u00f6zellikle b\u00fcy\u00fck g\u00f6r\u00fcnt\u00fclerle \u00e7al\u0131\u015f\u0131rken veya \u00e7ok say\u0131da ekran g\u00f6r\u00fcnt\u00fcs\u00fc al\u0131rken \u00f6nemli olabilir. Performans\u0131 art\u0131rmak i\u00e7in \u015funlar\u0131 yapabilirsiniz:<\/p>\n<ul>\n<li>Arka u\u00e7ta g\u00f6r\u00fcnt\u00fc s\u0131k\u0131\u015ft\u0131rma ve optimizasyon kullan\u0131n.<\/li>\n<li>\u00d6n y\u00fczde g\u00f6r\u00fcnt\u00fcleri y\u00fcklerken lazy loading (tembel y\u00fckleme) uygulay\u0131n.<\/li>\n<li>Gereksiz render i\u015flemlerini en aza indirmek i\u00e7in Vue&#8217;nun performans ipu\u00e7lar\u0131n\u0131 (\u00f6rne\u011fin, <code>v-once<\/code> kullan\u0131m\u0131) takip edin.<\/li>\n<li>B\u00fcy\u00fck bile\u015fenleri daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alara ay\u0131r\u0131n.<\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"G\u00fcn\u00fcm\u00fczde web uygulamalar\u0131, kullan\u0131c\u0131lara \u00e7e\u015fitli g\u00fc\u00e7l\u00fc ara\u00e7lar sunarak deneyimlerini zenginle\u015ftirmektedir. Bu ara\u00e7lardan biri de ekra","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":[1],"tags":[],"class_list":{"0":"post-37434","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","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>Proje Kurulumu ve Temel Yap\u0131land\u0131rma - 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\/proje-kurulumu-ve-temel-yapilandirma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Proje Kurulumu ve Temel Yap\u0131land\u0131rma\" \/>\n<meta property=\"og:description\" content=\"G\u00fcn\u00fcm\u00fczde web uygulamalar\u0131, kullan\u0131c\u0131lara \u00e7e\u015fitli g\u00fc\u00e7l\u00fc ara\u00e7lar sunarak deneyimlerini zenginle\u015ftirmektedir. Bu ara\u00e7lardan biri de ekra\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-04T12:41:29+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=\"3 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Proje Kurulumu ve Temel Yap\u0131land\u0131rma\",\"datePublished\":\"2026-01-04T12:41:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/\"},\"wordCount\":1681,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/\",\"name\":\"Proje Kurulumu ve Temel Yap\u0131land\u0131rma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-04T12:41:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Proje Kurulumu ve Temel Yap\u0131land\u0131rma\"}]},{\"@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":"Proje Kurulumu ve Temel Yap\u0131land\u0131rma - 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\/proje-kurulumu-ve-temel-yapilandirma\/","og_locale":"tr_TR","og_type":"article","og_title":"Proje Kurulumu ve Temel Yap\u0131land\u0131rma","og_description":"G\u00fcn\u00fcm\u00fczde web uygulamalar\u0131, kullan\u0131c\u0131lara \u00e7e\u015fitli g\u00fc\u00e7l\u00fc ara\u00e7lar sunarak deneyimlerini zenginle\u015ftirmektedir. Bu ara\u00e7lardan biri de ekra","og_url":"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-04T12:41:29+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"3 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Proje Kurulumu ve Temel Yap\u0131land\u0131rma","datePublished":"2026-01-04T12:41:29+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/"},"wordCount":1681,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/","url":"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/","name":"Proje Kurulumu ve Temel Yap\u0131land\u0131rma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-04T12:41:29+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/proje-kurulumu-ve-temel-yapilandirma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Proje Kurulumu ve Temel Yap\u0131land\u0131rma"}]},{"@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\/37434","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=37434"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37434\/revisions"}],"predecessor-version":[{"id":37435,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37434\/revisions\/37435"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37434"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}