<?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" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Bahas Javascript - Medium]]></title>
        <description><![CDATA[Karena kita sama-sama tahu Javascript adalah salah satu bahasa pemrograman yang cukup aneh di dunia, makanya ayoklah kita kupas satu persatu supaya lebih paham tentang Javascript. - Medium]]></description>
        <link>https://medium.com/bahas-javascript?source=rss----4793b8102d52---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Bahas Javascript - Medium</title>
            <link>https://medium.com/bahas-javascript?source=rss----4793b8102d52---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 23:04:00 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/bahas-javascript" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Frontend Security 101: Securing Your Content]]></title>
            <link>https://medium.com/bahas-javascript/frontend-security-101-securing-your-content-7535d8c24357?source=rss----4793b8102d52---4</link>
            <guid isPermaLink="false">https://medium.com/p/7535d8c24357</guid>
            <category><![CDATA[frontend-security]]></category>
            <category><![CDATA[front-end-development]]></category>
            <dc:creator><![CDATA[Ashari Muhammad Hisbulloh]]></dc:creator>
            <pubDate>Wed, 11 Sep 2024 10:43:23 GMT</pubDate>
            <atom:updated>2024-09-11T10:40:08.975Z</atom:updated>
            <content:encoded><![CDATA[<h4>Ternyata penting untuk memberikan lapisan keamanan melalui konten di aplikasi kita</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*SJtLg6TSceICynbt" /><figcaption><a href="https://unsplash.com/photos/mock-up-screen-of-smart-phone-blue-padlock-inside-red-data-protection-shield-fingerprint-as-concept-of-authorization-and-authentication-safety-cyber-security-data-protection-privacy-3d-rendering-eFiENE6KwGE">Photo from Getty Image</a></figcaption></figure><p>Sebagai seorang frontend developer, kita adalah garis depan yang berurusan dengan user. Dengan pemahaman tersebut, harusnya kita aware bahwa kebutuhan user adalah hal yang jadi prioritas kita dalam mengembangkan sebuah aplikasi. Nah, salah satu kebutuhan dasar dari user tentunya adalah rasa aman untuk menggunakan aplikasi buatan kita a.k.a security.</p><p>Kita tentunya enggak mau dong user merasa enggak safe pake aplikasi kita, di sisi lain kita juga enggak mau dong aplikasi yang kita buat masak vulnerable gitu. <em>Ngisin-ngisini (re: </em>memalukan), kecuali kamu developer buat aplikasi pemerintah sih ya, yang udah berkali-kali memang proven bukan hanya vulnerable tapi enggak layak naik production.</p><p>Oke back to topic terkait security, kali ini saya pengen buat semacam series untuk membahas hal-hal yang bisa kita perhatikan dan tingkatkan untuk membantu meningkatkan security di aplikasi kita yang hasil akhirnya tentu bisa meningkatkan rasa aman user kita dan jadinya semakin banyak user yang pakai aplikasi kita.</p><p>Kenapa dibuat series, soalnya banyak yang bisa dicover, kalo dijadikan satu artikel tu nanti… <em>saya bingung nulisnya, soalnya masih latihan nulis lagi di medium. Hehe</em></p><p>Pada edisi pertama ini, saya mau membahas hal terkait security yang mungkin tidak terlalu familiar, namun ternyata ini cukup penting untuk diimplement. Apalagi jika aplikasi kita melibatkan proses upload content seperti image, yaitu <strong>cleaning EXIF data</strong>.</p><blockquote>EXIF (Exchangeable Image File Format) data adalah informasi metadata yang tersimpan di file gambar, biasanya ini bawaan dari kamera digital atau aplikasi image editor. Beberapa data yang ada di dalam EXIF diantaranya: <strong>tanggal &amp; waktu</strong>, camera settings, resolusi, lokasi, model device, dan perangkat lunak editing kalo ada.</blockquote><p>Dari penjelasan singkat di atas, kita bisa notice kalo ada dua data yang relate dengan security dan privacy, yaitu tanggal dan waktu dan lokasi. Untuk tanggal dan waktu mungkin masih debatable lah ya, tapi kalo lokasi kan sudah masuk ranah privasi meskipun bisa juga dianggap sebagai public data karena bisa ditrack.</p><p><em>Terus enggak issue dong, ash?! Yo issue lah gimana sih…. debatable tu berarti ya bisa berarti “iya”</em></p><p>Balik lagi, kenapa ini penting, karena image ini kan mostly dalam aplikasi kita dia sifatnya publik ya. Semua orang bisa download image itu kalo contentnya memang muncul di layar user, berbeda dengan data sensitive yang mungkin bisa didapatkan kalo emang ada data breach atau leaked.</p><p>Dan banyak juga kasus-kasus kejahatan kan bermodalkan track dari 2 data tadi, yaitu tanggal dan waktu sama lokasi. Juga model kamera ataupun data perangkat lunak dapat digunakan juga oleh pihak yang enggak bertanggung jawab untuk attempt eksploitasi keamanan.</p><p>So…. what should we do?</p><p>Untungnya sebagai frontend developer, kita berinteraksi dekat dengan file-file user yang akan diupload melalui sistem, jadi kita bisa melakukan pencegahan-pencegahan untuk mengamankan data tersebut. Caranya ya jelas, sebelum kita melakukan proses upload ke backend kita perlu melakukan exif cleansing/exif remove.</p><p>Bermodalkan library exifremove dari NPM, kita bisa membuat helper seperti ini:</p><pre>import exifRemover from &#39;exifremove&#39;;<br><br>/**<br> * Delete Image Exif<br> * @description<br> * delete exif data from jpg or jpeg image<br> * and return clean image<br> * @param {string | ArrayBuffer} image<br> * @param {any} imageType<br> * @returns<br> */<br>export const deleteImageExif = (image: string | ArrayBuffer, imageType: any) =&gt; {<br>  // @ts-ignore<br>  const buffer = Buffer.from(image);<br>  const tempBuffer = exifRemover.remove(buffer);<br>  const blob = new Blob([tempBuffer], { type: imageType });<br>  const resultImageDeletedExif = new File(<br>    [blob],<br>    `temp.${imageType.split(&#39;/&#39;)[1]}`,<br>    { type: imageType },<br>  );<br>  return resultImageDeletedExif;<br>};</pre><p>The usage:</p><pre>const readerBuffer = new FileReader();<br>const imageFile = e.target.files[0];<br><br>readerBuffer.readAsArrayBuffer(imageFile);<br>const { type: imageType, size } = imageFile;<br><br>readerBuffer.onloadend = (event) =&gt; {<br>  const imageLoaded = {<br>    previewUrl: URL.createObjectURL(imageFile),<br>    file: null,<br>  };<br>  if (imageType === &#39;image/jpeg&#39; || imageType === &#39;image/jpg&#39;) {<br>    const deletedExif = deleteImageExif(event.target.result, imageType);<br>    imageLoaded.file = deletedExif;<br>  } else {<br>    imageLoaded.file = imageFile;<br>  }<br>  setFile(imageLoaded.file, imageLoaded.previewUrl, &#39;image&#39;);<br>};<br><br>// Terus tinggal upload deh filenya </pre><p>Dah as simple as that, terus apasih manfaat implement ini? Kenapa kita perlu aware terkait ini selain terkait privacy tadi?</p><ul><li>Dalam beberapa kasus, terutama dengan regional yang punya regulasi yang ketat seperti di Eropa, menyimpan data pribadi kaya lokasi tanpa persetujuan pengguna tuh bisa dianggap sebagai pelanggaran hukum. Jadi implementasi seperti ini bisa sangat bermanfaat untuk menghindari masalah hukum terkait privasi</li><li>Data-data EXIF ini juga menambah ukuran file gambar, jadi dengan implementasi ini kita bisa mengurangi ukuran file gambar dan mungkin bisa juga kita implement image optimization helper yang lain di dalamnya</li><li>Relate dengan EXIF yang menambah ukuran file gambar, nyatanya data EXIF ini banyak yang enggak terlalu diperlukan untuk kebutuhan aplikasi kita, jadi yaa… gitu deh</li></ul><p>Jadi dengan begini kamu, aku, dia, dan mereka alias kita-kita semua sudah sedikit lebih dekat untuk memberikan pelayanan prima ke user dengan menambah rasa aman user dalam menggunakan aplikasi kita.</p><p><em>Sampai jumpa di edisi selanjutnya, have a great day!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7535d8c24357" width="1" height="1" alt=""><hr><p><a href="https://medium.com/bahas-javascript/frontend-security-101-securing-your-content-7535d8c24357">Frontend Security 101: Securing Your Content</a> was originally published in <a href="https://medium.com/bahas-javascript">Bahas Javascript</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Choosing Your Frontend Library]]></title>
            <link>https://medium.com/bahas-javascript/choosing-your-frontend-library-dd6f9d060246?source=rss----4793b8102d52---4</link>
            <guid isPermaLink="false">https://medium.com/p/dd6f9d060246</guid>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[web-development-tips]]></category>
            <category><![CDATA[npm-libraries]]></category>
            <dc:creator><![CDATA[Ashari Muhammad Hisbulloh]]></dc:creator>
            <pubDate>Wed, 04 Sep 2024 08:22:27 GMT</pubDate>
            <atom:updated>2024-09-04T08:16:21.591Z</atom:updated>
            <content:encoded><![CDATA[<h4>Hal yang biasanya saya perhatikan dalam memilih library untuk web app saya</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*VOjH-OZA7tbZCf65" /><figcaption><a href="https://unsplash.com/photos/a-long-row-of-books-in-a-library-My06S-Wg_zc">Photo by Zetong Li</a></figcaption></figure><p>Di dunia per-frontend-an dimana komunitasnya sudah sangat besar didukung dengan library yang silih berganti tapi bentuknya mirip-mirip mungkin kadang kita agak bingung gimana cara memilih library yang cocok untuk aplikasi kita. Atau mungkin kamu sedang dapat task untuk melakukan migration project, tapi library yang dipake di codebase yang lama sudah enggak relevan lagi di jaman sekarang, kamu juga jadi bingung gimana milih library penggantinya.</p><p>Sebagai frontend developer yang mungkin belum terlalu familiar dengan dunia per-npm-an, yang mana disitu banyak librarynya yang mirip-mirip dengan popularitas yang sama mirip-miripnya juga, hal ini bisa bikin dilema. <em>Atau enggak?</em></p><p>Soalnya pemilihan library yang tepat ini juga akan membantu kita untuk maintain codebase kita di waktu yang akan datang, tentunya kita enggak mau pake library yang tidak sustainable dan tidak reliable. Nah, mari kita bongkar detail-detail dalam halaman library NPM untuk membantu kita memilih library yang tepat.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wR3rQbgLQaTd8esZj3XAbg.png" /><figcaption>Photo of Dayjs in npmjs.com</figcaption></figure><p>Kita akan mulai kulik dari bagian atas ya</p><h4>Typescript-based library is better than Typescript declaration file</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/160/1*HU6wehcS4dP6CFo936Gw4g.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/134/1*ZwpWGmp0Eef18ONLXnNNdQ.png" /><figcaption>Typescript-based (kiri) vs non Typescript-based (kanan)</figcaption></figure><p>Pertimbangan pertama yang saya ambil adalah untuk memilih library yang dibikin pake typescript alias typescript-based. Sebenernya hal ini penting nggak penting, tapi untuk long-live project saya akan sarankan untuk pilih yang TS-based. Beberapa keuntungan memilih library yang TS-based:</p><ul><li>Ketika kita nantinya akan migrasi ke project yang berbasis Typescript juga, kita tidak perlu melakukan penambahan install type declaration @types/[something]</li><li>Karena typing yang satu set dengan librarynya, kita lebih confident ketika melakukan upgrade library, sehingga tidak ada risiko versi library yang kita pakai sudah naik etapi ternyata type-nya belum terupdate/belum relevan</li></ul><h4>Fewer dependencies are better</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/776/1*r069QG5TQFOxH8r9N4Wqeg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/778/1*0By9DRI3hIfJbldNaCkOcA.png" /><figcaption>Dependencies comparison</figcaption></figure><p>Pertimbangan kedua saya dalam memilih library adalah memilih yang Dependencies nya lebih sedikit. Karena dengan begitu kita tahu bahwa risiko library kita break ketika ada dependecy yang deprecated/discontinue semakin kecil.</p><p>Karena enggak lucu library yang biasa kita pake serve user sehari-hari tiba-tiba nge-break karena ada dependency yang udah enggak relevan lagi. Kan kita juga day-to-day nya ngerjain fitur dan enggak ngecekin si dependencies ini.</p><p>Jangan sampe kejadian tahun 2016 terulang lagi, dimana library bernama left-pad tiba-tiba di-unpublish sama developernya terus bikin dunia Javascript seantero jagat mati total.</p><p><a href="https://www.theverge.com/2016/3/24/11300840/how-an-irate-developer-briefly-broke-javascript">https://www.theverge.com/2016/3/24/11300840/how-an-irate-developer-briefly-broke-javascript</a></p><h4>Weekly downloads specify the popularity</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/390/1*MWxKOsRfR69G1BOmmZyXxQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/376/1*SFABa1STjmWA2jTRIlhCBA.png" /><figcaption>Weekly download comparison</figcaption></figure><p>Weekly download juga bisa jadi faktor penting dalam menentukan library, karena weekly download yang banyak menandakan banyak user/developer yang percaya sama library ini, sehingga menandakan library ini cukup populer di kalangan developer.</p><p>Kenapa penting memilih library yang populer instead of indie? Karena library yang populer akan berbanding lurus dengan community support-nya. Sehingga ketika kamu punya issue, kamu akan merasa lebih aman karena pasti ada yang akan menjawab atau pasti ada yang pernah mengalami.</p><p><em>Your answer will be one Google Search away~</em></p><h4>Issues and pull request count are your friend</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/381/1*p2lkqsLKCsfjllKFHwkZAw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/378/1*FXO2G2guJ5RT_-CUF1YWTw.png" /><figcaption>Issues and PR comparison</figcaption></figure><p>Masih nyambung dengan popularitas sebuah library, semakin populer tentu sebuah library semakin banyak yang memperhatikan dan sama-sama ikut mempertahankan lifetime dari library tersebut. Hal ini akan ditunjukkan dengan kenaikan angka dari issues &amp; pull request .</p><p>Issues ini enggak melulu yang buruk-buruk, bukan berarti library yang kita pake akan bermasalah kalo angkanya tinggi. Justru kalo kita mau spare waktu sedikit lebih banyak untuk ngeliat issues yang ada di library tersebut, kita justru malah tau, library ini kedepannya mau dibawa kemana dan gimana; apa hal-hal yang kemungkinan akan disupport di masa yang akan datang; apa aja limitation library itu; dll.</p><p>Jadi nggak usah takut sama angka issues yang tinggi, etapi issue yang tinggi perlu diikuti sama pull-request yang tinggi pula, karena ini artinya member komunitasnya mau berkontribusi untuk improve library ini. Kalo PR-nya kosongan, issuenya tinggi, artinya librarynya udah enggak ada yang nggubris. 😀</p><h4>Unpacked size will affect your bundle size</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/370/1*fyO7WmJln62T1TWc0U6zQA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/381/1*RfFffZ_X0hhAXAPfllUSXQ.png" /><figcaption>Unpacked size comparison</figcaption></figure><p>Ini sangat perlu diperhatikan oleh frontend developer, terutama jika aplikasinya dipakai oleh user/customer dan bukan internal applications. Unpacked size dari sebuah library akan mempengaruhi seberapa besar bundle size dari aplikasimu.</p><p>Meskipun di teknologi sekarang sudah bisa kita akalin dengan adanya tree-shaking, lazy loading, dynamic import, dll, tapi akan jauh lebih baik memilih library yang punya size yang lebih kecil. Jadi tanpa melakukan optimization tadi, bundle size aplikasi kita tetap akan se-minimum mungkin.</p><h4>Last publish will define your future fate</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/371/1*kh7HVlm_A6sVtMc7Aww4TQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/380/1*kEef069qh_QDRUVYbX-pTg.png" /><figcaption>Last publish comparison</figcaption></figure><p>Last publish ini seperti namanya, kapan si latest version dari library ini dipublish. Saya biasanya akan memilih yang lebih muda alias yang lebih baru, karena dengan begitu teknologi yang dipakai kemungkinan lebih relevan dengan perkembangan saat ini, sehingga librarynya bisa lebih cepat, lebih performant, lebih optimized.</p><p>Tapi jika kamu tipikal orang yang lebih prefer yang lebih lama karena lebih battle-tested (enggak perlu dipublish lagi aja udah banyak yang pake kok), itu juga boleh. Yang penting jangan sampe terlalu jauh misal 1.5 tahun yang lalu last publishnya, itu bukan battle-tested, itumah otw deprecated.</p><h4>Last but not least, the trending library might not be the best option, the rising star is</h4><p>Ini agak berbeda approachnya, jadi kita enggak melihat di web npmjs.com tapi kita melihat di npmtrends</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HNH1WCvZojlXQiP2_o6Slg.png" /></figure><p>Kalo membaca penjelasan saya kan kita bisa simpulkan bahwa “oh berarti library yang populer ini yang paling baik buat saya ya”. Jawaban saya “ya belum tentu juga”</p><p>Kalo kita lihat redux ini merupakan state management library yang masih sangat populer di React, tapi setelah hands-on zustand , saya akan merekomendasikan zustand dibanding redux kepada temen-temen frontend saya yang lagi belajar atau lagi mempertimbangkan library state management yang baru.</p><p>Karena zustand punya approach yang lebih baru, lebih mudah digunakan dan disetup dibandingkan redux yang meskipun sekarang disupport sama redux-toolkit menurut saya tetap masih ribet penggunaannya.</p><p>Begitu teman-teman kurang lebihnya, mungkin masih ada banyak lagi pertimbangan lainnya, tapi baseline saya untuk memilih library biasanya itu sih.</p><p>Ternyata cukup banyak variable yang bisa kita pertimbangkan ya dalam memilih library di aplikasi/project kita. Hehe, semoga cerita kali ini bisa menambah insight buat temen-temen terutama frontend developer sehingga codebase yang sedang kamu kerjakan lebih maintainable dan sustainable.</p><p><em>Have a great day!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dd6f9d060246" width="1" height="1" alt=""><hr><p><a href="https://medium.com/bahas-javascript/choosing-your-frontend-library-dd6f9d060246">Choosing Your Frontend Library</a> was originally published in <a href="https://medium.com/bahas-javascript">Bahas Javascript</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New Framework, Where to Start?]]></title>
            <link>https://medium.com/bahas-javascript/new-framework-where-to-start-ce3221cfc426?source=rss----4793b8102d52---4</link>
            <guid isPermaLink="false">https://medium.com/p/ce3221cfc426</guid>
            <category><![CDATA[learn-new-things]]></category>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[learning-to-code]]></category>
            <dc:creator><![CDATA[Ashari Muhammad Hisbulloh]]></dc:creator>
            <pubDate>Wed, 04 Sep 2024 08:22:18 GMT</pubDate>
            <atom:updated>2024-08-28T13:57:26.410Z</atom:updated>
            <content:encoded><![CDATA[<h4>Sebuah cerita mengenal teknologi baru</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*x4XprEEMNHukaVJs" /><figcaption><a href="https://unsplash.com/photos/woman-sitting-on-sofa-with-macbook-air-GwVmBgpP-PQ">Photo by Steinar Engeland</a></figcaption></figure><p>Di dunia frontend development, perkembangan framework sungguh sesuatu yang jauh lebih cepat daripada perubahan topik pembahasan di sosial media. Silir berganti, baru baca framework A eh udah muncul framework B.</p><p>Di satu sisi ini merupakan hal yang menarik karena berarti banyak orang yang ada di komunitas frontend development sehingga bisa dibilang belajar frontend development di tahun ini masih relevan dengan kebutuhan industri. Tapi di sisi yang lain, perkembangan yang secepat ini bisa bikin banyak dari kita kecapekan sendiri ngikutinnya alias burnout.</p><p>Maka dari itu kita harus pandai pilah pilih apa yang harus dipelajari, ingat pandai pilah-pilih lo ya, bukan berarti enggak mau belajar. <em>That’s two different things. </em>Supaya kita belajarnya itu mampu menambah value kita ke depannya, meskipun tidak ada namanya belajar yang sia-sia, namun alangkah baiknya belajar yang memang bisa dapat hasil segera, <em>ya to.</em></p><p><em>So here are a few tips from mehhh on how to start on a new framework, ceilah… Kita akan mulai dari non-technical (decision makingnya) dan baru masuk ke technical.</em></p><h3>The non-technicals</h3><h4>Kebutuhan industri</h4><p>Seperti yang saya mention di atas, belajar itu boleh, justru malah harus banget. Tapi misalnya untuk seorang frontend developer di level junior atau intermediate, alangkah baiknya untuk belajar framework yang memang sedang ramai di industri. Jadi misal nanti sudah lumayan pede dengan skillnya, bisa dijadikan value tambahan di company sendiri atau di calon company baru untuk meningkatkan taraf hidup. <em>Taraf hidup jare~</em></p><p>Ya soalnya eman-eman, misal ada framework X muncul, ngehype di Twitter, tapi di industri belum terlalu urgent untuk di adaptasi. Yaaa meskipun a good thing untuk belajar framework tsb, kalo pandanganku sih tetep mendingan kalo mau explore coba yang emang industrinya lagi rame. Sehingga kita enggak perlu nyari “kolam” nya lagi ketika sudah cukup skillful. Tinggal pilih aja kolamnya.</p><p>Misal udah biasa pake React, yaa coba belajar ke Vue atau Svelte dulu, baru Remix. Gitu gitu lah~</p><h4>Support komunitas</h4><p>Karena kita sebagai developer di Indonesia belum sepenuhnya menjadi kreator di industri per-frontend-an, kita sejatinya adalah consumer at the same time. Nah, namanya sebuah produk yang dikembangkan oleh manusia yang sumbernya salah dan dusta, pasti produk itu juga tidak sempurna. Barangkali ada bumbu ghibah saat developnya, <em>bukan deng.</em></p><p>Setiap product pasti punya flaw nya sendiri-sendiri, menurut consumernya yang mana ini adalah kita, frontend developer. Maka dari itu… support komunitas yang kuat sangatlah penting dalam pertimbangan memilih framework yang akan dipelajari.</p><p>Dulu semasa saya masih sering ikut untuk jadi facilitator, saya dikasih tau bahwa “Problem yang kamu temui saat ngoding itu pasti orang lain di luar sana sudah pernah menemui juga”. Makanya dengan adanya komunitas yang besar dan baik, insyaAllah ketika kita ngoding dan nemu issue, the solution is one Google search away (atau ya one ChatGPT prompt away, terserah si). Jadi ya gitu, adanya komunitas juga bisa menjadi pelipur lara bahwa banyak developer yang lain stumble dengan issue kita lo, jadi kawan sepernasiban lah ibaratnya.</p><p>Enggak asik banget kalo misalnya udahlah belajar teknologi baru, nemu issue, eh enggak ada solusinya. (<em>Kalo kamu udah level pro dan bisa bikin proposal untuk solve issuenya, kamu pengecualian ya bang jago, saya nggak lagi ngomong sama kamu -_-</em>)</p><h3>The technicals</h3><p>Dua poin di atas tadi adalah biasanya pertimbangan saya untuk mempelajari teknologi baru, utamanya framework. Nah untuk beberapa poin di bawah ini akan jadi pertimbangan yang biasa saya pikirkan saat belajar framework baru. Jadi katakanlah kamu sudah mantep memilih sebuah framework untuk dipelajari, here are the key points I usually take a look at:</p><h4>Writing Component</h4><p>Hal paling basic adalah gimana sih cara kita bikin component-component di framework itu. Apakah pake JSX atau pake HTML biasa, atau gimana. Terus misal kita udah punya component itu kalo mau dipake penulisannya gimana a.k.a splitting component nya gimana. Yakali mau ditulis semua di satu file.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/850/0*za6YF8CxRIA6AniQ.jpeg" /></figure><h4>Interactivitynya</h4><p>Interactivity atau reactivity kayaknya sudah jadi fitur wajib sebuah framework frontend, karena kan ya kita ingin dapat feedback langsung ketika ada perubahan data. Kalo enggak ada interactivity/reactivity ya ngapain pake framework, pake HTML5 basic aja lah kalo begitchu~</p><p>Biasanya reactivity diwakili dengan penggunaan State dan Data binding ke componentnya. Nah ini perlu dilihat gimana penggunaan local state dan data binding di suatu framework.</p><p>Misal di React mah kita biasa</p><pre>function SomeComponent() {<br>  const [count, setCount] = useState&lt;number&gt;(0);<br><br>  return (<br>    &lt;&gt;<br>      &lt;button <br>         onClick={() =&gt; { setCount(prev =&gt; prev + 1) }}<br>      &gt;<br>        Tambah bro {count}<br>      &lt;/button&gt;<br>    &lt;/&gt;<br>  )<br>}</pre><p>Sedangkan di Svelte dia bakal kaya gini</p><pre>&lt;script&gt;<br> let count = 0;<br><br> function increment() {<br>  count += 1;<br> }<br>&lt;/script&gt;<br><br>&lt;button on:click={increment}&gt;<br> Tambah bro {count}<br>&lt;/button&gt;</pre><p>Nah sebenernya kan keduanya sama, tapi penulisannya aja yang beda.</p><h4>Populate datanya</h4><p>Setelah kita tau gimana komponen itu reactive terhadap perubahan data, selanjutnya kita juga perlu tau gimana data itu bisa dishare ke component yang lain. Kan enggak lucu masak datanya cuma bisa dipake di component Button doang, atau masak kita harus bikin suatu component kompleks jadi satu.</p><p>Makanya itu kita perlu tau misal kita mau passing data ke child componentnya itu gimana, apakah props drilling kah atau apakah, gitu. Terus kalo kita ketemu case kita harus populate data ke 3 level di bawahnya itu harus gimana, kan enggak mungkin kita props drill sampe ke bawah-bawah.</p><p>Kembali lagi, misal di React</p><pre>// Case untuk 1 level<br>function ParenComponent {<br>  return (<br>    &lt;ChildComponent data={data} /&gt;<br>  );<br>}<br><br>// Case untuk level yang banyak, kita bisa pake React Context API<br>function SomeLowLevelComponent() {<br>  const data = useContext(ParentContext);<br><br>  return (<br>    &lt;div&gt;{data}&lt;/div&gt;<br>  );<br>}</pre><p>Sedangkan di Svelte mungkin kurleb kaya gini</p><pre># Case 1 level<br>&lt;script&gt;<br>  import ChildComponent from &#39;./Child.svelte&#39;<br>&lt;/scrript&gt;<br><br>&lt;ChildComponent data={data} /&gt;<br><br># Case multiple level<br>&lt;script&gt;<br>  let value<br><br>  value.subscribe(val =&gt; {<br>    value = val<br>  })<br>&lt;/scrript&gt;<br><br>&lt;LowLevelComponent data={value} /&gt;</pre><p>Nah ini kita harus clear karena data-data ini kan krusial untuk mendukung interactivitynya, jangan sampe datanya enggak bisa diintegrasikan ke component yang lain. Ya kalo begitu buat apa ya to, mending pake jQuery aja atau malah enggak usah pake framework aja. Pake vanilla JS dan mainan innerHTML nya aja.</p><p>Another thing to note adalah… support data store nya. Misal kaya di React selain punya Context API, kita bisa integrate data store kita pake Redux, zustand, jotai, dll. Enggak semua framework perlu integrasi third-party ini, tapi kalo ada dan bisa ini juga bisa dikulik. Barangkali bisa bikin management data kita lebih rapi secara flow maupun codingan.</p><h4>Routingnya</h4><p>Part terakhir yang saya lihat ketika saya udah tau gimana cara saya buat manage component, data dan interactivitinya, adalah gimana kita bikin routingnya. Again… enggak semua hal bisa ditaruh dalam satu halaman. Bahkan mostly untuk real-world application kita perlu memisahkan menjadi beberapa routes.</p><p>Karena dengan begitu kita bisa lebih mudah untuk track historicalnya user, kemudian memudahkan logic yang kompleks atau logic untuk render-render component maupun data fetchingnya.</p><p>Di React sendiri kalau kita pake standalone, kita bisa pake react router, kalo kita pake framework Next JS kita malah udah bisa pake folder-based. Nah ini juga perlu dicek di framework yang mau kamu pelajari baik secara standalone itu gimana terus kalau misalnya lebih advanced gimana.</p><p>Kenapa perlu tau keduanya, barangkali suatu saat kamu enggak perlu fitur yang terlalu advance, biar tidak overkill ya abangku.</p><h4>(Bonus) UI and Testing environments</h4><p>Ini bonus, tapi kayaknya ya tetep aja cukup penting. Tidak lain dan tidak bukan adalah gimana kita ngestyling componentnya karena tidak munqin user mau dikasih tampilan basic HTML. Styling ini aku biasanya cari tahu alternatifnya:</p><ul><li>Apakah pakai CSS file terus diimport</li><li>Apakah bisa di styling langsung componentnya</li><li>Apakah bisa pake library styling components (misalnya styled-components)</li><li>Support UI library/UI kit di luarannya itu gimana, mudah dan lengkap enggaknya</li></ul><p>Kalo semua aspek di UI ini terjawab, biasanya saya udah ready to go untuk coba cari use case untuk diimplement pake framework baru ini.</p><p>Bonus tambahan, jelas kita perlu juga tau gimana kita kalo mau setup dan jalanin testing di aplikasi kita. Supaya apa? Supaya value kita juga bertambah, semua orang mungkin bisa ngoding, tapi belum tentu semua orang bisa bikin testing yang baik.</p><p>Maka dari itu… step terakhir yang kadang saya enggak lewatkan (seringnya dilewatkan soalnya), gimana unit testnya, integration testnya, kalo bisa juga masuk ke end-to-end testingnya tipis-tipis.</p><p>Dengan begitu setelah belajar framework baru, kamu bisa semakin las les sat set untuk tau arahnya gimana. Enggak cuma yang “cobain ah, terus ngapain ya ini” dan setelahnya bisa kamu jadikan bahan show-off untuk meningkatkan value kamu sendiri.</p><p>Well, it’s quite a long story for me too, semoga kamu membaca sampai akhir dan menikmati tulisan saya kali ini. <em>Have a nice day everibadee!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ce3221cfc426" width="1" height="1" alt=""><hr><p><a href="https://medium.com/bahas-javascript/new-framework-where-to-start-ce3221cfc426">New Framework, Where to Start?</a> was originally published in <a href="https://medium.com/bahas-javascript">Bahas Javascript</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Using Google Sheets as Your Database]]></title>
            <link>https://medium.com/bahas-javascript/using-google-sheets-as-your-database-09760ab66f8c?source=rss----4793b8102d52---4</link>
            <guid isPermaLink="false">https://medium.com/p/09760ab66f8c</guid>
            <category><![CDATA[fetch-api]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[reactjs]]></category>
            <dc:creator><![CDATA[Ashari Muhammad Hisbulloh]]></dc:creator>
            <pubDate>Wed, 04 Sep 2024 08:22:08 GMT</pubDate>
            <atom:updated>2024-08-14T04:19:01.053Z</atom:updated>
            <content:encoded><![CDATA[<p>Ketika mau bikin web tapi db nya masih di Google Sheets</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*EQKwOW0u7vWLN_zY" /><figcaption>Photo by Mika Baumeister on <a href="https://unsplash.com/photos/a-hand-pointing-at-a-spreadsheet-on-a-computer-screen-xTA7sAAtG40">Unsplash</a></figcaption></figure><p>Kadang sebagai developer kita pengen gitu bantuin komunitas kita untuk “modernize” aplikasinya biar informasinya lebih accessible dan readable. Tapi kepentok dengan issue kalo datanya sekarang ini masih disimpen di excel atau google sheets.</p><p><em>Mau dipindah ke RDBMS kok males (apalagi kalo banyak), kalo enggak dipindah gimana cara web app kita bisa dapet datanya.</em></p><p>Saya juga kemarin nemu issue begitu, salah satu komunitas saya mau bikin sebuah web untuk yaa semacam portal informasi sekaligus biar anggota bisa ngecek apakah membershipnya sudah diapprove atau belum. Tapi masalahnya semua datanya di Google Sheets, masalah yang lain jumlah membernya udah di angka 8000-an, jadi kan mau bikin MySQL (eh MariaDB) ya males, kalo mau langsung pake gimana caranya?</p><p>Setelah saya kulik lagi, ternyata web yang ingin dibuat ini enggak ada CRUD nya, jadi saya “cuma” butuh bisa baca/read aja data dari si Google Sheets.</p><p><em>Okay, jadi begini caranya, sakjane super simple…</em></p><p>Pertama kita perlu siapkan table dari Google Sheets nya, pastikan row nomor 1 berisi label dari data-data kita</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qeea0sNqvgumdau31qAG5g.png" /><figcaption>Table Google Sheets</figcaption></figure><p>Inget ya, <strong>harus banget</strong>, row pertama adalah row labelnya. Jika kita sudah memastikan kalo bentuknya kurang lebih kaya gitu, langkah selanjutnya kita menuju ke File -&gt; Share -&gt; Publish to Web</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/631/1*_Q3duPeATZH7AAgGKunwZw.png" /></figure><p>Setelahnya bakal muncul dialog/modal, untuk kolom pilihan yang sebelah kiri, saya biasanya cuma pilih Sheet instead of Entire Document , untuk yang pilihan sebelah kanan kita pilih publish sebagai Comma Separated Value (CSV) .</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/579/1*C206t8PLCagwqFsxKC6H7A.png" /></figure><p>Jadi… sederhananya kita akan akses datanya melalui data CSV, ketika datanya sudah CSV kita selanjutnya bisa lakukan fetching data dengan library apapun bisa pake axios atau fetch .</p><p><em>The preparations are done… now let’s fetch the datas…. </em>🥁</p><p>Untuk case ini saya pake axios, kalau ada yang pake yang lain, bisa menyesuaikan eaps…</p><p>Sebelumnya kita perlu bikin parser CSV dulu, ini bisa pake library <a href="https://www.npmjs.com/package/csv2json"><strong>csv2json</strong></a>, tapi saya pake function sendiri supaya bisa dipake di <em>client side </em>maupun ketika di <em>server side</em>.</p><pre>// @ts-ignore<br>export function parseCSV(csvText) {<br>  const rows = csvText.split(/\r?\n/); // Split CSV text into rows, handling &#39;\r&#39; characters<br>  const headers = rows[0].split(&quot;,&quot;); // Extract headers (assumes the first row is the header row)<br>  const data = []; // Initialize an array to store parsed data<br>  for (let i = 1; i &lt; rows.length; i++) {<br>    const rowData = rows[i].split(&quot;,&quot;); // Split the row, handling &#39;\r&#39; characters<br>    const rowObject = {};<br>    for (let j = 0; j &lt; headers.length; j++) {<br>      // @ts-ignore<br>      rowObject[headers[j]] = rowData[j];<br>    }<br>    data.push(rowObject);<br>  }<br>  return data;<br>}</pre><p>Then… kita fetch aja datanya</p><pre>const GOOGLE_SHEETS_LINK = &quot;your link here&quot;;<br><br>const fetchData = async () =&gt; {<br>  const response = await axios.get(GOOGLE_SHEETS_LINK);<br><br>  const { data } = response; // this will return data csv<br><br>  if (data) {<br>    return parseCSV(data); // parse csv to array of object<br>  }<br><br>  return [];<br>}</pre><p>Dari fetch di atas kita akan dapat response seperti ini yang selanjutnya bisa kita consume di component kita</p><pre>[<br>  { label1: &quot;data&quot;, label2: &quot;data&quot; } // dst<br>]</pre><p><em>Done, it’s as simple as that!</em></p><p>Dengan begini kita bisa consume data dari Google Sheets ke component kita. Apalagi ketika kita melakukan update pada sheets/table kita tadi, secara otomatis akan reflect ke API yang kita consume, jadi enggak perlu khawatir harus republish-republish.</p><p>But still… ini hanya quick temporary measurement dan untuk have fun aja. Kalau temen-temen butuh fitur yang lebih lengkap dan lebih advance terkait data management ini, saya tetep sarankan untuk dimigrate pakai RDBMS yang lebih proper, sekalipun bukan MySQL.</p><p><em>That’s it, have a good day everyone!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=09760ab66f8c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/bahas-javascript/using-google-sheets-as-your-database-09760ab66f8c">Using Google Sheets as Your Database</a> was originally published in <a href="https://medium.com/bahas-javascript">Bahas Javascript</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Styling your Components]]></title>
            <link>https://medium.com/bahas-javascript/styling-your-components-3deab31c2ba8?source=rss----4793b8102d52---4</link>
            <guid isPermaLink="false">https://medium.com/p/3deab31c2ba8</guid>
            <category><![CDATA[styled-components]]></category>
            <category><![CDATA[react-js-development]]></category>
            <dc:creator><![CDATA[Ashari Muhammad Hisbulloh]]></dc:creator>
            <pubDate>Thu, 28 Mar 2024 09:31:30 GMT</pubDate>
            <atom:updated>2024-03-28T09:04:46.239Z</atom:updated>
            <content:encoded><![CDATA[<h4>Lebih tepatnya my components sih ya</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*uI3CgNePy9gO82EN" /><figcaption><a href="https://unsplash.com/photos/a-computer-screen-with-a-logo-on-it-xkBaqlcqeb4">Pic by Lautaro Andreani</a></figcaption></figure><p>Dalam men-develop aplikasi terutama yang berbasis React JS, tentu kita seringkali dihadapkan dengan <em>case-case</em> yang mengharuskan kita untuk mengcustom suatu component atau kalau di post ini saya bahasakan dengan <em>nge</em>-<em>styling component</em>. Ya pasti karena kalo tidak distyling webnya akan jadi seperti website di era sebelum CSS muncul.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/704/0*XfMpZZMVI2FemmXc" /><figcaption>Image by CSS Tricks</figcaption></figure><p>Back then ketika framework javascript belum populer, salah satu go-to library yang saya pakai ya tentu saja UI Library kita semua yang tak lain dan tak bukan adalah bootstrap. Di saat itu bootstrap sudah canggih banget <em>lho</em>, kita bisa bikin element/component macam-macam dengan cukup mudah, sudah ada implementasinya yang disematkan di dokumentasinya tinggal di <em>copas</em> aja, terus beres deh terpasang di web kita. Jadilah web kita <em>canteek</em>, ya to.</p><p>Atau ada juga si paling radikal, yang membuat stylingnya sendiri full pake CSS, ini sih sudah bisa dipanggil <em>suhu </em>kala itu.</p><p>Nah di zaman yang semakin berkembang, akhirnya trend website yang sebelumnya dibuild pure dengan HTML+CSS+imbuhan JS dikit kini berkiblat ke Javascript-based yang dipionir oleh tiga framework yang bertahan hingga sekarang yaitu React, Vue, dan Angular (meskipun kalo di Indonesia sepertinya jarang ya denger developer Angular). Kemudian trend untuk styling component pun juga agaknya cukup berubah. Meskipun tetap masih ada juga yang implementasinya mirip-mirip.</p><p>Contohnya dengan naiknya TailwindCSS yang masih berbasis class name untuk stylingnya. Dan cara ini juga masih dipakai di development React hingga sekarang kok, dengan membuat file CSS dan styling disitu. <em>Which is fine, once again, as long as it works and it’s on production, you have nothing to worry about.</em></p><p>Tapi… untuk saya sendiri, saya lebih suka beberapa cara berikut untuk styling component saya, alias go-to saya ketika saya diharuskan untuk styling components.</p><p><em>Ohiya, sebagai disclaimer saya lebih suka styling component dengan bikin sebuah component (apa ya ini namanya) pokoknya bukan pakai </em><em>className gitu lah.</em></p><h4>Styled components (the pure one)</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*b7wxHN2iQ3jxHg7KNO10nA.png" /></figure><p>Sejak saya belajar bikin web dengan tanpa framework, saya itu memang lebih suka bikin styling sendiri instead of mengandalkan UI library. Karena dengan begitu ada <em>ke-khas-an</em> dari design web saya dan bisa saya achieve tanpa perlu banyak adjustment, <em>berikan aku file CSS maka akan kuguncang landing page.</em></p><p>Maka dari itu cara saya styling component saat ini masih jatuh ke cara CSS-in-JS, lebih spesifik adalah styled-components . Selain library styled-components sebenernya ada library lain seperti emotion yang <em>sakjane</em> kurang lebih implementasinya sama, tapi saya enggak pernah nyobain di project yang skalanya cukup besar jadi tidak bisa berkata banyak.</p><pre>// Instead of <br>&lt;SomeComponent className=&quot;abc def gih&quot; /&gt;<br><br>// Saya lebih suka<br>const SomeStyledComponent = styled.div`<br>  // your style here<br>`;<br><br><br>&lt;SomeStyledComponent /&gt;</pre><p>Ohiya, styled components juga bisa buat ngestyling component-component UI dari library lain, jadi misal kita ada mau bikin custom DatePicker, kita bisa comot DatePicker yang udah ada, terus kita ubah stylenya pake doi.</p><pre>export const StyledDatePicker = styled(DatePicker)`<br>  .some-class-to-style {<br>    width: 100px;<br>    // your styles<br>  }<br>`;</pre><h4>Styled components with styled system (xstyled, styled-system, etc)</h4><p>Berangkat dari styled-components selanjutnya kita bisa level-up the game dengan mengintegrasikan dengan library lain untuk bikin design system yang lebih mudah.</p><p>Di daftar rekomendasi saya ada @xstyled/styled-components dan styled-system . Ini nih yang saya bikin suka sama styled-components , karena selain bisa dicustom sendiri kita mau bikin component apa, kita juga bisa bikin dia lebih mudah untuk dipakai di codenya.</p><pre>// Before styled system<br>const StyledCompo = styled.div`<br>  margin: 32px;<br>  font-family: &quot;Proxima Nova&quot;, sans, monospace;<br>`;<br><br>import styled from &quot;@xstyled/styled-components&quot;;<br>// After styled system<br>const StyledCompo = styled.div`<br>  margin: 3; // ini nanti ada confignya 3 itu apa<br>  font-family: regular; // ini juga<br>`;</pre><p>Selain itu dengan adanya si styled system ini kita bisa bikin commons components yang kita bisa pake semau kita nantinya di component-component kita.</p><pre>return (<br>  &lt;Flex mb={20} gap={8}&gt;<br>    &lt;Text family=&quot;bold&quot; fontSize={2}&gt;Lorem ipsum&lt;/Text&gt;<br>  &lt;/Flex&gt;<br>);</pre><p>Jadi misal ketemu cuma perlu styling dikit, kita enggak perlu bikin component baru, atau kita harus nge-include si props tambahan ke styled component kita secara manual, atau kita perlu inject di prop style={{ ... }} nya.</p><h4>Stitches x Radix UI</h4><p>Ini saya baru nemu kayaknya setelah kerja di tempat kerja yang sekarang ketika ngerjain project baru gitu. Kebetulan ada temen yang memang suka explore codingan dan sharing terkait ini. Stitches ini kurang lebih sama dengan styled-components dan emotion , sama-sama CSS-in-JS, keunggulannya dia ini jauh lebih lightweight dengan hanya ~6KB dan support Server-Side Rendering (SSR). Jadi ini salah satu solusi yang menyenangkan untuk para frontend yang projectnya pake SSR.</p><pre>// Cara pakenya<br>import { styled } from &#39;@stitches/react&#39;;<br><br>const Button = styled(&#39;button&#39;, {<br>  backgroundColor: &#39;gainsboro&#39;,<br>  borderRadius: &#39;9999px&#39;,<br>  fontSize: &#39;13px&#39;,<br>  padding: &#39;10px 15px&#39;,<br>  &#39;&amp;:hover&#39;: {<br>    backgroundColor: &#39;lightgray&#39;,<br>  },<br>});<br><br>const SomeComponent = () =&gt; {<br>  return (<br>    &lt;Button /&gt;<br>  );<br>}</pre><p>Selain itu <em>pros</em>-nya, dia enggak perlu banyak diconfig, alias <em>plug ‘n play</em>, pasang langsung bisa dipake. Juga di stitches ini kita bisa bikin styled system secara langsung tanpa perlu ada library lain buat nge-bridge nya. Wow, semua hal tadi dilakukan oleh library dengan ukuran &lt;10KB.</p><p><em>Cons</em>-nya, saat ini masih support React JS aja. 😅</p><p>Selain stitches yang udah oke, lebih oke lagi dicombine pake Radix UI, dimana di dalamnya sudah ada component-component yang siap pake kaya Dialog, Card, Tooltip, etc . Di Radix sendiri ada 2 cara pake, mau dipake/di-install satu-per-satu alias ala carte dengan cara</p><pre>npm install @radix-ui/react-dialog<br>npm install @radix-ui/react-dropdown-menu<br>npm install @radix-ui/react-tooltip</pre><p>atau kita juga bisa langsung install sepaket semuanya dengan cara</p><pre>npm install @radix-ui/themes </pre><p>dengan begitu semua component dari Radix bisa kita pake langsung dengan import sesuai yang kita butuhkan. Kekurangannya ya kalo ini ada component yang sebenernya enggak kita pake, ini akan jadi beban bundle kita. <em>Hehe</em></p><p><em>Syudah</em>, secara garis besar sebenernya itu cara saya styling component untuk project freelance, kerjaan, maupun project iseng. Selanjutnya biasanya saya combine dengan library lain misal styled-components sama ANTD, atau sama Evergreen UI (ini bagus, ringan, tapi kurang populer nampaknya), atau sama Chakra UI, ya gitu-gitu lah, dipadu padankan satu sama lain.</p><p>Alasan saya enggak pake library yang berbasis class name lagi kaya bootstrap maupun Tailwind adalah karena <strong>saya males ngapalin nama class CSS nya</strong>, belum lagi ada ukurannya yang udah didefine oleh design system mereka 😵. Saya lebih suka dia jadi props karena bisa di-<em>autocomplete </em>kalo kita kebetulan juga pake Typescript.</p><p>Tapi sekali lagi saya mengingatkan, tidak ada <em>silver bullet </em>dalam men-develop aplikasi web (React), yang penting kita nyaman developnya, mudah dipahami oleh developer lain, mudah untuk dimaintain, dan udah launch ke production (dan nge-gaji kamu), <em>it’s fine~</em>. Kalo suatu saat kamu mau ubah caramu styling components mirip-mirip kaya saya, <em>it’s also fine~</em></p><p><em>Let’s have a fun time developing apps. See you!</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3deab31c2ba8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/bahas-javascript/styling-your-components-3deab31c2ba8">Styling your Components</a> was originally published in <a href="https://medium.com/bahas-javascript">Bahas Javascript</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Setting Up Your ESLint]]></title>
            <link>https://medium.com/bahas-javascript/setting-up-your-eslint-da00217296ef?source=rss----4793b8102d52---4</link>
            <guid isPermaLink="false">https://medium.com/p/da00217296ef</guid>
            <category><![CDATA[code-newbie]]></category>
            <category><![CDATA[eslint-config]]></category>
            <category><![CDATA[prettier]]></category>
            <dc:creator><![CDATA[Ashari Muhammad Hisbulloh]]></dc:creator>
            <pubDate>Thu, 28 Mar 2024 08:15:18 GMT</pubDate>
            <atom:updated>2024-03-19T09:54:51.609Z</atom:updated>
            <content:encoded><![CDATA[<h4>Biar codenya lebih rapi, lebih sesuai standard, dan enggak pusing bacanya</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*Hv7DKf2voQtNPSaH" /><figcaption><a href="https://unsplash.com/photos/captcha-cvBBO4PzWPg">Photo Markus Spiske</a></figcaption></figure><p>Halo, sepertinya sudah sangat lama sekali saya buka Medium. Bahkan saya enggak inget apa yang terakhir kali saya tulis di platform ini. Kali ini saya kembali, <em>wasyah</em></p><p>Di kesempatan kali ini saya ingin nulis terkait hal yang saya pelajari lebih dalam kemarin, meskipun sebenernya selama 5 tahun karir professional saya ini, saya udah pake. Tapi baru akhirnya saya paham dan bisa bener-bener merasa lebih pede untuk implement di code saya. Dan hal yang saya pelajari lagi tak lain dan tak bukan adalah setting up ESLint-Prettier di VSCode.</p><p>Perlu diketahui lagi, biar saya enggak dianggap <em>noob</em> banget, saya tuh udah pake eslint dari dulu, sudah paham tentang rules-rulesnya juga, tapi nge-integrate antara eslint, prettier, dan VSCode <em>seamlessly</em> itu perkara lain. <em>Hahaha</em></p><p>Mari langsung kita masuk ke topiknya saja deh ya….</p><blockquote>Sebelumnya perlu diketahui secara singkat kalo prettier itu sebuah code formatter, yang mana tool ini membantu supaya code kita lebih enak dipandang. Sedangkan eslint itu sendiri linter, yang bertugas untuk memastikan code yang kita tulis itu sesuai standard yang umum dipakai dan penulisan code kita ini efektif.</blockquote><p>Jadi meskipun keduanya sering dijadikan sebuah combo maut, keduanya punya fungsi yang berbeda.</p><p>Oke, sekarang beneran kita masuk ke pembahasan utama. Untuk meng-setup ESLint-Prettier di VSCode, kita perlu melakukan beberapa hal ini:</p><ul><li>Setting up ESLint</li><li>Setting up Prettier</li><li>Integrate dengan VSCode</li></ul><h4><strong>Prerequisites</strong></h4><ul><li>VSCode dengan extension ESLint dan Prettier</li></ul><h4><strong>Setting up your ESLint</strong></h4><p>Untuk setup ESLint sebenernya banyak caranya, kita bisa melakukan dengan cara manual, init melalui npm, maupun langsung dengan memilih config yang populer. Tapi jalan yang saya pilih adalah dengan menggunakan npm init</p><pre>npm init @eslint/config</pre><p>Dengan code ini kita akan disuguhi dengan beberapa pertanyaan kaya gimana ESLintnya mau dipake, gimana behavior impor/export codebase kita, framework apa yang kita pake dan mau pake popular style atau enggak. Kita bisa pilih menyesuaikan kebutuhan masing-masing codebase kita. <em>No silver bullet</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/954/1*DBrf5wKzqJtfmbJTW0Jewg.png" /></figure><p>Setelahnya kita akan dikasih list library yang perlu diinstall dan tinggal pilih Yes , kemudian tunggu aja. <em>Voila, ESLint sudah berhasil terinstall di codebase.</em></p><p>Setelah eslint ini berhasil terinstall dia akan melakukan scan terhadap codebase kita sesuai rules-rules yang diberikan di config filenya yang biasanya namanya eslintrc.* atau eslint.config.* untuk file config yang baru.</p><p><em>Step 1 Done</em></p><h4>Setting-up the Prettier</h4><p>Langkah selanjutnya yaitu menginstall prettier ke code kita supaya codenya jadi lebih rapi.</p><p>Untuk step ini biasanya juga ada beberapa cara, cara yang paling umum digunakan adalah menginstall Prettier ke VSCode kita dan menambahkan rules-rules ke file confignya .prettierrc .</p><p>Tapi untuk hal ini catch nya biasanya ada beberapa rules yang conflict satu sama lain antara ESLint yang sudah kita define dengan si prettier tadi. Maka di post kali ini saya menggunakan approach yang berbeda yaitu dengan menggunakan eslint-plugin-prettier sehingga antara rules yang telah kita apply ke file eslint config tidak conflict dengan prettier.</p><p>Mula-mula kita install dulu packagenya</p><pre>npm install --save-dev eslint-plugin-prettier eslint-config-prettier<br>npm install --save-dev --save-exact prettier</pre><p>Kemudian kita tambahkan prettier ke config eslint yang telah ter-generate tadi</p><pre>// File: eslintrc.js<br>{<br>  // ...<br>  // tempatkan prettier di paling belakang untuk override <br>  // styling dari config/plugin yang lain<br>  extends: [..., &quot;plugin:prettier/recommended&quot;],<br>  <br>  // ...<br>  rules: {<br>    &quot;prettier/prettier&quot;: [<br>      &quot;error&quot;, <br>      {<br>        // kalau mau tambah custom config<br>      }<br>    ]<br>  }<br>}</pre><p>Dengan menambahkan ke extends sebenernya sudah cukup untuk implement prettier ke code kita, tapi kalau mau nambahin rules yang lain bisa juga tambahin secara manual di bagian rules</p><p><em>Step 2 done</em></p><p>Setelah menginstall eslint dan prettier tadi, bukan berarti langsung usable, maksudnya code kita tidak akan secara otomatis di-fix ketika ada issue kecuali kita menambahkan script ke package.json untuk nge-lint code kita, misalnya:</p><pre>&quot;scripts&quot;: {<br>  // ...<br>  &quot;lint&quot;: &quot;eslint --quiet --fix&quot;<br>}</pre><p>Tapi tentu saja ini masih ribet kecuali kita integrate script ini dengan tools lain, kita harus run script nya secara manual biar code kita terdetect dan bisa difix. <em>Yakali masak gitu, rugi dong</em></p><p>Maka dari itu kita masuk ke last step…</p><h4>Integrate the tools with VSCode</h4><p>Ini bagian yang sebenernya singkat banget, kita cuma perlu nambahin/ubah file config vscode kita menjadi:</p><pre>{<br>  &quot;editor.formatOnSave&quot;: true,<br>  &quot;editor.formatOnPaste&quot;: true,<br>  &quot;[javascript][javascriptreact][typescript][typescriptreact]&quot;: {<br>    &quot;editor.formatOnSave&quot;: false<br>  },<br>  &quot;editor.codeActionsOnSave&quot;: {<br>    &quot;source.fixAll.eslint&quot;: &quot;explicit&quot;<br>  }<br>}</pre><p>Dari config di atas kita enggak pengen melakukan formatting ketika nge-save code dengan formatter biasa, tapi kita pengen nyuruh si eslint untuk ngefix code kita aja.</p><p>Oh iya, sekali lagi jangan lupa untuk install <strong>Prettier</strong> dan <strong>ESLint</strong> di <strong>VSCode</strong> nya ya.</p><p>Setelahnya, code kita sudah ready to go untuk diajak tempur.</p><p>—</p><p>Saya menggunakan approach ini karena seringkali saya ketika pake prettier dia conflict dengan si eslint jadi kadang malah eslint nya yang perlu mengalah atau malah saya harus kasih eslint ignore ke code saya, yang mana ini bukan <em>best practice</em>.</p><p>Tapi sekali lagi, approach ini bukanlah <em>silver bullet</em> untuk menginstall ESLint ke codebase kita, banyak cara lain dan <em>as long as it works, it works</em>. 😉</p><h4>References:</h4><ul><li><a href="https://eslint.org/">https://eslint.org/</a></li><li><a href="https://github.com/prettier/eslint-plugin-prettier">https://github.com/prettier/eslint-plugin-prettier</a></li><li><a href="https://github.com/wesbos/eslint-config-wesbos">https://github.com/wesbos/eslint-config-wesbos</a></li><li><a href="https://www.youtube.com/watch?v=lHAeK8t94as&amp;t=633s&amp;ab_channel=WesBos">Insall ESlint by Wesbos</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=da00217296ef" width="1" height="1" alt=""><hr><p><a href="https://medium.com/bahas-javascript/setting-up-your-eslint-da00217296ef">Setting Up Your ESLint</a> was originally published in <a href="https://medium.com/bahas-javascript">Bahas Javascript</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Library/Framework JS Terbaik…?]]></title>
            <link>https://medium.com/bahas-javascript/library-framework-js-terbaik-23b6168d6c7b?source=rss----4793b8102d52---4</link>
            <guid isPermaLink="false">https://medium.com/p/23b6168d6c7b</guid>
            <category><![CDATA[javascript-library]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[framework]]></category>
            <dc:creator><![CDATA[Ashari Muhammad Hisbulloh]]></dc:creator>
            <pubDate>Wed, 13 Jan 2021 14:25:27 GMT</pubDate>
            <atom:updated>2021-01-13T14:25:27.576Z</atom:updated>
            <content:encoded><![CDATA[<h4>A never-ending battle</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*ic_TwRGrvP41VfaW" /><figcaption>Photo by Joan Gamell on <a href="https://unsplash.com/photos/ZS67i1HLllo">Unsplash</a></figcaption></figure><p>Sebenernya cerita semacam ini udah pasti banyak ditemui di luaran sana, bahkan saking banyaknya tinggal kita tulis keyword “best javascript framework” dan kita tinggal pilih aja salah satu artikel secara random. Saya juga sebenernya agak ragu untuk nge-publish cerita ini karena saya masih ngerasa pengalaman saya belum sebanyak itu untuk bisa ngebahas topik ini. Hmm… Mari kita buat a la saya cerita aja deh ya.</p><p>BTW udah lama saya enggak nulis gini… <em>Prepare your tea and have a seat, everibadeee.</em></p><p>Secara umum, setahu saya ada tiga framework yang sampe sekarang masih jadi “the big 3” javascript framework, tentu seperti yang sudah kita duga, jQuery, heh bukan bukan, React, Vue, dan Angular. Banyak praktisi Javascript yang sebenernya kurang suka melakukan hal-hal kaya gini, membanding-bandingkan framework — kita sebut saja framework ya — Javascript yang satu dengan lainnya. Alasannya sederhana, karena sebenernya semuanya hampir-hampir sama, at least untuk sekarang ini, top framework Javascript punya fitur yang kurang lebih hampir sama, kemudahan yang sama, support dari komunitas yang cukup besar juga. Jadi daripada dibandingkan, lebih baik kalo penasaran ya tinggal dicoba aja gitu lo maksudnya.</p><h3>React JS</h3><p>Saya akan mulai dari framework yang paling familiar buat saya, React JS. Framework bikinan facebook yang saya mulai kenal di 2016 silam dan sejak 2018 saya pake sebagai daily “driver” saya. Sebenernya React ini kurang pas disebut framework, lebih tepat kalo disebut UI library. Alasannya sederhana karena semua hal lain seperti routing, global state management, dll, perlu library lain, ini kalau kasusnya kita pengin bikin aplikasi React yang full javascript. React juga bisa kita pasang layaknya library javascript lainnya dengan cukup tulis di bagian body HTML kita.</p><pre>&lt;script crossorigin src=&quot;https://unpkg.com/react@17/umd/react.production.min.js&quot;&gt;&lt;/script&gt;<br>&lt;script crossorigin src=&quot;https://unpkg.com/react-dom@17/umd/react-dom.production.min.js&quot;&gt;&lt;/script&gt;</pre><p>React punya komunitas yang besar banget di dunia, serta banyak library yang bisa dipake macem-macem di React, bahkan hampir semua library yang dulu kita pake di jQuery, kini udah ada wrappernya di React. React juga punya dua framework yang terkenal yaitu Next JS dan Gatsby JS.</p><p>React juga bisa kita tulis menggunakan Typescript, bisa dibilang bahasa pemrograman advancenya javascript yang kayaknya akhir-akhir ini lagi naik daun. Juga dilengkapi dengan salah satu library favorit saya bernama styled-components yang bikin kita styling component di React jauh lebih mudah.</p><p><em>Awalnya saya sih biasa aja sama styled-components saya nyoba bikin web dengan stack HTML+CSS, baru kerasa betapa saya take styled-components for granted.</em></p><p>Tapi masalahnya… Sebagai frontend developer yang lebih banyak main di React sendiri, saya bisa bilang learning curve React ini cukup <em>nganu</em>. Untuk web developer yang belum pernah nyobain library JS pasti akan kaget karena biasanya kita nulis script javascript di dalam body HTML, sedangkan React dengan JSX nya memutar balikkan persepsi kita dengan nulis tag HTML di dalam script javascript.</p><p>Selain terkait JSX, ada juga yang mungkin bisa bikin agak bingung yaitu implementasi class component, sepengalaman saya banyak temen-temen yang bingung dengan penggunaan class component di React. Ya meskipun sekarang udah ada juga fitur bernama hooks yang memudahkan bikin component pake function instead of a class. Katanya sih hooks bikin lebih clean, tapi saya sebagai penganut class component garis keras, sebenernya lebih suka class component, lebih gampang ditest pake Enzyme soalnya, hohoho.</p><p>Ohiya, karena masih populer, peluang kerja frontend developer yang bisa React ini masih terbuka sangat lebar kok, masih banyak perusahaan yang pake teknologi ini atau beralih ke teknologi ini.</p><p>Untuk junior level mungkin pengetahuan tentang vanilla javascript, React, Redux, hooks, udah cukup. Sedangkan untuk level yang lebih tinggi bisa explore terkait unit testing (Enzyme, Jest, React testing library), Typescript, framework (Next JS, Gatsby JS), state management selain Redux (Recoil JS, Context).</p><h3>Vue</h3><p>Vue JS (dibaca vyu je es) bisa dibilang framework yang naik daun dengan cepat 2–3 tahun terakhir ini. Framework yang diinisiasi oleh Mas Evan You ini menurut saya fiturnya yang paling mirip-mirip sama React JS, misalnya fitur virtual DOM nya, atau yang bisa dipasang sebagai CDN dengan menambahkan tag script di body HTML kita.</p><pre>&lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.6.12&quot;&gt;&lt;/script&gt;</pre><p>Ohiya Vue juga bisa langsung dipasang di Laravel, kayaknya diantara yang lain Vue ini satu-satunya yang saya temui bisa diembed langsung ke framework PHP. Bahkan jadi recommended javascript library buat Laravel kalo enggak salah.</p><p>Vue sendiri udah ngalain jumlah star nya React di Github, jadi support komunitas di Vue ini juga besar banget di dunia, banyak banget juga library untuk support kita bikin aplikasi Vue. Saya sejujurnya belum terlalu deep belajar Vue, jadi enggak begitu tau apakah Vue punya framework semacam Next JS atau Gatsby JS gitu. Tapi yang pasti library untuk styling component udah support Vue, meskipun implementasinya cukup beda dibandingkan ketika diimplementasi di React.</p><p>Vue juga punya keunggulan sendiri terkait learning curve, menurut saya learning curve Vue cukup <em>tolerable</em>. Karena untuk ngebikin componentnya masih hampir-hampir sama ketika kita develop web dengan stack HTML+CSS, orang-orang yang masih awam dengan library javascript yang belajar Vue akan lebih gampang ngeh-nya dibanding belajar React. It’s really a good point anyway.</p><p>Saya enggak begitu bisa bahas lebih jauh terkait Vue, karena cuma pernah nyoba sekali dua kali, itu pun mindset saya masih rekat sama React, jadi belajarnya juga enggak optimal.</p><p>Tenang, meskipun begitu saya cukup tau kok kalo perusahaan yang minat untuk pake Vue ini juga makin banyak, malah saya dulu ketika proses nyari kerja lebih banyak nemu requirement yang membutuhkan frontend developer yang pake Vue dibandingkan React.</p><h3>Angular</h3><p>Nah ini yang saya paling enggak bisa bahas, framework javascript yang bisa dibilang karirnya paling lama. Dibacking oleh perusahaan yang pasti kita udah familiar, tidak lain dan tidak bukan, Google. Angular ini bisa dibilang framework yang beneran framework, karena ketika kita install, kita akan dikasih segelondong lengkap, se routing-routingnya, tinggal diconfig aja.</p><p>Di awal kemunculannya Angular (AngularJS) masih dengan cara binding data ke HTML tag atau bikin component dengan HTML tag, yang saya rasa cara ini diadopsi oleh Vue JS. Tapi sejak muncul Angular, implementasinya bener-bener berubah, dan saya cuma berkesempatan untuk nyobain AngularJS.</p><p>Berbeda dengan dua library sebelumnya yang bisa kita install cukup dengan CDN, saya nyari tau di dokumentasi resmi Angular ini enggak nemu instalasi lewat CDN, jadi kayaknya emang harus full javascript gitu.</p><p>Angular sendiri udah make implementasi Typescript, jadi ini jadi drawback tersendiri ketika kita mau belajar Angular tapi pengetahuan javascript kita masih basic. Kita musti belajar proses MVC yang ada di Angular serta Typescript itu sendiri.</p><p>Dulu AngularJS punya masalah terkait performa yang bakal lambat banget ketika codebase kita makin besar, <em>jane</em> ya wajar kalo makin berat, tapi enggak tolerable gitu lo, jadi sejak berevolusi jadi Angular banyak issue terkait performa yang diperbaiki sama tim pengembangnya.</p><p>Saya enggak bisa bahas lebih lanjut, karena <em>blas</em> belum pernah nyobain framework ini. Terkait kesempatan kerja juga saya enggak begitu tau, setau saya perusahaan di Indonesia jarang yang pakai Angular, tapi banyak perusahaan di luar negeri yang pakai Angular, jadi mungkin kesempatannya justru lebih terbuka lebar kalau kita apply di perusahaan luar negeri.</p><h3>Rising Star: Svelte</h3><p>Svelte juga jadi <em>hot topic</em> di tahun lalu, library yang digadang-gadang punya performa jauh lebih baik dari ketiga framework Javascript di atas, learning curve yang lebih mudah karena implementasinya hampir-hampir sama kaya Vue yang main-main di tag HTML dan tanpa adanya Virtual DOM. Menarik!</p><p>Udah banyak perusahaan yang pake teknologi ini kaya Gojek, Tokopedia, GoDaddy, Rakuten, dll.</p><p>Saya sempet nyobain Svelte ini sekilas sih, dan emang asyik main-main Svelte ini juga potensinya besar banget. Karena Svelte yang newcomer ini tentu komunitas dan supportnya masih belum sebesar “the big 3”, tapi saya yakin Svelte juga akan segera punya komunitas yang besar.</p><p>Mari kita lihat apakah framework satu ini bisa menggeser trend top javascript framework.</p><h3>Recap</h3><p>Sejatinya, saya enggak bisa bilang mana framework terbaik, <strong>alasan pertama</strong> karena saya belum nyobain semuanya jadi masih kurang pengalaman; <strong>alasan kedua</strong> semua framework ini punya pasar sendiri dan memenuhi kebutuhan masing-masing, selama kebutuhan kita untuk develop web app terpenuhi dengan salah satu framework di atas yaudah, cukup aja gitu; <strong>alasan ketiga</strong>, familiarity dan preference, preferensi orang-orang untuk nulis kode serta rasa familiarnya bener-bener berbeda, orang yang lebih suka bisa dipisah-pisah dan bisa diimport lebih gampang mungkin memilih React, orang yang suka main di tag-tag HTML mungkin akan memilih Vue atau Svelte, orang yang suka implementasi Typescript mungkin akan pilih Angular atau React.</p><p>Menurut saya cobain aja semuanya dulu, terus pilih satu yang paling cocok, dalami sampe paham, baru nanti pindah. Karena untuk belajar framework di atas sebenernya kamu cukup punya fundamental javascript yang cukup kok, selebihnya tinggal penyesuaian nulis kodenya aja.</p><p>That’s it, selamat belajar. Have a great day.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=23b6168d6c7b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/bahas-javascript/library-framework-js-terbaik-23b6168d6c7b">Library/Framework JS Terbaik…?</a> was originally published in <a href="https://medium.com/bahas-javascript">Bahas Javascript</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Javascript Features Appreciation — 2020]]></title>
            <link>https://medium.com/bahas-javascript/javascript-features-appreciation-2020-f9bd90d9141e?source=rss----4793b8102d52---4</link>
            <guid isPermaLink="false">https://medium.com/p/f9bd90d9141e</guid>
            <category><![CDATA[optional-chaining]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[javascript-features]]></category>
            <dc:creator><![CDATA[Ashari Muhammad Hisbulloh]]></dc:creator>
            <pubDate>Mon, 04 Jan 2021 14:48:05 GMT</pubDate>
            <atom:updated>2021-01-04T14:48:05.586Z</atom:updated>
            <content:encoded><![CDATA[<h3>Javascript Features Appreciation — 2020</h3><h4>Fitur-fitur keren Javascript di tahun 2020 yang aku temukan</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lvJqpdnTgPD9f8G2MpplXQ.png" /></figure><p>Javascript adalah bahasa pemrograman yang berkembang dengan sangat cepat, dengan komunitasnya yang sangat besar, kemudahan untuk <em>contribute</em> di berbagai <em>library</em>. Bahkan kasarannya, kita meleng sehari aja bisa-bisa udah ketinggalan banyak update terkait Javascript. Emang segila itu perkembangan Javascript sekarang.</p><p>Sejak munculnya ECMAScript 2015 atau yang dikenal dengan ES6, aku merasa hal itu jadi <em>game changer</em> buat Javascript. Dari kemunculannya muncul banyak <em>library </em>untuk <em>support</em> Javascript di <em>web browser, </em>misalnya <em>transpiler</em> kaya Babel. Muncul juga berbagai <em>library </em>yang dibilang memudahkan pengembangan web kaya Webpack atau RollUp sebagai <em>module bundler; atau </em>PostCSS sebagai tool buat ngetransform CSS kita yang bisa menggantikan Sass yang merupakan Gem dari Ruby, ada juga Grunt dan Gulp yang sempat populer sebagai <em>task runner</em>, dan masih banyak lagi perkembangannya sampe sekarang.</p><p>Di tengah berbagai fitur dan perkembangan yang ada sejak 5 tahun lalu, di tahun kemarin lewat beberapa referensi lewat temen, twitter, atau baca-baca sendiri, aku nemu fitur-fitur keren Javascript yang bener-bener bikin nge-<em>develop</em> web jadi makin gampang.</p><h4>Optional Chaining</h4><p>Sebagai developer pasti sering banget berinteraksi sama data dengan tipe object, mau itu object beneran atau array. Baik dari logic codingan kita sendiri maupun data yang diterima dari tim backend.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/962/1*HGcXju2c85zHD0coxvN7CQ.png" /></figure><p>Dari snippet di atas, ketika kita mau akses data address.location kita bisa langsung dengan tuliskan data.address.location kan?</p><pre>// abnormal condition<br>let data = null;</pre><pre>console.log(data.address.location.pluscode); // error, can break the app</pre><pre>// Uncaught TypeError: Cannot read property &#39;address&#39; of null</pre><p>Tapi gimana kalo misal value dari data itu bisa null atau undefined ? Tentu kita perlu kasih handler supaya aplikasi kita enggak nge-break, karena kalo enggak dikasih handle kita bakal mencoba ngakses property dari sebuah value yang undefined/null tadi.</p><pre>if (data &amp;&amp; data.address &amp;&amp; data.address.location &amp;&amp; data.address.location.pluscode) {<br>  console.log(data.address.location.pluscode);<br>} // ampun deh </pre><p>Ampun deh, bayangin kita cuma butuh satu petil data tapi handler nya bisa jadi panjang gini, belum lagi misal objectnya nested lebih dalam lagi, bisa panjang banget dan code kita jadi enggak readable.</p><p>Dengan adanya optional chaining, kita bisa akses data-data yang sekiranya bakal nullable tapi enggak bakal bikin aplikasi kita nge-break atau nge return error. Karena ketika akses dan ketemu error, akan langsung direturn sebagai undefined .</p><pre>console.log(data?.address?.location?.pluscode); // undefined</pre><p>See? Code kita jauh lebih singkat dan udah dihandle sama Javascript kalo ada error-error.</p><p>Selain object literal, optional chaining ini juga bisa digunain di array.</p><pre>// normal condition<br>let arr = [1, 2, 3, 4]</pre><pre>if (arr.length &gt; 0) {<br>  arr.map(val =&gt; console.log(val));<br>}</pre><p>Dari snippet di atas kita ingin melakukan mapping kalau misal data arr punya length &gt; 0 . Tapi kalo ternyata ada update di code kita, dimana arr bisa aja null/undefined maka code di atas enggak bakal valid. Untuk bikin handle kondisi baru tersebut kita bisa pake dua cara.</p><pre>// abnormal condition<br>let arr = null;</pre><pre>// normal approach<br>if (Array.isArray(arr) &amp;&amp; arr.length &gt; 0) {<br>  arr.map(val =&gt; console.log(val));<br>}</pre><pre>// optional chaining #1<br>if (arr?.length &gt; 0) {<br>  arr.map(val =&gt; console.log(val));<br>}</pre><pre>// optional chaining #2<br>arr?.map(val =&gt; console.log(val));</pre><p>Optional chaining bukan cuma handle nullable object property, bahkan bisa handle object prototype di Javascript. Jadi kita juga bisa meng-optional chainingkan kaya .length, .map, .filter, .any, etc. .</p><p>Masih ada lagi, optional chaining ini bisa dipakai dengan expression, untuk akses item di suatu array, atau function callback.</p><p>Optional chaining ini bener-bener penyelamat banyak developer Javascript karena code yang ditulis bisa jauh lebih singkat, juga banyak library yang udah mulai support fitur ini tanpa perlu menambahkan Babel plugin. Tapi kalau kamu pengen menikmati fitur ini di project yang lumayan lama kamu perlu install @babel/plugin-proposal-optional-chaining .</p><h4>Numeric Separator</h4><p>Kita sebagai developer yang sehari-hari dihadapkan dengan text editor yang punya font begitu-gitu aja pasti sering banget kerepotan kalo harus berurusan dengan angka yang digitnya banyak. Takut kalo salah antara ribuan dan puluh atau ratus ribuan. Padahal cuma jarak 1 digit tapi bener-bener bisa berefek ke banyak bagian di aplikasi kita.</p><p>Tenang kisanak, karena kayaknya banyak juga developer lain yang mengalami hal ini, sekarang udah ada support untuk numeric separator.</p><pre>// Before: <br>let number = 1000000000; // ini berapa sih?</pre><pre>// After: <br>let number = 1_000_000_000; // oh 1 milyar toh ternyata</pre><p>Seperti namanya numeric separator ngasih bantuan kita untuk kasih separator di angka-angka yang dirasa bisa bikin kita kebingungan. Aku pertama kali nemu fitur numeric separator ini di Ruby ketika #100DaysOfCode round 1 tahun lalu.</p><p>Di Ruby kita bisa pisahin angka-angka pake underscore ( _ ) dan menurutku membantu banget, saat itu aku udah sempet rasan-rasan “kayaknya asyik nih kalo Javascript ada beginian”. Ternyata ada teman-teman!</p><p>Ohiya numeric separator ini enggak harus dipake untuk misah per 3 digit, kita bisa juga tulis dengan pattern yang ngasal dan tetep bisa jalan dengan baik kok.</p><pre>let number = 1_234_5_6789_0;</pre><p>Setahuku ini sebenernya fitur yang ada di ECMAScript 2021, tapi sejak tahun lalu aku udah sempet pake di beberapa project. Aku belum tau apakah library sekarang ini udah full support fitur ini, tapi cari aman bisa install dulu @babel/plugin-proposal-numeric-separator , then you are ready to go.</p><h4>Path aliasing with VSCode</h4><p>Pernah nggak sih ketika kita udah punya project aplikasi yang cukup gede dengan struktur folder yang udah dalem terus import kita jadi jelek banget karena kebanyakan titik-titiknya ../../../ ? Memangnya codebase kita ini morse apa gimana?</p><pre>// Before: <br>import SomeComponent from &quot;../../../../../lib/SomeComponent&quot;;</pre><pre>// After: <br>import SomeComponent from &quot;Libs/SomeComponent&quot;;</pre><p>Dengan path aliasing, kita bisa mempersingkat import kita supaya enggak kepanjangan, sekali lagi code kita bisa jadi lebih kebaca dengan baik.</p><p>Kalo aku lihat, sebenernya fitur ini udah ada lumayan lama di webpack dan kayaknya aku udah sempet nyobain, tapi saat itu kita enggak bisa manfaatin intellisense dari VSCode kita (kayaknya, entah mungkin aku yang enggak tau).</p><p>Nah dengan nambahin jsconfig.json atau tsconfig.json di VSCode dan nambahin baseUrl serta nambahin konfigurasi resolve di webpack, kita udah bisa memanfaatkan path aliasing yang tersinkron dengan VSCode.</p><pre>// jsconfig.json<br>{<br>  &quot;baseUrl&quot;: &quot;./src&quot;,<br>  &quot;include&quot;: [&quot;./src&quot;],<br>  // rest of the config...<br>}</pre><pre>// webpack config<br>module.exports = {<br>  //...<br>  resolve: {<br>    alias: {<br>      src: path.resolve(__dirname, &quot;./src&quot;)<br>    }<br>  }<br>}</pre><p>Voila! Sekarang kamu bisa ngoding tanpa perlu khawatir codebase mu yang agak besar itu berubah jadi sandi morse semua isinya.</p><h4>JSDoc</h4><p>Aku udah sempet bahas terkait JSDoc ini di story terpisah yang ngebahas tentang code commenting. Long story short, JSDoc ini ngebikin comment kita jadi smart, karena ketika kita ninggalin comment di code kita pakai standard JSDoc, IntelliSense dari VSCode ataupun text editor lain yang punya IntelliSense bakal bisa ngasih suggestion ketika kita mau pake method/function kita tadi.</p><p>Selain itu JSDoc juga bisa jadi guide buat kita yang mau migrasi dari Javascript ke Typescript.</p><p>Itu tadi empat fitur keren Javascript yang aku temuin sepanjang tahun 2020 kemarin, aku udah sempet intip-intip beberapa fitur di ES2021 dan juga keren-keren sih, meskipun belum tau apakah bakal ketemu case yang pake fitur itu.</p><p>Apa fitur keren Javascript yang udah pernah kamu temuin dan kamu cobain? Tinggalin di kolom komentar ya.</p><p>Have a great day. Jangan lupa pake masker!</p><h4>JSDoc</h4><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f9bd90d9141e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/bahas-javascript/javascript-features-appreciation-2020-f9bd90d9141e">Javascript Features Appreciation — 2020</a> was originally published in <a href="https://medium.com/bahas-javascript">Bahas Javascript</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Code commenting?]]></title>
            <link>https://medium.com/bahas-javascript/code-commenting-edd1fc1fe456?source=rss----4793b8102d52---4</link>
            <guid isPermaLink="false">https://medium.com/p/edd1fc1fe456</guid>
            <category><![CDATA[comment]]></category>
            <category><![CDATA[code]]></category>
            <category><![CDATA[code-newbie]]></category>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Ashari Muhammad Hisbulloh]]></dc:creator>
            <pubDate>Sun, 18 Oct 2020 01:55:25 GMT</pubDate>
            <atom:updated>2020-10-18T01:55:25.222Z</atom:updated>
            <content:encoded><![CDATA[<p>Do you mean code tormenting? Is that needed?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BGwG5AJ4P88K2bNO_upjOQ.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@lucabravo?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Luca Bravo</a> on <a href="https://unsplash.com/s/photos/code-comment?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><blockquote>Real programmers don’t comment their code, if it’s hard to write, it should be hard to understand. <br>- Anonymous</blockquote><p>Developer pasti enggak asing dengan istilah bernama clean code dan spaghetti code. Clean code sendiri merupakan sebuah konsep atau discipline dalam menulis kode dengan tujuan kode dapat mudah dipahami, diubah, dan dites. Bertolak belakang dengan spaghetti code, yang merupakan “ejekan” untuk kode yang enggak terstruktur dan susah dimaintain.</p><p>Spaghetti code biasanya terjadi karena beberapa faktor, kaya project requirement yang gampang berubah-ubah, kurangnya rule di programming style nya, juga bisa jadi karena kurangnya pengalaman dari si programmernya, and the thing is… Kita akan menjumpai hal ini di awal-awal kita belajar programming, and it is fine. Selama enggak berlarut-larut, karena bisa bahaya apalagi kalo ngerjain sesuatu dalam sebuah tim.</p><p>Clean code hadir untuk mengatasi masalah-masalah yang mungkin muncul ketika project dikerjakan oleh banyak orang. Saya sendiri merasa terbantu sejak pelan-pelan menerapkan clean code di kode saya. Penamaan yang jelas, flow yang lebih teratur, formatting yang baik, bener-bener mengurangi WTFPM (WTF Per Minute) — ukuran kualitas kodemu — ketika saya harus melihat masa lalu, maksudnya ngelihat kode yang pernah saya tulis sebelumnya.</p><p>Masalahnya… Clean code adalah konsep buatan manusia bernama Robert “Uncle Bob” Martin, yang mana tentu enggak sempurna. Enggak sempurna disini maksudnya enggak bisa diterapkan as it is dalam semua kondisi, karena berbeda kasus yang ditemui bisa jadi perlu ada adjustment. Dan salah satu adjustment yang saya maksud adalah code comments.</p><p>Mungkin agak gimana gitu ya? Terutama untuk temen-temen penganut paham clean code garis keras.</p><blockquote>“Code is self-documenting”, they say.</blockquote><p>Wait up… Listen to me first. Bear with me. <br>Saya juga percaya dan yakin bahwa kode yang baik adalah kode yang bisa dipahami “dalam sekali lihat”, kode ini ngapain, nge eksekusi apa aja, kalo error apa yang dia lakuin, dan sebagainya dan sebagainya. Kode yang baik jauh lebih baik daripada comments, tapi dalam beberapa hal kamu akan butuh comments dan <strong>clean code != well engineered</strong>.</p><h4>Kenapa sih comments sebegitunya di”benci”?</h4><p>Here’s my opi🧅.</p><p>Comments dipercaya sebagai code smells, alias bagian yang sukanya menuh-menuhin kode doang, bagian yang enggak penting. Saya juga dulunya mikir gitu, pokoknya code itu harus zero comments.</p><p>Sebenernya… Bukan comments yang salah dalam kode kita, tapi gimana penggunaan comments yang kurang optimal lah yang salah di kode kita. Kadang kita menggunakan comments disini-disana-dimana-mana hati kita senang sampe-sampe kode kita over-commented dan jadi code smells.</p><blockquote>Talk is easy, show me the code</blockquote><p><strong>Naruh comments di kode yang udah jelas</strong></p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/cd481a149272daaddb39c57508b8de52/href">https://medium.com/media/cd481a149272daaddb39c57508b8de52/href</a></iframe><p>Naruh comments di bagian-bagian kode yang udah jelas tanpa perlu dijelasin lagi adalah salah satu aspek kenapa comments jadi nggak penting, dan ya emang kaya gini enggak penting sih.</p><p><strong>Bertele-tele</strong></p><pre>// when being used, the tutorial window will be opened to show the tutorial<br>const displayWindow = () =&gt; {  <br>  ... your code goes here<br>}</pre><p>Comments yang panjang dan bertele-tele juga bisa bikin kita sebagai programmer ill feel sendiri bacanya. Gunakanlah comments dengan bahasa yang sederhana</p><p><strong>Comments yang… enggak berhubungan sama sekali</strong></p><pre>// why am I being here<br>const getAllProducts = (params) =&gt; {<br>  ... your code goes here</pre><pre>  .. some parameters, if else, loop, whatever<br>}</pre><pre>...<br></pre><pre>// THE BOSS IS A NUISANCE DAMMIT, WHY DID HE TAKE MY BURGER<br>const capitalizeWord = word =&gt; {<br>  ...your code goes here<br>}</pre><pre>...<br></pre><pre>// I know this function sucks, I know it very well, you can call me idiot</pre><p>Menambahkan comments di bagian yang enggak ada korelasinya sama kode yang dimaksud atau menjadikan comments sebagai tempat curhat karena yakin enggak bakal dibaca orang lain juga enggak boleh dilakukan ya kawanku.</p><p>Dan mungkin lebih banyak lagi kesalahan penggunaan comments yang bikin kita sebegitu enggak sukanya sama dia dan nganggep comments itu code smell.</p><h4>Cara memanfaatkan comments (dengan baik?)</h4><p>Comments memang bukan bagian untuk menjelaskan sebuah kode itu ngapain aja, tapi lebih ke kenapa ada kode itu disitu, kenapa kita pake cara itu dan enggak pake cara yang lain, juga bisa dipakai sebagai catatan buat orang yang lain ketika mau pake kode kita.</p><p><strong>Documentation comments</strong></p><p>Seperti namanya, comments ini digunakan untuk mendokumentasikan fungsi atau kode yang telah kita tulis (saya sih biasanya nulis ini buat di functions). Sebaiknya untuk comments ini menggunakan standard comments yang sudah ada, kalo Javascript ya pake standard <a href="http://usejsdoc.org/">JSDoc</a>.</p><p>Karena kalau ngikutin standard yang ada, bisa terintegrasi dengan intellisense yang ada di code editor kesayangan kita.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/721/1*XWcd_8KdZWD2S8Iy6nJcVg.png" /></figure><p>Contoh paling gampang yang sering saya pake adalah untuk mendeskripsikan function yang punya parameter yang berpotensi banyak.</p><p>Kenapa enggak pake object destructuring sih? Kan lebih gampang. <br>Well saya juga setuju, kalau isi objectnya sedikit kita bisa gunakan object destructuring. Tapi gimana kalo objectnya bisa terdiri dari sampe 12 property? Justru bisa berpotensi jadi kotor dan susah dimaintain.</p><p>Anyway, disinilah magic nya, dengan menjelaskan parameter yang bisa ditampung lewat comments, ketika kita mau pake di file lain, terus kita lupa parameternya apa aja, kita tinggal “peek” fungsi tadi dan akan kelihatan penjelasannya.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/842/1*Ddyr7qDpr4y8op1WDgU9KQ.png" /></figure><p>Bahkan tanpa kita harus repot-repot buka file yang ada fungsi tadi berada. Kode fungsi kita jadi tetep sederhana, tetep bisa didebug dengan baca comment yang ada, dan terintegrasi dengan code editor kita.</p><p>By the way, comments itu bisa di collapse/expand loh di VS Code, enggak perlu khawatir menuh-menuhin. 😉</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/761/0*GG3y5zezivhHAS8r.gif" /><figcaption>Collapsing comment in VS Code from <a href="https://cdn-media-1.freecodecamp.org/images/1*o9d-IZKFtlHf4ycY_n4H2Q.gif">freeCodeCamp</a></figcaption></figure><p><strong>Clarification comments</strong></p><p>Selain menggunakan comments sebagai alat buat ngebantuin kita dokumentasiin kode kita, kita juga bisa memanfaatkan comments untuk ngasih klarifikasi tentang “kenapa ada ini” di kode kita.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f936aa8ae07cc4ff29483223752ef57c/href">https://medium.com/media/f936aa8ae07cc4ff29483223752ef57c/href</a></iframe><p>Penggunaan comment di snippet di atas menjelaskan kenapa sih kita pake ini dan enggak pake yang lainnya. Terus juga ngasih catatan kalo misal kodenya mau diubah approachnya apa yang harus dilakukan.</p><p>Kita juga bisa meninggalkan comments dengan bentuk lain kaya</p><pre>// TODO: ...</pre><pre>Comment ini bisa sebagai flag buat kita terkait apa yang belum dilakukan dan nanti perlu dilakukan. Bisa juga sebagai catatan untuk orang lain kalo ada logic yang belum selesai dan warning kalo misal nanti mau pake ini ada sesuatu yang kurang beres</pre><p>atau misal snippet dari Lodash</p><pre>function addSetEntry(set, value) {<br>  /*<br>    Don&#39;t return `set.add` because it&#39;s not chainable in IE 11.<br>  */</pre><pre>    set.add(value);</pre><pre>    return set;  <br>}</pre><p>Comments bisa level up kode kita dan bisa juga downgrade kode kita, tergantung gimana kita memanfaatkan fitur comments di kode kita. Tetep menerapkan clean code dan menggunakan comments di saat-saat yang memang diperlukan dan hindari comments yang tidak diperlukan.</p><p>Enggak perlu terlalu garis keras dengan clean code dan jadi anti dengan menggunakan comments. Karena kita sebagai programmer — terutama yang kerja bareng tim — sebaiknya mengutamakan kenyamanan dan kemudahan kita dalam mantain kode kita.</p><h3></h3><p>Me five years ago: code should be &quot;clean&quot; and self-documentingMe today: pic.twitter.com/2bBLMhIY5n</p><p>Karena pada akhirnya menurut saya kode yang baik adalah kode yang dapat dipahami dengan mudah oleh orang lain, bisa jadi orang lain itu adalah kita sendiri di masa yang akan datang.</p><blockquote>“Any fool can write code that a computer can understand. Good programmers write a code that humans can understand”<br>- Martin Fowler</blockquote><p>Tambahan:</p><h3></h3><p>Don&#39;t treat your colleagues like compilers 🙅‍♂️ Write your code for humans - you aren&#39;t going to &quot;lose points&quot; if you leave helpful hints or little breadcrumbs to indicate how and why you&#39;ve done things a certain way.</p><p>Referensi:</p><ul><li><a href="https://gist.github.com/wojteklu/73c6914cc446146b8b533c0988cf8d29">Summary of clean codes</a></li><li><a href="https://blog.gojekengineering.com/the-basics-of-writing-clean-code-39ed770b626d">Gojek Engineering: The basics of writing clean code</a></li><li><a href="http://reviewthecode.blogspot.com/2016/01/wtf-per-minute-actual-measurement-for.html">WTF Per Minute: An Actual Measurement for Code Quality</a></li><li><a href="https://www.todaysoftmag.com/article/1120/clean-code-comments-and-formatting">Clean Code — Comments and Formatting by TSM</a></li><li><a href="https://www.techrepublic.com/article/the-pros-and-cons-but-mostly-pros-of-comments-in-code/">Pros and Cons of comments in code</a></li><li><a href="https://blog.submain.com/biggest-code-commenting-fails/">Biggest code commenting fails</a></li><li><a href="https://www.freecodecamp.org/news/code-comments-the-good-the-bad-and-the-ugly-be9cc65fbf83/">Putting comments in code: the good, the bad, the ugly</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=edd1fc1fe456" width="1" height="1" alt=""><hr><p><a href="https://medium.com/bahas-javascript/code-commenting-edd1fc1fe456">Code commenting?</a> was originally published in <a href="https://medium.com/bahas-javascript">Bahas Javascript</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Assigning Value: Under the Hood]]></title>
            <link>https://medium.com/bahas-javascript/assigning-value-under-the-hood-1fa1836e41ee?source=rss----4793b8102d52---4</link>
            <guid isPermaLink="false">https://medium.com/p/1fa1836e41ee</guid>
            <category><![CDATA[basics]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[value-and-variable]]></category>
            <category><![CDATA[fundamentals]]></category>
            <dc:creator><![CDATA[Ashari Muhammad Hisbulloh]]></dc:creator>
            <pubDate>Tue, 28 Jul 2020 00:06:26 GMT</pubDate>
            <atom:updated>2020-07-28T00:06:26.386Z</atom:updated>
            <content:encoded><![CDATA[<p>Cara Javascript meng-assign value ke variable</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_jFz-a2ZFBK5ZJER3q9kfQ.png" /></figure><p>Melanjutkan pembahasan di post sebelumnya terkait <em>mental model wire </em>dari Dan Abramov dan assigning value. Seperti yang aku ceritain sebelumnya assigning value bisa kita bayangin kaya menghubungkan suatu kabel (yang mana disebut variable) ke suatu value.</p><p>Kelihatannya sih sederhana banget, padahal… ya emang sederhana sih. Menggambarkan hubungan antara value dan variable dengan kabel menurutku cara paling mudah memahami gimana variable di Javascript bekerja. Tapi eh tapi, ada beberapa hal yang mungkin perlu kamu tahu terkait gimana sih sebenernya Javascript nge-handle assigning value ini.</p><p>Let’s dive deeper into assign value…</p><h4>Assign a primitive value to a variable</h4><p><em>Let’s say</em> kita punya potongan kode kaya gini</p><pre>let lauk = &quot;Soto&quot;;<br>let sayur = lauk;</pre><p>Kalo mengingat implementasi mental model wire kemarin, maka hasilnya kurang lebih akan begini kan…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/744/1*bu9LMIz5IOeTuXFoF6s2Yg.png" /></figure><p>Karena variable sayur juga dihubungkan ke value dari variable lauk . Tapi gimana kalo kita punya potongan kode kaya gini?</p><pre>let lauk = &quot;Soto&quot;;<br>let sayur = &quot;Soto&quot;;</pre><p>Apakah Javascript akan membuat value Soto lagi dan kemudian dihubungkan dengan variable sayur ? Atau malah variable sayur tetap terhubung ke tempat yang sama dengan variable lauk ? Coba dengan pengetahuanmu yang sekarang kira-kira dulu apa jawabannya…</p><p>.</p><p>.</p><p>.</p><p><em>Udah ya…? Udah dikira-kira ya? Fix ya ini jawabannya?</em></p><p>.</p><p>.</p><p>.</p><p>Jawabannya, variable sayur akan terhubung ke value yang sama dengan variable lauk .</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/726/1*yvqwmLUq75kb4ng7Vvcu8g.png" /></figure><p><em>Loh kok bisa gitu? Kan kita tadi assign value sendiri-sendiri? Kok terhubung ke value yang sama sih, harusnya beda dong?!</em></p><p>Mungkin kamu berpikir demikian, tapi ingat-ingat lagi bahwa 1) Javascript adalah salah satu bahasa pemrograman tingkat tinggi (jauh dari memory control); 2) Primitive value itu immutable/<em>read-only</em>.</p><p>Dengan ingat dua hal tadi, kita bisa tahu kalo ya karena primitive value merupakan value yang <em>read-only</em> kenapa harus dibuatkan value lagi di tempat yang berbeda terus dihubungkan?</p><p>Terus gimana misalnya kita punya kode kaya gini…</p><pre>let lauk = &quot;Soto&quot;;<br>let sayur = lauk;<br>sayur = &quot;Sate&quot;;</pre><p>Dari potongan kode di atas, variable sayur akan diganti dari sebelumnya terhubung ke Soto berpindah ke Sate .</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/672/1*fOS6jSShxXR-lCN9D1s0JA.png" /></figure><p>Karena ketika variable di assign ke primitive value dengan value yangberbeda, maka Javascript akan membuat value baru (tentunya) dan menghubungkan variable tadi ke value yang baru.</p><p>Jadi berapapun variable yang ada, kalau value yang di assign sama dan primitive value, maka Javascript akan menghubungkan semua variable ke satu value yang sama.</p><p><em>Oke, kalo gitu gimana dengan Object?</em></p><h4>Assign object value to a variable</h4><p>Sama seperti sebelumnya kita akan coba lihat, misal kita punya potongan kode kaya gini…</p><pre>let sherlock = {};<br>let watson = sherlock;</pre><p>Dari potongan kode di atas, dengan mental model wire kita pasti udah bisa membayangkan gimana Javascript menghubungkan value dari variable sherlock dan watson . Betul sekali kawanku, tentunya terhubung ke satu value yang sama.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/565/1*yMBchCPGOkfgk7dRC1q_gg.png" /></figure><p>Terus kira-kira gimana kalo kita ubah kode kita jadi kaya gini…</p><pre>let sherlock = {};<br>let watson = {};</pre><p>Apakah aturan di primitive value juga berlaku di object value? Bahwa akan tetap menunjuk ke satu value yang sama. Atau enggak kaya gitu? Coba kira-kira dulu, menurutmu apa yang akan dilakukan Javascript…</p><p>.</p><p>.</p><p>.</p><p>Udah punya jawaban? Yakin ya? Kita kunci jawabannya.</p><p>.</p><p>.</p><p>.</p><p>Jawabannya…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/567/1*m3N3l6RHLe5O2iPs_Ft6Hw.png" /></figure><p>Ketika berkutat dengan object, Javascript akan selalu membuat value baru, meskipun kita <strong>menulis</strong> isi dari objectnya sama atau sama-sama <em>empty object</em> {} . Ini juga jadi salah satu alasan kenapa ketika kita melakukan comparison{} == {} akan me-return false , karena valuenya sudah dianggap beda oleh Javascript.</p><p>Masih ngomongin object, kira-kira gimana sih gambaran kalo object yang punya <em>property</em>?</p><pre>let detective = {<br>  name: &quot;Sherlock Holmes&quot;<br>  address: &quot;Baker Street&quot;<br>};</pre><p>Selalu ingat bahwa variable terhubung dengan suatu value, ketika kita ngomongin object yang punya <em>property</em>, maka <em>key </em>dari property tadi berlaku sebagai variable dan valuenya (ya jadi <em>value</em>, namanya juga <em>value</em>). Maka bisa kita gambarkan kaya gini…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/617/1*FzeR_JS-_ZrbRWPqGG1Xuw.png" /></figure><p><em>See? </em>Kita menghubungkan variable detective ke suatu object, kemudian tiap variable di dalam object tadi terhubung dengan suatu value. Gambaran ini juga bisa diperdalam lagi misalnya kita punya kode yang sedikit lebih kompleks.</p><pre>let detective = {<br>  name: &quot;Sherlock Holmes&quot;,<br>  address: {<br>    street: &quot;Baker Street&quot;,<br>    city: &quot;London&quot;<br>  }<br>};</pre><p>Dari potongan kode di atas bisa kita ilustrasikan seperti ini</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/988/1*UapV4AKsVeV6k0ywpqYf2w.png" /></figure><p><strong>No Nested Object<br></strong>Dan Abramov di salah satu coursenya di Just Javascript bilang bahwa <strong>meskipun dalam kode kita tertulis bahwa object kita terlihat “nested”, tapi enggak ada yang namanya object di dalam object</strong>. Bisa kita lihat ilustrasi di atas kita bisa lihat bahwa sebenernya ada dua pasang <em>curly braces</em> yang artinya keduanya adalah entitas object yang sebenernya terpisah.</p><p>Makanya ketika kita melakukan mutation ke object yang terhubung ke address , secara otomatis value di detective.address juga ikut berubah.</p><pre>let detective = {<br>  name: &quot;Sherlock Holmes&quot;,<br>  address: {<br>    street: &quot;Baker Street&quot;,<br>    city: &quot;London&quot;<br>  }<br>};<br>let address = detective.address;<br>address.city = &quot;Liverpool&quot;;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/961/1*ctIbs8rpzHxhGQJ3qdn2ng.png" /></figure><p><em>Lalu gimana kalo kita pengen address punya value yang sama tapi menunjuk ke object yang berbeda?</em></p><p>Jawabannya ya dengan membuat object baru.</p><pre>let address = {<br>  street: &quot;Baker Street&quot;,<br>  city: &quot;London&quot;<br>};</pre><p>Dengan begitu Javascript akan membuatkan object baru untuk dihubungkan dengan variable address , meskipun property name nya sama, karena ada di object yang berbeda, akan terhubung ke value yang berbeda.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/937/1*hiL7JfKZ_Q0DFvbB_RS3VA.png" /></figure><p>Dengan begitu ketika kita mengubah value address.city enggak akan mempengaruhi value yang dihubungkan dengan detective.address.city lagi.</p><p><em>NB: Karena function juga sejatinya sebuah object, hal yang sama berlaku juga dengan function.</em></p><p>That’s it! Gimana Javascript memperlakukan variable ketika kita melakukan <em>assign value</em>. Semoga bermanfaat, happy coding!</p><p><em>I’m open for feedback anyway, just let me know in the comment section.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1fa1836e41ee" width="1" height="1" alt=""><hr><p><a href="https://medium.com/bahas-javascript/assigning-value-under-the-hood-1fa1836e41ee">Assigning Value: Under the Hood</a> was originally published in <a href="https://medium.com/bahas-javascript">Bahas Javascript</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>