<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: kouta222</title>
    <description>The latest articles on Forem by kouta222 (@kouta222).</description>
    <link>https://forem.com/kouta222</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1262140%2Fc5485daa-8232-47a1-b718-3b2107a1302d.jpeg</url>
      <title>Forem: kouta222</title>
      <link>https://forem.com/kouta222</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kouta222"/>
    <language>en</language>
    <item>
      <title>Mastering Kotlin Delegation: From Property Delegates to Class Composition</title>
      <dc:creator>kouta222</dc:creator>
      <pubDate>Wed, 20 Aug 2025 06:15:58 +0000</pubDate>
      <link>https://forem.com/kouta222/mastering-kotlin-delegation-from-property-delegates-to-class-composition-d4e</link>
      <guid>https://forem.com/kouta222/mastering-kotlin-delegation-from-property-delegates-to-class-composition-d4e</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In software engineering, &lt;strong&gt;delegation&lt;/strong&gt; is an object-oriented design pattern that allows an object to hand over certain responsibilities to another object. Instead of duplicating logic or relying heavily on inheritance, delegation promotes &lt;strong&gt;object composition&lt;/strong&gt; and modular code reuse.&lt;/p&gt;

&lt;p&gt;According to &lt;a href="https://en.wikipedia.org/wiki/Delegation_pattern" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The delegation pattern is an object-oriented design pattern that allows object composition to achieve the same code reuse as inheritance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In Kotlin, delegation is not just a pattern — it is &lt;strong&gt;built into the language&lt;/strong&gt; as a first-class feature. This makes it simple and powerful to implement.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Delegation?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Delegation means &lt;strong&gt;outsourcing part of a class’s behavior to another object&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It is often used when you want to &lt;strong&gt;reuse functionality from an existing class&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The delegating class holds the delegate as an &lt;strong&gt;instance&lt;/strong&gt; and forwards calls to it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  In Practice
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inheritance&lt;/strong&gt;: brings &lt;em&gt;all&lt;/em&gt; behavior from the parent class.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delegation&lt;/strong&gt;: selectively reuses &lt;em&gt;some&lt;/em&gt; behavior from another class.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Types of Delegation in Kotlin
&lt;/h2&gt;

&lt;p&gt;Kotlin supports two main forms of delegation:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Property Delegation
&lt;/h3&gt;

&lt;p&gt;In property delegation, getter and setter logic of a property is handled by another object.&lt;/p&gt;

&lt;p&gt;The syntax looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;val&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;property&lt;/span&gt;&lt;span class="nc"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="py"&gt;by&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under the hood, the Kotlin compiler creates a hidden property (&lt;code&gt;prop$delegate&lt;/code&gt;) and routes all property access to the delegate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Examples of Standard Delegates
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Lazy Properties&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="nf"&gt;lazy&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Computed once!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="s"&gt;"Kotlin"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The lambda runs only the first time the property is accessed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observable Properties&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;kotlin.properties.Delegates&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="nc"&gt;Delegates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;property&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;oldValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newValue&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"${property.name} changed from $oldValue to $newValue"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each assignment triggers a callback with metadata provided by &lt;code&gt;KProperty&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Class Delegation
&lt;/h3&gt;

&lt;p&gt;Kotlin also allows entire &lt;strong&gt;interface implementations&lt;/strong&gt; to be delegated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Printer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;printMessage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SimplePrinter&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Printer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;printMessage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello from Printer!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LoggingPrinter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;printer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Printer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Printer&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;printer&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;LoggingPrinter&lt;/code&gt; declares that it implements &lt;code&gt;Printer&lt;/code&gt;, but instead of re-implementing methods, it forwards calls to the given &lt;code&gt;printer&lt;/code&gt; instance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Kotlin Properties
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;property&lt;/strong&gt; in Kotlin is more than just a field — it is a combination of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;backing field (variable)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessor methods (getter/setter)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This unified model is what enables powerful property delegation features.&lt;/p&gt;




&lt;h2&gt;
  
  
  KProperty in Delegation
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;KProperty&lt;/code&gt; is part of Kotlin’s &lt;strong&gt;reflection API&lt;/strong&gt;, representing metadata about a property:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name, type, annotations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Can be used to &lt;strong&gt;inspect or manipulate properties at runtime&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In delegation, it provides context to the delegate (e.g., the property name being accessed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, in &lt;code&gt;observable&lt;/code&gt;, the &lt;code&gt;property&lt;/code&gt; parameter is a &lt;code&gt;KProperty&lt;/code&gt; instance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Delegation vs Inheritance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Inheritance&lt;/th&gt;
&lt;th&gt;Delegation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mechanism&lt;/td&gt;
&lt;td&gt;Takes &lt;strong&gt;all&lt;/strong&gt; behavior from parent&lt;/td&gt;
&lt;td&gt;Reuses &lt;strong&gt;only part&lt;/strong&gt; of another class&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relationship&lt;/td&gt;
&lt;td&gt;"Is-a" relationship&lt;/td&gt;
&lt;td&gt;"Has-a" relationship&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexibility&lt;/td&gt;
&lt;td&gt;Limited to one superclass&lt;/td&gt;
&lt;td&gt;Combine multiple delegates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Delegation promotes &lt;strong&gt;composition over inheritance&lt;/strong&gt;, leading to cleaner, more modular systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Translation Rules for Delegated Properties
&lt;/h2&gt;

&lt;p&gt;When you declare a delegated property, the Kotlin compiler:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generates an auxiliary hidden property (e.g., &lt;code&gt;prop$delegate&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Makes the original property’s &lt;strong&gt;getter/setter&lt;/strong&gt; call into the delegate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="nf"&gt;lazy&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"Kotlin"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;translates to something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;delegate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lazy&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"Kotlin"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;
    &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Should I Use a Function or a Property?
&lt;/h2&gt;

&lt;p&gt;Kotlin encourages a semantic distinction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If it &lt;strong&gt;describes behavior&lt;/strong&gt; → use a &lt;strong&gt;function&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;e.g. &lt;code&gt;run()&lt;/code&gt;, &lt;code&gt;jump()&lt;/code&gt;, &lt;code&gt;walk()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;If it &lt;strong&gt;describes state&lt;/strong&gt; → use a &lt;strong&gt;property&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;e.g. &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;lastName&lt;/code&gt;, &lt;code&gt;weight&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;More: &lt;a href="https://blog.kotlin-academy.com/kotlin-should-i-define-function-or-property-6786951da909" rel="noopener noreferrer"&gt;Kotlin Academy Blog&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/delegation.html" rel="noopener noreferrer"&gt;Kotlin Delegation Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kotlinlang.org/docs/delegated-properties.html" rel="noopener noreferrer"&gt;Delegated Properties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/Y_M27/items/a41b2aa8b49e7c3a1a7f" rel="noopener noreferrer"&gt;Qiita: Kotlin Delegation Basics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.kotlin-academy.com/kotlin-should-i-define-function-or-property-6786951da909" rel="noopener noreferrer"&gt;Kotlin Academy Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.slideshare.net/RecruitLifestyle/kotlin-87339759#23" rel="noopener noreferrer"&gt;Recruit Lifestyle Kotlin Slides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.slideshare.net/slideshow/kotlin-90624413/90624413" rel="noopener noreferrer"&gt;Another Kotlin Delegation SlideShare&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kotlin</category>
      <category>java</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Behind the Scenes of JavaScript: How Your Code Actually Runs</title>
      <dc:creator>kouta222</dc:creator>
      <pubDate>Fri, 15 Aug 2025 11:38:02 +0000</pubDate>
      <link>https://forem.com/kouta222/javascript-execution-model-from-source-code-to-running-program-1jn9</link>
      <guid>https://forem.com/kouta222/javascript-execution-model-from-source-code-to-running-program-1jn9</guid>
      <description>&lt;p&gt;JavaScript doesn’t just “run” your code instantly — it goes through a series of steps inside the &lt;strong&gt;engine&lt;/strong&gt; and the &lt;strong&gt;host environment&lt;/strong&gt; (browser or Node.js) before anything appears on the screen or in the console.&lt;/p&gt;

&lt;p&gt;By understanding this journey from &lt;strong&gt;source code to running program&lt;/strong&gt;, you can write code that behaves more predictably, performs better, and avoids subtle async bugs.&lt;/p&gt;

&lt;p&gt;This guide walks you through the &lt;strong&gt;JavaScript processing pipeline&lt;/strong&gt; — from the high-level compilation stages to what happens at runtime with the &lt;strong&gt;call stack&lt;/strong&gt;, &lt;strong&gt;event loop&lt;/strong&gt;, &lt;strong&gt;task queues&lt;/strong&gt;, and &lt;strong&gt;heap&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Overview of the JavaScript Processing Pipeline
&lt;/h2&gt;

&lt;p&gt;Before your code can run, the JavaScript engine transforms it step-by-step from text into something the CPU can execute.&lt;/p&gt;

&lt;p&gt;This process — the &lt;strong&gt;JavaScript processing pipeline&lt;/strong&gt; — can be broken into four main stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lexing / Tokenizing&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The engine scans your source code and splits it into tokens — the smallest meaningful units (e.g., &lt;code&gt;const&lt;/code&gt;, &lt;code&gt;sum&lt;/code&gt;, &lt;code&gt;=&lt;/code&gt;, &lt;code&gt;42&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parsing&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The parser converts tokens into an &lt;strong&gt;Abstract Syntax Tree (AST)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If a syntax error is found, execution stops immediately with a &lt;strong&gt;parse-time error&lt;/strong&gt; (&lt;code&gt;SyntaxError&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compilation&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The interpreter turns the AST into &lt;strong&gt;bytecode&lt;/strong&gt; (V8 uses &lt;strong&gt;Ignition&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;A JIT compiler may further optimize “hot” code paths into &lt;strong&gt;machine code&lt;/strong&gt; (V8 uses &lt;strong&gt;TurboFan&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime execution&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The CPU executes the bytecode or machine code.&lt;/li&gt;
&lt;li&gt;The engine manages variables, functions, and objects in memory using the &lt;strong&gt;stack&lt;/strong&gt; and &lt;strong&gt;heap&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  2. Core Components During Runtime Execution
&lt;/h2&gt;

&lt;p&gt;Once the runtime execution stage begins, your code interacts with a set of core components that manage memory, track function calls, and schedule tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Heap&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The heap is a large, mostly unstructured memory area where objects, arrays, and functions are stored.&lt;/li&gt;
&lt;li&gt;Variables in the stack often hold &lt;em&gt;references&lt;/em&gt; to these heap objects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Stack (Call Stack)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The call stack is a &lt;strong&gt;last-in, first-out (LIFO)&lt;/strong&gt; structure the engine uses to keep track of which functions are currently running.&lt;/li&gt;
&lt;li&gt;When a function finishes, its execution context is popped off the stack.&lt;/li&gt;
&lt;li&gt;If the stack is empty, the &lt;strong&gt;event loop&lt;/strong&gt; can dispatch new tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Task Queues&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The runtime keeps callbacks waiting to be executed in different queues:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Macrotask queue&lt;/strong&gt; → timers (&lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;setInterval&lt;/code&gt;), I/O events, UI rendering tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microtask queue&lt;/strong&gt; → Promise callbacks, &lt;code&gt;queueMicrotask&lt;/code&gt;, &lt;code&gt;MutationObserver&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Event Loop&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;event loop&lt;/strong&gt; is JavaScript’s scheduler. It keeps your single-threaded code responsive by repeatedly: finishing what’s on the &lt;strong&gt;call stack&lt;/strong&gt;, running any queued &lt;strong&gt;microtasks&lt;/strong&gt; (Promise callbacks), optionally letting the browser &lt;strong&gt;render&lt;/strong&gt;, then taking the next &lt;strong&gt;macrotask&lt;/strong&gt; (e.g., &lt;code&gt;setTimeout&lt;/code&gt;, I/O) and doing it again.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Diagram of JavaScript Execution Environment
&lt;/h2&gt;

&lt;p&gt;Here’s a high-level view of how the &lt;strong&gt;heap&lt;/strong&gt;, &lt;strong&gt;stack&lt;/strong&gt;, &lt;strong&gt;queues&lt;/strong&gt;, and &lt;strong&gt;event loop&lt;/strong&gt; interact, based on the MDN agent model diagram:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------------------------------------------------+
|  JavaScript Runtime (Browser / Node.js)              |
|                                                      |
|  +-------------------+    +---------------------+   |
|  | Heap              |    | Call Stack          |   |
|  |  {objects, arrays}|    | main()              |   |
|  |  functions        |    | foo()               |   |
|  +-------------------+    +---------------------+   |
|            ^                        |                 |
|            |                        v                 |
|  +-------------------+   +-----------------------+    |
|  | Task Queues       |   | Event Loop            |    |
|  |  [Macrotasks]     |&amp;lt;--| (checks, dispatches)  |    |
|  |  [Microtasks]     |   +-----------------------+    |
+------------------------------------------------------+

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Example: How Functions Execute Under the Hood
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Inside foo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Start bar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;End bar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Start&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;End&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step-by-step execution flow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The engine&lt;/strong&gt; stores the compiled &lt;code&gt;foo&lt;/code&gt; and &lt;code&gt;bar&lt;/code&gt; &lt;strong&gt;function objects&lt;/strong&gt; in the &lt;strong&gt;heap&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The engine&lt;/strong&gt; creates the &lt;strong&gt;global execution context object&lt;/strong&gt; and pushes it onto the &lt;strong&gt;call stack&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Runs &lt;code&gt;console.log('Start')&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;Pushes the &lt;strong&gt;console.log(‘Start’) function call object&lt;/strong&gt; onto the &lt;strong&gt;call stack&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Executes it (prints &lt;code&gt;"Start"&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Pops it off.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Encounters &lt;code&gt;bar()&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;Creates a &lt;strong&gt;bar execution context object&lt;/strong&gt; and pushes it onto the &lt;strong&gt;call stack&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Inside &lt;code&gt;bar&lt;/code&gt;, runs &lt;code&gt;console.log('Start bar')&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;Pushes the &lt;strong&gt;console.log(‘Start bar’) function call object&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Executes it (prints &lt;code&gt;"Start bar"&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Pops it off.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Calls &lt;code&gt;foo()&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;Creates a &lt;strong&gt;foo execution context object&lt;/strong&gt; and pushes it onto the &lt;strong&gt;call stack&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Inside &lt;code&gt;foo&lt;/code&gt;, runs &lt;code&gt;console.log('Inside foo')&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;Pushes the &lt;strong&gt;console.log(‘Inside foo’) function call object&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Executes it (prints &lt;code&gt;"Inside foo"&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Pops it off.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pops the &lt;strong&gt;foo execution context object&lt;/strong&gt; off the &lt;strong&gt;call stack&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Back in &lt;code&gt;bar&lt;/code&gt;, runs &lt;code&gt;console.log('End bar')&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;Pushes the &lt;strong&gt;console.log(‘End bar’) function call object&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Executes it (prints &lt;code&gt;"End bar"&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Pops it off.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pops the &lt;strong&gt;bar execution context object&lt;/strong&gt; off the &lt;strong&gt;call stack&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Back in the global context, runs &lt;code&gt;console.log('End')&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;Pushes the &lt;strong&gt;console.log(‘End’) function call object&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Executes it (prints &lt;code&gt;"End"&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Pops it off.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pops the &lt;strong&gt;global execution context object&lt;/strong&gt; off the &lt;strong&gt;call stack&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;call stack&lt;/strong&gt; is empty → the &lt;strong&gt;event loop&lt;/strong&gt; checks the &lt;strong&gt;microtask queue&lt;/strong&gt; and &lt;strong&gt;macrotask queue&lt;/strong&gt; for pending callbacks.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  4. Single-Threaded Nature of JavaScript
&lt;/h2&gt;

&lt;p&gt;JavaScript executes one task at a time in each environment (browser tab, Node.js process, or worker).&lt;/p&gt;

&lt;p&gt;There’s only one call stack, so a long-running synchronous operation will block rendering, event handling, and async callbacks.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Microtasks vs Macrotasks
&lt;/h2&gt;

&lt;p&gt;JavaScript schedules asynchronous work in two main buckets:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microtasks&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always run &lt;strong&gt;before&lt;/strong&gt; moving to the next macrotask.&lt;/li&gt;
&lt;li&gt;Examples: Promise &lt;code&gt;.then&lt;/code&gt;, &lt;code&gt;queueMicrotask&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Macrotasks&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scheduled for execution in the main event loop cycle.&lt;/li&gt;
&lt;li&gt;Examples: &lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;setInterval&lt;/code&gt;, network events.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Macrotask&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Microtask&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// Output:&lt;/span&gt;
&lt;span class="c1"&gt;// Microtask&lt;/span&gt;
&lt;span class="c1"&gt;// Macrotask&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Synchronous vs Asynchronous Execution
&lt;/h2&gt;

&lt;p&gt;JavaScript can run code in two different ways: &lt;strong&gt;synchronously&lt;/strong&gt; (blocking) and &lt;strong&gt;asynchronously&lt;/strong&gt; (non-blocking).&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Synchronous Execution (Blocking)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Synchronous code runs line-by-line, top-to-bottom.&lt;/p&gt;

&lt;p&gt;The call stack must be fully cleared before any queued tasks can run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;C&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Output: A, B, C&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Under the Hood:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Push global execution context onto stack.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;console.log('A')&lt;/code&gt; → push, execute, pop.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;console.log('B')&lt;/code&gt; → push, execute, pop.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;console.log('C')&lt;/code&gt; → push, execute, pop.&lt;/li&gt;
&lt;li&gt;Stack empty → event loop checks queues.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Blocking Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Start&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;e9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="c1"&gt;// Heavy computation&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;End&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The loop keeps the call stack busy until it finishes, blocking everything else — including UI updates.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Asynchronous Execution (Non-Blocking)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Asynchronous execution allows JavaScript to handle long-running operations without pausing the rest of the program.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Under the Hood — &lt;code&gt;setTimeout&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;C&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Logs&lt;/span&gt; &lt;span class="s2"&gt;`A`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Calls&lt;/span&gt; &lt;span class="s2"&gt;`setTimeout`&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Hands&lt;/span&gt; &lt;span class="nx"&gt;timer&lt;/span&gt; &lt;span class="nx"&gt;setup&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;runtime&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="nx"&gt;Timer&lt;/span&gt; &lt;span class="nx"&gt;API&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Timer&lt;/span&gt; &lt;span class="nx"&gt;runs&lt;/span&gt; &lt;span class="nx"&gt;outside&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Logs&lt;/span&gt; &lt;span class="s2"&gt;`C`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Stack&lt;/span&gt; &lt;span class="nx"&gt;empty&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="nf"&gt;microtasks &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;none&lt;/span&gt; &lt;span class="nx"&gt;here&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="nf"&gt;macrotask &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`B`&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Under the Hood — &lt;code&gt;async/await&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;example&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;example&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Logs&lt;/span&gt; &lt;span class="s2"&gt;`A`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Calls&lt;/span&gt; &lt;span class="s2"&gt;`example()`&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;logs&lt;/span&gt; &lt;span class="s2"&gt;`1`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;`await Promise.resolve()`&lt;/span&gt; &lt;span class="nx"&gt;schedules&lt;/span&gt; &lt;span class="nx"&gt;continuation&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;microtask&lt;/span&gt; &lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Logs&lt;/span&gt; &lt;span class="s2"&gt;`B`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Stack&lt;/span&gt; &lt;span class="nx"&gt;empty&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="nx"&gt;microtask&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;logs&lt;/span&gt; &lt;span class="s2"&gt;`2`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. When to Use &lt;code&gt;queueMicrotask&lt;/code&gt; vs &lt;code&gt;setTimeout&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;As I mentioned before,JavaScript schedules asynchronous work in two main ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Microtasks&lt;/strong&gt; — run right after the current task, before rendering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Macrotasks&lt;/strong&gt; — run after microtasks and potentially after the browser has rendered.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;queueMicrotask&lt;/code&gt; adds work to the &lt;strong&gt;microtask queue&lt;/strong&gt; (runs sooner),&lt;/p&gt;

&lt;p&gt;while &lt;code&gt;setTimeout&lt;/code&gt; schedules work in the &lt;strong&gt;macrotask queue&lt;/strong&gt; (runs later).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In short:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;queueMicrotask&lt;/code&gt;&lt;/strong&gt; → great for immediate follow-up logic without blocking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;setTimeout&lt;/code&gt;&lt;/strong&gt; → best for letting the browser update the UI or breaking up heavy tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: Execution Order&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Synchronous&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;queueMicrotask&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;queueMicrotask&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;setTimeout&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;setTimeout&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Synchronous&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Synchronous&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Synchronous&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;queueMicrotask&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;setTimeout&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;queueMicrotask&lt;/code&gt; runs after the current synchronous code, before any &lt;code&gt;setTimeout&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;setTimeout&lt;/code&gt; waits until the next macrotask phase, after all microtasks finish.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Avoiding Long-Running Synchronous Operations
&lt;/h2&gt;

&lt;p&gt;Long-running synchronous operations are one of the biggest performance killers in JavaScript applications. Since JavaScript is single-threaded, any operation that monopolizes the call stack will freeze your entire application.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why Long-Running Operations Are Problematic&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When a synchronous operation runs for too long:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UI becomes unresponsive&lt;/strong&gt; - buttons don’t click, scrolling freezes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animations stutter&lt;/strong&gt; - CSS animations and transitions halt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event handlers can’t fire&lt;/strong&gt; - user input is ignored&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timers are delayed&lt;/strong&gt; - &lt;code&gt;setTimeout&lt;/code&gt; callbacks can’t execute&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network responses queue up&lt;/strong&gt; - fetch/XHR callbacks are blocked&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Identifying Blocking Operations&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Common culprits include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ BAD: Processing large arrays synchronouslyfunction processHugeArray(items) {&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;expensiveOperation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="c1"&gt;// ❌ BAD: Complex calculationsfunction calculatePrimes(max) {&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;primes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;isPrime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;isPrime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isPrime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;primes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;primes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

  &lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Strategies to Avoid Blocking&lt;/strong&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Chunking with setTimeout&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Break work into smaller chunks, yielding control back to the event loop between chunks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ GOOD: Process array in chunks&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;processHugeArrayChunked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;chunkSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;chunkSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Get a slice of the array (one chunk)&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;chunkSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Process each item in the chunk&lt;/span&gt;
    &lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;expensiveOperation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="c1"&gt;// Yield control back to the event loop (prevents UI blocking)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;2. Using requestIdleCallback&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Schedule non-critical work when the browser is idle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ GOOD: Process array in chunks&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;processHugeArrayChunked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;chunkSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;chunkSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Extract a portion of the array&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;chunkSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Process each item in the chunk synchronously&lt;/span&gt;
    &lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;expensiveOperation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="c1"&gt;// Yield control back to the event loop to avoid blocking&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9. Browser vs Node.js Event Loop
&lt;/h2&gt;

&lt;p&gt;Browsers follow the &lt;a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-processing-model" rel="noopener noreferrer"&gt;WHATWG HTML event loop model&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Node.js uses event loop, which has multiple phases that affect callback order.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Rendering and Hydration
&lt;/h2&gt;

&lt;p&gt;Browsers render after microtasks are cleared at the end of a macrotask.&lt;/p&gt;

&lt;p&gt;Hydration in frameworks attaches JavaScript behavior to pre-rendered HTML — a framework concern, not part of the core event loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Q&amp;amp;A
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q1:&lt;/strong&gt; &lt;em&gt;What’s the difference between a task and a job?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In spec terms, a &lt;strong&gt;job&lt;/strong&gt; is any scheduled unit of work (microtask or macrotask).&lt;/li&gt;
&lt;li&gt;In browser docs, “task” usually means &lt;strong&gt;macrotask&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Q2:&lt;/strong&gt; &lt;em&gt;When is the UI rendered?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After the microtask queue is drained at the end of a macrotask.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Q3:&lt;/strong&gt; &lt;em&gt;Why does my Promise resolve before &lt;code&gt;setTimeout&lt;/code&gt; even with 0 ms delay?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Promise callbacks are &lt;strong&gt;microtasks&lt;/strong&gt;, and microtasks always run before any macrotask.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Q4:&lt;/strong&gt; &lt;em&gt;How can I prevent my application from freezing during heavy computations?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Break work into chunks using &lt;code&gt;setTimeout&lt;/code&gt;, use Web Workers for CPU-intensive tasks, or leverage &lt;code&gt;requestIdleCallback&lt;/code&gt; for non-critical work.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Execution_model" rel="noopener noreferrer"&gt;MDN: JavaScript Execution Model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide" rel="noopener noreferrer"&gt;MDN: Microtask Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/learn/asynchronous-work/event-loop-timers-and-nexttick" rel="noopener noreferrer"&gt;Node.js Event Loop Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://javascript.info/event-loop" rel="noopener noreferrer"&gt;JavaScript.info: Event Loop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-processing-model" rel="noopener noreferrer"&gt;WHATWG HTML Spec: Event Loop Processing Model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/queueMicrotask" rel="noopener noreferrer"&gt;MDN: queueMicrotask&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/setTimeout" rel="noopener noreferrer"&gt;MDN: setTimeout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback" rel="noopener noreferrer"&gt;MDN: requestIdleCallback&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>node</category>
      <category>frontend</category>
    </item>
    <item>
      <title>give me more useful SEO tips!!!</title>
      <dc:creator>kouta222</dc:creator>
      <pubDate>Thu, 14 Aug 2025 10:57:05 +0000</pubDate>
      <link>https://forem.com/kouta222/give-me-more-useful-seo-tips-3151</link>
      <guid>https://forem.com/kouta222/give-me-more-useful-seo-tips-3151</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/kouta222/seo-guide-for-software-developers-1ld6" class="crayons-story__hidden-navigation-link"&gt;SEO guide for Software Developers&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/kouta222" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1262140%2Fc5485daa-8232-47a1-b718-3b2107a1302d.jpeg" alt="kouta222 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/kouta222" class="crayons-story__secondary fw-medium m:hidden"&gt;
              kouta222
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                kouta222
                
              
              &lt;div id="story-author-preview-content-2762820" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/kouta222" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1262140%2Fc5485daa-8232-47a1-b718-3b2107a1302d.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;kouta222&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/kouta222/seo-guide-for-software-developers-1ld6" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 10 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/kouta222/seo-guide-for-software-developers-1ld6" id="article-link-2762820"&gt;
          SEO guide for Software Developers
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/seo"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;seo&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/google"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;google&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/kouta222/seo-guide-for-software-developers-1ld6" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;9&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/kouta222/seo-guide-for-software-developers-1ld6#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              21&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>seo</category>
      <category>google</category>
      <category>webdev</category>
    </item>
    <item>
      <title># OpenNext vs. Vercel: how to run Next.js anywhere (AWS, Cloudflare, Netlify) — and when to stick with Vercel</title>
      <dc:creator>kouta222</dc:creator>
      <pubDate>Wed, 13 Aug 2025 01:56:35 +0000</pubDate>
      <link>https://forem.com/kouta222/-opennext-vs-vercel-how-to-run-nextjs-anywhere-aws-cloudflare-netlify-and-when-to-stick-1kd3</link>
      <guid>https://forem.com/kouta222/-opennext-vs-vercel-how-to-run-nextjs-anywhere-aws-cloudflare-netlify-and-when-to-stick-1kd3</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://vercel.com/frameworks/nextjs" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt; is the "it just works" home for Next.js with zero-config deploys, Edge/Serverless runtimes, preview deployments, and first-class cache/revalidation features.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opennext.js.org/" rel="noopener noreferrer"&gt;OpenNext&lt;/a&gt; is an open-source adapter that repackages your Next.js build so you can deploy it on AWS, Cloudflare Workers, or Netlify with behavior close to Vercel's runtime — without vendor lock-in.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you want control, portability, or lower infra cost at scale, OpenNext is compelling. If you want speed, DX, and batteries-included features, Vercel remains the fastest path.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What OpenNext is (in one minute)
&lt;/h2&gt;

&lt;p&gt;OpenNext is a community project that consumes the output of &lt;code&gt;next build&lt;/code&gt; and converts it into deployable packages for multiple targets. Concretely, it splits your app into server handlers, image optimization, middleware, and caches, then emits artifacts your IaC (SST, CDK, Terraform) can wire up behind CloudFront, Lambda, Workers, etc.&lt;/p&gt;

&lt;p&gt;It's not a hosting platform; it's a build adapter + runtime glue. The docs highlight wide production use and a goal of supporting "all Next.js features."&lt;/p&gt;

&lt;h2&gt;
  
  
  Where OpenNext runs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS&lt;/strong&gt; (Lambda/Lambda@Edge, CloudFront, S3). Maintained with help from the SST community.&lt;br&gt;
check here: &lt;a href="https://opennext.js.org/aws" rel="noopener noreferrer"&gt;https://opennext.js.org/aws&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cloudflare Workers&lt;/strong&gt; via a Node-compatible Worker bundle (different from Cloudflare's edge-only adapter).&lt;br&gt;
check here: &lt;a href="https://opennext.js.org/cloudflare" rel="noopener noreferrer"&gt;https://opennext.js.org/cloudflare&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Netlify&lt;/strong&gt; through the Netlify Next.js runtime that moved into the OpenNext org.&lt;br&gt;
check here: &lt;a href="https://opennext.js.org/netlify" rel="noopener noreferrer"&gt;https://opennext.js.org/netlify&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How OpenNext works on AWS (architecture tour)
&lt;/h2&gt;

&lt;p&gt;OpenNext's AWS docs describe the &lt;a href="https://opennext.js.org/aws/inner_workings/architecture" rel="noopener noreferrer"&gt;default architecture&lt;/a&gt; and the folders it generates under &lt;code&gt;.open-next/&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Assets&lt;/strong&gt;: hashed (&lt;code&gt;_next/**&lt;/code&gt;) vs. unhashed (&lt;code&gt;public/**&lt;/code&gt;) with recommended cache headers. Serve directly via CDN.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server Lambda&lt;/strong&gt;: wraps Next's &lt;code&gt;NextServer&lt;/code&gt; (standalone build) for SSR, ISR, SSG, and API routes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image optimization backend&lt;/strong&gt;: ships with &lt;code&gt;sharp&lt;/code&gt;, compiled for the target arch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revalidation backend&lt;/strong&gt;: consumes a FIFO queue to perform on-demand revalidation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://opennext.js.org/aws/v2/inner_workings/warming" rel="noopener noreferrer"&gt;Warmer backend&lt;/a&gt;&lt;/strong&gt; (optional): invokes your server function periodically to reduce cold-starts; costs are small and can be pre-warmed on deploy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpenNext does not create infrastructure; you wire these pieces up using SST/CDK/etc. The docs even compare OpenNext, Vercel, Amplify, and Docker across features like function splitting, ISR, and on-demand revalidation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start on AWS with SST (serverless path)
&lt;/h2&gt;

&lt;p&gt;SST's "Next.js on AWS" guide shows a Serverless (OpenNext) flow and a Containers (ECS/Fargate) flow. For the serverless option, you initialize SST in your Next app, add AWS resources (like an S3 bucket), link them to the &lt;code&gt;Nextjs&lt;/code&gt; component, and &lt;code&gt;sst deploy&lt;/code&gt;. &lt;a href="https://sst.dev/docs/start/aws/nextjs" rel="noopener noreferrer"&gt;sst.dev&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How OpenNext works on Cloudflare
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;@opennextjs/cloudflare&lt;/code&gt; adapter builds your app and transforms the output to run inside the Cloudflare Workers runtime with Node.js compatibility. It supports Next.js 15 minors and the latest 14 minor, and a broad set of features (App Router, SSR, ISR, PPR, Middleware, &lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt; via Cloudflare Images, etc.).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scaffold a new project&lt;/strong&gt; (pre-configured for Workers):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  npm create cloudflare@latest &lt;span class="nt"&gt;--&lt;/span&gt; my-next-app &lt;span class="nt"&gt;--framework&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;next &lt;span class="nt"&gt;--platform&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;workers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://opennext.js.org/cloudflare" rel="noopener noreferrer"&gt;opennext.js.org&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cloudflare's own guide points to the OpenNext adapter for Workers deployments.&lt;br&gt;
&lt;a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/nextjs/" rel="noopener noreferrer"&gt;Cloudflare Docs&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Heads-up&lt;/strong&gt;: Worker bundle size is 3 MiB (free) or 10 MiB (paid) compressed; OpenNext docs call this out and show Wrangler's size reporting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use Wrangler v3.99.0+ for the current adapter.&lt;br&gt;
&lt;a href="https://opennext.js.org/cloudflare/get-started?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;opennext.js.org&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  And where Vercel fits
&lt;/h2&gt;

&lt;p&gt;Vercel is the first-class home for Next.js: zero-config deploys, CI-connected preview URLs, and native support for Serverless/Edge Functions and the Next.js Data Cache with on-demand/tag-based revalidation (propagates globally in ~300 ms).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Edge Functions&lt;/strong&gt;: set &lt;code&gt;runtime: 'edge'&lt;/code&gt; or default the app to Edge; ideal for latency-sensitive work at the network edge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ISR&lt;/strong&gt;: straightforward with &lt;code&gt;export const revalidate = ...&lt;/code&gt; (App Router) or &lt;code&gt;fetch(..., { next: { revalidate }})&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to choose which
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Choose Vercel if you want:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The fastest path to reliable production deploys with minimal ops.&lt;/li&gt;
&lt;li&gt;Platform features (Data Cache, fast global revalidation, preview deployments) tightly integrated with Next.js.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choose OpenNext if you want:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Portability (multi-cloud or need to run on AWS/Cloudflare/Netlify).&lt;/li&gt;
&lt;li&gt;Infra control &amp;amp; cost tuning (e.g., mix ECS + Lambda; bring your own cache/CDN layers).&lt;/li&gt;
&lt;li&gt;Deeper integration with your stack (VPCs, private services, custom middleware outside the Next process).&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>typescript</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Understanding Spring Framework: Core Philosophy, IoC/DI, and AOP</title>
      <dc:creator>kouta222</dc:creator>
      <pubDate>Tue, 12 Aug 2025 07:18:00 +0000</pubDate>
      <link>https://forem.com/kouta222/understanding-spring-framework-core-philosophy-iocdi-and-aop-56fp</link>
      <guid>https://forem.com/kouta222/understanding-spring-framework-core-philosophy-iocdi-and-aop-56fp</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The Spring Framework has transformed Java enterprise development with its lightweight, non-invasive design. It emphasizes simplicity, testability, and maintainability through Inversion of Control (IoC), Dependency Injection (DI), and Aspect-Oriented Programming (AOP). This article keeps your original volume, adds precise corrections, and expands explanations so a motivated beginner-to-intermediate reader can build accurate intuition and avoid common traps in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Philosophy
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Lightweight &amp;amp; Non-Invasive&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Write POJOs that don't extend framework base classes. Spring integrates via metadata (annotations/config), not inheritance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separation of Concerns&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Distinguish domain logic (services), infrastructure (repositories, messaging), and cross‑cutting concerns (transactions, security, caching via AOP).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Convention over Configuration&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Spring Boot supplies sane defaults and auto-configuration; you override only what you need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testability First&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
DI allows swapping fakes/mocks, minimizing static/global state and making unit/integration tests straightforward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mental model:&lt;/strong&gt; The container orchestrates object graphs and lifecycle; your code expresses intent (interfaces, annotations, configs).&lt;/p&gt;

&lt;h2&gt;
  
  
  IoC &amp;amp; Dependency Injection — What It Is and Isn't
&lt;/h2&gt;

&lt;p&gt;IoC means the container owns creation, wiring, and lifecycle. You declare what you need; the container decides when/how to provide it.&lt;/p&gt;

&lt;h3&gt;
  
  
  It is:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Constructor/setter/field injection performed by the container&lt;/li&gt;
&lt;li&gt;Externalized configuration and lifecycle callbacks&lt;/li&gt;
&lt;li&gt;Event-driven control flow (framework calls you)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  It is not:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Service Locator patterns that call back into the container everywhere&lt;/li&gt;
&lt;li&gt;Heavy factories sprinkled across your code&lt;/li&gt;
&lt;li&gt;Static singletons and manual wiring&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the Container Actually Does
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Bean definition loading (from annotations, @Configuration, XML)&lt;/li&gt;
&lt;li&gt;Dependency resolution (by type → qualifiers → names → &lt;a class="mentioned-user" href="https://dev.to/primary"&gt;@primary&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Instantiation (constructors/factory methods/FactoryBean)&lt;/li&gt;
&lt;li&gt;Decoration (apply BeanPostProcessors, create AOP proxies if needed)&lt;/li&gt;
&lt;li&gt;Scope &amp;amp; lifecycle (singleton/prototype/web scopes; destruction callbacks)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Deep Dive: Container Startup (Step‑by‑Step)
&lt;/h2&gt;

&lt;p&gt;Before we break down the sequence, remember that the ApplicationContext is more than just a bean factory. It's the supervisor of your workshop — managing blueprints, coordinating schedules, enforcing safety rules, and making sure every tool (bean) is ready to work together.&lt;/p&gt;

&lt;p&gt;It extends the simpler BeanFactory (which only handles the core DI mechanics) and layers on practical capabilities: a configuration model that understands @Configuration, &lt;a class="mentioned-user" href="https://dev.to/bean"&gt;@bean&lt;/a&gt;, component scanning, XML, and imports; lifecycle orchestration via the refresh() workflow; environment and profile management for property sources and &lt;a class="mentioned-user" href="https://dev.to/profile"&gt;@profile&lt;/a&gt; filtering; an event bus (ApplicationEventPublisher) for publish/subscribe; internationalization through MessageSource; resource loading from the classpath, URLs, or the filesystem; type conversion and validation through a ConversionService; integration with AOP and autowiring hooks via BeanPostProcessors; and the ability to form parent/child contexts for modular composition.&lt;/p&gt;

&lt;p&gt;When your application starts, Spring takes the ApplicationContext through a well-defined refresh lifecycle. Let's walk through it as if we're setting up a brand-new workshop from scratch.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Create context instance
&lt;/h3&gt;

&lt;p&gt;Spring builds the "box" that will hold all your beans.&lt;/p&gt;

&lt;p&gt;When you start your app (&lt;code&gt;SpringApplication.run(...)&lt;/code&gt; or create an ApplicationContext manually), Spring first creates the container object — the thing responsible for managing all your beans.&lt;/p&gt;

&lt;p&gt;Think of it like opening an empty toolbox that's about to be filled with tools (your beans).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Load configuration
&lt;/h3&gt;

&lt;p&gt;Find out what beans should exist.&lt;/p&gt;

&lt;p&gt;Spring now reads your app's configuration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Property sources&lt;/strong&gt; — &lt;code&gt;.properties&lt;/code&gt; or &lt;code&gt;.yml&lt;/code&gt; files, environment variables, system properties.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@Configuration classes&lt;/strong&gt; — special classes with &lt;a class="mentioned-user" href="https://dev.to/bean"&gt;@bean&lt;/a&gt; methods.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Component scanning&lt;/strong&gt; — looks through packages for @Component, @Service, @Controller, etc., and makes "bean blueprints" for them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this stage, no beans are created yet — Spring is just making a shopping list of what to build later.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Register infrastructure post-processors
&lt;/h3&gt;

&lt;p&gt;Add special helpers that know how to handle Spring's own features.&lt;/p&gt;

&lt;p&gt;Some beans aren't your beans — they're Spring's own support beans.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ConfigurationClassPostProcessor&lt;/code&gt; — understands @Configuration and &lt;a class="mentioned-user" href="https://dev.to/bean"&gt;@bean&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Others handle @Enable... annotations, validation, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can think of these as setup crew members who prepare the rules before any actual objects are made.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Invoke processors that adjust bean definitions
&lt;/h3&gt;

&lt;p&gt;Change the blueprints before building anything.&lt;/p&gt;

&lt;p&gt;Spring calls BeanFactoryPostProcessors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;These can add, remove, or modify bean definitions.&lt;/li&gt;
&lt;li&gt;Example: PropertySourcesPlaceholderConfigurer replaces &lt;code&gt;${my.value}&lt;/code&gt; with the actual number from your properties file.&lt;/li&gt;
&lt;li&gt;Also where &lt;a class="mentioned-user" href="https://dev.to/profile"&gt;@profile&lt;/a&gt; filtering happens — beans not matching the active profile are removed before they're built.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Analogy: before construction starts, the architect might update the blueprints with the latest measurements.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Register instance-level processors
&lt;/h3&gt;

&lt;p&gt;Hook into beans after they're built but before you use them.&lt;/p&gt;

&lt;p&gt;These are BeanPostProcessors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do autowiring (@Autowired, @Value).&lt;/li&gt;
&lt;li&gt;Call lifecycle annotations (@PostConstruct).&lt;/li&gt;
&lt;li&gt;Create AOP proxies (wrapping beans in decorators for transactions, logging, etc.).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of these as quality inspectors — every finished bean passes through them before entering the container.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Instantiate non-lazy singletons
&lt;/h3&gt;

&lt;p&gt;Build the actual objects, in the right order.&lt;/p&gt;

&lt;p&gt;Spring now builds all non-lazy singleton beans:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It looks at dependencies to know who to create first.&lt;/li&gt;
&lt;li&gt;@DependsOn can force certain beans to be created before others.&lt;/li&gt;
&lt;li&gt;If there's a circular dependency (Bean A needs Bean B and vice versa), Spring uses an internal trick (early references) to handle it for singletons.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the factory floor — beans go from blueprints to real objects here.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Initialization &amp;amp; proxying
&lt;/h3&gt;

&lt;p&gt;Final touches before the beans are "ready for action."&lt;/p&gt;

&lt;p&gt;For each bean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;postProcessBeforeInitialization&lt;/strong&gt; — BeanPostProcessors can tweak it before init.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Init methods&lt;/strong&gt; — your @PostConstruct or InitializingBean.afterPropertiesSet().&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;postProcessAfterInitialization&lt;/strong&gt; — last chance for wrapping/proxying (AOP).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: AnnotationAwareAspectJAutoProxyCreator might wrap your service in a proxy that handles @Transactional.&lt;/p&gt;

&lt;p&gt;This is like polishing and adding safety features before putting the tool into the toolbox.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Ready: context is refresh-complete
&lt;/h3&gt;

&lt;p&gt;The app is now "live."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring publishes events like ContextRefreshedEvent.&lt;/li&gt;
&lt;li&gt;Beans that implement ApplicationListener can react.&lt;/li&gt;
&lt;li&gt;Beans implementing SmartLifecycle can start background jobs.&lt;/li&gt;
&lt;li&gt;In Spring Boot, CommandLineRunner and ApplicationRunner beans run here.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your toolbox is full, organized, and ready for you to start working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ordering semantics:&lt;/strong&gt; PriorityOrdered/Ordered affect the order of post-processors and certain callback beans, not the order regular application beans are created.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiring Rules That Bite in Practice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Constructor injection is preferred (immutability, fail-fast for missing deps).&lt;/li&gt;
&lt;li&gt;If multiple beans of the same type exist:

&lt;ul&gt;
&lt;li&gt;Use &lt;a class="mentioned-user" href="https://dev.to/primary"&gt;@primary&lt;/a&gt; to pick a default.&lt;/li&gt;
&lt;li&gt;Use @Qualifier at the injection point for explicit choice.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Collections (e.g., &lt;code&gt;List&amp;lt;Foo&amp;gt;&lt;/code&gt;) are ordered using @Order/Ordered for the injected collection only.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Scopes (and Scoped Proxies) with Realistic Patterns
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Singleton (default):&lt;/strong&gt; one instance per container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prototype:&lt;/strong&gt; a new instance per lookup. Injecting a prototype into a singleton gives you one snapshot at injection time. For true per‑use behavior, inject &lt;code&gt;ObjectProvider&amp;lt;PrototypeType&amp;gt;&lt;/code&gt; and call &lt;code&gt;getObject()&lt;/code&gt; when needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web scopes:&lt;/strong&gt; @RequestScope, @SessionScope.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AOP Essentials — What Proxies Can and Can't Do
&lt;/h2&gt;

&lt;p&gt;Spring AOP applies advice via proxies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JDK dynamic proxies if the target implements at least one interface.&lt;/li&gt;
&lt;li&gt;CGLIB class-based proxies otherwise. You can force class proxies with &lt;code&gt;spring.aop.proxy-target-class=true&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Limitations to remember:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Only public methods are reliably proxied by default in proxy-based AOP.&lt;/li&gt;
&lt;li&gt;Calls made within the same class (self-invocation) bypass the proxy; advice won't run.&lt;/li&gt;
&lt;li&gt;final/private methods cannot be advised with proxy-based AOP.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Self-invocation solutions:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Extract the advised method to another bean and inject it.&lt;/li&gt;
&lt;li&gt;Self-inject the proxied bean (works, but be explicit why).&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;AopContext.currentProxy()&lt;/code&gt; with &lt;code&gt;@EnableAspectJAutoProxy(exposeProxy = true)&lt;/code&gt; as an advanced option.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Transactions — Practical Fundamentals
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Annotate public methods on Spring-managed beans with @Transactional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read-only:&lt;/strong&gt; &lt;code&gt;@Transactional(readOnly = true)&lt;/code&gt; hints for optimizations; it does not block writes by itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transaction manager:&lt;/strong&gt; provided by data starters in Boot; otherwise register one and (if multiple) select with qualifiers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Placement:&lt;/strong&gt; Avoid annotating private/final methods; ensure external calls go through the proxy boundary.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Caching — Keys, Eviction, and Pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Enable with @EnableCaching.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;@Cacheable(cacheNames = "products", key = "#id")&lt;/code&gt;, @CacheEvict, @CachePut.&lt;/li&gt;
&lt;li&gt;Key evaluation uses SpEL; make keys explicit to avoid surprises.&lt;/li&gt;
&lt;li&gt;Backing store decides TTL/size (e.g., Caffeine, Redis). Configure at the cache manager level.&lt;/li&gt;
&lt;li&gt;Same self-invocation caveat: cache advice won't apply to internal calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Retry — Transient Fault Handling
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Add Spring Retry dependency and @EnableRetry.&lt;/li&gt;
&lt;li&gt;Annotate with &lt;code&gt;@Retryable(value = IOException.class, maxAttempts = 3, backoff = @Backoff(delay = 1000, multiplier = 2.0))&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Provide a @Recover method with a matching signature for fallback after retries.&lt;/li&gt;
&lt;li&gt;Be mindful of idempotency; don't blindly retry non-idempotent operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Method-Level Security — Expressions in Practice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Enable with @EnableMethodSecurity.&lt;/li&gt;
&lt;li&gt;Use @PreAuthorize/@PostAuthorize with SpEL (e.g., &lt;code&gt;@PreAuthorize("hasRole('ADMIN')")&lt;/code&gt;, or &lt;code&gt;hasPermission(#id, 'User', 'READ')&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Security advice is AOP: same proxy limitations apply. Keep methods public, and don't expect internal calls to be secured unless going through the proxy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conditional &amp;amp; Profile-Driven Configuration
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Content appears to be incomplete in the original document&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lifecycle &amp;amp; Shutdown — Beyond @PostConstruct
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Awareness interfaces (BeanNameAware, BeanFactoryAware, etc.) can provide context but use sparingly.&lt;/li&gt;
&lt;li&gt;SmartLifecycle supports phased startup/shutdown; useful for coordinating resources (messaging consumers, schedulers).&lt;/li&gt;
&lt;li&gt;Application events (ContextRefreshedEvent, ContextClosedEvent) let you hook into startup/shutdown safely.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tightening Corrections (Why They Matter)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;@Order vs creation order:&lt;/strong&gt; Prevents incorrect assumptions; @Order affects injection order for collections and certain callbacks, not bean creation timing. Use @DependsOn or proper dependency wiring to control creation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@Service on interfaces:&lt;/strong&gt; Avoids "bean not found" at runtime. Component scanning registers concrete classes, not plain interfaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interface-only proxies:&lt;/strong&gt; The Proxy.newProxyInstance example works only when the bean type is an interface. For concrete classes, rely on CGLIB or Spring AOP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature toggles:&lt;/strong&gt; Annotations like @Cacheable, @Retryable, @PreAuthorize, and @Transactional often require enabling annotations (e.g., @EnableCaching). Without them, the annotations silently do nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request-scoped controllers:&lt;/strong&gt; These are atypical; controllers should usually be singletons. Inject request-scoped collaborators via proxies instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FactoryBean:&lt;/strong&gt; Fine for demonstrations, but in production prefer a pooled DataSource and obtain a Connection per operation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boot-specific conditions:&lt;/strong&gt; @ConditionalOnProperty and similar annotations live in Spring Boot and assume Boot's auto-configuration machinery is present on the classpath.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Minimal, Correct Code Snippets
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Enabling Features (Spring Boot)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@SpringBootApplication&lt;/span&gt;
&lt;span class="nd"&gt;@EnableCaching&lt;/span&gt;
&lt;span class="nd"&gt;@EnableRetry&lt;/span&gt;
&lt;span class="nd"&gt;@EnableMethodSecurity&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;SpringApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Application&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; This configures a Spring Boot application with caching, retry logic, and method-level security enabled. In non-Boot apps, add @EnableTransactionManagement to enable @Transactional support.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bean Creation Order
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Configuration&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderedConfig&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Bean&lt;/span&gt;
    &lt;span class="nd"&gt;@DependsOn&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt;&lt;span class="s"&gt;"dataSource"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"transactionManager"&lt;/span&gt;&lt;span class="o"&gt;})&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ApplicationService&lt;/span&gt; &lt;span class="nf"&gt;applicationService&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ApplicationService&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Bean&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;DataSource&lt;/span&gt; &lt;span class="nf"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DataSource&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Bean&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;TransactionManager&lt;/span&gt; &lt;span class="nf"&gt;transactionManager&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;TransactionManager&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; This setup ensures ApplicationService is only created after both dataSource and transactionManager beans are available. Note that @Order on bean methods does not affect creation timing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Self-invocation (One of the Safe Patterns)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@EnableAspectJAutoProxy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exposeProxy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Transactional&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;updateUser&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Business logic for updating a user&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;doSomething&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nc"&gt;UserService&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;AopContext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentProxy&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;updateUser&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Demonstrates handling the self-invocation problem. By exposing the proxy, internal method calls still pass through transactional advice. A more maintainable alternative is to move updateUser into another bean.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing With the Container in Mind
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full context:&lt;/strong&gt; @SpringBootTest for end-to-end wiring and AOP/transactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mocking collaborators:&lt;/strong&gt; @MockBean to replace a bean in the context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Profile-specific tests:&lt;/strong&gt; use @ActiveProfiles("test") with test configurations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By grounding your understanding in how the container really starts, wires, and decorates beans-and by recognizing proxy limitations and feature-enabling requirements-you can translate Spring's philosophy into production-grade code. Keep aspects focused, dependencies explicit, and configuration type-safe. With these patterns, your original structure (philosophy → IoC/DI → container → lifecycle → AOP → real patterns) becomes a reliable mental map you can reuse across services.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://docs.spring.io/spring-framework/reference/core/beans/introduction.html" rel="noopener noreferrer"&gt;Spring Framework Reference Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.docswell.com/s/MasatoshiTada/K1XMLK-advanced-spring-for-professionals" rel="noopener noreferrer"&gt;Advanced Spring for Professionals — Masatoshi Tada&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.baeldung.com/inversion-control-and-dependency-injection-in-spring" rel="noopener noreferrer"&gt;Inversion of Control | Baeldung&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>spring</category>
      <category>springboot</category>
      <category>java</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>SEO guide for Software Developers</title>
      <dc:creator>kouta222</dc:creator>
      <pubDate>Sun, 10 Aug 2025 09:25:30 +0000</pubDate>
      <link>https://forem.com/kouta222/seo-guide-for-software-developers-1ld6</link>
      <guid>https://forem.com/kouta222/seo-guide-for-software-developers-1ld6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"When I was assigned to the SEO project, I thought: ‘I build features, I fix bugs — why do I need to deal with Google rankings?’&lt;/em&gt;  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;But as I dug deeper into SEO, I began to realize its power — the ability to bring in highly targeted users, improve product visibility, and turn a well-built site into a constant source of organic traffic."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That realization inspired me to put together a &lt;strong&gt;brief SEO guide for developers&lt;/strong&gt; — not full of marketing jargon, but focused on the technical aspects we can directly control.&lt;br&gt;&lt;br&gt;
If you’ve ever wondered how your code can influence search rankings, this guide is for you.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. Push vs. Pull Marketing — Where SEO Fits
&lt;/h2&gt;

&lt;p&gt;Before we talk about Google, we need to understand how SEO fits into the bigger marketing picture.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Push marketing&lt;/strong&gt; – You reach out to the audience first (ads, emails, banners).&lt;br&gt;&lt;br&gt;
Users are &lt;em&gt;passive&lt;/em&gt; and may have &lt;strong&gt;low interest&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Think: unsolicited API calls — you're sending data without a request.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pull marketing&lt;/strong&gt; – Users come to you because they're searching for something.&lt;br&gt;&lt;br&gt;
Users are &lt;em&gt;active&lt;/em&gt; and have &lt;strong&gt;high intent&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Think: an API request — they're asking for exactly what they want.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;SEO is pull marketing&lt;/strong&gt; — you make your site discoverable for people actively searching for answers or products.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. How Google Search Works
&lt;/h2&gt;

&lt;p&gt;This process has 3 steps.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1 — Crawling
&lt;/h3&gt;

&lt;p&gt;Googlebot (a crawler) visits your site, following links and reading HTML.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Starts from a known set of URLs (seed list)&lt;/li&gt;
&lt;li&gt;Follows links on each page&lt;/li&gt;
&lt;li&gt;Respects &lt;code&gt;robots.txt&lt;/code&gt; rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What is &lt;code&gt;robots.txt&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;robots.txt&lt;/code&gt; is a plain text file placed at the root of your website (e.g., &lt;code&gt;https://example.com/robots.txt&lt;/code&gt;) that gives instructions to search engine crawlers about which pages or directories they are allowed or not allowed to visit.  &lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://developers.google.com/search/docs/crawling-indexing/overview-google-crawlers" rel="noopener noreferrer"&gt;Google Crawling Basics&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 2 — Indexing
&lt;/h3&gt;

&lt;p&gt;Once content is fetched, Google parses it into a structured format.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strips unnecessary markup&lt;/li&gt;
&lt;li&gt;Extracts text, images, structured data (JSON-LD, Microdata, RDFa)&lt;/li&gt;
&lt;li&gt;Stores in a giant index (like a search-optimized database)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://developers.google.com/search/docs/fundamentals/how-search-works#step-2--indexing" rel="noopener noreferrer"&gt;How Indexing Works&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 3 — Ranking
&lt;/h3&gt;

&lt;p&gt;When a user searches, Google's algorithms match the query to indexed pages, ranking them based on &lt;strong&gt;hundreds of signals&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Relevance to the search query&lt;/li&gt;
&lt;li&gt;Page quality (content depth, trustworthiness)&lt;/li&gt;
&lt;li&gt;User experience (speed, mobile-friendly)&lt;/li&gt;
&lt;li&gt;Authority (backlinks, brand reputation)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://developers.google.com/search/docs/appearance/ranking-systems-guide" rel="noopener noreferrer"&gt;Google Ranking Systems Guide&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  3. On-Page SEO — Things You Control in Code
&lt;/h2&gt;

&lt;p&gt;These are &lt;strong&gt;internal signals&lt;/strong&gt; Google uses to understand and evaluate your pages.&lt;/p&gt;
&lt;h3&gt;
  
  
  Metadata
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Title Tag&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;React Performance Optimization Tips | MyDevBlog&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Unique for every page&lt;/li&gt;
&lt;li&gt;≤60 chars (EN) or ≤31 chars (JP)&lt;/li&gt;
&lt;li&gt;Describes page content accurately&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Meta Description&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Learn React performance optimization tips for faster rendering and better UX."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Affects click-through rates, not direct rankings&lt;/li&gt;
&lt;li&gt;Include relevant keywords naturally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://developers.google.com/search/docs/appearance/title-link" rel="noopener noreferrer"&gt;Control Titles &amp;amp; Snippets&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Heading Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;React Performance Tips&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Use Memoization&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;React.memo()&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;One &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; per page&lt;/li&gt;
&lt;li&gt;Logical hierarchy&lt;/li&gt;
&lt;li&gt;Helps accessibility and SEO&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Internal Linking
&lt;/h3&gt;

&lt;p&gt;Links between related pages help Google discover and rank them&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/react-optimization"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Learn React Optimization"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;React Optimization&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Descriptive anchor text &amp;gt; "click here"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://developers.google.com/search/docs/crawling-indexing/links-crawlable" rel="noopener noreferrer"&gt;Internal Linking Guide&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance &amp;amp; Core Web Vitals
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Core Web Vitals Metrics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LCP&lt;/strong&gt; (Largest Contentful Paint) – ≤2.5s&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;INP&lt;/strong&gt; (Interaction to Next Paint) – ≤200ms (replaced FID in March 2024)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLS&lt;/strong&gt; (Cumulative Layout Shift) – ≤0.1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Measurement Tools:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lighthouse&lt;/li&gt;
&lt;li&gt;PageSpeed Insights&lt;/li&gt;
&lt;li&gt;Web Vitals JS library&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 &lt;strong&gt;Dev tip&lt;/strong&gt;: Use &lt;code&gt;next/image&lt;/code&gt;, &lt;code&gt;font-display: swap&lt;/code&gt;, and SSR/SSG to improve scores.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://web.dev/vitals/" rel="noopener noreferrer"&gt;Core Web Vitals Overview&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Mobile-First Indexing
&lt;/h3&gt;

&lt;p&gt;Google now uses the mobile version of your site for ranking and indexing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always design mobile-first&lt;/li&gt;
&lt;li&gt;Test with Mobile-Friendly Test&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Off-Page SEO — How Developers Can Influence It
&lt;/h2&gt;

&lt;p&gt;Off-page SEO measures your site's authority and trust based on external signals.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backlinks&lt;/strong&gt; – Links from other sites act like upvotes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Citations&lt;/strong&gt; – Brand mentions without links&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Developer-driven link building:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Publish high-quality API documentation&lt;/li&gt;
&lt;li&gt;Release open-source tools or libraries&lt;/li&gt;
&lt;li&gt;Create technical blog posts with code examples&lt;/li&gt;
&lt;li&gt;Build performance benchmarks or case studies&lt;/li&gt;
&lt;li&gt;Share demo apps that others embed or reference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you build genuinely useful resources, links come naturally.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://developers.google.com/search/docs/fundamentals/creating-helpful-content" rel="noopener noreferrer"&gt;Link Building Best Practices&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5. JavaScript SEO — CSR vs SSR
&lt;/h2&gt;

&lt;p&gt;JavaScript-heavy sites face unique SEO challenges.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CSR&lt;/strong&gt; (Client-Side Rendering): HTML is almost empty initially; content is rendered in the browser → can delay or block indexing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSR&lt;/strong&gt; (Server-Side Rendering): Full HTML is sent from the server → better for SEO&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSG&lt;/strong&gt; (Static Site Generation): HTML built at deploy time → fastest for crawlers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best practices:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use SSR/SSG for key landing pages&lt;/li&gt;
&lt;li&gt;Pre-render or use hybrid rendering for dynamic content&lt;/li&gt;
&lt;li&gt;Test rendered HTML with "View Page Source" and URL Inspection Tool&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Technical SEO — Under-the-Hood Adjustments
&lt;/h2&gt;

&lt;h3&gt;
  
  
  URL Strategy
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/react-performance-tips
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/blog?id&lt;span class="o"&gt;=&lt;/span&gt;123&amp;amp;cat&lt;span class="o"&gt;=&lt;/span&gt;perf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Lowercase, hyphen-separated words&lt;/li&gt;
&lt;li&gt;Include keywords&lt;/li&gt;
&lt;li&gt;One URL = one piece of content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use canonical tags for duplicates:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"canonical"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/react-performance-tips"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  robots.txt &amp;amp; Meta Robots
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Control crawling:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User-agent: *
Disallow: /private/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Control indexing:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"robots"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"noindex, nofollow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔗 &lt;a href="https://developers.google.com/search/docs/crawling-indexing/robots/intro" rel="noopener noreferrer"&gt;Robots.txt Rules&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Structured Data
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;JSON-LD format (Google's recommended):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"application/ld+json"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@context&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://schema.org&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Article&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;headline&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SEO for Developers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;author&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jane Doe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;datePublished&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2025-08-10&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rich snippets (stars, breadcrumbs)&lt;/li&gt;
&lt;li&gt;Better click-through rates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data" rel="noopener noreferrer"&gt;Intro to Structured Data&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Practical SEO Debugging Workflow (Developer Edition)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Check Crawlability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool&lt;/strong&gt;: Google Search Console → Coverage Report&lt;/li&gt;
&lt;li&gt;Verify no essential pages are blocked in robots.txt&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Fix Technical Errors
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool&lt;/strong&gt;: Screaming Frog SEO Spider&lt;/li&gt;
&lt;li&gt;Identify broken links, wrong status codes, missing metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Optimize Performance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool&lt;/strong&gt;: Lighthouse CLI&lt;/li&gt;
&lt;li&gt;Focus on LCP, INP, CLS&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Add Structured Data
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool&lt;/strong&gt;: Rich Results Test&lt;/li&gt;
&lt;li&gt;Validate JSON-LD implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Validate Mobile-First
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool&lt;/strong&gt;: Mobile-Friendly Test&lt;/li&gt;
&lt;li&gt;Ensure no content is hidden on mobile that exists on desktop&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Simulate Googlebot
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool&lt;/strong&gt;: &lt;code&gt;curl -A "Googlebot"&lt;/code&gt; or Chrome DevTools network throttling&lt;/li&gt;
&lt;li&gt;See how fast and complete initial HTML is&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Monitor &amp;amp; Iterate
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool&lt;/strong&gt;: Google Search Console → Performance&lt;/li&gt;
&lt;li&gt;Track queries, impressions, CTR, and rankings&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;its important to make your site :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discoverable&lt;/strong&gt; (crawlable, indexable)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understandable&lt;/strong&gt; (structured HTML, clear metadata)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Valuable&lt;/strong&gt; (solves the searcher's problem)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a developer, you have a huge advantage — you can build an SEO-friendly foundation from day one, while others are stuck patching technical debt later.&lt;/p&gt;

&lt;h1&gt;
  
  
  references
&lt;/h1&gt;

&lt;p&gt;Nishiyama, Y., &amp;amp; Kobayashi, M. (2018). 現場のプロから学ぶ SEO技術バイブル. Maruyama, H. (Ed.). Tankobon Softcover.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>google</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Understanding Null Safety in Kotlin: A Beginner's Guide</title>
      <dc:creator>kouta222</dc:creator>
      <pubDate>Wed, 06 Aug 2025 06:27:43 +0000</pubDate>
      <link>https://forem.com/kouta222/understanding-null-safety-in-kotlin-a-beginners-guide-cno</link>
      <guid>https://forem.com/kouta222/understanding-null-safety-in-kotlin-a-beginners-guide-cno</guid>
      <description>&lt;p&gt;If you're coming from Java or just starting to learn Kotlin (like me!), one of the most important concepts to understand is &lt;strong&gt;null safety&lt;/strong&gt;.This feature is one of Kotlin's biggest advantages and can save you from countless bugs and crashes in your applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's the Problem with Null?
&lt;/h2&gt;

&lt;p&gt;Before diving into Kotlin's solution, let's understand the problem. In Java, any reference type can potentially be &lt;code&gt;null&lt;/code&gt;, which often leads to the dreaded &lt;code&gt;NullPointerException&lt;/code&gt; (NPE) - one of the most common runtime errors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it" rel="noopener noreferrer"&gt;What is a NullPointerException, and how do I fix it?&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  How Java Handles Null (The Old Way)
&lt;/h3&gt;

&lt;p&gt;In Java, you constantly need to check for null values to avoid crashes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Java code - potential for NullPointerException&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// This might return null&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 💥 Crash if name is null!&lt;/span&gt;

&lt;span class="c1"&gt;// Safe Java code requires manual null checks&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Safe, but verbose&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Name is null!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem is that** Java's type system doesn't distinguish between variables that can be null and those that cannot**. Every reference could potentially be null, making your code defensive and verbose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kotlin's Solution: Explicit Null Safety
&lt;/h2&gt;

&lt;p&gt;Kotlin solves this problem by making nullability explicit in the type system. This means the compiler knows exactly which variables can be null and which cannot, catching potential null pointer errors at compile time rather than runtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nullable vs Non-Nullable Types
&lt;/h3&gt;

&lt;p&gt;In Kotlin, the type system distinguishes between two kinds of types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Non-nullable types&lt;/strong&gt;: Cannot hold &lt;code&gt;null&lt;/code&gt; values&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nullable types&lt;/strong&gt;: Can hold &lt;code&gt;null&lt;/code&gt; values (marked with &lt;code&gt;?&lt;/code&gt;)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Non-nullable type - cannot be null&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"John"&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;length&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;  &lt;span class="c1"&gt;// Safe - compiler guarantees name is not null&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Output: 4&lt;/span&gt;

&lt;span class="c1"&gt;// Nullable type - can be null&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;nullableName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;  &lt;span class="c1"&gt;// Notice the ? after String&lt;/span&gt;
&lt;span class="c1"&gt;// val length = nullableName.length  // ❌ Compilation error!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key difference is the &lt;code&gt;?&lt;/code&gt; symbol after the type name. &lt;code&gt;String?&lt;/code&gt; means "a String that can be null," while &lt;code&gt;String&lt;/code&gt; means "a String that cannot be null."&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with Nullable Types
&lt;/h2&gt;

&lt;p&gt;When you have nullable types, Kotlin provides several safe ways to work with them:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Traditional Null Check with &lt;code&gt;if&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Just like in Java, you can check for null explicitly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;nullableName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nullableName&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Inside this block, nullableName is automatically cast to non-null String&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Name length: ${nullableName.length}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Name is null!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Safe Call Operator (&lt;code&gt;?.&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;The safe call operator is one of Kotlin's most useful features:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;nullableName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Safe call - returns null if nullableName is null&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nullableName&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;

&lt;span class="c1"&gt;// You can chain safe calls&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;firstChar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Char&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nullableName&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;uppercase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Will print the length or null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Elvis Operator (&lt;code&gt;?:&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;The Elvis operator (named because it looks like Elvis's haircut) provides a default value when the left side is null:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;nullableName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// If nullableName is null, use "Unknown" instead&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;displayName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nullableName&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="s"&gt;"Unknown"&lt;/span&gt;

&lt;span class="c1"&gt;// You can also use it with safe calls&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;length&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nullableName&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Display name: $displayName"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Length: $length"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Not-Null Assertion (&lt;code&gt;!!&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Use with caution!&lt;/strong&gt; The not-null assertion operator converts a nullable type to non-null, but throws an exception if the value is actually null:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;nullableName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// This will throw KotlinNullPointerException if nullableName is null&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nullableName&lt;/span&gt;&lt;span class="o"&gt;!!&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;length&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;

&lt;span class="c1"&gt;// Only use !! when you're absolutely certain the value is not null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Using &lt;code&gt;let&lt;/code&gt; Function
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;let&lt;/code&gt; function is useful when you want to execute code only if a value is not null:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;nullableName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;nullableName&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;let&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;// This block only executes if nullableName is not null&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processing name: $name"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Length: ${name.length}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;// name is automatically cast to non-null String here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Safe Casts (&lt;code&gt;as?&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;When casting types, use safe casts to avoid ClassCastException:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Any&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello"&lt;/span&gt;

&lt;span class="c1"&gt;// Safe cast - returns null if cast fails&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;length&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="c1"&gt;// Unsafe cast (avoid in most cases)&lt;/span&gt;
&lt;span class="c1"&gt;// val str2: String = obj as String // Could throw ClassCastException&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Working with Collections
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Collections of Nullable Types
&lt;/h3&gt;

&lt;p&gt;When working with collections that might contain null elements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;listWithNulls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Filter out null values&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;nonNullList&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;listWithNulls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filterNotNull&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonNullList&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Output: [A, B, C]&lt;/span&gt;

&lt;span class="c1"&gt;// Process only non-null elements&lt;/span&gt;
&lt;span class="n"&gt;listWithNulls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;let&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processing: $it"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prefer non-nullable types&lt;/strong&gt;: Only use nullable types when you actually need them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use safe calls (&lt;code&gt;?.&lt;/code&gt;) over null checks&lt;/strong&gt;: They're more concise and readable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Combine safe calls with Elvis operator&lt;/strong&gt;: &lt;code&gt;value?.method() ?: defaultValue&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Avoid &lt;code&gt;!!&lt;/code&gt; operator&lt;/strong&gt;: Only use it when you're absolutely certain the value is not null.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;let&lt;/code&gt; for complex null handling&lt;/strong&gt;: It's great for executing multiple operations on non-null values.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Real-World Example
&lt;/h2&gt;

&lt;p&gt;Here's a practical example showing how you might handle user data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?)&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;processUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;?)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Handle potentially null user&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;let&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processing user: ${u.name}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;// Handle potentially null email&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;emailDisplay&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;let&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="s"&gt;"Email: $email"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="s"&gt;"No email provided"&lt;/span&gt;

        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emailDisplay&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;// Safe call with Elvis operator&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;emailLength&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Email length: $emailLength"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"No user to process"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Usage&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;user1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"john@example.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;user2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Jane"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;processUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;// Will process normally&lt;/span&gt;
&lt;span class="nf"&gt;processUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;// Will handle null email gracefully&lt;/span&gt;
&lt;span class="nf"&gt;processUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// Will print "No user to process"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Kotlin's null safety system might seem complex at first, but it's designed to prevent one of the most common sources of bugs in programming. The key points to remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;?&lt;/code&gt; to mark types that can be null&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;?.&lt;/code&gt; for safe method calls&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;?:&lt;/code&gt; to provide default values&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;let&lt;/code&gt; for complex null handling&lt;/li&gt;
&lt;li&gt;Avoid &lt;code&gt;!!&lt;/code&gt; unless absolutely necessary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By embracing these concepts, you'll write safer, more reliable Kotlin code that's less prone to runtime crashes. The compiler becomes your ally, catching potential null pointer errors before they can cause problems in production.&lt;/p&gt;

&lt;p&gt;References&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kotlinlang.org/docs/null-safety.html" rel="noopener noreferrer"&gt;Kotlin Official Documentation - Null Safety&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>java</category>
      <category>spring</category>
    </item>
    <item>
      <title>🔥 The Next Big Things in Frontend: Svelte, Astro, Qwik &amp; Solid (2025 Edition)</title>
      <dc:creator>kouta222</dc:creator>
      <pubDate>Wed, 30 Jul 2025 09:43:16 +0000</pubDate>
      <link>https://forem.com/kouta222/the-next-big-things-in-frontend-svelte-astro-qwik-solid-2025-edition-2fnf</link>
      <guid>https://forem.com/kouta222/the-next-big-things-in-frontend-svelte-astro-qwik-solid-2025-edition-2fnf</guid>
      <description>&lt;p&gt;React, Angular, and Vue have dominated the frontend space for over a decade. But the world of frontend development is evolving. In 2025, new frameworks are pushing boundaries by focusing on &lt;strong&gt;performance&lt;/strong&gt;, &lt;strong&gt;developer experience&lt;/strong&gt;, and &lt;strong&gt;innovative rendering techniques&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Svelte&lt;/strong&gt;, &lt;strong&gt;Astro&lt;/strong&gt;, &lt;strong&gt;Qwik&lt;/strong&gt;, and &lt;strong&gt;SolidJS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s explore how each framework works, what makes them unique, and how they handle a simple &lt;strong&gt;counter component&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  📊 Performance Benchmarks (2025)
&lt;/h2&gt;

&lt;p&gt;From the latest &lt;a href="https://krausest.github.io/js-framework-benchmark/2025/table_chrome_138.0.7204.50.html" rel="noopener noreferrer"&gt;JS Framework Benchmark&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Startup Time&lt;/th&gt;
&lt;th&gt;Bundle Size&lt;/th&gt;
&lt;th&gt;Memory Use&lt;/th&gt;
&lt;th&gt;Interactivity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qwik&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🥇 Instant&lt;/td&gt;
&lt;td&gt;🥇 ~1KB&lt;/td&gt;
&lt;td&gt;✅ Very Low&lt;/td&gt;
&lt;td&gt;✅ Resume-only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Svelte&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🥈 Fast&lt;/td&gt;
&lt;td&gt;✅ ~60–70% smaller&lt;/td&gt;
&lt;td&gt;✅ Low&lt;/td&gt;
&lt;td&gt;✅ Direct DOM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SolidJS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Very Fast&lt;/td&gt;
&lt;td&gt;✅ Compact&lt;/td&gt;
&lt;td&gt;✅ Very Low&lt;/td&gt;
&lt;td&gt;✅ Fine-grained reactivity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🥇 Static (SSG)&lt;/td&gt;
&lt;td&gt;✅ Minimal (0 JS by default)&lt;/td&gt;
&lt;td&gt;✅ Tiny&lt;/td&gt;
&lt;td&gt;⚠️ Client-partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;React&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ Moderate&lt;/td&gt;
&lt;td&gt;❌ Larger bundles (~40–100 KB+)&lt;/td&gt;
&lt;td&gt;⚠️ Higher&lt;/td&gt;
&lt;td&gt;✅ Full hydration on load&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;React is still the most widely used and well-supported, but it comes with heavier runtime and bundle costs compared to newer, specialized frameworks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Key Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Qwik&lt;/strong&gt; leads in startup time and JS payload size thanks to &lt;strong&gt;resumability&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Svelte&lt;/strong&gt; offers excellent bundle sizes and fast runtime performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SolidJS&lt;/strong&gt; balances React-like DX with superior reactivity and speed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Astro&lt;/strong&gt; dominates in static delivery but requires care with client-side interactivity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt; still performs well, but it lags in startup performance and bundle size&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🟠 Svelte
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://svelte.dev/" rel="noopener noreferrer"&gt;Svelte&lt;/a&gt; is different. Instead of running in the browser like React or Vue, it’s a &lt;strong&gt;compiler&lt;/strong&gt; that converts your components into minimal, optimized JavaScript &lt;strong&gt;at build time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This eliminates the need for a virtual DOM or large runtime libraries, resulting in faster performance and smaller bundles.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Highlights
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Compile-time magic&lt;/strong&gt;: No runtime framework overhead&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct DOM updates&lt;/strong&gt; = ultra-fast UI&lt;/li&gt;
&lt;li&gt;Simple syntax close to vanilla HTML/JS&lt;/li&gt;
&lt;li&gt;Bundles are often 60–70% smaller than React/Vue&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚙️ Counter Component in Svelte
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  let count = 0;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  Count: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔍 Code Explanation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;let count = 0;&lt;/code&gt; declares a reactive variable.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{count}&lt;/code&gt; automatically updates in the DOM when &lt;code&gt;count&lt;/code&gt; changes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;on:click&lt;/code&gt; attaches the event handler directly in HTML-like syntax.&lt;/li&gt;
&lt;li&gt;No need for hooks or re-renders—&lt;strong&gt;Svelte compiles it all to pure JS&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧪 When to Choose Svelte
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Performance-critical apps&lt;/li&gt;
&lt;li&gt;Projects where bundle size matters (e.g. low-bandwidth regions)&lt;/li&gt;
&lt;li&gt;Teams who prefer simplicity over convention&lt;/li&gt;
&lt;li&gt;Full-stack apps with SvelteKit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://svelte.dev/tutorial" rel="noopener noreferrer"&gt;Try Svelte Tutorial&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔵 Astro
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://astro.build/" rel="noopener noreferrer"&gt;Astro&lt;/a&gt; is built for &lt;strong&gt;content-rich websites&lt;/strong&gt; like blogs, portfolios, and marketing pages. Its secret? Astro ships &lt;strong&gt;zero JavaScript by default&lt;/strong&gt;—it generates static HTML and only adds interactivity when needed via its &lt;strong&gt;Islands Architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It also supports multiple UI frameworks (React, Vue, Svelte, Solid) in a single project.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Highlights
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Zero JavaScript by default = blazing fast loads&lt;/li&gt;
&lt;li&gt;Uses &lt;strong&gt;partial hydration&lt;/strong&gt; with &lt;code&gt;client:*&lt;/code&gt; directives&lt;/li&gt;
&lt;li&gt;Multi-framework component support&lt;/li&gt;
&lt;li&gt;Built-in routing and markdown rendering&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧼 Zero JavaScript: Why It Matters
&lt;/h2&gt;

&lt;p&gt;In the age of faster load times, mobile-first design, and global reach, minimizing JavaScript isn't just an optimization—it's a &lt;strong&gt;competitive advantage&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Modern frameworks like &lt;strong&gt;Astro&lt;/strong&gt;, &lt;strong&gt;Qwik&lt;/strong&gt;, and even &lt;strong&gt;Svelte&lt;/strong&gt; (to some degree) are shifting from the &lt;strong&gt;JavaScript-heavy SPA&lt;/strong&gt; model toward &lt;strong&gt;minimal JS delivery&lt;/strong&gt;, especially during the initial page load.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚫 The Problem with Traditional JS-Heavy Apps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Large JS bundles delay &lt;strong&gt;First Contentful Paint (FCP)&lt;/strong&gt; and &lt;strong&gt;Time to Interactive (TTI)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Mobile users on 3G/4G suffer from slow or broken experiences&lt;/li&gt;
&lt;li&gt;More JavaScript means more parsing, more memory, and more battery drain&lt;/li&gt;
&lt;li&gt;SEO bots may struggle with JS-rendered content&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚙️ Counter Component in Astro
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;
&lt;span class="c1"&gt;// Renders a static button, then hydrates interactivity on the client using inline script&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"counter"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Count: 0&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt; &lt;span class="na"&gt;is&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;inline&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    let count = 0;
    const button = document.getElementById("counter");
    button.addEventListener("click", () =&amp;gt; &lt;span class="si"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Count: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="si"&gt;}&lt;/span&gt;);
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔍 How It Works
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No external JavaScript or framework is used.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;is:inline&lt;/code&gt; attribute ensures the script is included directly in the page output.&lt;/li&gt;
&lt;li&gt;This runs entirely in the browser when the component is hydrated.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Usage Example
&lt;/h3&gt;

&lt;p&gt;You can use it inside any page like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Counter from '../components/Counter.astro';

&amp;lt;html&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Hello from Astro&amp;lt;/h1&amp;gt;
    &amp;lt;Counter client:load /&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When to use Astro
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Content-Driven website,app&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🟣 Qwik – Resumable Apps That Start in 1KB
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://qwik.dev/" rel="noopener noreferrer"&gt;Qwik&lt;/a&gt; introduces a radical concept: &lt;strong&gt;resumability&lt;/strong&gt;. Instead of hydrating the entire app on the client, Qwik sends serialized app state and resumes only the parts a user interacts with.&lt;/p&gt;

&lt;p&gt;This means Qwik apps are interactive &lt;strong&gt;almost instantly&lt;/strong&gt;, even at large scales.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Highlights
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No hydration phase—just &lt;strong&gt;resume&lt;/strong&gt; from server state&lt;/li&gt;
&lt;li&gt;Fine-grained lazy loading of components and logic&lt;/li&gt;
&lt;li&gt;Ships only ~1KB of JS to start&lt;/li&gt;
&lt;li&gt;Qwik City: built-in routing and SSR support&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚙️ Counter Component in Qwik
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;component$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useSignal&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@builder.io/qwik&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useSignal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      Count: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔍 Code Explanation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;useSignal(0)&lt;/code&gt; creates a reactive state variable.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;count.value&lt;/code&gt; gets/sets the value.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;onClick$&lt;/code&gt; adds a resumable event listener.&lt;/li&gt;
&lt;li&gt;Qwik &lt;strong&gt;defers all JS until it's needed&lt;/strong&gt;, making load times almost instant.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When to Choose Qwik
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Large-scale interactive apps that must load fast&lt;/li&gt;
&lt;li&gt;SSR-heavy or SEO-critical applications&lt;/li&gt;
&lt;li&gt;Forward-thinking teams ready to explore new paradigms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://qwik.dev/docs/concepts/think-qwik/" rel="noopener noreferrer"&gt;Qwik Concepts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://qwik.dev/docs/concepts/resumable/" rel="noopener noreferrer"&gt;Qwik Resumability Explained&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🟢 SolidJS – Reactivity Without the Virtual DOM
&lt;/h2&gt;

&lt;p&gt;SolidJS offers &lt;strong&gt;fine-grained reactivity&lt;/strong&gt; with a React-like syntax—without using a virtual DOM. It updates the DOM directly using a system based on &lt;strong&gt;signals&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The result: top-tier performance and a clean, composable architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Highlights
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Uses &lt;code&gt;createSignal()&lt;/code&gt; for state&lt;/li&gt;
&lt;li&gt;No virtual DOM—DOM updates are exact and scoped&lt;/li&gt;
&lt;li&gt;React-like JSX and mental model&lt;/li&gt;
&lt;li&gt;Great for highly interactive UIs&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  What Are Signals?
&lt;/h3&gt;

&lt;p&gt;In &lt;strong&gt;SolidJS&lt;/strong&gt;, a signal is a &lt;strong&gt;reactive variable&lt;/strong&gt;—a primitive that automatically tracks and reacts to changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSignal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;count()&lt;/code&gt; → to get the current value&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;setCount()&lt;/code&gt; → to update the value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you use &lt;code&gt;count()&lt;/code&gt; in your JSX or computations, Solid &lt;strong&gt;automatically tracks that dependency&lt;/strong&gt; and will re-run just the parts that depend on it when the value changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Benefits of Signals
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No full re-renders&lt;/strong&gt; – only update what changed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic dependency tracking&lt;/strong&gt; – no &lt;code&gt;useEffect&lt;/code&gt;, no boilerplate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficient updates&lt;/strong&gt; – no virtual DOM diffing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory-safe&lt;/strong&gt; – avoids unnecessary retention&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal overhead&lt;/strong&gt; – ultra-performant even at scale&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Think of it like reactive Excel cells: when one changes, only the affected formulas update.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ⚙️ Counter Component in Solid
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createSignal&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;solid-js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSignal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      Count: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔍 Code Explanation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;createSignal()&lt;/code&gt; returns a reactive getter and setter.&lt;/li&gt;
&lt;li&gt;Calling &lt;code&gt;setCount()&lt;/code&gt; updates the value and triggers updates.&lt;/li&gt;
&lt;li&gt;Only the &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; text updates—&lt;strong&gt;not the full component&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When to Choose SolidJS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want React-like DX with better performance&lt;/li&gt;
&lt;li&gt;Your app has heavy interactivity and needs precise updates&lt;/li&gt;
&lt;li&gt;You want low runtime cost without learning a new paradigm&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://dev.to/this-is-learning/the-evolution-of-signals-in-javascript-8ob"&gt;Signals in JavaScript – dev.to&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://dev.to/ryansolid/a-hands-on-introduction-to-fine-grained-reactivity-3ndf"&gt;Hands-on Reactivity in Solid&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  🧭 Final Thoughts
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Recommended Framework&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tiny bundles, fast UI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Svelte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content-heavy static sites&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Astro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resumable SSR apps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Qwik&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reactive UI-heavy apps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SolidJS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each of these frameworks offers unique advantages and mental models. Exploring them will deepen your understanding of performance trade-offs, reactivity, and modern rendering techniques.&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://lihautan.com/the-svelte-compiler-handbook" rel="noopener noreferrer"&gt;Svelte Compiler Handbook – Li Hau Tan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.astro.build/en/concepts/why-astro/" rel="noopener noreferrer"&gt;Astro Concepts – Official Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.astro.build/en/concepts/islands/" rel="noopener noreferrer"&gt;Astro Islands Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qwik.dev/docs/concepts/think-qwik/" rel="noopener noreferrer"&gt;Qwik Concepts: Think Qwik&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qwik.dev/docs/concepts/resumable/" rel="noopener noreferrer"&gt;Qwik Resumability Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.solidjs.com/" rel="noopener noreferrer"&gt;SolidJS document – dev.to&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/this-is-learning/the-evolution-of-signals-in-javascript-8ob"&gt;Signals in JavaScript – dev.to&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ryansolid/a-hands-on-introduction-to-fine-grained-reactivity-3ndf"&gt;Hands-on Reactivity with Solid – dev.to&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://krausest.github.io/js-framework-benchmark/2025/table_chrome_138.0.7204.50.html" rel="noopener noreferrer"&gt;JS Framework Benchmark (2025)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.leverture.com/post/frontend-frameworks-in-2025-whats-hot-whats-not-and-whats-next" rel="noopener noreferrer"&gt;Frontend Frameworks in 2025 – Leverture&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>frontend</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>svelte</category>
    </item>
    <item>
      <title># AWS SAA Study Guide: What are Ephemeral Ports?</title>
      <dc:creator>kouta222</dc:creator>
      <pubDate>Sun, 27 Jul 2025 09:32:27 +0000</pubDate>
      <link>https://forem.com/kouta222/-aws-saa-study-guide-what-are-ephemeral-ports-2kmh</link>
      <guid>https://forem.com/kouta222/-aws-saa-study-guide-what-are-ephemeral-ports-2kmh</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;While studying for AWS SAA (Solutions Architect Associate) certification, I encountered the question "What are ephemeral ports?" So I decided to research and summarize this topic!&lt;/p&gt;

&lt;h2&gt;
  
  
  What are Ephemeral Ports?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definition
&lt;/h3&gt;

&lt;p&gt;Ephemeral ports are &lt;strong&gt;dynamically allocated port numbers temporarily used by client-side applications&lt;/strong&gt;. As you know,The word "ephemeral" means "temporary" or "transient," and true to its name, these are short-lived ports that exist only during the duration of a communication session.&lt;/p&gt;

&lt;p&gt;While server applications typically listen on fixed well-known ports (port 80 for HTTP, port 443 for HTTPS, etc.), client-side applications need different port numbers for each connection. This is where the operating system automatically selects and assigns unused port numbers - this mechanism is what ephemeral ports are all about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Port Number Classifications and Ranges
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Well-Known Ports&lt;/strong&gt;: 0-1023&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ports for well-known services like HTTP (80), HTTPS (443), SSH (22), etc.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Registered Ports&lt;/strong&gt;: 1024-49151&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Used by specific applications and services that have registered them&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ephemeral Ports&lt;/strong&gt;: 49152-65535&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dynamic ports temporarily used by clients&lt;/p&gt;

&lt;h2&gt;
  
  
  Actual Ranges by Operating System
&lt;/h2&gt;

&lt;p&gt;The actual ephemeral port ranges vary by operating system:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;OS&lt;/th&gt;
&lt;th&gt;Ephemeral Port Range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;32768-61000 (typical)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Vista/7/Server 2008 and later&lt;/td&gt;
&lt;td&gt;49152-65535&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows XP and earlier&lt;/td&gt;
&lt;td&gt;1025-5000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Ephemeral Port Operation Mechanism
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Basic Communication Flow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Connection Initiation&lt;/strong&gt;: Client requests connection to server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Port Assignment&lt;/strong&gt;: OS dynamically assigns an ephemeral port to the client&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Communication Execution&lt;/strong&gt;: Client uses the assigned temporary port to communicate with server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resource Release&lt;/strong&gt;: After communication ends, the ephemeral port is released and becomes available for reuse&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Concrete Example: Web Browsing Case
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgp4381q0twau7pmeq7bc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgp4381q0twau7pmeq7bc.png" alt=" " width="800" height="1038"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: Diagram created with AI assistance&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Importance of Ephemeral Ports in AWS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Network ACL Considerations
&lt;/h3&gt;

&lt;p&gt;AWS Network ACLs are &lt;strong&gt;stateless&lt;/strong&gt; in nature, requiring explicit traffic permission for both inbound and outbound directions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Specific Problem Example
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Scenario Setup&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're trying to SSH from your home PC (Windows) to an AWS EC2 instance&lt;/li&gt;
&lt;li&gt;EC2 is placed in a private subnet&lt;/li&gt;
&lt;li&gt;Network ACL is configured&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's happening?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Connection Initiation (Success)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your PC:52341 → EC2:22 (SSH connection request)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Inbound rule: "Allow connections to port 22" → ✅ Passes through&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. EC2 Response (Failure)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EC2:22 → Your PC:52341 (SSH response)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Outbound rule: "Allow response to port 52341?" → ❌ Not configured&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Problem&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Port 22 (SSH) is allowed, but...&lt;/li&gt;
&lt;li&gt;Response to the client's ephemeral port (52341 in this example) is not allowed&lt;/li&gt;
&lt;li&gt;Result: Connection timeout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;br&gt;
Add the following to outbound rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;| Rule# | Type | Protocol | Port Range | Destination | Allow/Deny |
|-------|------|----------|------------|-------------|------------|
| 100 | Custom TCP | TCP | 1024-65535 | 0.0.0.0/0 | ALLOW |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;"Ephemeral ports not allowed" = "Return traffic to temporary port numbers used by clients is being blocked by Network ACL outbound rules"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I learned that ephemeral ports are "temporary ports" assigned to clients. I believe this kind of knowledge is essential for quickly identifying the root cause of infrastructure issues!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>awschallenge</category>
    </item>
    <item>
      <title>AWS Storage Services Comparison: S3, EBS, EFS, and FSx</title>
      <dc:creator>kouta222</dc:creator>
      <pubDate>Fri, 11 Jul 2025 06:24:53 +0000</pubDate>
      <link>https://forem.com/kouta222/aws-storage-services-comparison-s3-ebs-efs-and-fsx-4nm0</link>
      <guid>https://forem.com/kouta222/aws-storage-services-comparison-s3-ebs-efs-and-fsx-4nm0</guid>
      <description>&lt;p&gt;Amazon Web Services (AWS) offers multiple storage solutions designed to meet different use cases and performance requirements. Understanding the differences between S3, EBS, EFS, and FSx is crucial for architects and developers to choose the right storage service for their applications. This article provides a comprehensive comparison of these four key AWS storage services.&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazon S3 (Simple Storage Service)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;: Object Storage&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Regional&lt;/p&gt;

&lt;p&gt;Amazon S3 is AWS's flagship object storage service that stores data as objects within buckets. It's designed for internet-scale applications and provides virtually unlimited storage capacity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Characteristics:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Access Method&lt;/strong&gt;: HTTP-based API access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durability&lt;/strong&gt;: Extremely high durability (99.999999999% or 11 9's)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Availability&lt;/strong&gt;: High availability across multiple Availability Zones&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ideal Use Cases&lt;/strong&gt;: Long-term data storage, backup and archiving, content distribution, data lakes, and static website hosting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Primary Benefits:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cost-effective for large-scale data storage&lt;/li&gt;
&lt;li&gt;Multiple storage classes for different access patterns&lt;/li&gt;
&lt;li&gt;Built-in data redundancy and disaster recovery&lt;/li&gt;
&lt;li&gt;Seamless integration with other AWS services&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Amazon EBS (Elastic Block Store)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;: Block Storage&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Availability Zone-specific&lt;/p&gt;

&lt;p&gt;EBS provides persistent block-level storage volumes that can be attached to EC2 instances. It functions as a traditional hard drive or SSD for your virtual machines.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Characteristics:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Access Method&lt;/strong&gt;: Direct attachment to EC2 instances as disk volumes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope&lt;/strong&gt;: Single Availability Zone deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Various volume types optimized for different workloads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ideal Use Cases&lt;/strong&gt;: Operating system storage, database storage, file systems, and any application requiring persistent block storage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Primary Benefits:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;High IOPS performance for demanding applications&lt;/li&gt;
&lt;li&gt;Snapshot capabilities for backup and recovery&lt;/li&gt;
&lt;li&gt;Encryption at rest and in transit&lt;/li&gt;
&lt;li&gt;Flexible volume types (gp3, io2, st1, sc1)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Amazon EFS (Elastic File System)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;: File Storage&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Multi-AZ (Fully Managed)&lt;/p&gt;

&lt;p&gt;EFS provides a fully managed, scalable file system that can be accessed by multiple EC2 instances simultaneously across different Availability Zones.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Characteristics:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Access Method&lt;/strong&gt;: NFS (Network File System) protocol through mount targets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope&lt;/strong&gt;: Cross-AZ access capability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Automatically scales up and down based on usage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ideal Use Cases&lt;/strong&gt;: Shared application data, content repositories, web serving, and containerized applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Primary Benefits:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Concurrent access from multiple instances&lt;/li&gt;
&lt;li&gt;Automatic scaling without provisioning&lt;/li&gt;
&lt;li&gt;POSIX-compliant file system&lt;/li&gt;
&lt;li&gt;Integration with AWS services like Lambda and containers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Amazon FSx
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;: File System&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Fully Managed High-Performance File Systems&lt;/p&gt;

&lt;p&gt;FSx provides fully managed file systems optimized for specific use cases and workloads, offering four distinct variants.&lt;/p&gt;

&lt;h3&gt;
  
  
  FSx Variants:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. FSx for Windows File Server
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Native Windows file system with SMB protocol&lt;/li&gt;
&lt;li&gt;Active Directory integration&lt;/li&gt;
&lt;li&gt;Ideal for Windows-based applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. FSx for Lustre
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;High-performance file system for compute-intensive workloads&lt;/li&gt;
&lt;li&gt;Optimized for HPC, machine learning, and media processing&lt;/li&gt;
&lt;li&gt;Can integrate with S3 for data processing pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. FSx for NetApp ONTAP
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Enterprise-grade file system with advanced data management&lt;/li&gt;
&lt;li&gt;Multi-protocol support (NFS, SMB, iSCSI)&lt;/li&gt;
&lt;li&gt;Ideal for enterprise applications requiring advanced features&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. FSx for OpenZFS
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;High-performance file system with snapshot and compression capabilities&lt;/li&gt;
&lt;li&gt;Suitable for workloads requiring high IOPS and low latency&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Primary Benefits:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Optimized for high-performance workloads&lt;/li&gt;
&lt;li&gt;Fully managed with automated backups&lt;/li&gt;
&lt;li&gt;Integration with existing enterprise tools&lt;/li&gt;
&lt;li&gt;Multiple protocol support depending on variant&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Storage Type Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Object Storage (S3)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Purpose&lt;/strong&gt;: Long-term data preservation and archival&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access Pattern&lt;/strong&gt;: Infrequent to moderate access via HTTP APIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Virtually unlimited&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: Most cost-effective for large-scale storage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Block Storage (EBS)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Purpose&lt;/strong&gt;: Server-attached storage for data processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access Pattern&lt;/strong&gt;: High-frequency, low-latency access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Limited to instance attachment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: Higher per GB but optimized for performance&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  File Storage (EFS/FSx)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Purpose&lt;/strong&gt;: Shared file systems for collaborative workloads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access Pattern&lt;/strong&gt;: Multi-instance concurrent access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Elastic (EFS) or high-performance (FSx)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: Premium pricing for shared access capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use Case Scenarios
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Choose S3 when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Building data lakes or analytics platforms&lt;/li&gt;
&lt;li&gt;Implementing backup and disaster recovery solutions&lt;/li&gt;
&lt;li&gt;Hosting static websites or content distribution&lt;/li&gt;
&lt;li&gt;Archiving data for compliance requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choose EBS when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Running databases on EC2 instances&lt;/li&gt;
&lt;li&gt;Deploying applications requiring high IOPS&lt;/li&gt;
&lt;li&gt;Setting up boot volumes for EC2 instances&lt;/li&gt;
&lt;li&gt;Implementing single-instance file systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choose EFS when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Supporting containerized applications&lt;/li&gt;
&lt;li&gt;Implementing shared content repositories&lt;/li&gt;
&lt;li&gt;Building scalable web applications&lt;/li&gt;
&lt;li&gt;Requiring POSIX-compliant shared storage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choose FSx when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Running high-performance computing workloads&lt;/li&gt;
&lt;li&gt;Supporting Windows-based enterprise applications&lt;/li&gt;
&lt;li&gt;Implementing machine learning training pipelines&lt;/li&gt;
&lt;li&gt;Requiring specialized file system features&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Each AWS storage service addresses specific requirements and use cases. S3 excels at scalable object storage for long-term data preservation, EBS provides high-performance block storage for EC2 instances, EFS offers shared file storage for multi-instance applications, and FSx delivers specialized high-performance file systems for demanding workloads.&lt;/p&gt;

&lt;p&gt;The key to successful storage architecture is understanding your application's access patterns, performance requirements, and scalability needs. By matching these requirements to the appropriate storage service, you can optimize both cost and performance for your AWS infrastructure.&lt;/p&gt;

&lt;p&gt;references&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pilotcore.io/blog/ebs-efs-fsx-s3-how-these-storage-options-differ" rel="noopener noreferrer"&gt;https://pilotcore.io/blog/ebs-efs-fsx-s3-how-these-storage-options-differ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>kouta222</dc:creator>
      <pubDate>Fri, 11 Jul 2025 06:03:31 +0000</pubDate>
      <link>https://forem.com/kouta222/-5104</link>
      <guid>https://forem.com/kouta222/-5104</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/kouta222/understanding-blob-in-javascript-handling-binary-data-on-the-client-side-2cp6" class="crayons-story__hidden-navigation-link"&gt;Understanding Blob in JavaScript: Handling Binary Data on the Client Side&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/kouta222" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1262140%2Fc5485daa-8232-47a1-b718-3b2107a1302d.jpeg" alt="kouta222 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/kouta222" class="crayons-story__secondary fw-medium m:hidden"&gt;
              kouta222
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                kouta222
                
              
              &lt;div id="story-author-preview-content-2676985" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/kouta222" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1262140%2Fc5485daa-8232-47a1-b718-3b2107a1302d.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;kouta222&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/kouta222/understanding-blob-in-javascript-handling-binary-data-on-the-client-side-2cp6" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 11 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/kouta222/understanding-blob-in-javascript-handling-binary-data-on-the-client-side-2cp6" id="article-link-2676985"&gt;
          Understanding Blob in JavaScript: Handling Binary Data on the Client Side
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/frontend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;frontend&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typescript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typescript&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/kouta222/understanding-blob-in-javascript-handling-binary-data-on-the-client-side-2cp6" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/kouta222/understanding-blob-in-javascript-handling-binary-data-on-the-client-side-2cp6#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>frontend</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Understanding Blob in JavaScript: Handling Binary Data on the Client Side</title>
      <dc:creator>kouta222</dc:creator>
      <pubDate>Fri, 11 Jul 2025 06:03:24 +0000</pubDate>
      <link>https://forem.com/kouta222/understanding-blob-in-javascript-handling-binary-data-on-the-client-side-2cp6</link>
      <guid>https://forem.com/kouta222/understanding-blob-in-javascript-handling-binary-data-on-the-client-side-2cp6</guid>
      <description>&lt;p&gt;Blob (Binary Large Object) plays a crucial role when working with file or binary data on the client side. In web application development, using Blob allows developers to implement features such as handling local files and enabling file downloads directly from the browser.&lt;/p&gt;

&lt;p&gt;This article covers everything from the basics of Blob in JavaScript to real-world use cases and performance optimization techniques.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What is a Blob?
&lt;/h2&gt;

&lt;p&gt;In client-side JavaScript, a Blob is an object representing raw binary data. It can be used to handle various types of content, including text, images, audio, video, or other binary data.&lt;/p&gt;

&lt;p&gt;You can create a Blob with JavaScript like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;108&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;108&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// Binary representation of "Hello"&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Blob&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/plain&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Common Use Cases for Blob
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. Uploading and Downloading Files
&lt;/h3&gt;

&lt;p&gt;Blob is often used to handle file uploads and downloads. Using an HTML &lt;code&gt;&amp;lt;input type="file"&amp;gt;&lt;/code&gt; element, you can read the user's selected file and create a Blob from it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fileInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input[type="file"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;fileInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;change&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Blob&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also generate content on the client and allow the user to download it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, world!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Blob&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/plain&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;download&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello.txt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  b. Previewing Images and Videos
&lt;/h3&gt;

&lt;p&gt;Blob can be used to preview images or videos selected by the user. By generating a temporary URL with &lt;code&gt;URL.createObjectURL()&lt;/code&gt;, you can display media files using &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; tags.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fileInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input[type="file"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;preview&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#preview&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;fileInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;change&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;preview&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  c. Temporary Storage and Web Workers
&lt;/h3&gt;

&lt;p&gt;Blobs are also useful for temporarily storing data or dynamically generating scripts for Web Workers. Web Workers allow you to offload intensive tasks from the main thread.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Blob&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;`
  onmessage = function(e) {
    postMessage('Received: ' + e.data);
  }
`&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/javascript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;worker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello, Worker!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Performance and Optimization
&lt;/h2&gt;

&lt;p&gt;While Blob is a powerful tool, performance should be considered when dealing with large data sets.&lt;/p&gt;

&lt;h3&gt;
  
  
  a. Memory Management
&lt;/h3&gt;

&lt;p&gt;Blobs consume memory, so it's important to release resources when they are no longer needed. You can use &lt;code&gt;URL.revokeObjectURL()&lt;/code&gt; to release the memory associated with a Blob URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;revokeObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Release memory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  b. Streaming and Chunking Data
&lt;/h3&gt;

&lt;p&gt;For large datasets, consider splitting the data or using streaming APIs like &lt;code&gt;ReadableStream&lt;/code&gt; and &lt;code&gt;WritableStream&lt;/code&gt; to process Blob data efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Security Considerations
&lt;/h2&gt;

&lt;p&gt;Since Blob enables handling arbitrary file data, it's important to implement security best practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always validate and sanitize uploaded files to prevent malware.&lt;/li&gt;
&lt;li&gt;Use Content Security Policy (CSP) headers to mitigate XSS (Cross-Site Scripting) risks when working with dynamically generated Blob URLs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Using Blob on the client side opens up a wide range of possibilities for handling files and binary data in web applications. From file previews to dynamic content generation and Web Worker usage, Blob is an essential tool for modern web development.&lt;/p&gt;

&lt;p&gt;Let's keep building great apps with the power of Blob!&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Blob&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>frontend</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
