<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Ajat Darojat's Blog]]></title><description><![CDATA[A software engineer, coding instructor, and creator of Mongoloquent ORM. Active in communities and contribute to open-source projects.]]></description><link>https://ajatdarojat45.id</link><generator>RSS for Node</generator><lastBuildDate>Mon, 18 May 2026 13:11:43 GMT</lastBuildDate><atom:link href="https://ajatdarojat45.id/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Effortless Deployment 
of Next & Angular Apps with Firebase]]></title><description><![CDATA[Introducing Firebase App Hosting
Hi teman-teman, Beberapa waktu lalu saya mendapat kesempatan untuk sharing pada acara Google IO Extended Bogor 2024. Topik yang saya bawakan adalah terkait salah produk baru dari Firebase. Saya mau sedikit sharing ter...]]></description><link>https://ajatdarojat45.id/effortless-deployment-of-next-angular-apps-with-firebase</link><guid isPermaLink="true">https://ajatdarojat45.id/effortless-deployment-of-next-angular-apps-with-firebase</guid><category><![CDATA[Firebase]]></category><category><![CDATA[Firebase App Hosting]]></category><category><![CDATA[google cloud]]></category><category><![CDATA[deployment]]></category><category><![CDATA[Next.js]]></category><category><![CDATA[Angular]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Thu, 05 Sep 2024 10:19:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1725531493056/d27cc6ea-0dee-40ae-83f4-d6809d673aa8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-introducing-firebase-app-hosting">Introducing Firebase App Hosting</h3>
<p>Hi teman-teman, Beberapa waktu lalu saya mendapat kesempatan untuk sharing pada acara <strong>Google IO Extended Bogor 2024</strong>. Topik yang saya bawakan adalah terkait salah produk baru dari Firebase. Saya mau sedikit sharing terkait materi yang saya bawakan di acara tersebut.</p>
<p>Oke langsung saja, saya akan mulai dengan pertanyaan:</p>
<p>Pertama pernah gak teman-teman merasa punya ide inovatif untuk membuat aplikasi <em>web</em> namun tidak memiliki waktu untuk mempelajari bagaimana menyiapkan infrastruktur yang dibutuhkan?</p>
<p>Atau teman-teman merasa ingin berinovasi dengan cepat namun terhambat oleh proses deploy yang masih manual dan tidak efisien?</p>
<p>Jika teman-teman merasakan hal tersebut, saya akan memperkenalkan <strong>Firebase App Hosting</strong> untuk teman-teman. "<strong><em>The next generation of serverless web hosting with</em> Google</strong>"</p>
<p>Seperti yang kita tahu akhir-akhir ini <em>fullstack framework</em> Javascript cukup banyak digunakan seperti <strong>Angular</strong> dan <strong>Next.js</strong>. Dimana kita dapat memanfaatkan <em>benefits</em> dari <em>server-side-rendering</em> dari Javascript dengan mudah. Misalnya untuk meningkatkan <em>SEO</em> (<em>search engine optimization</em>) atau untuk meningkatkan <em>load time</em> dari aplikasi kita.</p>
<p>Untuk itu kita butuh lebih dari sekedar <em>CDN</em> (<em>Content Delivery Network</em>). Kita butuh sebuah <em>backend</em> karena <em>fullstack framework</em> seperti Next.js dan Angular menggabungkan antara <em>backend</em> dan <em>frontend</em> sekaligus. Maka dari itu kita perlu menyiapakan infrastruktur. Tetapi menyiapkan infrastruktur yang dibutuhkan dan kapan kita membutuhkannya terkadang menjadi hal yang memusingkan dan cukup memakan waktu.</p>
<p><strong>Firebase App Hosting</strong> hadir untuk menyelesaikan masalah tersebut. "<strong><em>The new home for full-stack</em> Angular <em>and</em> Next.js <em>apps on</em> Google</strong>".</p>
<p>Firebase App Hosting akan secara otomatis menyiapakan infrastruktur yang diperlukan dan menyajalankan aplikasi kita secara otomatis.</p>
<p><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUduRMQs8rGNg8iEPF85AgoQa_bhGiToND0Fw0NYUhHOzMYeyLFWal_ULsjK9H9xVDA2aPXRCjzX9Da6PWME_V27jls24-09pgQyCg-ONTBWnEmsjgoJjW02dC89gkPTv4AVycEJkyyA2rhrZpIcAw1rtJuHnmw=nw?key=E3PGEb2_FMe1HCzpsBT8IQ" alt /></p>
<p>Firebase App hosting menyerderhanakan proses implementasi dari Github ke Google Cloud. Mulai dari membuat aset statis pada Google Cloud Build, lalu mengimplementasikan konten yang dinamis pada Google Cloud Run dan menyeajikan konten yang disimpan pada cache dalam Google Cloud CDN. Jadi kita cukup <em>push</em> kode kita ke Github, Firebase App Hosting akan menyelesaikan sisanya.</p>
<h3 id="heading-deploy-a-nextjs-app-with-firebase-app-hosting">Deploy a NextJS App with Firebase App Hosting</h3>
<p>Sekarang pertanyaannya bagaimna melakukan deploy ke Firebase App Hosting dan serumit apa prosesnya. Kita akan coba bahas pada sesi ini.</p>
<p>Jadi untuk men-<em>deploy</em> aplikasi Next.js ke Firebase App Hosting ada beberapa langkah yang perlu kita lakukan.</p>
<ol>
<li><p><strong>Download source code Next.js</strong></p>
<p> Untuk men-<em>download</em> <em>project</em> Next.js kita bisa menggunakan perintah:</p>
<pre><code class="lang-bash"> npx create-next-app@latest
</code></pre>
</li>
<li><p><strong>Pergi ke Firebase Console</strong></p>
<p> Untuk pergi ke Firebase Console kamu bisa mengunjungi link berikut: <a target="_blank" href="https://console.firebase.google.com/">https://console.firebase.google.com/</a></p>
<p> Lalu masuk menu App Hosting pada bagian side bar seperti pada gambar dibawah dan kita bisa masuk ke bagian "<strong><em>Get started</em></strong>".</p>
<p> <img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUciOoQzp4nopizA0KJEcLAKpSxYrHtMRfvDg2YIgj6EMmjCMIFEQEo3mGIEhB0koTmvop6vjz1pu5gve2Z43HcvOshuLXZoQnd0btNzy8CaBC_FNCyWoNsxNS02mNlpPwCkoaL6B_2jz7mA_TH8K2P1un5QDSE=nw?key=E3PGEb2_FMe1HCzpsBT8IQ" alt /></p>
<p> <em>Note: Untuk menggunakan Firebase App Hosting kita perlu meng-upgrade pricing plan aplikasi kita jadi "Blaze"</em></p>
</li>
<li><p><strong><em>Set up</em> App Hosting</strong></p>
<p> Pada bagian <em>set up</em> App Hosting ada tiga langkah yang harus kita lakukan yaitu:</p>
<ol>
<li><p><strong><em>Import</em> <em>a</em> Github <em>repositoy</em></strong></p>
<p> Pada step ini kita diminta menghubungkan Firebase App Hosting dengan akun Github kita.</p>
<p> <img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUdJ6qo0fOhP1Ig-UHMldl-C1vDYtI8icoww1VlxJbVwbHQLmSe8H_5sQ8SDtUxJM_JSHADUsWD2g-2evt2X-1-by_EfxD15mzBFRhlP8IR7djvowXrjHqHHc5AbT-4h8IE3IXUXtecK-o0biu6tTRCs9KxU06X-=nw?key=E3PGEb2_FMe1HCzpsBT8IQ" alt /></p>
<p> Setelah tehubung kita <em>import repository</em> yang ingin kita <em>deploy</em>, seperti gambar dibawah:</p>
<p> <img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUd7AFfe_j_E2LWWlbzoW0P5CkQz-yQLDA1jB9ebNl1FT_tZoxOsdDIz7GPT_TThl037pkI_GMYztbKAwBWwetiqnUmDL0MYPgeTk9cwxi8Q8AOgbMKn8okZ9I4Dpl4KxewsrFrsJ_w09UylPTFvuFdpk6qxj-Zw=nw?key=E3PGEb2_FMe1HCzpsBT8IQ" alt /></p>
</li>
<li><p><strong><em>Deployment settings</em></strong></p>
<p> Pada step kedua ini kita akan melakukan <em>deployment setting</em> dimana kita perlu menentukan <em>root directory</em> dan memilih <em>branch</em> dari <em>repository</em> kita yang ingin kita <em>deploy</em>.</p>
<p> Pada step ini juga terdapat fitur <em>automatic rollout.</em> Kita bisa mengaktifkannya atau tidak. Ketika fitur ini aktif maka setiap ada perubahan pada <em>branch</em> yang kita pilih maka Firebase App Hosting akan melakukan proses <em>redeploy</em>. Untuk lebih jelasnya bisa lihat gambar dibawah:</p>
<p> <img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUdZjJianR6flG17-ilcPcqslDxDh9HSu0ttXguT-cuZtUPR9UqZdGkLlVKPuMsVfWWr_kitVS6h2RoifJb0I4RrD-Pn0RMVBxsbO43OeMPh36ZaLmrO8_TWyY6tLgGCgeGvo8cT6roBPbq5uGwKBr2ZVHUqc3g=nw?key=E3PGEb2_FMe1HCzpsBT8IQ" alt /></p>
</li>
<li><p><strong><em>Name your backend</em></strong></p>
<p> Pada step ketiga atau terakhir kita diminta untuk memberikan nama dari aplikasi <em>backend</em> kita. Firebase App Hosting akan membuatkan <em>server</em> untuk aplikasi <em>backend</em> kita secara otomatis pada layanan Google Cloud.</p>
<p> <img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUc9AHVu9VYq2M81xq0IpIlHakhAgoJriaUB-cWwJ2eUmwr-kpWRJvlp-r7VVtCI6HmpAI5FvzMXlmrOcMURnCp_KBMjUI6CQd6BH8k_9BJzhCpV_bMZrvHiQREEQLdTREn05QFc5ezOWY8CKDTknJsLzJynC4va=nw?key=E3PGEb2_FMe1HCzpsBT8IQ" alt /></p>
</li>
</ol>
</li>
</ol>
<p>    Setelah setupnya selesai kita bisa menekan tombol "<strong><em>Finish and Deploy</em></strong>*"* untuk memproses <em>deployment</em> kita. Firebase App Hosting akan menyiapakan infrasktuktur aplikasi kita secara otomatis baik untuk <em>frontend</em> ataupun <em>backend</em>.</p>
<ol start="4">
<li><p><strong>Dashboard Firebase App Hosting</strong></p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724423501431/2af1e4b2-c66b-41e1-a688-ca745f708c1c.png" alt class="image--center mx-auto" /></p>
<p> Setelah proses deploy selesai kita bisa masuk ke <em>dashboard</em> aplikasi kita di Firebase App Hosting untuk melihat informasi dan fitur apa aja yang ada disana. Kurang lebih tapilannya seperti gambar diatas.</p>
<p> Disini kita lihat pada <em>dahsboard</em> Firebase App Hosting terdapat dua section, yaitu:</p>
<ol>
<li><p><strong><em>Current rollout</em></strong></p>
<p> Pada <em>section current rollout</em> terdapat informasi git dan <em>commit</em> terakhir, <em>domain</em>, <em>manage domain</em> dan masuk ke Google Cloud Run Log dan Metrics untuk melihat kesehatan dari aplikasi kita.</p>
</li>
<li><p><strong><em>Rollout History</em></strong></p>
<p> Pada <em>section rollout history</em> kita dapat melihat riwayat peluncuran dari apalikasi kita.</p>
<p> Di Firebase App Hosting sendiri proses peluncurannya terdapat dua tahap yaitu <em>build</em> dan <em>deploy</em>, yang akan kita bahas pada bagian berikutnya.</p>
</li>
</ol>
</li>
<li><p><strong>Rollout Process</strong></p>
<p> Proses <em>rollout</em> pada Firebase App Hosting terdapat dua step yaitu:</p>
<ol>
<li><p><strong><em>Build</em></strong></p>
<p> <img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUeOrHLNNACYluPbqFl1nkBa8ztgEwy6zgAzjq0xhw-4D-Q3cwqdGRnGsRs0FsIE29-d6IDXYrQA_ZBpcddo8GtH6RQ45MPXokRvZb7_vJU1mx39rGjHyxhwV9Lj6qYpsEpE7Wg-1hbySO0HQoCqZIdZAynitFtg=nw?key=E3PGEb2_FMe1HCzpsBT8IQ" alt /></p>
<p> Pada proses <em>build</em> ini, Firebase App Hosting akan meminta Google Cloud Build Job mengenerate ases statis dan membuat <em>container image</em> untuk Google Coud Run.</p>
</li>
<li><p><strong><em>Deploy</em></strong></p>
<p> <img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUen9GvGrI57RVr-b8lRjw7rrGn16DKphdyiFitmR6lfEnLwVWn5Lt87qnY1sGIde4sxg_qoh7Fe7HheAaUHKAF1SMlrn2StEGih3KWb7ZBmNYkdbz9RWyjQmv-lry3uWVjGm0kMjSil_pUNVFI1NtK7qDgUJqMl=nw?key=E3PGEb2_FMe1HCzpsBT8IQ" alt /></p>
<p> Setelah proses <em>build</em> selesai akan masuk ke proses berikutnya yaitu <em>deploy</em>. Pada tahap ini Firebase App Hosting akan membuat Google Coud Run Revision dengan image yang dibuat pada proses <em>build</em>. Lalu mengaktifkan trafik. Jika ada trafik yang masuk dan proses <em>deploy</em>-nya sudah selesai maka trafiknya akan secara otomatis diarahkan ke deploy yang terbaru sehingga memperkecil kemungkinan <em>downtime</em>.</p>
</li>
</ol>
</li>
</ol>
<p>    <img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUdiimrGYRLZdTPlTiJGd1B6Ec5BWQi3DiTi9Ur-9irqvP67CTkISM8Eq3Ug28Ja4KgDbjqFUMDLjml-dQc8AmjENV80X3ZGAc8WXiPKl1akDqNPO6JNh6e0MsK7nLjaEciNUUjea7CayFyGnRX1uOdRiQRdaI0=nw?key=E3PGEb2_FMe1HCzpsBT8IQ" alt /></p>
<p>    Sekali lagi pada Firebase App Hosting proses <em>rollout</em> dikaitkan dengan Google Cloud Build Job dan Google Cloud Run Revision.</p>
<p>    Tetapi Ketika kita menggunakan serverless, ada satu hal yang menantang yaitu mencari tahu dimana ketika terjadi kesalahan. Apalagi jika kita tida memiliki visibilitas pada backend tentu akan sulit untuk menemukannya.</p>
<p>    Firebase App Hosting hadir dengan konsep yang namanya "<em>Just the right level</em></p>
<p>    <em>of abstraction</em>". Dimana kita dapat masuk ke Google Cloud Build dan Google Cloud Run Revision untuk mengetahui apa yang terjadi dibelakang layar untuk setiap tollout. Misalnya kita bisa mencari tahu diamana dan bagaimana aplikasi kita dijalankan. Kita juga dapat melihat runtime configuration seperti informasi CPU boost, minimun instance yang aktif dimana ini dapat scale up dan scale down secara otomatis sesuai permintaan. Dan kita dapat melakukan konfigurasi dalam bentuk yml.</p>
<ol start="6">
<li><p><strong>Recap</strong></p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724914194424/e6ad803a-25f5-4bb4-b4ff-5dfcf2ad2983.png" alt class="image--center mx-auto" /></p>
<p> Untuk rangkuman bagaimana melakaukan <em>deploy</em> aplikasi Nextjs ke Firebase App Hosting kurang lebih seperti ini:</p>
<ol>
<li><p>Pertama kita buat aplikasi Nextjs-nya dengan menjalankan perintah <code>npx create-next-app</code></p>
</li>
<li><p>Kita hubungkan Firebase App Hosting dengan akun Github kita lalu import repo yang ingin kita deploy</p>
</li>
<li><p>Setelah repo kita ter-<em>import</em> ke Firebase App hosting, Firebase App Hosting akan menyiapkan infranstruktur yang dibutuhkan dan menjalankan aplikasi kita secara otomatis.</p>
</li>
<li><p>Kita juga dapat melihat build logs dan status backend dari aplikasi kita secara transparan.</p>
</li>
<li><p>Yang terakhir kita dapat melakukan custom domain dan mendapatkan sertifikat SSL secara gratis.</p>
</li>
</ol>
</li>
</ol>
<h3 id="heading-optimized-for-modern-full-stack-frameworks">Optimized for Modern, Full-stack frameworks</h3>
<p>Jika teman-teman pengguna lama Firebase tentu teman-teman kenal dengan Firebase Hosing. Yaitu layanan dari Firebase yang bisa kita gunakan untuk men-deploy static website.</p>
<p>Sekarang pertanyaannya apakah Firebase App Hosting ini akan menggantikan Firebase Hosting? Jawabannya adalah tidak.</p>
<p>Firebase App Hosting hadir bukan untuk menggantikan Firebase Hosting tetapi untuk mengisi gap tertentu.</p>
<p>Firebase App Hosting hadir untuk mengoptimalkan aplikasi fullstack framework yang memerlukan backend seperti Next.js dan Angular.</p>
<h3 id="heading-founding-principles">Founding Principles</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1725530302111/9df5d416-4901-4850-998d-2fa123f6f935.png" alt class="image--center mx-auto" /></p>
<p>Pada sesi ini kita akan membahas tentang prinsip dari Firebase App Hosting. Ada empat prinsip dari Firebase App Hoshting dan kita akan coba bahas satu per satu.</p>
<ol>
<li><p><strong><em>Full-stack</em></strong></p>
<p> Firebase App Hosting di-<em>design</em> untuk me-<em>manage</em> semuanya dari Content Delivery Network (CDN) ke server-side-rendering (SSR).</p>
<p> Firebase App Hosting tidak hanya mendukung pengalihan <em>traffic</em> ke <em>backend</em> tetapi akan menglola aplikasi <em>backend</em> kita sepenuhnya sesuai standarisasi layanan Google Cloud.</p>
<p> Dimana layanan dari Google Cloud Run akan secara otamatis meningkatkan backend kita sesuai kebutuhan dan akan diturunkan ke 0 atau idle ketika tidak ada traffic. Hal tersebut bagus untuk menghemat <em>cost</em>.</p>
</li>
<li><p><strong><em>Framework Aware</em></strong></p>
<p> Prinsip kedua dari Firebase App Hosting ini adalah "<strong><em>Framework Aware</em></strong>". Dimana <em>build pack</em> dari Firebase App Hosting di-design dapat mengenali kode yang kita gunakan baik menggunakan Next.js maupun Angular.</p>
<p> Firebase App Hosting juga dapat men-<em>deploy</em> dan menjalankan aplikasi kita secara otomatis sesuai dengan kode yang kita gunakan. Untuk saat ini yang baru di-<em>support</em> Next.js dan Angular.</p>
</li>
<li><p><strong><em>Git-centric</em></strong></p>
<p> Firebase App Hosting dirancang berdasarkan <em>Continuous Integration</em> dan <em>Continuous Delivery</em> (CI/CD) pada Github. Jadi penggunaanya cukup mudah. Setelah kita meng-install atau mengintegrasikan Firebase App Hosting dengan akun Github kita, implementasinya semudah melakukan git push.</p>
<p> Kita bisa menjadi pengguna Firebase App Hosting tanpa perlu meng-<em>install</em> Firebase CLI di komputer kita.</p>
<p> Kita juga dapat melihat status <em>development</em> dan <em>deployment</em> dari aplikasi kita. Selain itu kita juga dapat melihat peluncuran atau <em>rollout</em> dan dapat melacak setiap versi dari aplikasi kita.</p>
<p> Firebase App Hosting dapat melihat <em>commit</em> baru sesuai kebijakan deploy yang kita buat. Dan akan men-<em>deploy</em> secara otomatis menggunakan Google Cloud Build.</p>
</li>
<li><p><strong><em>Modern Architecture</em></strong></p>
<p> Prinsip yang keempat dari Firebase App Hosting adalah "<strong><em>Modern Architecture</em></strong>" yang artinya layanan Firebase App Hosting sepenuhnya bersifat regional.</p>
<p> Seluruh layanan Firebase App Hosting diisolasi berdasarkan wilayah <em>backend</em> dari aplikasi kita. Kegagalan disuatu <em>region</em> tidak akan berpengaruh ke <em>region</em> lainnya. Bahkan dalam 1 <em>region</em> dibagi lagi ke beberapa bagian dengan menggunakan layanan dari Google Cloud Load Balancear dan CDN.</p>
</li>
</ol>
<h3 id="heading-benefits">Benefits</h3>
<p>Ada beberapa hal yang ditawarkan oleh Firebase App Hosting yang mungkin bisa menjadi pertimbangan teman-teman sebelum menggunakan layanan dari Firebase App Hosting.</p>
<ol>
<li><p><strong><em>Scalabel</em></strong></p>
<p> Layanan dari Firebase App Hosting cukup <em>flexible</em>. Dimana Firebase App Hosting dapat melakukan <em>scale up</em> dan <em>scale down</em> infrastruktur <em>backend</em> aplikasi kita secara otomatis sesuai kebutuhan.</p>
</li>
<li><p><strong><em>Flexible</em></strong></p>
<p> Firebase App Hosting menawarkan flexibilitas yang cukup tinggi. Dimana memberikan kita kemampuan untuk melihat ke layanan dari Google Cloud, jadi kita dapat membangun infrastruktur aplikasi kita sesuai dengan kebutuhan.</p>
</li>
<li><p><strong>Secure</strong></p>
<p> Firebase App Hosting juga menawarkan keamanan yang cukup tinggi karena didukung oleh layanan Google Cloud. Dan Firebase App Hosting membantu memastikan aplikasi kita memenuhi standar keamanan dan kepatuhan dari layanan Google Cloud.</p>
</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[Panduan Lengkap Menginstall Certbot di Ubuntu]]></title><description><![CDATA[Certbot adalah alat yang memudahkan pengelolaan sertifikat SSL/TLS dari Let's Encrypt. Dalam panduan ini, kita akan belajar langkah-langkah untuk menginstal Certbot di Ubuntu dan mendapatkan sertifikat SSL/TLS.
Persiapan AwalSebelum menginstal Certbo...]]></description><link>https://ajatdarojat45.id/cara-menginstall-certbot-pada-ubuntu</link><guid isPermaLink="true">https://ajatdarojat45.id/cara-menginstall-certbot-pada-ubuntu</guid><category><![CDATA[snapd]]></category><category><![CDATA[certbot]]></category><category><![CDATA[nginx]]></category><category><![CDATA[Ubuntu]]></category><category><![CDATA[SSL Certificate]]></category><category><![CDATA[SSL/TLS]]></category><category><![CDATA[server]]></category><category><![CDATA[deployment]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Sat, 20 Jul 2024 13:50:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/XJXWbfSo2f0/upload/8044e5552da08e7ad26f8f12b7db7409.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><code>Certbot</code> adalah alat yang memudahkan pengelolaan sertifikat <code>SSL/TLS</code> dari <code>Let's Encrypt</code>. Dalam panduan ini, kita akan belajar langkah-langkah untuk menginstal <code>Certbot</code> di Ubuntu dan mendapatkan sertifikat <code>SSL/TLS</code>.</p>
<p><strong>Persiapan Awal</strong><br />Sebelum menginstal <code>Certbot</code>, pastikan sistem <code>Ubuntu</code> kita sudah diperbarui dan siap untuk menginstal <em>dependencies</em> yang diperlukan.</p>
<blockquote>
<p>Pastikan <code>Nginx</code> sudah terinstal dan ada <code>domain</code> yang sudah terknfigurasi pada server kamu. <em>Untuk menginstal</em><code>Nginx</code><em>dan mengkonfigurasi</em><code>domain</code><em>pada</em><code>Ubuntu</code><em>kamu bisa membaca artikel</em> <a target="_blank" href="https://ajatdarojat45.id/cara-port-forwarding-menggunakan-nginx-di-ubuntu"><em>berikut</em></a><em>.</em></p>
</blockquote>
<pre><code class="lang-bash">sudo apt update
sudo apt upgrade
</code></pre>
<p><strong>Menginstal Certbot</strong><br />Langkah pertama adalah menginstal <code>Certbot</code> menggunakan <code>snapd</code>:</p>
<pre><code class="lang-bash">sudo apt install snapd
</code></pre>
<p>Setelah <code>snapd</code> terinstal jalankan perintah berikut untuk mengintall <code>Certbot</code> pada mesin kita:</p>
<pre><code class="lang-bash">sudo snap install --classic certbot
</code></pre>
<p>Jalankan perintah berikut untuk memastikan perintah <code>certbot</code> dapat berjalan:</p>
<pre><code class="lang-bash">sudo ln -s /snap/bin/certbot /usr/bin/certbot
</code></pre>
<p><strong>Mendapatkan Sertifikat SSL</strong><br />Setelah <code>Certbot</code> terinstal, kita bisa mendapatkan sertifikat <code>SSL</code> untuk domain kita.</p>
<pre><code class="lang-bash">sudo certbot --nginx -d example.com
</code></pre>
<p>Gantilah <code>example.com</code> dengan nama domain kamu. <code>Certbot</code> akan secara otomatis mengonfigurasi <code>Nginx</code> untuk menggunakan sertifikat <code>SSL</code>.</p>
<blockquote>
<p>Pastikan <code>Nginx</code> sudah terinstal dan ada <code>domain</code> yang sudah terknfigurasi pada server kamu. <em>Untuk menginstal</em><code>Nginx</code><em>dan mengkonfigurasi</em><code>domain</code><em>pada</em><code>Ubuntu</code><em>kamu bisa membaca artikel</em> <a target="_blank" href="https://ajatdarojat45.id/cara-port-forwarding-menggunakan-nginx-di-ubuntu"><em>berikut</em></a><em>.</em></p>
</blockquote>
<p><strong>Memeriksa Instalasi</strong><br />Pastikan sertifikat <code>SSL</code> berfungsi dengan benar dengan membuka situs web Anda di browser dan memeriksa ikon kunci di bagian alamat.</p>
<p><strong>Sumber</strong></p>
<ul>
<li><p><a target="_blank" href="https://ajatdarojat45.id/cara-port-forwarding-menggunakan-nginx-di-ubuntu">https://ajatdarojat45.id/cara-port-forwarding-menggunakan-nginx-di-ubuntu</a></p>
</li>
<li><p><a target="_blank" href="https://certbot.eff.org/instructions?ws=nginx&amp;os=ubuntufocal">https://certbot.eff.org/instructions?ws=nginx&amp;os=ubuntufocal</a></p>
</li>
<li><p><a target="_blank" href="https://snapcraft.io/docs/installing-snap-on-ubuntu">https://snapcraft.io/docs/installing-snap-on-ubuntu</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Bagaimana Menggunakan Generics pada TypeScript]]></title><description><![CDATA[Selamat datang pada pembahasan Typescript! Hari ini, kita akan mempelajari generik, sebuah feature di Typescript yang powerful yang memungkinkan kita untuk membuat kemponen yang dapat digunakan kembali. Generik memberikan sebuah cara untuk membuat ko...]]></description><link>https://ajatdarojat45.id/generik-pada-typescript</link><guid isPermaLink="true">https://ajatdarojat45.id/generik-pada-typescript</guid><category><![CDATA[TypeScript]]></category><category><![CDATA[generics]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Thu, 18 Jul 2024 14:24:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/NH0pmKaZeuk/upload/4033f9fd108d3a6d0bacdbe06c2db4f8.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Selamat datang pada pembahasan Typescript! Hari ini, kita akan mempelajari <code>generik</code>, sebuah feature di Typescript yang powerful yang memungkinkan kita untuk membuat kemponen yang dapat digunakan kembali. Generik memberikan sebuah cara untuk membuat komponen-komponen yang berkerja dengan banyak tipe data dan memberikan kemanan tipe pada saat yang bersamaan.</p>
<h3 id="heading-1-perkenalan-generik">1. Perkenalan Generik</h3>
<p>Generik memungkinkan kita untuk menulis fungsi, kelas dan <em>interface</em> yang fleksibel dan dapat digunakan berulang-ulang. Generik memungkinkan kita membuat komponen-komponen yang dapat bekerja dengan banyak tipe data tanpa kehilangan informasi tipenya.</p>
<p><strong>Fungsi Generik Dasar</strong></p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">identity</span>&lt;<span class="hljs-title">T</span>&gt;(<span class="hljs-params">arg: T</span>): <span class="hljs-title">T</span> </span>{
  <span class="hljs-keyword">return</span> arg;
}

<span class="hljs-keyword">let</span> output1 = identity&lt;string&gt;(<span class="hljs-string">"myString"</span>); <span class="hljs-comment">// Output: "myString"</span>
<span class="hljs-keyword">let</span> output2 = identity&lt;number&gt;(<span class="hljs-number">42</span>); <span class="hljs-comment">// Output: 42</span>
</code></pre>
<p>Pada contoh ini, <code>T</code> adalah tipe parameter yang bertindak sebagai sebuah <em>placeholder</em> untuk tipe yang asli. Ketika fungsinya dipanggil, tipe parameternya telah diganti dengan tipe yang diberikan.</p>
<h3 id="heading-2-fungsi-generik">2. Fungsi Generik</h3>
<p>Kita dapat membuat fungsi generik yang bekerja dengan banyak tipe data. Ini berguna khususnya untuk fungsi yang bekerja dengan <em>array</em> atau koleksi.</p>
<p><strong>Contoh: Fungsi Generik</strong></p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">loggingIdentity</span>&lt;<span class="hljs-title">T</span>&gt;(<span class="hljs-params">arg: T[]</span>): <span class="hljs-title">T</span>[] </span>{
  <span class="hljs-built_in">console</span>.log(arg.length); <span class="hljs-comment">// Array has a `.length` property</span>
  <span class="hljs-keyword">return</span> arg;
}

<span class="hljs-keyword">let</span> stringArray = loggingIdentity&lt;string&gt;([<span class="hljs-string">"Alice"</span>, <span class="hljs-string">"Bob"</span>, <span class="hljs-string">"Charlie"</span>]);
</code></pre>
<p>Disini, fungsi <code>loggingIdentity</code> bekerja dengan sebuah <em>array</em> dari semua tipe <code>T</code>. Tipe <em>array</em> ditentukan ketika fungsinya dipanggil.</p>
<h3 id="heading-3-kelas-generik">3. Kelas Generik</h3>
<p>Generik dapat digunakan untuk membuat kelas yang bekerja dengan berbagai tipe. Ini berguna untuk struktur data seperti <em>stacks</em>, <em>queues</em> atau <em>linked lists</em>.</p>
<p><strong>Contoh: Kelas Generik</strong></p>
<pre><code class="lang-javascript"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">GenericNumber</span>&lt;<span class="hljs-title">T</span>&gt; </span>{
  <span class="hljs-attr">zeroValue</span>: T;
  add: <span class="hljs-function">(<span class="hljs-params">x: T, y: T</span>) =&gt;</span> T;

  <span class="hljs-keyword">constructor</span>(zeroValue: T, addFunction: (x: T, y: T) =&gt; T) {
    <span class="hljs-built_in">this</span>.zeroValue = zeroValue;
    <span class="hljs-built_in">this</span>.add = addFunction;
  }
}

<span class="hljs-keyword">let</span> myNumber = <span class="hljs-keyword">new</span> GenericNumber&lt;number&gt;(<span class="hljs-number">0</span>, <span class="hljs-function">(<span class="hljs-params">x, y</span>) =&gt;</span> x + y);
<span class="hljs-built_in">console</span>.log(myNumber.add(<span class="hljs-number">5</span>, <span class="hljs-number">10</span>)); <span class="hljs-comment">// Output: 15</span>

<span class="hljs-keyword">let</span> myString = <span class="hljs-keyword">new</span> GenericNumber&lt;string&gt;(<span class="hljs-string">""</span>, <span class="hljs-function">(<span class="hljs-params">x, y</span>) =&gt;</span> x + y);
<span class="hljs-built_in">console</span>.log(myString.add(<span class="hljs-string">"Hello, "</span>, <span class="hljs-string">"world!"</span>)); <span class="hljs-comment">// Output: "Hello, world!"</span>
</code></pre>
<p>Pada contoh ini, kelas <code>GenericNumber</code> bekerja dengan berbagai tipe <code>T</code>. Tipenya dispesifikasikan ketika sebuah <em>instance</em> dari kelas dibuat.</p>
<h3 id="heading-4-constraints-generik">4. <em>Constraints</em> Generik</h3>
<p>Terkadang, kita perlu untuk membatasi tipe-tipe yang dapat digunakan dengan generik. Kita dapat mencapainya dengan constraints.</p>
<p><strong>Contoh: <em>Constraints</em> Generik</strong></p>
<pre><code class="lang-javascript">interface Lengthwise {
  <span class="hljs-attr">length</span>: number;
}

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">loggingIdentityWithConstraint</span>&lt;<span class="hljs-title">T</span> <span class="hljs-title">extends</span> <span class="hljs-title">Lengthwise</span>&gt;(<span class="hljs-params">arg: T</span>): <span class="hljs-title">T</span> </span>{
  <span class="hljs-built_in">console</span>.log(arg.length); <span class="hljs-comment">// Now we know it has a `.length` property</span>
  <span class="hljs-keyword">return</span> arg;
}

loggingIdentityWithConstraint({ <span class="hljs-attr">length</span>: <span class="hljs-number">10</span>, <span class="hljs-attr">value</span>: <span class="hljs-number">42</span> }); <span class="hljs-comment">// Works</span>
<span class="hljs-comment">// loggingIdentityWithConstraint(42); // Error: Argument of type 'number' is not assignable to parameter of type 'Lengthwise'.</span>
</code></pre>
<p>Disini, tipe <em>generic</em> <code>T</code> telah dibatasi untuk tipe-tipe yang memiliki properti <code>length</code>.</p>
<h3 id="heading-5-menggunakan-beberapa-parameter-tipe">5. Menggunakan Beberapa Parameter Tipe</h3>
<p>Generik dapat juga menggunakan beberapa parameter tipe untuk membuat tipe-tipe yang lebih fleksibel dan kompleks.</p>
<p><strong>Contoh: Beberapa Parameter Tipe</strong></p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">merge</span>&lt;<span class="hljs-title">T</span>, <span class="hljs-title">U</span>&gt;(<span class="hljs-params">obj1: T, obj2: U</span>): <span class="hljs-title">T</span> &amp; <span class="hljs-title">U</span> </span>{
  <span class="hljs-keyword">return</span> { ...obj1, ...obj2 };
}

<span class="hljs-keyword">let</span> mergedObject = merge({ <span class="hljs-attr">name</span>: <span class="hljs-string">"Alice"</span> }, { <span class="hljs-attr">age</span>: <span class="hljs-number">25</span> });
<span class="hljs-built_in">console</span>.log(mergedObject); <span class="hljs-comment">// Output: { name: "Alice", age: 25 }</span>
</code></pre>
<p>Pada contoh ini, fungsi <code>merge</code> menerima 2 tipe objek yang berbeda dan menggabungkannya menjadi satu.</p>
<h3 id="heading-6-interfaces-generik">6. <em>Interfaces</em> Generik</h3>
<p><em>Interfaces</em> dapat juga menggunakan generics untuk membuat kontrak untuk fungsi, kelas dan objek yang fleksibel dan dapat digunakan kembali.</p>
<p><strong>Contoh: <em>Interfaces</em> Generik</strong></p>
<pre><code class="lang-javascript">interface KeyValuePair&lt;K, V&gt; {
  <span class="hljs-attr">key</span>: K;
  value: V;
}

<span class="hljs-keyword">let</span> kvp: KeyValuePair&lt;string, number&gt; = { <span class="hljs-attr">key</span>: <span class="hljs-string">"age"</span>, <span class="hljs-attr">value</span>: <span class="hljs-number">30</span> };
<span class="hljs-built_in">console</span>.log(kvp); <span class="hljs-comment">// Output: { key: "age", value: 30 }</span>
</code></pre>
<p>Disini, <em>interface</em> <code>keyValuePair</code> menerima dua parameter, <code>K</code> dan <code>V</code>, membuat sebuah generik <em>interface</em>.</p>
<h3 id="heading-7-parameter-tipe-bawaan">7. Parameter Tipe Bawaan</h3>
<p>Kita dapat memberikan tipe bawaan untuk generik kit, membuat opsi generik ketika memanggil fungsi atau membuat sebuah <em>instance</em> dari sebuah kelas.</p>
<p><strong>Contoh: Parameter Tipe Bawaan</strong></p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">createArray</span>&lt;<span class="hljs-title">T</span> = <span class="hljs-title">string</span>&gt;(<span class="hljs-params">length: number, value: T</span>): <span class="hljs-title">T</span>[] </span>{
  <span class="hljs-keyword">return</span> <span class="hljs-built_in">Array</span>(length).fill(value);
}

<span class="hljs-keyword">let</span> stringArray = createArray(<span class="hljs-number">3</span>, <span class="hljs-string">"hello"</span>);
<span class="hljs-keyword">let</span> numberArray = createArray&lt;number&gt;(<span class="hljs-number">3</span>, <span class="hljs-number">42</span>);
<span class="hljs-built_in">console</span>.log(stringArray); <span class="hljs-comment">// Output: ["hello", "hello", "hello"]</span>
<span class="hljs-built_in">console</span>.log(numberArray); <span class="hljs-comment">// Output: [42, 42, 42]</span>
</code></pre>
<p>Pada contoh ini, jika tipe tidak diberikan, maka type <code>string</code> bawaan akan digunakan.</p>
<h3 id="heading-8-constraints-dan-keyof-generik">8. Constraints dan keyof Generik</h3>
<p>Menggunakan <code>typeof</code> dengan generik memungkinkan kita untuk membuat fungsi yang beroperasi pada properti-properti objek yang spesifik.</p>
<p><strong>Contoh: <em>Constraints</em> dan</strong> <code>keyof</code> <strong>Generik</strong></p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getProperty</span>&lt;<span class="hljs-title">T</span>, <span class="hljs-title">K</span> <span class="hljs-title">extends</span> <span class="hljs-title">keyof</span> <span class="hljs-title">T</span>&gt;(<span class="hljs-params">obj: T, key: K</span>) </span>{
  <span class="hljs-keyword">return</span> obj[key];
}

<span class="hljs-keyword">let</span> person = { <span class="hljs-attr">name</span>: <span class="hljs-string">"Alice"</span>, <span class="hljs-attr">age</span>: <span class="hljs-number">25</span> };
<span class="hljs-keyword">let</span> name = getProperty(person, <span class="hljs-string">"name"</span>); <span class="hljs-comment">// Output: "Alice"</span>
<span class="hljs-keyword">let</span> age = getProperty(person, <span class="hljs-string">"age"</span>); <span class="hljs-comment">// Output: 25</span>
<span class="hljs-comment">// let unknown = getProperty(person, "unknown"); // Error: Argument of type '"unknown"' is not assignable to parameter of type 'keyof { name: string; age: number; }'.</span>
</code></pre>
<p>Disini, fungsi <code>getProperty</code> menerima sebuah object <code>T</code> dan key <code>K</code> yang harus menjadi sebuah <code>key</code> dari <code>T</code>. Ini memastikan keamanan tipe.</p>
<h3 id="heading-contoh-kode">Contoh Kode</h3>
<p>Disini sebuah contoh yang mencontohkan penggunaan dari generik pada fungsi, kelas dan <em>interface</em>:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Generic function</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">reverseArray</span>&lt;<span class="hljs-title">T</span>&gt;(<span class="hljs-params">items: T[]</span>): <span class="hljs-title">T</span>[] </span>{
  <span class="hljs-keyword">return</span> items.reverse();
}

<span class="hljs-keyword">let</span> reversedNumbers = reverseArray([<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>]);
<span class="hljs-built_in">console</span>.log(reversedNumbers); <span class="hljs-comment">// Output: [5, 4, 3, 2, 1]</span>

<span class="hljs-comment">// Generic class</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DataStorage</span>&lt;<span class="hljs-title">T</span>&gt; </span>{
  private data: T[] = [];

  addItem(item: T) {
    <span class="hljs-built_in">this</span>.data.push(item);
  }

  removeItem(item: T) {
    <span class="hljs-built_in">this</span>.data = <span class="hljs-built_in">this</span>.data.filter(<span class="hljs-function"><span class="hljs-params">i</span> =&gt;</span> i !== item);
  }

  getItems(): T[] {
    <span class="hljs-keyword">return</span> [...this.data];
  }
}

<span class="hljs-keyword">let</span> textStorage = <span class="hljs-keyword">new</span> DataStorage&lt;string&gt;();
textStorage.addItem(<span class="hljs-string">"Alice"</span>);
textStorage.addItem(<span class="hljs-string">"Bob"</span>);
textStorage.removeItem(<span class="hljs-string">"Alice"</span>);
<span class="hljs-built_in">console</span>.log(textStorage.getItems()); <span class="hljs-comment">// Output: ["Bob"]</span>

<span class="hljs-comment">// Generic interface</span>
interface Pair&lt;T, U&gt; {
  <span class="hljs-attr">first</span>: T;
  second: U;
}

<span class="hljs-keyword">let</span> pair: Pair&lt;string, number&gt; = { <span class="hljs-attr">first</span>: <span class="hljs-string">"Alice"</span>, <span class="hljs-attr">second</span>: <span class="hljs-number">25</span> };
<span class="hljs-built_in">console</span>.log(pair); <span class="hljs-comment">// Output: { first: "Alice", second: 25 }</span>
</code></pre>
<h3 id="heading-rangkuman">Rangkuman</h3>
<p>Hari ini, kita telah mempelajari generics pada Typescript, membahas fungsi, kelas, <em>constraint</em>, multiple parameter tipe, <em>interface</em>, parameter tipe bawaan, dan operator <code>keyof</code> generik.<br />Generik adalah sebuah fitur yang powerfull yang memungkinkan kita membuat komponen yang fleksibel, dapat digunakan kembali dan sebagai keamanan tipe.</p>
<h3 id="heading-sumber">Sumber</h3>
<ul>
<li><a target="_blank" href="https://anuj1.hashnode.dev/generics-in-typescript">https://anuj1.hashnode.dev/generics-in-typescript</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Panduan Lengkap Menangani Submodule Git]]></title><description><![CDATA[Pernah gak mengalami folder di project aplikasi kita menjadi submodule atau isi nya menjadi kosong? seperti gambar pada gambar.

Hal tersebut biasanya terjadi karena subfolder dari directory aplikasi kita terdapat folder .git. Itu yang menyebabkan fo...]]></description><link>https://ajatdarojat45.id/cara-mengatasi-submodule-pada-git</link><guid isPermaLink="true">https://ajatdarojat45.id/cara-mengatasi-submodule-pada-git</guid><category><![CDATA[Git]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[git-submodule]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Wed, 17 Jul 2024 09:26:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/UT8LMo-wlyk/upload/9483b9cba748e7b6da3793a26f7b210f.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Pernah gak mengalami folder di project aplikasi kita menjadi <code>submodule</code> atau isi nya menjadi kosong? seperti gambar pada gambar.</p>
<p><img src="https://i0.wp.com/shunsvineyard.info/wp-content/uploads/2019/12/github_submodule.png?fit=678%2C267&amp;ssl=1" alt="Contoh folder yang menjadi submodule di git" /></p>
<p>Hal tersebut biasanya terjadi karena subfolder dari directory aplikasi kita terdapat folder <code>.git</code>. Itu yang menyebabkan folder/subfolder di directory project kita menjadi submodule.</p>
<p>Berikut cara mengatasi problem folder yang menjadi submodule di git:</p>
<ol>
<li><p>Hapus folder <code>.git</code> didalam folder yang menjadi <code>submodule</code>. Bisa hapus secara manual lewat <code>explorer</code> atau jalankan perintah <code>rm -rf .git</code> di folder yang menjadi <code>submodule</code>.</p>
</li>
<li><p>Hapus cache dengan menjalankan command berikut <code>git rm -r --cached -r .</code></p>
</li>
<li><p>Jalankan perintah <code>git add .</code></p>
</li>
<li><p>Jalankan perintah <code>git commit -m "some commit"</code></p>
</li>
<li><p>Jalankan perintah <code>git push origin master --force</code></p>
</li>
</ol>
<p>Setelah melakukan langkah-langkah di atas silahkan cek kembali folder <code>git</code> yang menjadi <code>submodule</code> tadi.</p>
<p>Selamat mencoba!</p>
]]></content:encoded></item><item><title><![CDATA[Perbedaan 'var', 'let', dan 'const' dalam JavaScript]]></title><description><![CDATA[Jadi jika kamu baru di dunia javascript mungkin kamu akan bertanya-tanya, apa perbedaan antara var, let dan const dan kenapa itu penting? Pada dasarnya mereka itu sama, dengan beberapa kebiasaan yang berbeda. var, let dan const adalah sebuah keyboard...]]></description><link>https://ajatdarojat45.id/perbedaan-var-let-dan-const-dalam-javascript</link><guid isPermaLink="true">https://ajatdarojat45.id/perbedaan-var-let-dan-const-dalam-javascript</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[var let const]]></category><category><![CDATA[variables]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Wed, 17 Jul 2024 09:24:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/ZS67i1HLllo/upload/e10b2e6c5128a8e8249d2f104115a188.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Jadi jika kamu baru di dunia <code>javascript</code> mungkin kamu akan bertanya-tanya, apa perbedaan antara <code>var</code>, <code>let</code> dan <code>const</code> dan kenapa itu penting? Pada dasarnya mereka itu sama, dengan beberapa kebiasaan yang berbeda. <code>var</code>, <code>let</code> dan <code>const</code> adalah sebuah <code>keyboard</code> untuk mendeklarasikan variabel di <code>javascript</code>. Sejak lahirnya <code>javascript</code>, <code>var</code> menjadi <code>method</code> utama untuk mendeklarasikan variabel di <code>javascript</code>, sampai <code>let</code> dan <code>const</code> hadir dengan <code>ES6</code> di tahun 2015.</p>
<p>Petama, mari kita bahas secara terknis dari <code>var</code>, <code>let</code> dan <code>const</code>.</p>
<h2 id="heading-1-var"><strong>1.</strong> <code>var</code></h2>
<h3 id="heading-11-var-memilikin-cakupan-fungsi">1.1. <code>var</code> memilikin cakupan fungsi</h3>
<p>Jika kamu tidak terbiasa dengan <code>javascript scope</code>, <code>scope</code> mengacu pada konteks blok kode, yang menentukan aksesibilitas variabel tertentu. Jika variabel dideklarasikan diluar sebuah fungsi, itu tercakup secara global, artinya bisa di akses dimana aja di kode kamu. berikut adalah case <code>var</code> dalam cakupan fungsi. Lihat contoh di bawah ini.</p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setup</span>(<span class="hljs-params"></span>) </span>{
<span class="hljs-keyword">var</span> x = <span class="hljs-number">16</span>;
<span class="hljs-built_in">console</span>.log(c); <span class="hljs-comment">//output: 16</span>
}
<span class="hljs-built_in">console</span>.log(x); <span class="hljs-comment">//output: x is nor defined</span>
</code></pre>
<p>Dalam contoh diatas, karena <code>x</code> dideklarasikan dalam suatu fungsi, variabel <code>x</code> hanya dapat diakses di dalam fungsi tersebut.</p>
<h3 id="heading-12-var-dapat-di-re-assigned-dan-re-declared">1.2. <code>var</code> dapat di <code>re-assigned</code> dan <code>re-declared</code></h3>
<p><code>var</code> dapat di <code>re-assigned</code> dan bahkan di <code>re-declared</code> tanpa menimbulkan <code>error</code>. mungkin kamu berpikir bahwa kode kita akan menjadi lebih fleksibel, tapi pada kenyataanya, itu akan menumbulkan suatu masalah. Karena <code>var</code> bisa di <code>re-declared</code>, ada kemungkinan kita lupa mendeklarasikan variabel tertentu, dan tidak sengaja mengganti value nya. Ketika aplikasi kita skalanya masih kecil, mungkin kita masih bisa menghindari masalah ini. Namun, saat aplikasi kita sudah mulai besar, <code>best practice</code> nya menggunakan <code>let</code>.</p>
<h2 id="heading-2-let-dan-const">2. <code>let</code> dan <code>const</code></h2>
<p><code>let</code> dan <code>const</code> berprilaku dengan cara yang sangat mirip, dengan satu perbedaan utama. Ayo kita liat pesamaanya dulu.</p>
<h3 id="heading-21-let-dan-const-memiliki-cakupan-blok">2.1. <code>let</code> dan <code>const</code> memiliki cakupan blok</h3>
<p>Dengan <code>let</code> dan <code>const</code>, variable hanya bisa di akses dalam blok dimana mereka didekalrasikan. Jadi mungkin kamu bertanya, apa itu blok?</p>
<blockquote>
<p><strong>Blok</strong> adalah segala sesuatu yang dikelilingi oleh sepasang <code>{}</code> (contoh. <code>For loop</code>, <code>if statement</code>, dll). Lihat contoh di bawah ini.</p>
</blockquote>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">letExample</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">let</span> x = <span class="hljs-number">2</span>;
<span class="hljs-keyword">if</span> (x === <span class="hljs-number">2</span>) {
<span class="hljs-keyword">let</span> y = <span class="hljs-number">6</span>;
<span class="hljs-built_in">console</span>.log(y); <span class="hljs-comment">//output: 6</span>
}
<span class="hljs-built_in">console</span>.log(x); <span class="hljs-comment">//output: 2</span>
<span class="hljs-built_in">console</span>.log(y); <span class="hljs-comment">//output: x is nor defined</span>
}
</code></pre>
<p>Dalam contoh diatas, variabel <code>x</code> dideklarasikan didalam lingkup blok <code>fungsi</code>, yang membuatnya dapat diakses didalam seluruh <code>fungsi</code> itu. Namun, variabel <code>y</code> dideklarasikan di dalam lingkup blok pernyataan <code>if</code>,  membuatnya hanya dapat diakses dalam pernyataan itu, meskipun pernyataan itu ada di dalam <code>fungsi</code>.</p>
<h3 id="heading-22-let-bisa-di-re-assigned-tapi-tidak-bisa-di-re-declared">2.2. <code>let</code> bisa di <code>re-assigned</code> tapi tidak bisa di <code>re-declared</code></h3>
<p><code>let</code> mirip dengan <code>var</code> karena bisa di <code>re-assigned</code>, tapi tidak bisa <code>di re-declared</code>. Ini membantu masalah penimpaan <code>value</code> yang saya sebutkan diatas dengan <code>var</code>. Kita dapat <code>re-assigned</code> variabel <code>let</code> sebanyak yang kita butuhkan, tapi pernyataan aslinya akan selalu sama.</p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">letExample</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">let</span> x = <span class="hljs-number">3</span>;
  x = <span class="hljs-number">6</span>
  <span class="hljs-built_in">console</span>.log(x); <span class="hljs-comment">//output: 6</span>
}
</code></pre>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">letExample</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">let</span> x = <span class="hljs-number">3</span>;
  <span class="hljs-keyword">let</span> x = <span class="hljs-number">8</span>;
  <span class="hljs-built_in">console</span>.log(x); <span class="hljs-comment">//error: variable has already been declare</span>
}
</code></pre>
<h3 id="heading-23-const-tidak-bisa-di-re-assigned-dan-re-declared-agak">2.3. <code>const</code> tidak bisa di <code>re-assigned</code> dan <code>re-declared</code> (agak)</h3>
<p><code>const</code> di <code>javascript</code> secara <code>harfiah</code> berarti <code>konstan</code>. Saat kamu ingin membuat sebuah variabel yang tidak akan pernah berubah didalam kode kamu, kamu bisa menggunakan <code>const</code>. Ini kan membantu <code>readibility</code> kamu dan developer lainnya.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> x = <span class="hljs-number">20</span>;
x = <span class="hljs-number">20</span>;
<span class="hljs-built_in">console</span>.log(x); <span class="hljs-comment">//output: error: assignment to constant variable</span>
</code></pre>
<blockquote>
<p><strong>Note</strong>: Walaupun <code>const</code> tidak bisa di <code>re-assigned</code> dan <code>re-declared</code>, tapi nilainya bisa dimanipulasi. Contohnya, Jika kita me-<code>assigned</code> sebuah <code>object</code> kedalam variabel <code>const</code>, <code>javascript</code> mengizinkan nilai dan properti didalam sebuah <code>object</code> untuk dimanipulasi selama <code>object</code> aslinya tidak di <code>re-assigned</code> ke <code>object</code> baru. Contoh:</p>
</blockquote>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> particle = {<span class="hljs-attr">x</span>: <span class="hljs-number">10</span>, <span class="hljs-attr">y</span>: <span class="hljs-number">20</span>};
particle.x = <span class="hljs-number">50</span>;
<span class="hljs-built_in">console</span>.log(particle); <span class="hljs-comment">//output: {x: 50, y: 10}</span>
particle = {<span class="hljs-attr">x</span>: <span class="hljs-number">20</span>, <span class="hljs-attr">y</span>: <span class="hljs-number">60</span>};
<span class="hljs-built_in">console</span>.log(particle); <span class="hljs-comment">//output: error: assignment to constant variable</span>
</code></pre>
<h2 id="heading-3-catatan">3. Catatan</h2>
<p>Hindari menggunakan <code>var</code>. Jika kamu memiliki sebuat variabel yang <strong>tidak akan pernah berubah</strong>, gunakan <code>const</code>. Jika tidak gunakan <code>let</code>! Saya harap ini membantu kamu mengerti "<strong>apa</strong>" dan "<strong>mengapa</strong>" variabel pada <code>JavaScript</code>!</p>
]]></content:encoded></item><item><title><![CDATA[Cara Menggunakan Optional Chaining di Javascript]]></title><description><![CDATA[Konsep Optional Chaining (?.) yang baru saja diperkenalkan di Javascript ES2020. Versi baru dari Javascript membawa peningkatan pada implementasi saat ini dan membuat hidup kita lebih mudah sebagai developer.

Kalian bisa cek Spesifikasi Bahasa ECMAC...]]></description><link>https://ajatdarojat45.id/optional-chaining-di-javascript</link><guid isPermaLink="true">https://ajatdarojat45.id/optional-chaining-di-javascript</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[Optional chaining]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Wed, 17 Jul 2024 09:21:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/oXlXu2qukGE/upload/bf3d0757353aaf6207e26e7e8d141bde.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Konsep Optional Chaining (<code>?.</code>) yang baru saja diperkenalkan di Javascript ES2020. Versi baru dari Javascript membawa peningkatan pada implementasi saat ini dan membuat hidup kita lebih mudah sebagai developer.</p>
<blockquote>
<p>Kalian bisa cek <a target="_blank" href="https://tc39.es/ecma262/2020/">Spesifikasi Bahasa ECMACript 2020 (ES2020)</a> dan  <a target="_blank" href="https://github.com/tc39/proposal-optional-chaining">TC39 proposal</a> yang baru.</p>
</blockquote>
<p>Di artikel ini, kita kan membahas tentang <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining">Optional Chaining di Javascript</a>.</p>
<p>Apa itu Optional Chaining (<code>?.</code>) di Javascript?</p>
<p>Operator Optional Chaining memungkinkan kita untuk mengakses properti nested obyek, tanpa perlu mengecek apakah obyek parent-nya ada. Jadi, daripada mengembalikan sebuah error, <code>?.</code> akan mengembalikan <code>undefined</code> jika obyek parentnya <code>null</code> atau <code>undefined</code>.</p>
<p>Operator <code>?.</code> bekerja dengan cara yang sama seperti Operator <code>.</code> (chaining). Satu-satunya perbedaan yaitu alih-alih mengembalikan sebuah error jika referensinya <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Glossary/nullish">nullish</a> (<code>null</code> atau <code>undefined</code>), ia akan mengembalikan sebuah nilai <code>undefined</code>.</p>
<p><strong>Syntax</strong></p>
<pre><code class="lang-javascript">object.value?.prop
object.value?.[expr]
object.value?.[index]
object.func?.(args)
</code></pre>
<p><strong>Lihat contoh berikut</strong></p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> userInfo = {
   <span class="hljs-attr">firstName</span>: <span class="hljs-string">'Darsh'</span>,
   <span class="hljs-attr">lastName</span>: <span class="hljs-string">'Shah'</span>,
   <span class="hljs-attr">details</span>: {
      <span class="hljs-attr">bio</span>: <span class="hljs-string">'Auth0 Ambassador | Postman Student Expert | Blogger | Speaker'</span>,
      <span class="hljs-attr">title</span>: <span class="hljs-string">'Software Developer'</span>
   },
   sayHello() {
      <span class="hljs-keyword">return</span> <span class="hljs-string">'Hey there!👋'</span>;
   }
};
</code></pre>
<p>Sekarang bagaimana jika kita melakukan ini?</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> userTitle = userInfo.details &amp;&amp; userInfo.details.title;
</code></pre>
<p>Pertama kita mengecek apakah properti <code>details</code> ada di <code>userInfo</code> dan lalu kita assign <code>title</code> kedalam <code>userTitle</code> jika ia ada. Jika tidak, <code>userTitle</code> akan <code>undefined</code>.</p>
<p>Biasanya, kita menggunakan operator <code>&amp;&amp;</code> untuk menghindari error ketika obyeknya <code>null</code> atau <code>undefined</code>.</p>
<p>Tapi itu membosankan bukan?</p>
<p>Dengan fitur Javascript yang baru, kita bisa menggunakan operator Optional Chaining (<code>?.</code>) untuk membuatnya terlihat lebih clear.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> userTitle = userInfo.details?.title;
</code></pre>
<p>Apakah itu nyata?</p>
<p>Ya, ini akan bekerja dengan cara yang sama seperti yang kita lakukan dengan operator <code>&amp;&amp;</code>.</p>
<p>Yang terjadi adalah, Operator <code>?.</code> akan menghentikan evaluasi jika bagian sebelum <code>?.</code> <code>undefined</code> atau <code>null</code> dan mengembalikan <code>undefined</code> daripada mengembalikan sebuah error.</p>
<p>disini contohnya</p>
<p><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VjAz_wln--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1608201033218/lX19Sro14.png" alt /></p>
<blockquote>
<p>Note: Ini hanya akan bekerja di properti nested. Jika kita mencoba untuk menggunakannya di level pertama, ia akan mengembalikan sebuah error jika objeknya tidak ada. Operator Optional Chaining membutuhkan sebuah parent obyek untuk dilihat terlebuh dahulu.</p>
</blockquote>
<p>Di contoh ini, <code>user</code> i.e., <code>parent obyek</code> tidak didefinisikan dan kita mencoba untuk menggunakan operator Optional Chaining. Jadi, ia akan mengembalikan sebuah error.</p>
<p><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FOa-759d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1608201660117/gPa_cmE_V.png" alt /></p>
<p>Manfaatkan operator Optional Chaining kapanpun ada kebutuhan. Semoga pekerjaan kamu menjadi sedikit lebih mudah.</p>
<p>Terimakasih telah membaca sampai akhir</p>
<p><strong>Sumber</strong></p>
<ul>
<li><p><a target="_blank" href="https://dev.to/iamdarshshah/optional-chaining-in-javascript-28h3">https://dev.to/iamdarshshah/optional-chaining-in-javascript-28h3</a></p>
</li>
<li><p><a target="_blank" href="https://tc39.es/ecma262/2020/">https://tc39.es/ecma262/2020/</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/tc39/proposal-optional-chaining">https://github.com/tc39/proposal-optional-chaining</a></p>
</li>
<li><p><a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining</a></p>
</li>
<li><p><a target="_blank" href="https://developer.mozilla.org/en-US/docs/Glossary/nullish">https://developer.mozilla.org/en-US/docs/Glossary/nullish</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Memahami Komponen Presentational dan Container pada React]]></title><description><![CDATA[Pada postingan blog ini kita akan mengekplorasi tentang React component. Ini menjelaskan dua jenis komponen - Presentational dan Container, karena keduanya bisa lebih dipahami sebagai pasangan.
Sebelum kita mulai mengekplorasi lebih jauh, kita perlu ...]]></description><link>https://ajatdarojat45.id/memahami-komponen-presentational-dan-container-pada-react</link><guid isPermaLink="true">https://ajatdarojat45.id/memahami-komponen-presentational-dan-container-pada-react</guid><category><![CDATA[React]]></category><category><![CDATA[components]]></category><category><![CDATA[UI]]></category><category><![CDATA[frontend]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Wed, 17 Jul 2024 08:18:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/UYsBCu9RP3Y/upload/ef89ad38d1dc729bbe33cd1128ab0aab.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Pada postingan blog ini kita akan mengekplorasi tentang <em>React component</em>. Ini menjelaskan dua jenis komponen - <strong>Presentational dan Container</strong>, karena keduanya bisa lebih dipahami sebagai pasangan.</p>
<p>Sebelum kita mulai mengekplorasi lebih jauh, kita perlu memahami dua hal:</p>
<ol>
<li><p>Dua tipe ini tidak meng-extend class dasar dari <code>React.Component</code>. Tidak ada tipe seperti <code>Presentational</code> atau <code>Container</code>. Ini lebih seperti konvensi atau pattern/pola. Dimana para developer biasanya menggunakan ketika membuat sebuah aplikasi dengan React.</p>
</li>
<li><p>Pasangan ini juga bisa disebut sebagai stateless dan statefull atau impure dan pure component, tapi ini tidak sama. Presentational component dapat menjadi statefull, dan Container component dapat menjadi stateless juga, dan mereka juga dapat menjadi functional component atau class component.</p>
</li>
</ol>
<h3 id="heading-pengenalan-dan-gambaran"><strong>Pengenalan dan Gambaran</strong></h3>
<p>Seperti yang sudah disebutkan diatas, devisi untuk Presentational component dan Container component adalah development pattern, biasanya digunakan oleh developer untuk membedakan komponen berdasarkan tujuannya: </p>
<ul>
<li><p>Presentational component mengatur bagaimana sesuatu terlihat.</p>
</li>
<li><p>Container component mengatur bagaimana sesuatu berkerja.</p>
</li>
</ul>
<h3 id="heading-fitur-utama-dari-presentational-component">Fitur Utama dari Presentational Component</h3>
<ul>
<li><p>Fungsi utamanya adalah untuk menampilkan data.</p>
</li>
<li><p>Biasanya hanya berisi method <code>render()</code> atau hanya <code>JSX</code>.</p>
</li>
<li><p>Memiliki style.</p>
</li>
<li><p>Tidak memiliki state (Ketika memiliki, itu bisanya state UI bukan data).</p>
</li>
<li><p>Tidak tahu bagaimana cara merubah data.</p>
</li>
<li><p>Menerima data melalui props dari Container component.</p>
</li>
<li><p>Biasanya ditulis sebagai stateless functional component (Meskipun ini bukan aturan)</p>
</li>
</ul>
<p><strong>Contoh</strong></p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> Book = <span class="hljs-function">(<span class="hljs-params">{ title, img_url }</span>) =&gt;</span> (
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"book"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{img_url}</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">{title}/</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">h3</span>&gt;</span>{title}<span class="hljs-tag">&lt;/<span class="hljs-name">h3</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
)
<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> Book;
</code></pre>
<p>Contoh diatas hanya memiliki satu tugas yang harus dilakukan yaitu me-render props yang diterima yaitu <code>title</code> dan <code>img_url</code> kedalam DOM.</p>
<p>Contoh berikut juga merupakan contoh dari <code>Presentational component</code> karena apa yang sebenarnya dilakukan adalah menentukan cara menampilkan daftar komponen dan mengirim data melalui props ke child component.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> BookList = <span class="hljs-function">(<span class="hljs-params">{ books }</span>) =&gt;</span> (
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"book-list"</span>&gt;</span>
    { books.map(book =&gt; <span class="hljs-tag">&lt;<span class="hljs-name">Book</span> <span class="hljs-attr">title</span>=<span class="hljs-string">{book.title}</span> <span class="hljs-attr">img_url</span>=<span class="hljs-string">{book.img_url}</span> /&gt;</span>) }
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
)
<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> BookList;
</code></pre>
<p>Presentational component mendapatkan data dari Container component, dan jika kita lihat relasinya, itu adalah relasi child-parent, dimana Presentational component sebagai child dan Container component hampir disetiap kasus merupaka parent dari Presentational component.</p>
<h3 id="heading-fitur-utama-dari-container-component">Fitur Utama dari Container Component</h3>
<ul>
<li><p>Fungsi utamanya adalah mengatur prilaku data.</p>
</li>
<li><p>Berisi lebih banyak element/komponen dengan fungsi <code>render()</code> (Presentational component, lifecycle methods atau hooks)</p>
</li>
<li><p>Tidak memiliki style.</p>
</li>
<li><p>Memiliki state dan mengaturnya.</p>
</li>
<li><p>Memberikan data ke children component.</p>
</li>
<li><p>Selalu ditulis sebagai statefull class component (walaupun saat ini cenderung ditulis menggunakan hooks, jadi paling sering ditulis sebagai functional statefull component)</p>
</li>
</ul>
<p><strong>Contoh (class component)</strong></p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> BookList <span class="hljs-keyword">from</span> <span class="hljs-string">'./BookList'</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">BookList</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Component</span> </span>{
    <span class="hljs-keyword">constructor</span>(props) {
        <span class="hljs-built_in">super</span>(props);
        <span class="hljs-built_in">this</span>.state = {
            <span class="hljs-attr">books</span>: []
        };
    }

    componentDidMount() {
        fetch(<span class="hljs-string">'https://learn-co-curriculum.github.io/books-json-example-api/books.json'</span>)
        .then(<span class="hljs-function"><span class="hljs-params">response</span> =&gt;</span> response.json())
        .then(<span class="hljs-function"><span class="hljs-params">bookData</span> =&gt;</span> <span class="hljs-built_in">this</span>.setState({ <span class="hljs-attr">books</span>: bookData.books }))
    }

   render() {
        <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">BookList</span> <span class="hljs-attr">books</span>=<span class="hljs-string">{this.state.books}</span> /&gt;</span></span>
    }
}
<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> BookListContainer;
</code></pre>
<p><strong>Contoh (funtional component)</strong></p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> BookList <span class="hljs-keyword">from</span> <span class="hljs-string">'./BookList'</span>;
<span class="hljs-keyword">import</span> {useState, useEffect} <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;

<span class="hljs-keyword">const</span> BookList = <span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> [books, setBooks] = useState([]);
    useEffect(<span class="hljs-function">() =&gt;</span> {
        fetch(<span class="hljs-string">'https://learn-co-curriculum.github.io/books-json-example-api/books.json'</span>)
        .then(<span class="hljs-function"><span class="hljs-params">response</span> =&gt;</span> response.json())
        .then(<span class="hljs-function"><span class="hljs-params">bookData</span> =&gt;</span> setBooks({bookData.books}) }, []);
    }

    render() {
        <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">BookList</span> <span class="hljs-attr">books</span>=<span class="hljs-string">{books}</span> /&gt;</span></span>
    }
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> BookListContainer;
</code></pre>
<h3 id="heading-kesimpulan">Kesimpulan</h3>
<p>2 jenis komponen ini selalu berjalan bersamaan karena memiliki pola yang sama. Karena React terus berkembang, dimungkinkan untuk menulis aplikasi React <strong>HANYA</strong> menggunakan <code>fungsional component</code> dan <code>hook</code>, karena mereka dapat menyelesaikan sebagian besar masalah sekarang. Pemisahan masalah antara Presentational dan logika adalah cara yang baik untuk lebih memahami bagaimana aplikasi kita harus bekerja dan UI apa yang akan dimilikinya. Tetapi pola ini <strong>BUKANLAH</strong> suatu keharusan dan kamu dapat menggunakannya jika menurut kamu wajar untuk aplikasi kamu.</p>
<p><strong>Sumber  
</strong></p>
<ul>
<li><p><a target="_blank" href="https://dev.to/olenadrugalya/presentational-and-container-components-in-react-4gfj"><strong>https://dev.to/olenadrugalya/presentational-and-container-components-in-react-4gfj</strong></a></p>
</li>
<li><p><a target="_blank" href="https://reactjs.org/"><strong>https://reactjs.org/</strong></a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Perbedaan Antara SSR dan CSR]]></title><description><![CDATA[Di artikel ini, kita akan membahas perbedaan antara server-side-rendering (SSR) dan client-site-rendering (CSR). Mengetahui perbedaan kedua hal tersebut sangatlah penting, terutama ketika kita men-develop di web. Pertama-tama, yang akan kita bahas ad...]]></description><link>https://ajatdarojat45.id/perbedaan-antara-ssr-dan-csr</link><guid isPermaLink="true">https://ajatdarojat45.id/perbedaan-antara-ssr-dan-csr</guid><category><![CDATA[React]]></category><category><![CDATA[SSR]]></category><category><![CDATA[csr]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Wed, 17 Jul 2024 08:14:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/cZr2sgaxy3Q/upload/ea1072fe658b521a9ecf04ea7f01b773.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Di artikel ini, kita akan membahas perbedaan antara server-side-rendering (SSR) dan client-site-rendering (CSR). Mengetahui perbedaan kedua hal tersebut sangatlah penting, terutama ketika kita men-develop di web. Pertama-tama, yang akan kita bahas adalah definisi dari SSR dan CSR, lalu kita akan membahas perbedaan antara keduanya, dan terakhir, keadaan seperti apa yang cocok untuk masing-masing.</p>
<h3 id="heading-apa-itu-ssr">Apa itu SSR?</h3>
<p>SSR adalah singkatan dari server-side-rendering. Kemampuan aplikasi web untuk me-render halaman web di server alih-alih me-render-nya di browser. Ketika halaman web sampai di client, sudah sepenuhnya ter-render. Itu karena server-side telah me-render secara penuh sebelum halaman web dikirim oleh server ke client. Ketika request diterima oleh server-side, semuanya akan di compile, jika konten dari halaman web membutuhkan data dari database, server akan melakukanya, lalu me-render datanya ke halaman yang sudah dirender sepenuhnya dan mengrimnya ke client sebagai response. Sekarang, bagaimana jika client menavigasi ke route yang berbeda? Setiap client navigasi ke route yang berbeda, server akan melakukan pekerjaan itu lagi.</p>
<h3 id="heading-apa-itu-csr">Apa itu CSR?</h3>
<p>CSR adalah singkatan dari client-side-rendering. Overall, CSR adalah kebalikan dari SSR. Jika SSR me-render halaman web di server-side, CSR me-render halaman web di client-side. Ketika request diterima oleh server, server tidak akan me-render halaman web, sebaliknya, server akan mengirim satu halaman yang akan menjadi kerangka halaman ke client. Server mengirim halaman web dengan file javascript. Lalu, javascript akan mengubah halaman web menjadi halaman yang di-render sepenuhnya. Jadi dimana konten nya? Bagaimana jika halaman web membutuhkan data dari database? Kemudian, API masuk. Client akan membuat sebuah request ke API untuk mengambil data dan me-render-nya ke halaman web. Terakhir, bagaimana jika client navigasi ke route yang berbeda? Apakah server akan mengirim halaman web lagi? Server tidak akan mengirim halaman web lagi, sebagai gantinya, client akan me-render ulang halaman web sesuai route yang diminta client. Jadi halaman web yang digunakan, selalu halaman yang sama dengan request pertama.</p>
<h3 id="heading-perbedaan">Perbedaan</h3>
<p>Perbedaan utama antara SSR dan CSR adalah dimana halaman web di-render. SSR me-render halaman web di server-side dan CSR me-render halaman web di client-side. Client-side mengatur route secara dinamis tanpa perlu me-refresh halaman setiap client request route yang beda.</p>
<h3 id="heading-menggunakan-ssr">Menggunakan SSR</h3>
<ul>
<li><p>Jika SEO prioritas kita, biasanya ketika kita membuat sebuah situs blog dan kita ingin setiap orang yang mencari di google membuka website kita, maka SSR adalah pilihan kita.</p>
</li>
<li><p>Jika website mu membutuhkan initial loading yang cepat.</p>
</li>
<li><p>Jika konten dari website kita tidak membutuhkan banyak interaksi pengguna.</p>
</li>
</ul>
<h3 id="heading-menggunakan-csr">Menggunakan CSR</h3>
<ul>
<li><p>Ketika SEO bukan prioritas.</p>
</li>
<li><p>Jika situs kita memiliki banyak interaksi</p>
</li>
<li><p>Jika kita membuat sebuah aplikasi website</p>
</li>
</ul>
<p><strong>Sumber</strong></p>
<ul>
<li><a target="_blank" href="https://dev.to/alain2020/ssr-vs-csr-2617"><strong>https://dev.to/alain2020/ssr-vs-csr-2617</strong></a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Langkah Mudah Membagikan Proyek Web Pribadi]]></title><description><![CDATA[Artikel ini tentang bagaimana localhost kita jadikan sebagai link yang bisa di akses oleh setiap orang. Kita akan melakukan ini dengan menggunakan ngrok.
Sebagai seorang developer, apapun yang kita kerjakan harus dibagikan sebagai sebuah link yang or...]]></description><link>https://ajatdarojat45.id/langkah-mudah-membagikan-proyek-web-pribadi</link><guid isPermaLink="true">https://ajatdarojat45.id/langkah-mudah-membagikan-proyek-web-pribadi</guid><category><![CDATA[ngrok]]></category><category><![CDATA[deployment]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Wed, 17 Jul 2024 08:13:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/yeB9jDmHm6M/upload/27a555e0df3eb9174109f62500aa9337.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Artikel ini tentang bagaimana <code>localhost</code> kita jadikan sebagai link yang bisa di akses oleh setiap orang. Kita akan melakukan ini dengan menggunakan <code>ngrok</code>.</p>
<p>Sebagai seorang developer, apapun yang kita kerjakan harus dibagikan sebagai sebuah link yang orang lain bisa mengaksesnya. Terlepas apakah kita sebagai seorang <code>frontend</code>, <code>backend</code>, <code>MERN</code> stack atau seorang <code>LAMP</code> stack developer, saya asumsikan kamu tahu tentang pentingnya <code>http://localhost</code>.</p>
<p>Bagaimana cara membagikan pekerjaan kita di <code>localhost</code> agar bisa di akses oleh orang lain dengan simple?</p>
<p>Ada beberapa metode deploy project ke sebuah server sebagai link yang bisa diakses. Tapi problem dengan proses ini adalah kita harus:</p>
<ul>
<li><p><code>commit</code> kode kita dan nge-<code>push</code> ke server eksternal sebelum orang lain bisa melihat progressnya.</p>
</li>
<li><p>Proses ini merupakan proses yang memakan waktu dan data.</p>
</li>
<li><p>Sebagai <code>code newbie</code> prosesnya bahkan lebih melelehkan karena kita harus mempelajari git, GitHub, heroku, AWS, dan lain-lain.</p>
</li>
</ul>
<p>Jawaban dari semua masalah tersebut adalah membagikan pekerjaan kita di <a target="_blank" href="http://localhost"><code>localhost</code></a> tanpa perlu <code>commit</code> dan <code>push</code> code kita ke server eksternal. Ini sangat dimungkinkan dengan <code>tunneling</code> <a target="_blank" href="http://localhost"><code>localhost</code></a> kita ke internet menggunakan <code>ngrok</code>.</p>
<p><code>Ngrok</code> mengekspos server local dibelakan <code>NATs</code> dan <code>firewall</code> ke internet publik melalui <code>tunnel</code> yang aman.</p>
<p><strong>Ayo Kita Mulai</strong></p>
<ol>
<li><p>Download ngrok <a target="_blank" href="https://ngrok.com/download">disini.</a></p>
</li>
<li><p>Unzip file yang sudah di tadi untuk meng-install-nya.</p>
<blockquote>
<p>Untuk Linux atau OSX kamu bisa meng-unzip ngrok dengan perintah <code>unzip /path/to/ngrok.zip</code>. Untuk pengguna Windows cukup double click <code>ngok.zip</code>.</p>
</blockquote>
</li>
<li><p>Sambungkan dengan akun kita (opsional)</p>
<blockquote>
<p>Jalankan perintah berikut <code>./ngrok authtoken &lt;your_auth_token&gt;</code>, untuk menmbahkan <code>authtoken</code> kita kedalam file <code>ngrok.yml</code>. Menghubungkan dengan akun akan mencantumkan <code>tunnel</code> yang terbuka ke dashboard. Memungkinkan kita untuk setup timeout tunnel lebih lama dan banyak lagi. Kunjungi dashboard untuk mendapatkan <code>authtoken</code>.</p>
</blockquote>
</li>
<li><p>Jalankan <code>ngrok</code></p>
<blockquote>
<p>Untuk menjalankan tunnel http di port <code>3000</code> jalankan perintah berikut <code>./ngrok http 3000</code>.<br />terminal akan terlihat seperti gambar berikut:  </p>
<p><img src="https://res.cloudinary.com/ajatdarojat45/image/upload/v1609850704/ajatdarojat45/Screen_Shot_2021-01-05_at_19.38.54_cloupp.png" alt /></p>
<p>Jadi link tersebut bisa dibagikan dan dapat diakses oleh orang lain. Link tersebut bekerja selama kita menjalankan programnya di kimputer kita.</p>
</blockquote>
</li>
</ol>
<p><strong>Kenapa kita menggunakan ngrok?</strong></p>
<p>Mereka memiliki dokumentasi yang baik, mudah untuk digunakan dan memiliki pengguna yang banyak yang dapat menolong kita dengan banyak proyek yang mungkin kita kerjakan.</p>
<p>Lihat <a target="_blank" href="https://ngrok.com/docs">dokumentasi</a> untuk melihat lebih banyak ide bagaimana cara menggunakan <code>ngrok</code>.</p>
<p><strong>Sumber</strong></p>
<ul>
<li><p><a target="_blank" href="https://ngrok.com/docs"><strong>https://ngrok.com/docs</strong></a></p>
</li>
<li><p><a target="_blank" href="https://dev.to/kitarp/share-your-web-projects-easily-4i60"><strong>https://dev.to/kitarp/share-your-web-projects-easily-4i60</strong></a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Cara Mengakses Pull Request Tertentu di GitHub]]></title><description><![CDATA[Berikut adalah setting konfigurasi pada git agar memudahkan kita untuk checkout ke spesifik pull request berdasarkan nomor pull request nya.

Cek lokasi file .gitconfig di komputer kalian dengan menjalankan command berikut: git config --list --show-o...]]></description><link>https://ajatdarojat45.id/cara-mengakses-pull-request-tertentu-di-github</link><guid isPermaLink="true">https://ajatdarojat45.id/cara-mengakses-pull-request-tertentu-di-github</guid><category><![CDATA[gith]]></category><category><![CDATA[GitHub]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Wed, 17 Jul 2024 08:11:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/KPAQpJYzH0Y/upload/c5bb15130f054f4faf21d0c3ee01e5b3.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Berikut adalah setting konfigurasi pada <code>git</code> agar memudahkan kita untuk checkout ke spesifik pull request berdasarkan nomor pull request nya.</p>
<ol>
<li><p>Cek lokasi file <code>.gitconfig</code> di komputer kalian dengan menjalankan command berikut:<br /> <code>git config --list --show-origin</code></p>
</li>
<li><p>Buka file <code>.gitconfig</code></p>
</li>
<li><p>Tambahkan script berikut:<br /> <code>[remote "origin"]</code><br />       <code>fetch = +refs/pull/*/head:refs/remotes/origin/pr/*</code></p>
</li>
<li><p>Clone repo kalian lalu buka menggunakan editor kesukaan kalian. </p>
</li>
<li><p>Jalankan command berikut untuk checkout ke speifikasi pull request berdasarkan nomornya:<br /> <code>git checkout pr/&lt;nomor_pull_request&gt;</code></p>
</li>
<li><p>Selesai</p>
</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[Jenis-Jenis Data Primitif di JavaScript]]></title><description><![CDATA[Pada artikel ini, kita akan coba memahami tipe data primitif pada Javascript. Artikel ini untuk pemula.
Nilai atau tipe data primitif adalah sesuatu yang bukan objek dan tidak memiliki metode yang terkait dengannya. Dengan kata lain, tipe data primit...]]></description><link>https://ajatdarojat45.id/jenis-jenis-data-primitif-di-javascript</link><guid isPermaLink="true">https://ajatdarojat45.id/jenis-jenis-data-primitif-di-javascript</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[Data types in javascript]]></category><category><![CDATA[Primitive datatypes]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Wed, 17 Jul 2024 08:09:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/EcQOGkwWMmk/upload/66a37dc9082d0d2ebd3577cedb3f6eb2.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Pada artikel ini, kita akan coba memahami tipe data primitif pada <code>Javascript</code>. Artikel ini untuk pemula.</p>
<p>Nilai atau tipe data primitif adalah sesuatu yang bukan objek dan tidak memiliki metode yang terkait dengannya. Dengan kata lain, tipe data primitif adalah data sederhana tanpa metode dan properti tambahan.</p>
<p>Ada 7 tipe data primitif pada <code>Javascript</code>.</p>
<ol>
<li><p><code>boolean</code></p>
</li>
<li><p><code>null</code></p>
</li>
<li><p><code>undefined</code></p>
</li>
<li><p><code>number</code></p>
</li>
<li><p><code>string</code></p>
</li>
<li><p><code>symbol</code></p>
</li>
<li><p><code>bigint</code></p>
</li>
</ol>
<p>Kita dapat menggunakan operator <code>typeof(value)</code> untuk mengetahui tipe data dari nilai yang diberikan.</p>
<p><strong>Contoh</strong>:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">typeof</span> <span class="hljs-number">1</span>;         <span class="hljs-comment">// number</span>
<span class="hljs-keyword">typeof</span> <span class="hljs-string">"dev.to"</span>;  <span class="hljs-comment">// string</span>
<span class="hljs-keyword">typeof</span> <span class="hljs-literal">null</span>;      <span class="hljs-comment">// object</span>
<span class="hljs-keyword">typeof</span> <span class="hljs-literal">undefined</span>; <span class="hljs-comment">// undefined</span>
<span class="hljs-keyword">typeof</span> <span class="hljs-literal">true</span>;      <span class="hljs-comment">// boolean</span>
<span class="hljs-keyword">typeof</span> <span class="hljs-number">1n</span>;        <span class="hljs-comment">// bigint</span>
<span class="hljs-keyword">let</span> sym = <span class="hljs-built_in">Symbol</span>(<span class="hljs-string">"key"</span>);
<span class="hljs-keyword">typeof</span> key;       <span class="hljs-comment">// symbol</span>
</code></pre>
<ol>
<li><h2 id="heading-boolean"><code>boolean</code></h2>
<p> <code>boolean</code> adalah tipe data yang hanya memiliki dua nilai, yaitu, <code>true</code> dan <code>false</code>.  </p>
<p> Nilai <code>boolean</code> biasanya digunakan dalam operator perbandingan dan kondisi.  </p>
<p> Kita dapat menggunakan konstruktor <code>Boolean()</code> untuk membuat objek <code>boolean</code>. Namun, ini umumnya dianggap praktik yang buruk dan harus dihindari.  </p>
<p> <strong>Contoh</strong>: </p>
<pre><code class="lang-javascript"> <span class="hljs-keyword">let</span> x = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Boolean</span>(<span class="hljs-literal">true</span>);
 <span class="hljs-keyword">typeof</span>  x;  <span class="hljs-comment">// boolean</span>
</code></pre>
<p> Jangan bingung antara tipe primitif <code>boolean</code> dengan objek <code>Boolean</code>.</p>
</li>
<li><h2 id="heading-null"><code>null</code></h2>
<p> Nilai <code>null</code> mewakili ketiadaan objek.  </p>
<p> <strong>Contoh</strong>:</p>
<pre><code class="lang-javascript"> <span class="hljs-keyword">let</span> boo = <span class="hljs-literal">null</span>;
 <span class="hljs-keyword">typeof</span> boo; <span class="hljs-comment">//null</span>
</code></pre>
<p> Pada contoh diatas, variable <code>boo</code> ada tetapi tidak memiliki nilai yang terkait dengannya.</p>
</li>
<li><h2 id="heading-undefined"><code>undefined</code></h2>
<p> <code>undefined</code> adalah nilai yang otomatis diberikan ke variabel yang telah dideklarasikan.  </p>
<p> <strong>Contoh</strong>:</p>
<pre><code class="lang-javascript"> <span class="hljs-keyword">var</span> x;
 <span class="hljs-keyword">typeof</span> x;  <span class="hljs-comment">// undefined</span>
</code></pre>
</li>
<li><h2 id="heading-number"><code>number</code></h2>
<p> Tipe data <code>number</code> berisi nilai numberik. Kamu dapat mendefinisikan nilai positif, desimal dan negatif. <code>number</code> juga memiliki nalai pisitif dan negatif yang tidak terbatas.  </p>
<p> <strong>Contoh</strong>:</p>
<pre><code class="lang-javascript"> <span class="hljs-keyword">var</span> num = <span class="hljs-number">123</span>;
 <span class="hljs-keyword">typeof</span> num;   <span class="hljs-comment">// number</span>
 <span class="hljs-comment">// using constructor</span>
 <span class="hljs-keyword">var</span> boo = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Number</span>(<span class="hljs-number">123</span>)
 <span class="hljs-keyword">typeof</span> boo;   <span class="hljs-comment">// object</span>
 <span class="hljs-keyword">typeof</span> boo.valueOf();  <span class="hljs-comment">// number</span>
</code></pre>
</li>
<li><h2 id="heading-string"><code>string</code></h2>
<p> <code>string</code> adalah tipe data yang terdiri dari karakter atau urutan karakter dalam tanda kutip tunggal (<code>'contoh'</code>) atau tanda kutip ganda (<code>"contoh"</code>) atau dalam kutip belakang (<code>`contoh` </code>).  </p>
<p> Kita bisa menggunakan fungsi konstruktor <code>String()</code> untuk membuat sebuah objek bertipe <code>string</code>.  </p>
<p> <strong>Contoh</strong>:</p>
<pre><code class="lang-javascript"> <span class="hljs-keyword">let</span> string1 = <span class="hljs-string">"Double quotes"</span>;
 <span class="hljs-keyword">let</span> string2 = <span class="hljs-string">'Single quotes'</span>;
 <span class="hljs-keyword">typeof</span> string1;  <span class="hljs-comment">// string</span>
 <span class="hljs-keyword">let</span> string4 = <span class="hljs-keyword">new</span> <span class="hljs-built_in">String</span>(<span class="hljs-string">"string constuctor"</span>);
 <span class="hljs-keyword">typeof</span> string4;  <span class="hljs-comment">// object</span>
 <span class="hljs-keyword">typeof</span> string4.valueOf();  <span class="hljs-comment">// stirng</span>
</code></pre>
</li>
<li><h2 id="heading-symbol"><code>symbol</code></h2>
<p> <code>symbol</code> adalah tipe data yang memberikan nilai unik dan anonim yang bisa digunakan sebagai properti objek.  </p>
<p> <code>symbol</code> diperkenalkan pada <code>ES6</code>.  </p>
<p> symbol tidak memiliki konstruktor jadi kita tidak bisa membuat objek <code>symbol</code> menggunakan kata kunci <code>new</code>.  </p>
<p> <strong>Contoh</strong>:</p>
<pre><code class="lang-javascript"> <span class="hljs-keyword">let</span> sym1  = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Symbol</span>(<span class="hljs-string">'a'</span>); <span class="hljs-comment">// TypeError</span>
 <span class="hljs-keyword">let</span> sym2 = <span class="hljs-built_in">Symbol</span>(<span class="hljs-string">'a'</span>);  <span class="hljs-comment">// symbol is created</span>
 <span class="hljs-keyword">let</span> sym3 = <span class="hljs-built_in">Symbol</span>(<span class="hljs-string">'a'</span>);  <span class="hljs-comment">// symbol is created</span>
 sym2  === sym3;  <span class="hljs-comment">// false</span>
</code></pre>
<p> Baris terakhir pada contoh diatas bernilai <code>false</code> karena antara <code>sym2</code> dan <code>sym3</code> adalah bernilai unik.  </p>
<p> Lihat <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Glossary/Symbol">halaman ini</a> untuk mengetahui lebih lanjut tentang <code>symbol</code>.</p>
</li>
<li><h2 id="heading-bigint"><code>bigint</code></h2>
<p> Tipe data primitif <code>bigint</code> diperkenalkan pada <code>ES10</code>.  </p>
<p> Sebelum <code>ES10</code>, nilai maksimal angka pada <code>Javascript</code> adalah <code>9007199254740991</code> atau <code>Number.MAX_SAFE_INTEGER</code>. Untuk mengatasi batasan ini, <code>bigint</code> diperkenalkan.  </p>
<p> <strong>Contoh</strong>:</p>
<pre><code class="lang-javascript"> <span class="hljs-keyword">let</span> x = <span class="hljs-number">1</span>;
 <span class="hljs-keyword">let</span> y = <span class="hljs-number">1n</span>;
 <span class="hljs-keyword">typeof</span> x;  <span class="hljs-comment">// number</span>
 <span class="hljs-keyword">typeof</span> y;  <span class="hljs-comment">// bigint</span>
</code></pre>
</li>
</ol>
<p>Terimakasih telah membaca artikel ini, harap berikan masukan yang membangun.</p>
<p><strong>Sumber</strong>:</p>
<ul>
<li><p><a target="_blank" href="https://developer.mozilla.org/en-US/docs/Glossary/Primitive">https://developer.mozilla.org/en-US/docs/Glossary/Primitive</a></p>
</li>
<li><p><a target="_blank" href="https://dev.to/vineethsagar/introduction-to-primitive-types-in-javascript-575o">https://dev.to/vineethsagar/introduction-to-primitive-types-in-javascript-575o</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Panduan Dasar Git untuk Pemula]]></title><description><![CDATA[Banyak dari kita khususnya pemula bingung tentang Git.
Definisi teknis tentang Git adalah

Git adalah sebuah Version System Control untuk menulusuri kode selama software di develop.

Apa itu VCS?
Sebuah Version System Control singkatnya adalah sebuah...]]></description><link>https://ajatdarojat45.id/panduan-dasar-git-untuk-pemula</link><guid isPermaLink="true">https://ajatdarojat45.id/panduan-dasar-git-untuk-pemula</guid><category><![CDATA[Git]]></category><category><![CDATA[GitHub]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Wed, 17 Jul 2024 08:06:40 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/842ofHC6MaI/upload/41bbac3cb13bc7ff0d80e34dfe300872.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Banyak dari kita khususnya pemula bingung tentang <code>Git</code>.</p>
<p>Definisi teknis tentang <code>Git</code> adalah</p>
<blockquote>
<p><code>Git</code> adalah sebuah Version System Control untuk menulusuri kode selama software di develop.</p>
</blockquote>
<h3 id="heading-apa-itu-vcs">Apa itu VCS?</h3>
<p>Sebuah Version System Control singkatnya adalah sebuah manajemen kode, dimana biasanya mengelola versi informasi yang berbeda (i.e source code).</p>
<p>VCS melacak modifikasi yang kita lakukan pada kode dan mencatat perubahan yang kita buat.</p>
<p>Tapi ada perbedaan tipe dari Version Control System.</p>
<ol>
<li><p><strong>Local Version Control System</strong> - ini memiliki sistem database untuk mengelola trek.</p>
</li>
<li><p><strong>Centralized Versin Control System</strong> - Dimana semua pengguna terhubung ke semuah repo master.</p>
</li>
<li><p><strong>Distributed Version Control System</strong> - Dimana semua pengguna dapat terhubung ke banyak repo di waktu yang sama.</p>
</li>
</ol>
<h3 id="heading-terminologi-peting-git">Terminologi Peting Git</h3>
<ol>
<li><strong>Repository</strong></li>
</ol>
<p>Simpelnya, repo/repositori adalah sebuah jenis wadah tempat kita menyimpan sesuatu. Secara teknis itu adalah sebuah struktur data yang digunakan oleh VCS dimana metadata dari file dan direktori kode yang disimpan.</p>
<ol start="2">
<li><strong>Branch</strong></li>
</ol>
<p>Anggap ini sebagai cabang pohon sederhana yang menyipang dari akar pohon, demikian pula dengan <code>branch git</code> adalah versi repo yang membagi dari repositori utama. Di repo branch kita dapat mambuat berbagai perubahan seperti: daftar, hapus, ganti nama dan lain-lain.</p>
<ol start="3">
<li><strong>Clone</strong></li>
</ol>
<p>Clonning di git berarti membuat sebuah salinan dari target repositori dan menduplikasi semua file dari target repo. <code>clone</code> adalah utilitas baris perintah <code>git</code>.</p>
<ol start="4">
<li><strong>Index</strong></li>
</ol>
<p>Index di git dikenal juga sebagai <code>staging area</code> atau <code>staging index</code>. Sebuah file di direktori Git yang menyimpan informasi tentang apa yang akan masuk ke komit kita selanjutnya. File di <code>staging index</code> siap untuk ditambahkan ke repositori.</p>
<ol start="5">
<li><strong>Push dan Pull request</strong></li>
</ol>
<p><code>Git push</code> akan mengambil semua file dari direktori repo lokal dan akan di push ke repo utama misalnya di Github.</p>
<p><code>Git pull</code> digunakan ketika kita ingin pull perubahan terakhir di repo utama.</p>
<h3 id="heading-perintah-untuk-menggunakan-git-di-command-line">Perintah untuk menggunakan Git di Command Line</h3>
<ol>
<li><p><code>git init</code> - Untuk menginisiasi atau membuat sebuah repositori.</p>
</li>
<li><p><code>git add .</code> - Untuk menambahkan file kode ke repo kita.</p>
</li>
<li><p><code>git status</code> - Untuk melihat file di repositori.</p>
</li>
<li><p><code>git commit -m 'pesan komit'</code> - Untuk menambahkan pesan komit ke file kode kita.</p>
</li>
<li><p><code>git push -u origin master</code> - Untuk push kode kedalam repositori utama atau target repositori.</p>
</li>
<li><p><code>git pull 'nama_remote' 'nama_branch'</code> - Ini akan pull konten dari repositori utama.</p>
</li>
<li><p><code>git fetch</code> - Ini akan mengambil komit terbaru dari repo utama ke lokal repo kita.</p>
</li>
<li><p><code>git merge</code> - ini akan menggabungkan branch dari remote ke repositori lokal.</p>
</li>
<li><p><code>git clone link_repositori</code> - Untuk klone target repositori.</p>
</li>
</ol>
<p>Jadi itu saja untuk <code>Git</code>, berharap artikel ini dapat membantu dalam belajar dan akan menjadi panduan yang mudah dibaca. Kasih tau jika artikel ini membantu.</p>
<p>Lanjutkan dan buat proyek pertama di Github dengan bantuan artikel ini. 🙂</p>
<p><strong>Sumber</strong>:</p>
<ul>
<li><p><a target="_blank" href="https://git-scm.com/docs">https://git-scm.com/docs</a></p>
</li>
<li><p><a target="_blank" href="https://dev.to/binalmehta/git-for-newbies-jm0">https://dev.to/binalmehta/git-for-newbies-jm0</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[MongoDB Finds Location by Radius]]></title><description><![CDATA[Hi teman-teman pada artikel ini kita akan mempelajari bagaimana melakukan pencarian data pada MongoDB berdasarkan radius tertentu.
Asumsikan kita memiliki database dengan nama sandbox dan memiliki collection dengan nama malls.
Selanjutnya kita siapka...]]></description><link>https://ajatdarojat45.id/mongodb-finds-location-by-radius</link><guid isPermaLink="true">https://ajatdarojat45.id/mongodb-finds-location-by-radius</guid><category><![CDATA[MongoDB]]></category><category><![CDATA[Databases]]></category><category><![CDATA[NoSQL]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Fri, 05 Jul 2024 10:51:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/ioYwosPYC0U/upload/bb0e917a6e1c4b5ea839421536211045.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi teman-teman pada artikel ini kita akan mempelajari bagaimana melakukan pencarian data pada MongoDB berdasarkan radius tertentu.</p>
<p>Asumsikan kita memiliki database dengan nama <code>sandbox</code> dan memiliki collection dengan nama <code>malls</code>.</p>
<p>Selanjutnya kita siapkan data dummy untuk dimasukan kedalam database dan collection yang baru kita buat tadi. Untuk data dummy kurang lebih seperti ini:</p>
<pre><code class="lang-json">[
    {
        <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Pondok Indah Mall"</span>,
      <span class="hljs-attr">"location"</span>: {
        <span class="hljs-attr">"type"</span>: <span class="hljs-string">"Point"</span>,
          <span class="hljs-attr">"coordinates"</span>: [
          <span class="hljs-number">106.7846567</span>,
          <span class="hljs-number">-6.2653276</span>
        ]
      }
    },
    {
      <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Central Park Mall"</span>,
      <span class="hljs-attr">"location"</span>: {
          <span class="hljs-attr">"type"</span>: <span class="hljs-string">"Point"</span>,
        <span class="hljs-attr">"coordinates"</span>: [
          <span class="hljs-number">106.7909275</span>,
          <span class="hljs-number">-6.176278</span>
        ]
      }
    }
]
</code></pre>
<p>Selanjutnya yang kita lakukan adalah membuat index pada field <code>location</code> di collection <code>malls</code> dengan menjalankan command berikut pada <code>mongosh</code>:</p>
<pre><code class="lang-bash"><span class="hljs-comment"># switch ke database sandbox</span>
use sandbox

<span class="hljs-comment"># create index</span>
db.malls.createIndex({<span class="hljs-string">"location"</span>: <span class="hljs-string">"2dsphere"</span>})

<span class="hljs-comment"># response</span>
<span class="hljs-string">'location_2dshpere'</span>
</code></pre>
<p>Setelah berhasil membuat index, kita siapkan coordinate untuk melakukan query <code>106.7827962, -6.2615624</code> (coordinate Masjid Raya Pondok Indah). Lalu kita siapkan query yang akan kita jalakan seperti contoh dibawah ini:</p>
<pre><code class="lang-json">{
  location: {
    $near: {
      $geometry: {
        type: <span class="hljs-string">"Point"</span>,
        coordinates: [<span class="hljs-number">106.7827962</span>, <span class="hljs-number">-6.2615624</span>]
      },
      $maxDistance: <span class="hljs-number">1000</span>
    }
  }
}
</code></pre>
<blockquote>
<p>$maxDistance in meter</p>
</blockquote>
<p>Jika berhasil kita akan mendapakan response seperti json di bawah ini:</p>
<pre><code class="lang-json">[
    {
        <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Pondok Indah Mall"</span>,
      <span class="hljs-attr">"location"</span>: {
        <span class="hljs-attr">"type"</span>: <span class="hljs-string">"Point"</span>,
          <span class="hljs-attr">"coordinates"</span>: [
          <span class="hljs-number">106.7846567</span>,
          <span class="hljs-number">-6.2653276</span>
        ]
      }
    }
]
</code></pre>
<h3 id="heading-references">References</h3>
<ul>
<li><p><a target="_blank" href="https://www.mongodb.com/docs/manual/reference/operator/query/near/">https://www.mongodb.com/docs/manual/reference/operator/query/near/</a></p>
</li>
<li><p><a target="_blank" href="https://www.mongodb.com/docs/manual/reference/glossary/#std-term-GeoJSON">https://www.mongodb.com/docs/manual/reference/glossary/#std-term-GeoJSON</a></p>
</li>
<li><p><a target="_blank" href="https://www.mongodb.com/docs/manual/core/2dsphere/">https://www.mongodb.com/docs/manual/core/2dsphere/</a></p>
</li>
<li><p><a target="_blank" href="https://www.mongodb.com/docs/v6.0/reference/operator/query/geometry/">https://www.mongodb.com/docs/v6.0/reference/operator/query/geometry/</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Cara Memasang Font Fira Code di Visual Studio Code]]></title><description><![CDATA[Masalah
Pemrogram menggunakan banyak simbol, sering kali dikodekan dengan beberapa karakter. Untuk otak manusia, urutan seperti ->, <= atau:=adalah token logis tunggal, bahkan jika mengambil dua atau tiga karakter di layar. Mata kita menghabiskan jum...]]></description><link>https://ajatdarojat45.id/setup-fira-code-di-vs-code</link><guid isPermaLink="true">https://ajatdarojat45.id/setup-fira-code-di-vs-code</guid><category><![CDATA[fira code]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Fri, 05 Jul 2024 10:50:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/-FHIdRVGets/upload/4a185d2878117520d56f7c63b27deafd.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><img src="https://github.com/tonsky/FiraCode/raw/master/extras/logo.svg" alt /></p>
<h3 id="heading-masalah">Masalah</h3>
<p>Pemrogram menggunakan banyak simbol, sering kali dikodekan dengan beberapa karakter. Untuk otak manusia, urutan seperti <code>-&gt;</code>, <code>&lt;=</code> atau<code>:=</code>adalah token logis tunggal, bahkan jika mengambil dua atau tiga karakter di layar. Mata kita menghabiskan jumlah energi yang tidak sedikit untuk memindai, mengurai, dan menggabungkan beberapa karakter menjadi satu karakter yang logis. Idealnya, semua bahasa pemrograman harus dirancang dengan simbol Unicode lengkap untuk operator, tetapi itu belum terjadi.</p>
<h3 id="heading-solusi">Solusi</h3>
<p>Fira Code adalah font monospace gratis yang berisi ligatur untuk kombinasi multi-karakter pemrograman umum. Ini hanyalah fitur rendering font: kode yang mendasarinya tetap kompatibel dengan ASCII. Ini membantu untuk membaca dan memahami kode lebih cepat.</p>
<h3 id="heading-download">Download</h3>
<p><a target="_blank" href="https://github.com/tonsky/FiraCode/releases/download/6.2/Fira_Code_v6.2.zip"><img src="https://github.com/tonsky/FiraCode/raw/master/extras/download.png" alt /></a></p>
<h3 id="heading-cara-install">Cara Install</h3>
<h4 id="heading-macos">macOS</h4>
<p>Didalam folder TFF yang sudah di download:</p>
<ol>
<li><p>Pilih semua file font</p>
</li>
<li><p>Klik kanan dan pilih <code>Open</code> (alternatif <code>Open with Font Book</code>)</p>
</li>
<li><p>Pilih <code>Install Font</code></p>
</li>
</ol>
<p><em>Atau</em></p>
<ul>
<li><p>Menggunakan <a target="_blank" href="http://brew.sh/">brew</a> dan <a target="_blank" href="https://caskroom.github.io/">cask</a></p>
<p>  Tidak di support secara resmi, mungkin menginstall versi lama.</p>
<pre><code class="lang-bash">  brew tap homebrew/cask-fonts
  brew install --cask font-fira-code
</code></pre>
</li>
</ul>
<h4 id="heading-os-lain">OS lain</h4>
<p>Untuk menginstall Fira Code di OS lain bisa ikuti tautan <a target="_blank" href="https://github.com/tonsky/FiraCode/wiki/Installing">berikut</a></p>
<h3 id="heading-setup">Setup</h3>
<h4 id="heading-vs-code">VS Code</h4>
<p>Pastikan sudah menginstall <a target="_blank" href="https://github.com/tonsky/FiraCode/wiki/Installing">font-nya</a></p>
<ol>
<li><p>Menggunakan visual Setting Editor</p>
<p> Untuk membuka setting editor: dari menu <code>Code</code>, pilih <code>Preferences</code> &gt; <code>Setting</code> atau gunakan shortcut keyboard <code>ctrl</code> + <code>,</code> (<code>cmd</code> + <code>,</code> di mac)</p>
<p> Untuk mengaktifkan FiraCode di setting editor: dibawah "Commonly Used", klik "Text Editor" lalu klik "Font". Di bagian "Font Family" ganti semua conten dengan <code>Fira Code</code>. Lalu centang check box "Enables/Disables font ligatures" dibawah "Font Ligatures" untuk mengaktifkan special ligatures.</p>
</li>
<li><p>Edit <code>setting.json</code> secara manual</p>
<p> Visual studio memungkinkan kita untuk mengedit file konfigurasi <code>setting.json</code>.</p>
<ul>
<li><p>Tekan <code>shift</code> + <code>ctrl</code> + <code>P</code> ( <code>shift</code> + <code>cmd</code> + <code>P</code> di mac)</p>
</li>
<li><p>Ketikan "settings"</p>
</li>
<li><p>Klik "preferences: open settings(JSON)"</p>
</li>
</ul>
</li>
</ol>
<p>    Lalu paste line berikut dan simpan.</p>
<pre><code class="lang-json">    <span class="hljs-string">"editor.fontFamily"</span>: <span class="hljs-string">"'Fira Code'"</span>,
    <span class="hljs-string">"editor.fontLigatures"</span>: <span class="hljs-literal">true</span>,
</code></pre>
<h4 id="heading-text-editor-lain">Text Editor lain</h4>
<p>Untuk menginstall Fira Code di text editor lain bisa ikuti tatutan <a target="_blank" href="https://github.com/tonsky/FiraCode/wiki">berikut</a>.</p>
<p><strong>Sumber</strong></p>
<ul>
<li><a target="_blank" href="https://github.com/tonsky/FiraCode">FiraCode</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Tips Mocking Function dengan Jest untuk Pemula]]></title><description><![CDATA[Tetsing adalah salah satu bagian penting dalam men-develop sebuah program, yang bertujuan untuk memastikan program yang kita develop sesuai yang kita harapkan.
Namun ketika program yang kita develop terintergarsi dengan third party services seperti s...]]></description><link>https://ajatdarojat45.id/mocking-function-with-jest</link><guid isPermaLink="true">https://ajatdarojat45.id/mocking-function-with-jest</guid><category><![CDATA[Jest]]></category><category><![CDATA[Testing]]></category><category><![CDATA[Express.js]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Fri, 05 Jul 2024 10:49:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/EWLHA4T-mso/upload/d8671f8be654e71678d9c6e47e748fb4.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Tetsing adalah salah satu bagian penting dalam men-develop sebuah program, yang bertujuan untuk memastikan program yang kita develop sesuai yang kita harapkan.</p>
<p>Namun ketika program yang kita develop terintergarsi dengan <code>third party services</code> seperti social login, cek ongkir, dll, terkdangan proses testing menjadi sesuatu yang <em>tricky</em>.</p>
<p>Terkadang me-mocking sebuah function yang terintegrasi dengan <code>third party services</code> diperlukan didalam sebuah testing guna mempercepat proses testing itu sendiri.</p>
<p>Berikut adalah sample code mocking menggunakan <a target="_blank" href="https://jestjs.io/">jest</a> yang bisa teman-teman gunakan untuk menguji/testing sebuah function yang terintegrasi dengan <code>third party services</code>.</p>
<blockquote>
<p>Saya asumsikan teman-teman sudah familiar dengan basic testing di <code>jest.</code></p>
</blockquote>
<pre><code class="lang-javascript"><span class="hljs-comment">// User.js</span>
<span class="hljs-keyword">const</span> db = <span class="hljs-built_in">require</span>(<span class="hljs-string">"./dbconfig"</span>); <span class="hljs-comment">// your db config</span>

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> </span>{
    <span class="hljs-keyword">static</span> create = <span class="hljs-keyword">async</span> (payload) =&gt; {
        <span class="hljs-keyword">try</span> {
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">await</span> db.create(payload);
        } <span class="hljs-keyword">catch</span> (err) {
            <span class="hljs-keyword">throw</span> err;
        }
    };

    <span class="hljs-keyword">static</span> findAll = <span class="hljs-keyword">async</span> () =&gt; {
        <span class="hljs-keyword">try</span> {
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">await</span> db.findAll();
        } <span class="hljs-keyword">catch</span> (err) {
            <span class="hljs-keyword">throw</span> err;
        }
    };

    <span class="hljs-keyword">static</span> deleteAll = <span class="hljs-keyword">async</span> () =&gt; {
        <span class="hljs-keyword">try</span> {
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">await</span> db.deleteAll();
        } <span class="hljs-keyword">catch</span> (err) {
            <span class="hljs-keyword">throw</span> err;
        }
    };
}

modul.exports = User;
</code></pre>
<pre><code class="lang-javascript"><span class="hljs-comment">// user.test.js</span>
<span class="hljs-keyword">const</span> User = <span class="hljs-built_in">require</span>(<span class="hljs-string">"./User"</span>);
<span class="hljs-keyword">const</span> app = <span class="hljs-built_in">require</span>(<span class="hljs-string">"./app"</span>);
<span class="hljs-keyword">const</span> request = <span class="hljs-built_in">require</span>(<span class="hljs-string">"supertest"</span>);

describe(<span class="hljs-string">"Testing user"</span>, <span class="hljs-function">() =&gt;</span> {
    beforeAll(<span class="hljs-keyword">async</span> () =&gt; {
        <span class="hljs-keyword">await</span> User.create({
            <span class="hljs-attr">username</span>: <span class="hljs-string">"udin"</span>,
            <span class="hljs-attr">email</span>: <span class="hljs-string">"udin@mail.com"</span>,
        });
    });

    beforeEach(<span class="hljs-function">() =&gt;</span> {
        jest.restoreAllMocks();
    });

    afterAll(<span class="hljs-keyword">async</span> () =&gt; {
        <span class="hljs-keyword">await</span> User.deleteAll();
    });

    it(<span class="hljs-string">"Should be return error when hit findAll"</span>, <span class="hljs-function">(<span class="hljs-params">done</span>) =&gt;</span> {
    jest.spyOn(User, <span class="hljs-string">"findAll"</span>).mockRejectedValue(<span class="hljs-string">"Error"</span>); <span class="hljs-comment">// you can pass your value as arg</span>
        <span class="hljs-comment">// or =&gt; User.findAll = jest.fn().mockRejectedValue('Error')</span>
        request(app)
            .get(<span class="hljs-string">"/users"</span>)
            .then(<span class="hljs-function">(<span class="hljs-params">res</span>) =&gt;</span> {
        <span class="hljs-comment">// expect your response here</span>
                expect(res.status).toBe(<span class="hljs-number">500</span>);
                expect(res.body).toBe(<span class="hljs-string">"Error"</span>);
                done();
            })
            .catch(<span class="hljs-function">(<span class="hljs-params">err</span>) =&gt;</span> {
                done(err);
            });
    });
});
</code></pre>
<p><strong>Sumber</strong></p>
<ul>
<li><a target="_blank" href="https://jestjs.io/docs/mock-function-api">https://jestjs.io/docs/mock-function-api</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Langkah Mudah Mengurangi Waktu Loading Aplikasi React Sebesar 70%]]></title><description><![CDATA[Langkah-langkah untuk mengurangi intial loading time di aplikasi React.
Ketika kita membangun large-scale aplikasi menggunakan React, masalah yang sering kita temui adalah peforma aplikasi. Ketika aplikasi timbuh besar dan besar lagi, kinerjanya mung...]]></description><link>https://ajatdarojat45.id/cara-mengurangi-70-loading-time-di-aplikasi-react</link><guid isPermaLink="true">https://ajatdarojat45.id/cara-mengurangi-70-loading-time-di-aplikasi-react</guid><category><![CDATA[React]]></category><category><![CDATA[frontend]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Fri, 05 Jul 2024 10:44:16 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/yGPxCYPS8H4/upload/30609f0faa5dd29e043b37b392f75da0.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Langkah-langkah untuk mengurangi intial loading time di aplikasi React.</p>
<p>Ketika kita membangun <code>large-scale</code> aplikasi menggunakan React, masalah yang sering kita temui adalah peforma aplikasi. Ketika aplikasi timbuh besar dan besar lagi, kinerjanya mungkin memburuk. Terutama initial loading time aplikasi akan lebih terpengaruh. Initial loading time harus cepat tanpa menampilkan blank screen ke pengguna. Karena mangambil banyak waktu untuk memuat akan menciptakan kesan yang buruk bagi pengguna.</p>
<p>Penyebab utama dari masalah ini adalah menambahkan terlalu banyak komponen kedalam satu bundle file, jadi loading dari bundle file tersebut mungkin memakan banyak waktu. Untuk menyelesaikan masalah ini React memiliki solusinya, yaitu <code>code-splitting</code> dan <code>lazy loading</code>. Yang memungkinkan pemisahan bundle file menjadi ukuran yang lebih kecil.</p>
<p>Tempat terbaik untuk memperkenalkan <code>code-splitting</code> adalah di route. <code>Route-basecode-splitting</code> menyelesaikan sebagian masalah ini. Tapi sebagian besar apikasi hanya memanfaatkan <strong>50%</strong> dari keuntungan <code>code-splitting</code>.</p>
<p>Pertanyaanya, apakah kita menyusun komponen dengan benar saat menggunakan <code>code-splitting</code>? Kita akan lihat kenapa dan bagaimana menyelesaikanya menggunakan beberapa contoh kode. Untuk itu, kita akan menggunakan sebuah contoh aplikasi React dengan beberapa komponen <code>UI</code>.</p>
<p>Dari screenshoot dibawah, kita dapat lihat sebuah komponen dashboard, yang memiliki banyak tab. Setiap tab memiliki banyak komponen.</p>
<p><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i7I9ESxb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m86yxfplki8f6m4y85ps.png" alt /></p>
<p>Dashboard komponen tersebut menggunakan <code>route-basecode-splitting</code> seperti kode dibawah ini.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> Dashboard = lazy(<span class="hljs-function">() =&gt;</span> <span class="hljs-keyword">import</span>(<span class="hljs-string">'components/Dashboard'</span>));
<span class="hljs-keyword">const</span> Settings = lazy(<span class="hljs-function">() =&gt;</span> <span class="hljs-keyword">import</span>(<span class="hljs-string">'components/Settings'</span>));
<span class="hljs-keyword">const</span> Configurations = lazy(<span class="hljs-function">() =&gt;</span> <span class="hljs-keyword">import</span>(<span class="hljs-string">'components/Configurations'</span>));

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Router</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">Layout</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">SideBar</span>/&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">Layout</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">AppHeader</span>/&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">Content</span> <span class="hljs-attr">style</span>=<span class="hljs-string">{{padding:</span> '<span class="hljs-attr">20px</span>'}}&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">Suspense</span> <span class="hljs-attr">fallback</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">div</span>&gt;</span>Loading...<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>}&gt;
              <span class="hljs-tag">&lt;<span class="hljs-name">Switch</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">Route</span> <span class="hljs-attr">path</span>=<span class="hljs-string">"/dashboard"</span>&gt;</span>
                  <span class="hljs-tag">&lt;<span class="hljs-name">Dashboard</span>/&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">Route</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">Route</span> <span class="hljs-attr">path</span>=<span class="hljs-string">"/settings"</span>&gt;</span>
                  <span class="hljs-tag">&lt;<span class="hljs-name">Settings</span>/&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">Route</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">Route</span> <span class="hljs-attr">path</span>=<span class="hljs-string">"/configuration"</span>&gt;</span>
                  <span class="hljs-tag">&lt;<span class="hljs-name">Configurations</span>/&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">Route</span>&gt;</span>
              <span class="hljs-tag">&lt;/<span class="hljs-name">Switch</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">Suspense</span>&gt;</span>
          <span class="hljs-tag">&lt;/<span class="hljs-name">Content</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">Layout</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">Layout</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">Router</span>&gt;</span></span>
  );
}
</code></pre>
<p>Dashboard komponen bersisi beberapa sub-komponen seperti Sales, Profit, Chart, Tiles dan Trend sepertu kode dibawah ini.</p>
<pre><code class="lang-javascript">
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Dashboard</span>(<span class="hljs-params"></span>) </span>{

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Tabs</span> <span class="hljs-attr">defaultActiveKey</span>=<span class="hljs-string">"1"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">TabPane</span> <span class="hljs-attr">tab</span>=<span class="hljs-string">"Sales"</span> <span class="hljs-attr">key</span>=<span class="hljs-string">"1"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">Sales</span>/&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">TabPane</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">TabPane</span> <span class="hljs-attr">tab</span>=<span class="hljs-string">"Profit"</span> <span class="hljs-attr">key</span>=<span class="hljs-string">"2"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">Profit</span>/&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">TabPane</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">TabPane</span> <span class="hljs-attr">tab</span>=<span class="hljs-string">"Chart"</span> <span class="hljs-attr">key</span>=<span class="hljs-string">"3"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">Chart</span>/&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">TabPane</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">TabPane</span> <span class="hljs-attr">tab</span>=<span class="hljs-string">"Tiles"</span> <span class="hljs-attr">key</span>=<span class="hljs-string">"4"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">Tiles</span>/&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">TabPane</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">TabPane</span> <span class="hljs-attr">tab</span>=<span class="hljs-string">"Trends"</span> <span class="hljs-attr">key</span>=<span class="hljs-string">"5"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">Trends</span>/&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">TabPane</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">Tabs</span>&gt;</span></span>
  );
}
</code></pre>
<p>Kita harus <em>split</em> kode kedalam <em>route</em>. Jadi ketika aplikasi di <em>bundle</em>, kita mendapatkan <em>filebuild</em> terpisah untuk setiap <em>route</em>, seperti dibawah ini.</p>
<p><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6mGWrJJd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ilf5k7rggx1l1zv2zccb.png" alt /></p>
<p>Dari gambar diatas, ukuran <em>file**</em>405.1KB** adalah dashboard komponen dan file yang lainnya untuk Header, Sidebar, komponen lain dan css.</p>
<p>Ketika aplikasi di <em>host</em> di <a target="_blank" href="https://www.netlify.com/">Netlify</a> untuk menguji kinerjanya. Seolah-olah kita sudah menguji di lokal dan tidak ada perbedaan. Ketika kita test aplikasi yang di host menggunakan <a target="_blank" href="https://gtmetrix.com/">GTmetrix</a>, dashboard screen butuh 2.9 detik untuk di <em>load</em>, Silahkan lihat gambar di bawah untuk <em>frame by frame loading.</em></p>
<p><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--18w70Ipx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dfgai6a0xk1w7gfbvz10.png" alt /></p>
<p>Komponen dashboard adalah halaman awal aplikasi, jadi ketika kita mengunjungi webistenya <strong>405.1 KB</strong> akan di <em>load</em> bersama dengan header dan sidebar.</p>
<p>Awalnya user haya akan melihat tab Sales, tapi contoh dashboard komponen aplikasi memiliki banyak tab. Jadi browser mendownload komponen yang lain juga, itu menunda aplikasi ke user. Untuk mengurangi <em>initial laod time</em>, Kita membutuhkan beberapa perubahan di dashboard komponen seperti dibawah ini.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> Sales = lazy(<span class="hljs-function">() =&gt;</span> <span class="hljs-keyword">import</span>(<span class="hljs-string">'components/Sales'</span>));
<span class="hljs-keyword">const</span> Profit = lazy(<span class="hljs-function">() =&gt;</span> <span class="hljs-keyword">import</span>(<span class="hljs-string">'components/Profit'</span>));
<span class="hljs-keyword">const</span> Chart = lazy(<span class="hljs-function">() =&gt;</span> <span class="hljs-keyword">import</span>(<span class="hljs-string">'components/Chart'</span>));
<span class="hljs-keyword">const</span> Tiles = lazy(<span class="hljs-function">() =&gt;</span> <span class="hljs-keyword">import</span>(<span class="hljs-string">'components/Tiles'</span>));
<span class="hljs-keyword">const</span> Trends = lazy(<span class="hljs-function">() =&gt;</span> <span class="hljs-keyword">import</span>(<span class="hljs-string">'components/Trends'</span>));

<span class="hljs-keyword">const</span> { TabPane } = Tabs;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Dashboard</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Tabs</span> <span class="hljs-attr">defaultActiveKey</span>=<span class="hljs-string">"1"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">TabPane</span> <span class="hljs-attr">tab</span>=<span class="hljs-string">"Sales"</span> <span class="hljs-attr">key</span>=<span class="hljs-string">"1"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">Suspense</span> <span class="hljs-attr">fallback</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">div</span>&gt;</span>Loading...<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>}&gt;
          <span class="hljs-tag">&lt;<span class="hljs-name">Sales</span>/&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">Suspense</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">TabPane</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">TabPane</span> <span class="hljs-attr">tab</span>=<span class="hljs-string">"Profit"</span> <span class="hljs-attr">key</span>=<span class="hljs-string">"2"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">Suspense</span> <span class="hljs-attr">fallback</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">div</span>&gt;</span>Loading...<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>}&gt;
          <span class="hljs-tag">&lt;<span class="hljs-name">Profit</span>/&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">Suspense</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">TabPane</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">TabPane</span> <span class="hljs-attr">tab</span>=<span class="hljs-string">"Chart"</span> <span class="hljs-attr">key</span>=<span class="hljs-string">"3"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">Suspense</span> <span class="hljs-attr">fallback</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">div</span>&gt;</span>Loading...<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>}&gt;
          <span class="hljs-tag">&lt;<span class="hljs-name">Chart</span>/&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">Suspense</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">TabPane</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">TabPane</span> <span class="hljs-attr">tab</span>=<span class="hljs-string">"Tiles"</span> <span class="hljs-attr">key</span>=<span class="hljs-string">"4"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">Suspense</span> <span class="hljs-attr">fallback</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">div</span>&gt;</span>Loading...<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>}&gt;
          <span class="hljs-tag">&lt;<span class="hljs-name">Tiles</span>/&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">Suspense</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">TabPane</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">TabPane</span> <span class="hljs-attr">tab</span>=<span class="hljs-string">"Trends"</span> <span class="hljs-attr">key</span>=<span class="hljs-string">"5"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">Suspense</span> <span class="hljs-attr">fallback</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">div</span>&gt;</span>Loading...<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>}&gt;
          <span class="hljs-tag">&lt;<span class="hljs-name">Trends</span>/&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">Suspense</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">TabPane</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">Tabs</span>&gt;</span></span>
  );
}
</code></pre>
<p>Disini kita telah mengimport setiap komponen dengan <code>lazy loading</code> dan membungkus komponen dengan <code>suspend</code>.</p>
<blockquote>
<p>Disini kita telah menambahkan banyak suspend untuk pemahaman yang lebih baik, tapi kita bisa menggunakan satu <code>sunpend</code> untuk semua komponen.</p>
</blockquote>
<p>Kita belum melakukan perubahan apapun pada <code>code-splitting</code> tingkat <em>route</em>. Ketika aplikasi di <em>build</em>, beberapa tambahan <em>files</em> akan ditambahkan karena kita telah me mgimplementasi <code>lazy-loaded</code> disetiap tab di dashboard komponen. Silahkan cek gambar dibawah untuk build file separation.</p>
<p><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8cA6EaTl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/268n08iakvetd2hd0b5k.png" alt /></p>
<p>Sekarang kita test lagi aplikasi dengan <a target="_blank" href="https://gtmetrix.com/">GTmetrix</a> dengan perubahan diatas. Lihat kinerja aplikasi pada gambar dibawah.</p>
<p><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--btIPAr9n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hi2z7p6rtx8gp1h31fox.png" alt /></p>
<p>Seperti yang kita lihat, sekarang dashboard komponen di muat dalam 1 second, karena hanya kode tab Sales yang diload. Kita telah mengurangi hanpir <strong>2 detik</strong> denga nmembuat beberapa perubahan. Mari kita lihat perbandingan dari route-base dan route, <code>component-basecode-splitting</code> pada gambar dibawah ini.</p>
<p><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rtbgP-xh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/refnafbfm38huv20sajl.png" alt /></p>
<p><code>Route Based code-splitting</code></p>
<p><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IoWYsBzW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k2agdjoxwnu2h98543s6.png" alt /></p>
<p><code>Route and component-based code-splitting</code></p>
<p>Seperti yang kita lihat, ini adalah peningkatan besar dalalm <em>initial load</em> aplikasi, Sekarang kami telah mengurangi waktu buka awal aplikasi React hingga 70% dengan beberapa penyesuaian dengan menggunakan <code>code-splitting</code> secara efektif di komponen dashboard.</p>
<h3 id="heading-referensi">Referensi</h3>
<ul>
<li><p><a target="_blank" href="https://reactjs.org/docs/code-splitting.html#code-splitting">Code Splitting</a></p>
</li>
<li><p><a target="_blank" href="https://gtmetrix.com/blog/first-contentful-paint-explained/">First Contentful Paint</a></p>
</li>
<li><p><a target="_blank" href="https://dev.to/nilanth/how-to-reduce-react-app-loading-time-by-70-1kmm">https://dev.to/nilanth/how-to-reduce-react-app-loading-time-by-70-1kmm</a></p>
</li>
</ul>
<h3 id="heading-kesimpulan">Kesimpulan</h3>
<p>Menyusun komponen dengan cara yang dioptimalkan dan menggunakan React API secara efektif akan meningkatkan kinerja aplikasi skala besar.</p>
]]></content:encoded></item><item><title><![CDATA[Mengenal JSX: Konsep dan Fungsi Utamanya]]></title><description><![CDATA[Apa itu JSX?
JSX singkatan dari javascript dan XML. Memungkinkan kita untuk menulis tag HTML didalam React element.
Kenapa JSX dibutuhkan?
Berikut adalah contoh code React dengan menggunakan JSX
import React from "react"; 

function App() {
    retur...]]></description><link>https://ajatdarojat45.id/apa-itu-jsx</link><guid isPermaLink="true">https://ajatdarojat45.id/apa-itu-jsx</guid><category><![CDATA[React]]></category><category><![CDATA[JSX]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Fri, 05 Jul 2024 10:43:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/c8h0n7fSTqs/upload/6afb491a72709b6132a80e70f6b65cc8.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-apa-itu-jsx">Apa itu JSX?</h3>
<p>JSX singkatan dari javascript dan XML. Memungkinkan kita untuk menulis tag HTML didalam React element.</p>
<h3 id="heading-kenapa-jsx-dibutuhkan">Kenapa JSX dibutuhkan?</h3>
<p>Berikut adalah contoh code React dengan menggunakan JSX</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>; 

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">return</span> (
        <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Hello World!<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>

    ); 
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> App;
</code></pre>
<p>Jika kita tidak ingin menggunakan JSX. Mari kita lihat bagaimana kita dapat melakukannya?</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>; 

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">return</span> (
        React.createElement(<span class="hljs-string">'div'</span>, <span class="hljs-literal">null</span>, 
        React.createElement(
            <span class="hljs-string">'h1'</span>, <span class="hljs-literal">null</span>, <span class="hljs-string">`Hello World!`</span>
        ))

    ); 
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> App;
</code></pre>
<p>Ini adalah code yang sama yang ditulis tanpa JSX. Jadi, JSX memungkinkan kita untuk menulis HTML elemen didalam javascript tanpa menggunakan method <code>createElement()</code> atau <code>appendChild()</code>.</p>
<p>Kita tidak harus menggunakan JSX, tapi JSX membuat jadi lebih mudah dalam membuat aplikasi React. Setiap JSX elemen hanyalah <code>syntactic sugar</code> untuk memanggil <code>React.createElement</code>. Jadi, semua yang kita lakukan dengan JSX dapat juga dilakukan dengan plain javascript.</p>
<h3 id="heading-rules-for-coding-jsx">Rules for coding JSX</h3>
<p>Ketika menulis kode JSX kita sebaiknya mengikuti hal-hal berikut:</p>
<ul>
<li><p>Menyisipkan ekspresi javascript. Ekspresi javascript yang valid bisa di sisipkan dalam kode JSX dengan menggunakan curly braces <code>{}</code>.</p>
<pre><code class="lang-javascript">  <span class="hljs-keyword">import</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>; 

  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
      <span class="hljs-keyword">return</span> (
          <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
              <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>The sum of 6 and 9 is {6+9}<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
          <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
      ); 
  }

  <span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> App;
</code></pre>
</li>
<li><p>Semua top level elemen kode HTML didalam JSX harus di bungkus dalam SATU level element. Jadi ketika menulis banyak elemen, kita harus menaruhnya didalam single parent elemen.</p>
<pre><code class="lang-javascript">  <span class="hljs-comment">// WRONG WAY</span>
  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{ 
   <span class="hljs-keyword">return</span> (
     <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Hey, React!<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span></span>
     <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>I love JSX!<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span></span>
   ); 
  }
</code></pre>
<pre><code class="lang-javascript">  <span class="hljs-comment">// CORRECT WAY</span>
  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{ 
     <span class="hljs-keyword">return</span> (
      <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Hey, React!<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>I love JSX!<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
     ); 
  }
</code></pre>
</li>
<li><p>Sebuah blok kode HTML untuk menulis potongan HTML dalam beberapa baris, letakan kode HTML didalam sebuah tanda kurung <code>()</code> dan simpan didalam sebuah variable. Variable ini bisa digunakan dimana saja sebagai pengganti HTML.</p>
<pre><code class="lang-javascript">  <span class="hljs-keyword">const</span> myelem = (
      <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Hello React!<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>I love JSX!<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>This is a block of code. <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  ); 

  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
      <span class="hljs-keyword">return</span> myelem; 
  }
</code></pre>
</li>
<li><p>Semua elemen harus ditutup. Semua HTML elemen harus ditutup dengan benar. JSX akan menempar sebuah error jika HTML tidak ditutup dengan benar.</p>
<pre><code class="lang-javascript">  <span class="hljs-keyword">const</span> myelem = (
      <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"img.png"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"Yay"</span> /&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> /&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">br</span>/&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  ); 

  <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
      <span class="hljs-keyword">return</span> myelem; 
  }

  <span class="hljs-comment">// NOTICE THAT EVEN SELF CLOSING TAGS ARE PROPERLY CLOSED</span>
</code></pre>
</li>
</ul>
<p><em>React tidak perlu menggunakan JSX</em>, tapi kebanyakan orang merasa terbantu sebagai bantuan visual saat bekerja dengan UI didalam kode javascript.</p>
<p>JSX juga memungkinkan React untuk menampilkan pesan error dan warning yang lebih berguna.</p>
<p><strong>Sumber</strong>:</p>
<ul>
<li><p><a target="_blank" href="https://reactjs.org/docs/introducing-jsx.html">https://reactjs.org/docs/introducing-jsx.html</a></p>
</li>
<li><p><a target="_blank" href="https://dev.to/rahxuls/what-is-jsx-in-react-4igb">https://dev.to/rahxuls/what-is-jsx-in-react-4igb</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Langkah Mudah Mengambil Fields Spesifik dari MongoDB]]></title><description><![CDATA[Jika kamu mencari solusi untuk mengambil fields tertentu yang dibutuhkan dari mongoDB, ini sulusi simple yang bisa menolong tanpa efek samping.
Katakan, kita punya fields data seperti dibawah ini di database:
meetingId,
meetingDate,
noticeDate,
title...]]></description><link>https://ajatdarojat45.id/cara-mengambil-fields-tertentu-dari-mongodb</link><guid isPermaLink="true">https://ajatdarojat45.id/cara-mengambil-fields-tertentu-dari-mongodb</guid><category><![CDATA[MongoDB]]></category><category><![CDATA[NoSQL]]></category><category><![CDATA[Databases]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Fri, 05 Jul 2024 10:41:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/cijiWIwsMB8/upload/7b3b381bdf67bdbd75c02f73624a3c51.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Jika kamu mencari solusi untuk mengambil fields tertentu yang dibutuhkan dari mongoDB, ini sulusi simple yang bisa menolong tanpa efek samping.</p>
<p>Katakan, kita punya fields data seperti dibawah ini di database:</p>
<pre><code class="lang-plaintext">meetingId,
meetingDate,
noticeDate,
title,
agenda,
venue,
notice,
noticeDistribution,
chairedBy,
participants,
minutes,
minutesPreparedBy,
minutesApprovedBy,
minutesDistribuion,
status,
username,
userid
</code></pre>
<p>Tapi kita hanya butuh field <code>minutes</code> dan <code>minutesApprovedBy</code> , kita bisa malakukan cara seperti dibawah ini:</p>
<pre><code class="lang-javascript">yourDB.find({}, {<span class="hljs-attr">minutes</span>:<span class="hljs-literal">true</span>, <span class="hljs-attr">minutesApprovedBy</span>:<span class="hljs-literal">true</span>})
.then(<span class="hljs-function"><span class="hljs-params">data</span>=&gt;</span>res.send(data))
.catch(<span class="hljs-function"><span class="hljs-params">err</span>=&gt;</span>res.send(err))
</code></pre>
<p>fields yang kita butuhkan atau mau kita ambil, disatukan dengan nilai <code>true</code> seperti yang kita lihat diatas. Ini akan mengembalikan fields tersebut dari database. Kita juga bisa melakukan <code>findOne({}, {})</code> bila perlu.</p>
<p><strong>Sumber</strong>:</p>
<ul>
<li><p><a target="_blank" href="https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/">https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/</a></p>
</li>
<li><p><a target="_blank" href="https://dev.to/tradecoder/how-to-get-only-required-data-fields-from-mongodb-5b0p">https://dev.to/tradecoder/how-to-get-only-required-data-fields-from-mongodb-5b0p</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Panduan Git untuk Pemula]]></title><description><![CDATA[Banyak dari kita khususnya pemula bingung tentang Git.
Definisi teknis tentang Git adalah

Git adalah sebuah Version System Control untuk menulusuri kode selama software di develop.

Apa itu VCS?
Sebuah Version System Control singkatnya adalah sebuah...]]></description><link>https://ajatdarojat45.id/git-untuk-pemula</link><guid isPermaLink="true">https://ajatdarojat45.id/git-untuk-pemula</guid><category><![CDATA[GitHub]]></category><category><![CDATA[Git]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Fri, 05 Jul 2024 10:39:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/wX2L8L-fGeA/upload/fbb6c070e0de9f2cf6364d9be0151773.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Banyak dari kita khususnya pemula bingung tentang <code>Git</code>.</p>
<p>Definisi teknis tentang <code>Git</code> adalah</p>
<blockquote>
<p><code>Git</code> adalah sebuah Version System Control untuk menulusuri kode selama software di develop.</p>
</blockquote>
<h3 id="heading-apa-itu-vcs">Apa itu VCS?</h3>
<p>Sebuah Version System Control singkatnya adalah sebuah manajemen kode, dimana biasanya mengelola versi informasi yang berbeda (i.e source code).</p>
<p>VCS melacak modifikasi yang kita lakukan pada kode dan mencatat perubahan yang kita buat.</p>
<p>Tapi ada perbedaan tipe dari Version Control System.</p>
<ol>
<li><p><strong>Local Version Control System</strong> - ini memiliki sistem database untuk mengelola trek.</p>
</li>
<li><p><strong>Centralized Versin Control System</strong> - Dimana semua pengguna terhubung ke semuah repo master.</p>
</li>
<li><p><strong>Distributed Version Control System</strong> - Dimana semua pengguna dapat terhubung ke banyak repo di waktu yang sama.</p>
</li>
</ol>
<h3 id="heading-terminologi-peting-git">Terminologi Peting Git</h3>
<ol>
<li><strong>Repository</strong></li>
</ol>
<p>Simpelnya, repo/repositori adalah sebuah jenis wadah tempat kita menyimpan sesuatu. Secara teknis itu adalah sebuah struktur data yang digunakan oleh VCS dimana metadata dari file dan direktori kode yang disimpan.</p>
<ol start="2">
<li><strong>Branch</strong></li>
</ol>
<p>Anggap ini sebagai cabang pohon sederhana yang menyipang dari akar pohon, demikian pula dengan <code>branch git</code> adalah versi repo yang membagi dari repositori utama. Di repo branch kita dapat mambuat berbagai perubahan seperti: daftar, hapus, ganti nama dan lain-lain.</p>
<ol start="3">
<li><strong>Clone</strong></li>
</ol>
<p>Clonning di git berarti membuat sebuah salinan dari target repositori dan menduplikasi semua file dari target repo. <code>clone</code> adalah utilitas baris perintah <code>git</code>.</p>
<ol start="4">
<li><strong>Index</strong></li>
</ol>
<p>Index di git dikenal juga sebagai <code>staging area</code> atau <code>staging index</code>. Sebuah file di direktori Git yang menyimpan informasi tentang apa yang akan masuk ke komit kita selanjutnya. File di <code>staging index</code> siap untuk ditambahkan ke repositori.</p>
<ol start="5">
<li><strong>Push dan Pull request</strong></li>
</ol>
<p><code>Git push</code> akan mengambil semua file dari direktori repo lokal dan akan di push ke repo utama misalnya di Github.</p>
<p><code>Git pull</code> digunakan ketika kita ingin pull perubahan terakhir di repo utama.</p>
<h3 id="heading-perintah-untuk-menggunakan-git-di-command-line">Perintah untuk menggunakan Git di Command Line</h3>
<ol>
<li><p><code>git init</code> - Untuk menginisiasi atau membuat sebuah repositori.</p>
</li>
<li><p><code>git add .</code> - Untuk menambahkan file kode ke repo kita.</p>
</li>
<li><p><code>git status</code> - Untuk melihat file di repositori.</p>
</li>
<li><p><code>git commit -m 'pesan komit'</code> - Untuk menambahkan pesan komit ke file kode kita.</p>
</li>
<li><p><code>git push -u origin master</code> - Untuk push kode kedalam repositori utama atau target repositori.</p>
</li>
<li><p><code>git pull 'nama_remote' 'nama_branch'</code> - Ini akan pull konten dari repositori utama.</p>
</li>
<li><p><code>git fetch</code> - Ini akan mengambil komit terbaru dari repo utama ke lokal repo kita.</p>
</li>
<li><p><code>git merge</code> - ini akan menggabungkan branch dari remote ke repositori lokal.</p>
</li>
<li><p><code>git clone link_repositori</code> - Untuk klone target repositori.</p>
</li>
</ol>
<p>Jadi itu saja untuk <code>Git</code>, berharap artikel ini dapat membantu dalam belajar dan akan menjadi panduan yang mudah dibaca. Kasih tau jika artikel ini membantu.</p>
<p>Lanjutkan dan buat proyek pertama di Github dengan bantuan artikel ini. 🙂</p>
<p><strong>Sumber</strong>:</p>
<ul>
<li><p><a target="_blank" href="https://git-scm.com/docs">https://git-scm.com/docs</a></p>
</li>
<li><p><a target="_blank" href="https://dev.to/binalmehta/git-for-newbies-jm0">https://dev.to/binalmehta/git-for-newbies-jm0</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Memahami Kode Status HTTP dengan Mudah]]></title><description><![CDATA[Apa dan untuk apa kode status HTTP itu?
1XX - Informasi

Menunjukan hanya satu informasi:

Contoh:

100 - Continue

102 - Processing


2XX - Sukses

Menunjukan request yang berhasil.

Contoh:

200 - OK

201 - Created

202 - Accepted


3XX - Pengaliha...]]></description><link>https://ajatdarojat45.id/kode-status-http</link><guid isPermaLink="true">https://ajatdarojat45.id/kode-status-http</guid><category><![CDATA[http]]></category><dc:creator><![CDATA[Ajat Darojat]]></dc:creator><pubDate>Fri, 05 Jul 2024 10:38:14 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/89xuP-XmyrA/upload/54c90a4f02893b768b600bdca0cf780b.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Apa dan untuk apa kode status <code>HTTP</code> itu?</p>
<h3 id="heading-1xx-informasi">1XX - Informasi</h3>
<blockquote>
<p>Menunjukan hanya satu informasi:</p>
</blockquote>
<p><strong>Contoh</strong>:</p>
<ul>
<li><p>100 - Continue</p>
</li>
<li><p>102 - Processing</p>
</li>
</ul>
<h3 id="heading-2xx-sukses">2XX - Sukses</h3>
<blockquote>
<p>Menunjukan request yang berhasil.</p>
</blockquote>
<p><strong>Contoh</strong>:</p>
<ul>
<li><p>200 - OK</p>
</li>
<li><p>201 - Created</p>
</li>
<li><p>202 - Accepted</p>
</li>
</ul>
<h3 id="heading-3xx-pengalihan">3XX - Pengalihan</h3>
<blockquote>
<p>Menunjukkan penggilan ulang.</p>
</blockquote>
<p><strong>Contoh</strong>:</p>
<ul>
<li><p>301 - Moved permanently</p>
</li>
<li><p>308 - Permanent Redirect</p>
</li>
</ul>
<h3 id="heading-4xx-error-client">4XX - Error Client</h3>
<blockquote>
<p>Menunjukan error pada sisi client. Sebuah contoh yang kita pernah temui adalah ketika kita memasukan <code>URL</code> yang salah.</p>
</blockquote>
<p><strong>Contoh</strong>:</p>
<ul>
<li><p>400 - Bad Request</p>
</li>
<li><p>401 - Unautorized</p>
</li>
<li><p>403 - Forbidden</p>
</li>
<li><p>404 - Not Found</p>
</li>
</ul>
<h3 id="heading-5xx-error-server">5XX - Error Server</h3>
<blockquote>
<p>Menunjukan sebuah error pada sisi server.</p>
</blockquote>
<p><strong>Contoh</strong>:</p>
<ul>
<li><p>500 - Internal server Error</p>
</li>
<li><p>501 - Bad Gateway</p>
</li>
<li><p>502 - Service Unavailable</p>
</li>
</ul>
<p><strong>Sumber</strong>:</p>
<ul>
<li><p><a target="_blank" href="https://httpstatuses.com/">https://httpstatuses.com/</a></p>
</li>
<li><p><a target="_blank" href="https://dev.to/fariasmateuss/http-status-codes-3olc">https://dev.to/fariasmateuss/http-status-codes-3olc</a></p>
</li>
</ul>
]]></content:encoded></item></channel></rss>