<?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: Guillaume Sere</title>
    <description>The latest articles on Forem by Guillaume Sere (@guillaumesere).</description>
    <link>https://forem.com/guillaumesere</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%2F1382485%2F328dcc95-8834-499b-bfed-557f03b54a8f.jpg</url>
      <title>Forem: Guillaume Sere</title>
      <link>https://forem.com/guillaumesere</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/guillaumesere"/>
    <language>en</language>
    <item>
      <title>🧩 Building Mosaic Grid — A Rotation-Based Puzzle Game with Next.js</title>
      <dc:creator>Guillaume Sere</dc:creator>
      <pubDate>Fri, 10 Apr 2026 14:58:44 +0000</pubDate>
      <link>https://forem.com/guillaumesere/building-mosaic-grid-a-rotation-based-puzzle-game-with-nextjs-4chb</link>
      <guid>https://forem.com/guillaumesere/building-mosaic-grid-a-rotation-based-puzzle-game-with-nextjs-4chb</guid>
      <description>&lt;p&gt;I recently built Mosaic Grid, a browser-based puzzle game focused on placement and rotation mechanics. In this post, I want to walk through the technical decisions, challenges, and architecture behind it.&lt;/p&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%2Fmjdix8zkwnr5bl7hpm9t.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%2Fmjdix8zkwnr5bl7hpm9t.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mosaic-grid.vercel.app/" rel="noopener noreferrer"&gt;https://mosaic-grid.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎮 Concept
&lt;/h2&gt;

&lt;p&gt;The game is played on a 6x6 grid, where players must:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drag &amp;amp; drop pieces onto the board&lt;/li&gt;
&lt;li&gt;Rotate them in 90° increments&lt;/li&gt;
&lt;li&gt;Avoid overlaps&lt;/li&gt;
&lt;li&gt;Match an expected solution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At its core, it’s a mix of spatial reasoning and constraint solving.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Next.js (App Router)&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;CSS Modules / Tailwind (depending on your setup)&lt;/li&gt;
&lt;li&gt;Custom state management (no heavy external libs)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧠 Core Architecture
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1. Grid Representation
&lt;/h2&gt;

&lt;p&gt;The board is represented as a 2D array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Cell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
&lt;span class="na"&gt;occupied&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nl"&gt;pieceId&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;number&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;grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Cell&lt;/span&gt;&lt;span class="p"&gt;[][]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
&lt;span class="nc"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;occupied&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&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;
  
  
  2. Piece Modeling
&lt;/h2&gt;

&lt;p&gt;Each piece is defined as a matrix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Piece&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;[][];&lt;/span&gt;
  &lt;span class="nl"&gt;rotation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 0, 90, 180, 270&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nc"&gt;Example &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;x2&lt;/span&gt; &lt;span class="nx"&gt;block&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&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. Rotation Logic
&lt;/h2&gt;

&lt;p&gt;Instead of storing multiple orientations, I compute rotations dynamically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;rotateMatrix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;[][]):&lt;/span&gt; &lt;span class="kr"&gt;number&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;matrix&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;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;_&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="o"&gt;=&amp;gt;&lt;/span&gt;
 &lt;span class="nx"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;row&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="nf"&gt;reverse&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;p&gt;Each click applies a 90° rotation.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Drag &amp;amp; Drop System
&lt;/h2&gt;

&lt;p&gt;I implemented a custom drag &amp;amp; drop system instead of relying on libraries.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;More control over snapping behavior&lt;/li&gt;
&lt;li&gt;Easier grid alignment&lt;/li&gt;
&lt;li&gt;Better performance for small UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Key ideas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Track mouse position&lt;/li&gt;
&lt;li&gt;Translate piece preview in real-time&lt;/li&gt;
&lt;li&gt;Snap to nearest valid grid cell on drop&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Placement Validation
&lt;/h2&gt;

&lt;p&gt;Before placing a piece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check boundaries&lt;/li&gt;
&lt;li&gt;Check collisions&lt;/li&gt;
&lt;li&gt;Apply special rules (e.g. 2x2 pieces must align on even coordinates)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;canPlace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;piece&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;grid&lt;/span&gt;&lt;span class="p"&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;piece&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;shape&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="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;j&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;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;piece&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;shape&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;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&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;piece&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;shape&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;j&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&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;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;return&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&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;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;occupied&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&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="p"&gt;}&lt;/span&gt; 
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&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;
  
  
  6. Game State
&lt;/h2&gt;

&lt;p&gt;State is split into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;grid&lt;/li&gt;
&lt;li&gt;pieces (with position + rotation)&lt;/li&gt;
&lt;li&gt;progress (correct vs incorrect placements)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I avoided global state libraries and used React state + lifting state up, which was sufficient for this scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 UX Details
&lt;/h2&gt;

&lt;p&gt;Some small but important features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Double-click to rotate placed pieces&lt;/li&gt;
&lt;li&gt;Click to rotate pieces in the palette&lt;/li&gt;
&lt;li&gt;Visual feedback:

&lt;ol&gt;
&lt;li&gt;🟢 Correct placement&lt;/li&gt;
&lt;li&gt;🔴 Incorrect placement&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Automatic “snap” to valid positions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧩 Challenges
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Rotation + Collision Combined&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Handling rotation while ensuring valid placement required recalculating bounding boxes dynamically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Snapping System&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Making the drag feel natural without jitter or misalignment took several iterations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Edge Cases&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Partial out-of-bounds placement&lt;/li&gt;
&lt;li&gt;Rotated shapes exceeding grid limits&lt;/li&gt;
&lt;li&gt;Special constraints for certain pieces&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 What’s Next
&lt;/h2&gt;

&lt;p&gt;Possible improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Procedural level generation&lt;/li&gt;
&lt;li&gt;Mobile touch support improvements&lt;/li&gt;
&lt;li&gt;Animations (Framer Motion)&lt;/li&gt;
&lt;li&gt;Score / timer system&lt;/li&gt;
&lt;li&gt;Multiplayer or daily challenges&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💬 Feedback
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mosaic-grid.vercel.app/" rel="noopener noreferrer"&gt;https://mosaic-grid.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re into puzzle games or frontend architecture, I’d love your feedback!&lt;/p&gt;

&lt;p&gt;What would you improve in this kind of system?&lt;br&gt;
How would you handle state or performance differently?&lt;/p&gt;

&lt;h1&gt;
  
  
  webdev #nextjs #react #gamedev #javascript #indiedev
&lt;/h1&gt;

</description>
      <category>nextjs</category>
      <category>ui</category>
      <category>ux</category>
      <category>javascript</category>
    </item>
    <item>
      <title>🌍 Building “Ma Zone” — A Geolocated Events Platform with Next.js</title>
      <dc:creator>Guillaume Sere</dc:creator>
      <pubDate>Fri, 06 Feb 2026 11:51:02 +0000</pubDate>
      <link>https://forem.com/guillaumesere/building-ma-zone-a-geolocated-events-platform-with-nextjs-2b6k</link>
      <guid>https://forem.com/guillaumesere/building-ma-zone-a-geolocated-events-platform-with-nextjs-2b6k</guid>
      <description>&lt;p&gt;I recently built Ma Zone, a web application that helps users discover events near their location and around the world.&lt;br&gt;
The goal was to work on real-world challenges like geolocation, third-party APIs, maps, and SEO in a modern full-stack React environment.&lt;/p&gt;

&lt;p&gt;Here’s a breakdown of the technical side of the project 👇&lt;/p&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%2Ftqu2m2smjneqhqh10tej.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%2Ftqu2m2smjneqhqh10tej.png" alt=" " width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ma-zone-60.vercel.app/" rel="noopener noreferrer"&gt;https://ma-zone-60.vercel.app/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🧱 Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Next.js (App Router)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;React + TypeScript&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leaflet + React-Leaflet for interactive maps&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;External Event APIs (geolocated event data)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Server-side data fetching with caching control&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SEO optimization using Next.js Metadata API&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  🗺️ 1. Handling Maps in Next.js (SSR Challenge)
&lt;/h2&gt;

&lt;p&gt;Leaflet depends on the window object, which doesn’t exist during server-side rendering.&lt;/p&gt;

&lt;p&gt;To avoid the classic:&lt;/p&gt;

&lt;p&gt;ReferenceError: window is not defined&lt;/p&gt;

&lt;p&gt;I isolated the map into a Client Component and loaded it dynamically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"use client";

import dynamic from "next/dynamic";

const Map = dynamic(() =&amp;gt; import("./Map"), { ssr: false });

export default function MapWrapper() {
  return &amp;lt;Map /&amp;gt;;
}

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  📍 2. User Geolocation
&lt;/h2&gt;

&lt;p&gt;The app requests the user’s position via the browser API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;navigator.geolocation.getCurrentPosition(
  (position) =&amp;gt; {
    setCoords({
      lat: position.coords.latitude,
      lng: position.coords.longitude,
    });
  },
  () =&amp;gt; {
    // fallback location (Paris)
    setCoords({ lat: 48.8566, lng: 2.3522 });
  }
);

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

&lt;/div&gt;



&lt;p&gt;These coordinates are then used to fetch nearby events.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌐 3. Fetching Geolocated Events from APIs
&lt;/h2&gt;

&lt;p&gt;On the server side, I aggregate event data from multiple providers and normalize the structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const mapEvent = (item: any) =&amp;gt; ({
  id: item.id,
  title: item.name,
  description: item.description,
  date: item.date,
  latitude: Number(item.latitude),
  longitude: Number(item.longitude),
});

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

&lt;/div&gt;



&lt;p&gt;Data is fetched with cache: "no-store" to ensure fresh event listings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;await fetch(url, { cache: "no-store" });

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧭 4. Displaying Events on the Map
&lt;/h2&gt;

&lt;p&gt;Each event becomes a marker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Marker position={[event.latitude, event.longitude]}&amp;gt;
  &amp;lt;Popup&amp;gt;
    &amp;lt;h3&amp;gt;{event.title}&amp;lt;/h3&amp;gt;
    &amp;lt;p&amp;gt;{event.date}&amp;lt;/p&amp;gt;
  &amp;lt;/Popup&amp;gt;
&amp;lt;/Marker&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;This creates a visual discovery experience instead of a simple list.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡ 5. SEO with Next.js Metadata API
&lt;/h2&gt;

&lt;p&gt;Even though the app is dynamic and map-heavy, SEO still matters.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const metadata = {
  title: "Ma Zone – Events near you",
  description: "Discover concerts, festivals and local events around you.",
  openGraph: {
    title: "Ma Zone",
    description: "Find events near you",
    type: "website",
  },
};

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

&lt;/div&gt;



&lt;p&gt;This ensures proper indexing and rich previews when shared.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Key Challenges Solved
&lt;/h2&gt;

&lt;p&gt;✔ Mixing client-only libraries (Leaflet) with SSR&lt;br&gt;
✔ Handling browser geolocation safely&lt;br&gt;
✔ Normalizing data from different event APIs&lt;br&gt;
✔ Building a map-based UX instead of a traditional feed&lt;br&gt;
✔ Keeping performance + SEO in a hybrid Next.js app&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 What’s Next
&lt;/h2&gt;

&lt;p&gt;Planned improvements include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Event detail pages with dynamic metadata&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Filters (date, category, free/paid)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Favorites system&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Smarter location-based suggestions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Link: &lt;a href="https://ma-zone-60.vercel.app/" rel="noopener noreferrer"&gt;https://ma-zone-60.vercel.app/&lt;/a&gt;&lt;/p&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%2Fbel4ff9hpr20mhorgdk7.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%2Fbel4ff9hpr20mhorgdk7.png" alt=" " width="690" height="916"&gt;&lt;/a&gt;&lt;/p&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%2F1fkjal6d0uczarcpu6bm.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%2F1fkjal6d0uczarcpu6bm.png" alt=" " width="687" height="918"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This project was a great way to explore real-world geospatial data, API aggregation, and modern Next.js architecture.&lt;/p&gt;

&lt;p&gt;If you're building something similar or working with maps + Next.js, I’d love to exchange ideas!&lt;/p&gt;

&lt;h1&gt;
  
  
  nextjs #react #typescript #webdev #frontend #maps #geolocation #seo
&lt;/h1&gt;

</description>
      <category>nextjs</category>
      <category>api</category>
      <category>webdev</category>
      <category>map</category>
    </item>
    <item>
      <title>World Radio 60 : explorer les radios du monde entier depuis votre navigateur 🎧🌍</title>
      <dc:creator>Guillaume Sere</dc:creator>
      <pubDate>Fri, 19 Dec 2025 17:02:24 +0000</pubDate>
      <link>https://forem.com/guillaumesere/world-radio-60-explorer-les-radios-du-monde-entier-depuis-votre-navigateur-3p44</link>
      <guid>https://forem.com/guillaumesere/world-radio-60-explorer-les-radios-du-monde-entier-depuis-votre-navigateur-3p44</guid>
      <description>&lt;p&gt;J’ai récemment terminé un projet personnel que je voulais partager : World Radio 60, un site web qui permet d’écouter et de découvrir des radios du monde entier, avec une interface simple et intuitive.&lt;/p&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%2Fmtzrdtfjhflgkbtyl0oc.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%2Fmtzrdtfjhflgkbtyl0oc.png" alt=" " width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi ce projet ?
&lt;/h2&gt;

&lt;p&gt;Je voulais créer une plateforme où l’utilisateur peut :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;parcourir les radios par pays et voir le drapeau correspondant ;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;filtrer par ville, pays ou nom de radio ;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;écouter un flux audio en direct directement depuis le site ;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bénéficier d’une navigation fluide et rapide, même avec des centaines de radios.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Stack et choix techniques
&lt;/h2&gt;

&lt;p&gt;Pour ce projet, j’ai utilisé:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Next.js 13 (App Router) pour le rendu côté serveur et la génération de pages dynamiques.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;React pour construire une interface réactive et interactive.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TypeScript pour plus de sécurité sur les types et éviter les erreurs courantes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API interne pour contourner les problèmes de CORS et récupérer les flux des radios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tailwind CSS pour un style moderne, responsive et rapide à mettre en place.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comment ça fonctionne ?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Le site récupère les lieux (places) depuis l’API Radio.Garden.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Les lieux sont regroupés par pays, avec une limite de villes pour optimiser les performances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pour chaque lieu, les channels sont récupérés via un endpoint interne Next.js.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;L’utilisateur peut filtrer les radios par pays ou rechercher une station spécifique.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Un lecteur audio permet d’écouter le flux en direct.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Optimisations
&lt;/h2&gt;

&lt;p&gt;🔒 Verrou anti-double fetch pour éviter les requêtes infinies en React Strict Mode.&lt;/p&gt;

&lt;p&gt;⚡ Lazy loading et limites par pays pour réduire le temps de chargement.&lt;/p&gt;

&lt;p&gt;✅ Gestion des erreurs et fallback pour les flux indisponibles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Résultat
&lt;/h2&gt;

&lt;p&gt;World Radio 60 est maintenant en ligne et permet de parcourir facilement les radios de tous les continents, tout en offrant une interface simple et rapide.&lt;/p&gt;

&lt;p&gt;🌐 Découvrez-le ici : &lt;a href="https://world-radio-60.vercel.app/" rel="noopener noreferrer"&gt;https://world-radio-60.vercel.app/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>api</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>🚀 Building nasa-media — Exploring NASA’s public image archives with React</title>
      <dc:creator>Guillaume Sere</dc:creator>
      <pubDate>Wed, 10 Dec 2025 11:01:31 +0000</pubDate>
      <link>https://forem.com/guillaumesere/building-nasa-media-exploring-nasas-public-image-archives-with-react-3fh8</link>
      <guid>https://forem.com/guillaumesere/building-nasa-media-exploring-nasas-public-image-archives-with-react-3fh8</guid>
      <description>&lt;p&gt;I recently built nasa-media, a web application that allows users to explore NASA’s public image archive using the NASA Image and Video Library API.&lt;/p&gt;

&lt;p&gt;The goal of this project was not just to consume an API, but to turn a raw data source into a clean, usable and user-friendly experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛰️ About the NASA Image &amp;amp; Video Library API
&lt;/h2&gt;

&lt;p&gt;NASA provides a public API that grants access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;historical space missions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;planetary exploration images&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lunar archives (Apollo missions)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ISS, Mars rovers, astronomy media&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The API endpoint used in this project is: &lt;a href="https://nasa-media.vercel.app/" rel="noopener noreferrer"&gt;https://nasa-media.vercel.app/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Project goals
&lt;/h2&gt;

&lt;p&gt;My main objectives were:&lt;/p&gt;

&lt;p&gt;✅ Make large archives easy to explore&lt;/p&gt;

&lt;p&gt;✅ Keep the UI readable even with long descriptions&lt;/p&gt;

&lt;p&gt;✅ Provide a fast and intuitive search experience&lt;/p&gt;

&lt;p&gt;✅ Ensure the app works well on desktop and mobile&lt;/p&gt;

&lt;p&gt;✅ Preserve clarity and performance despite pagination&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Tech stack
&lt;/h2&gt;

&lt;p&gt;React&lt;br&gt;
Fetch API&lt;br&gt;
NASA Image &amp;amp; Video Library API&lt;br&gt;
CSS (flexbox / responsive design)&lt;br&gt;
React Router&lt;br&gt;
Lottie animations&lt;/p&gt;

&lt;h2&gt;
  
  
  🔎 Key features
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Search system&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Users can search for specific topics or missions:&lt;/p&gt;

&lt;p&gt;Moon&lt;br&gt;
Apollo&lt;br&gt;
Mars&lt;br&gt;
ISS&lt;br&gt;
Any NASA-related keyword&lt;br&gt;
Each search resets pagination to keep results consistent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Paginated results&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The API supports pagination, which is handled client-side:&lt;/p&gt;

&lt;p&gt;next / previous navigation&lt;br&gt;
detection of remaining pages&lt;br&gt;
automatic scroll-to-top on page changes&lt;br&gt;
This keeps the UX smooth and predictable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Enriched image cards&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each result card displays:&lt;/p&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%2Fbwdmalaay5782ui2q780.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%2Fbwdmalaay5782ui2q780.png" alt=" " width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;the image&lt;br&gt;
the official NASA title&lt;br&gt;
the full description from the archive&lt;br&gt;
The descriptions are always visible, allowing users to understand the context of each image without extra clicks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. UX improvements&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some UX details that made a big difference:&lt;/p&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%2Fv3ubwg4aogcd2hvq6p52.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%2Fv3ubwg4aogcd2hvq6p52.png" alt=" " width="401" height="915"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;smooth scroll between pages&lt;br&gt;
responsive layout for small screens&lt;br&gt;
click on image opens high-resolution version&lt;br&gt;
clear page description explaining how to use the app&lt;br&gt;
automatic closing of mobile navigation menu&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 What I learned
&lt;/h2&gt;

&lt;p&gt;This project helped me reinforce several skills:&lt;br&gt;
Working with real-world public APIs&lt;br&gt;
Handling API inconsistencies and missing fields&lt;br&gt;
Designing UI around long-form content&lt;br&gt;
Improving UX without overcomplicating the interface&lt;br&gt;
Managing state and pagination cleanly in React&lt;/p&gt;

&lt;p&gt;It also reminded me that good UX matters as much as clean code, especially when dealing with large datasets.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚧 Possible next improvements
&lt;/h2&gt;

&lt;p&gt;Some ideas I’d like to explore next:&lt;br&gt;
route-based detail pages for each image&lt;br&gt;
lazy loading for images&lt;br&gt;
SEO improvements for archive pages&lt;br&gt;
filters by media type or NASA center&lt;br&gt;
skeleton loaders for better perceived performance&lt;/p&gt;

&lt;h2&gt;
  
  
  🌍 Final thoughts
&lt;/h2&gt;

&lt;p&gt;nasa-media is a personal project, but it reflects how I like to approach development:&lt;/p&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%2Fnlowwbdqr4kt9c1e94qg.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%2Fnlowwbdqr4kt9c1e94qg.png" alt=" " width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;clean UI, clear purpose, and meaningful data presentation.&lt;/p&gt;

&lt;p&gt;If you enjoy working with APIs, open data, or frontend UX, I highly recommend exploring NASA’s public APIs — there’s a lot of fascinating content available.&lt;/p&gt;

&lt;p&gt;Thanks for reading 🚀&lt;br&gt;
Feel free to share feedback or ideas for improvement.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://nasa-media.vercel.app/" rel="noopener noreferrer"&gt;https://nasa-media.vercel.app/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>react</category>
      <category>webdev</category>
      <category>node</category>
    </item>
    <item>
      <title>🚆 Nouvelles fonctionnalités sur mon site d'horaires SNCF en temps réel ! 🛠️</title>
      <dc:creator>Guillaume Sere</dc:creator>
      <pubDate>Fri, 05 Dec 2025 11:41:58 +0000</pubDate>
      <link>https://forem.com/guillaumesere/nouvelles-fonctionnalites-sur-mon-site-dhoraires-sncf-en-temps-reel--4mha</link>
      <guid>https://forem.com/guillaumesere/nouvelles-fonctionnalites-sur-mon-site-dhoraires-sncf-en-temps-reel--4mha</guid>
      <description>&lt;p&gt;Mon site web qui utilise l’API de la SNCF pour afficher les horaires des trains partout en France vient de recevoir plusieurs améliorations majeures pour rendre l’expérience utilisateur encore plus agréable. 🎯&lt;/p&gt;

&lt;p&gt;🆕 Quoi de neuf ?&lt;/p&gt;

&lt;p&gt;✅ Interface plus vivante avec animations Lottie et visuels interactifs&lt;br&gt;
 ✅ Recherche de trajets possible par sélection de gares &lt;br&gt;
 ✅ Affichage détaillé des trajets avec correspondances, quai et durée de chaque segment&lt;br&gt;
 ✅ Suggestions de trajets populaires pour gagner du temps&lt;br&gt;
 ✅ Chargement rapide et responsive sur tous les appareils&lt;/p&gt;

&lt;p&gt;Le site reproduit fidèlement l’affichage que l’on retrouve dans les gares tout en ajoutant des fonctionnalités pratiques pour planifier vos voyages en quelques clics.&lt;/p&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%2F22cacbz9zzvw94f22chw.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%2F22cacbz9zzvw94f22chw.png" alt=" " width="800" height="384"&gt;&lt;/a&gt;&lt;/p&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%2Fyb6uv9fzgf0xpql1m6n3.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%2Fyb6uv9fzgf0xpql1m6n3.png" alt=" " width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 Idéal pour consulter les horaires, vérifier les retards ou préparer un trajet de dernière minute, où que vous soyez !&lt;/p&gt;

&lt;p&gt;Lien: &lt;a href="https://train-sncf.vercel.app/" rel="noopener noreferrer"&gt;https://train-sncf.vercel.app/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>ui</category>
      <category>javascript</category>
      <category>devops</category>
    </item>
    <item>
      <title>📺 IPTV-60 – Mon lecteur IPTV personnel en ligne</title>
      <dc:creator>Guillaume Sere</dc:creator>
      <pubDate>Wed, 26 Nov 2025 14:14:39 +0000</pubDate>
      <link>https://forem.com/guillaumesere/itv-60-mon-lecteur-iptv-personnel-en-ligne-1imh</link>
      <guid>https://forem.com/guillaumesere/itv-60-mon-lecteur-iptv-personnel-en-ligne-1imh</guid>
      <description>&lt;h2&gt;
  
  
  Salut la communauté ! 👋
&lt;/h2&gt;

&lt;p&gt;Je voulais partager avec vous IPTV-60, un projet sur lequel j’ai travaillé récemment. C’est une application web qui permet de regarder des chaînes IPTV directement depuis votre navigateur et de gérer vos favoris de façon simple et rapide.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Fonctionnalités principales
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Lecture en direct de chaînes IPTV via HLS. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Favoris : ajoutez et retirez vos chaînes préférées en un clic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Filtres : recherchez par pays et catégorie.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chargement optimisé : affichage progressif avec infinite scroll pour ne pas surcharger la page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Catégories et pays : affiche le logo, le drapeau et le nom du pays de la chaîne.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sous-titrage : support pour les flux avec sous-titres.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛠 Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Frontend : React, Next.js&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Streaming : Hls.js&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;State management : Hooks + LocalStorage pour les favoris&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Données : API publique IPTV-org (streams, chaînes, logos)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 Ce qui m’a motivé
&lt;/h2&gt;

&lt;p&gt;Regarder la télévision en ligne peut vite devenir compliqué avec plusieurs apps et services. J’avais envie d’un lecteur centralisé, simple et rapide à utiliser directement depuis un navigateur, avec mes chaînes préférées toujours à portée de main.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 Aperçu du projet
&lt;/h2&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%2Fhngp1xe2up4l1euyse1i.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%2Fhngp1xe2up4l1euyse1i.png" alt=" " width="800" height="613"&gt;&lt;/a&gt;&lt;/p&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%2F7q8ahd6rlwj4b4x08unr.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%2F7q8ahd6rlwj4b4x08unr.png" alt=" " width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🌐 Essayer IPTV-60
&lt;/h2&gt;

&lt;p&gt;Vous pouvez tester le projet ici : &lt;a href="https://iptv-60.vercel.app/" rel="noopener noreferrer"&gt;https://iptv-60.vercel.app/&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;IPTV-60 est encore en développement, mais il fonctionne déjà très bien pour un usage personnel ou pour tester des flux IPTV.&lt;/p&gt;

&lt;p&gt;Si vous avez des idées d’amélioration ou des suggestions (nouveaux filtres, thème sombre, etc.), je serais ravi d’en discuter !&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>javascript</category>
      <category>api</category>
    </item>
    <item>
      <title>Intégrer l'Intelligence Artificielle dans vos Applications TypeScript</title>
      <dc:creator>Guillaume Sere</dc:creator>
      <pubDate>Fri, 14 Feb 2025 09:53:26 +0000</pubDate>
      <link>https://forem.com/guillaumesere/integrer-lintelligence-artificielle-dans-vos-applications-typescript-4jkk</link>
      <guid>https://forem.com/guillaumesere/integrer-lintelligence-artificielle-dans-vos-applications-typescript-4jkk</guid>
      <description>&lt;p&gt;L'intelligence artificielle (IA) est en train de révolutionner le développement web, offrant de nouvelles possibilités pour créer des applications plus intelligentes et interactives. Dans cet article, nous allons explorer comment intégrer l'IA dans vos applications TypeScript, en mettant l'accent sur les outils et les techniques disponibles pour les développeurs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi Intégrer l'IA dans vos Applications ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;L'intégration de l'IA peut apporter plusieurs avantages à vos applications web :&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Personnalisation : L'IA peut analyser les comportements des utilisateurs pour offrir des expériences personnalisées.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatisation : Automatisez les tâches répétitives pour améliorer l'efficacité.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Analyse Prédictive : Utilisez des modèles prédictifs pour anticiper les besoins des utilisateurs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interaction Naturelle : Intégrez des chatbots et des assistants virtuels pour une interaction plus naturelle.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Outils et Bibliothèques pour l'IA avec TypeScript&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pour intégrer l'IA dans vos applications TypeScript, vous pouvez utiliser divers outils et bibliothèques. Voici quelques-uns des plus populaires :
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;TensorFlow.js : Une bibliothèque JavaScript pour l'apprentissage automatique, compatible avec TypeScript. Elle permet d'entraîner et d'exécuter des modèles directement dans le navigateur.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Brain.js : Une bibliothèque de réseaux de neurones pour JavaScript, qui fonctionne bien avec TypeScript. Elle est idéale pour des projets plus simples et des prototypes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ONNX.js : Permet d'exécuter des modèles ONNX (Open Neural Network Exchange) dans le navigateur. ONNX est un format standard pour les modèles d'IA.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API d'IA : Utilisez des API externes comme celles de Google Cloud AI, Microsoft Azure AI, ou IBM Watson pour intégrer des fonctionnalités d'IA avancées sans avoir à entraîner vos propres modèles. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Étapes pour Intégrer l'IA dans une Application TypeScript
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Définir les Besoins : Identifiez les fonctionnalités que vous souhaitez ajouter avec l'IA. Cela peut être la reconnaissance vocale, l'analyse de sentiments, ou la recommandation de produits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choisir les Outils : Sélectionnez les bibliothèques ou API qui répondent le mieux à vos besoins.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Installer les Dépendances : Ajoutez les bibliothèques nécessaires à votre projet TypeScript via npm ou yarn.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @tensorflow/tfjs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Développer les Fonctionnalités : Implémentez les fonctionnalités d'IA dans votre code TypeScript. Par exemple, pour utiliser TensorFlow.js :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as tf from '@tensorflow/tfjs';

// Charger un modèle pré-entraîné
const model = await tf.loadLayersModel('path/to/model.json');

// Préparer les données d'entrée
const input = tf.tensor2d([[1.0, 2.0], [3.0, 4.0]]);

// Faire une prédiction
const prediction = model.predict(input);
prediction.print();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Tester et Optimiser : Testez vos fonctionnalités d'IA et optimisez les performances pour garantir une expérience utilisateur fluide. &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Voici un exemple concret d'utilisation de TensorFlow.js pour intégrer un modèle de reconnaissance d'images dans une application TypeScript. Nous allons utiliser un modèle pré-entraîné pour classer des images.
&lt;/h2&gt;

&lt;p&gt;Exemple : Reconnaissance d'Images avec TensorFlow.js&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Objectif&lt;/strong&gt;&lt;br&gt;
Créer une application web simple qui permet à l'utilisateur de télécharger une image, puis utiliser un modèle pré-entraîné pour classer cette image.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Initialiser le Projet&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Commencez par créer un nouveau projet Node.js et installez les dépendances nécessaires :&lt;/p&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%2Fg0bvuy8ve55d5c42dk64.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%2Fg0bvuy8ve55d5c42dk64.png" alt=" " width="617" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Créer la Structure du Projet&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Créez un fichier index.html pour la structure de base de votre application web et un fichier app.ts pour le code TypeScript.&lt;/p&gt;

&lt;p&gt;index.html&lt;br&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%2Fhwdvy1inwwte1t8qqgnl.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%2Fhwdvy1inwwte1t8qqgnl.png" alt=" " width="611" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;app.ts&lt;br&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%2Fvf7roo9xawnovdqiuqej.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%2Fvf7roo9xawnovdqiuqej.png" alt=" " width="621" height="610"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compiler le Code TypeScript&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ajoutez un fichier tsconfig.json pour configurer la compilation TypeScript :&lt;/p&gt;

&lt;p&gt;tsconfig.json&lt;br&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%2Fzpq0j6mzusbx2ksuv7lf.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%2Fzpq0j6mzusbx2ksuv7lf.png" alt=" " width="629" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Compilez le code TypeScript :&lt;br&gt;
npx tsc&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tester l'Application &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ouvrez index.html dans votre navigateur. Vous devriez pouvoir télécharger une image et voir la prédiction du modèle s'afficher.&lt;/p&gt;

&lt;p&gt;Explication&lt;/p&gt;

&lt;p&gt;TensorFlow.js : Nous utilisons TensorFlow.js pour charger et exécuter le modèle directement dans le navigateur.&lt;/p&gt;

&lt;p&gt;MobileNet : Un modèle pré-entraîné pour la classification d'images, capable de reconnaître 1000 classes d'objets différents.&lt;/p&gt;

&lt;p&gt;FileReader : Utilisé pour lire l'image téléchargée par l'utilisateur et l'afficher dans l'application.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Sortie de TypeScript 5.7 RC, nouvelle alternative à npm, avenir des frameworks JavaScript - Cette semaine en JS</title>
      <dc:creator>Guillaume Sere</dc:creator>
      <pubDate>Tue, 26 Nov 2024 09:56:45 +0000</pubDate>
      <link>https://forem.com/guillaumesere/sortie-de-typescript-57-rc-nouvelle-alternative-a-npm-avenir-des-frameworks-javascript-cette-2of5</link>
      <guid>https://forem.com/guillaumesere/sortie-de-typescript-57-rc-nouvelle-alternative-a-npm-avenir-des-frameworks-javascript-cette-2of5</guid>
      <description>&lt;p&gt;Bonjour les passionnés de JavaScript !&lt;br&gt;
Bienvenue dans l'édition de cette semaine de « This Week In JavaScript » &lt;/p&gt;

&lt;p&gt;Aujourd'hui, nous plongeons dans le dernier candidat à la sortie de TypeScript, une discussion stimulante sur l'avenir des frameworks à l'ère de l'IA et quelques outils incontournables pour booster votre jeu de développement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terrains RC Typescript 5.7
&lt;/h2&gt;

&lt;p&gt;Vous pouvez désormais installer  TypeScript 5.7 Release Candidate  avec :&lt;br&gt;
&lt;code&gt;npm install -D typescript@rc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voici les nouveautés :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Détection de bugs plus intelligente :&lt;/strong&gt; de nouveaux contrôles détectent les variables jamais initialisées, même dans les fonctions profondément imbriquées.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Commodité sans build :&lt;/strong&gt; pour les utilisateurs de ts-node et de Deno, l'option --rewriteRelativeImportExtensions convertit automatiquement les importations .ts en .js, permettant aux développeurs d'exécuter du code TypeScript de manière transparente dans plusieurs environnements comme Node.js et Deno.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ECMAScript 2024 :&lt;/strong&gt; prise en charge complète de Object.groupBy et Promise.withResolvers, vous aidant à tirer parti des dernières fonctionnalités ECMAScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le gestionnaire de paquets Vlt et le registre sans serveur
&lt;/h2&gt;

&lt;p&gt;Isaac Schlueter , le créateur de  npm , est de retour avec quelque chose  de nouveau : vlt et le registre sans serveur (vsr) .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vlt Package Manager :&lt;/strong&gt; une alternative plus rapide et plus élégante à npm avec des fonctionnalités telles que des performances améliorées et une syntaxe de requête de dépendance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Registre sans serveur :&lt;/strong&gt; compatible avec npm, ce registre privé et évolutif vous donne un contrôle total sur la distribution de vos packages.&lt;/p&gt;

&lt;p&gt;Ces outils pourraient considérablement rationaliser la manière dont les développeurs gèrent les packages JavaScript en offrant des performances plus rapides et davantage de contrôle sur la distribution des packages privés.&lt;/p&gt;

&lt;h2&gt;
  
  
  Composante du parti
&lt;/h2&gt;

&lt;p&gt;Si vous êtes un développeur front-end travaillant sur plusieurs frameworks,  Component Party  est votre nouveau meilleur ami. Il s'agit d'un outil qui compare la manière dont les tâches courantes sont effectuées dans différentes bibliothèques telles que  React ,  Vue ,  Svelte et  Angular .&lt;/p&gt;

&lt;p&gt;Avec ses derniers ajouts (prise en charge de  Svelte 5 et Angular 17) , il est plus à jour que jamais. Il offre une comparaison côte à côte de la manière dont les tâches courantes (comme le rendu d'un composant ou la gestion de l'état) sont gérées dans des bibliothèques telles que  React ,  Vue et  Svelte . Cela facilite l'apprentissage ou le changement de framework sans perdre de temps à parcourir la documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le débat sur le cadre de l’IA
&lt;/h2&gt;

&lt;p&gt;Avec des outils comme  Replit ,  Cursor ,  v0  et d’autres qui génèrent du code fonctionnel presque instantanément, un nouveau débat se prépare : les frameworks auront-ils encore de l’importance à l’avenir ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vitesse vs structure :&lt;/strong&gt;  le code généré par l’IA pourrait réduire la dépendance aux frameworks traditionnels pour certains projets, mais les frameworks resteront probablement essentiels pour les applications plus vastes et complexes. La véritable question est de savoir comment les frameworks évolueront parallèlement à ces outils d’IA.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact futur :&lt;/strong&gt; À mesure que l'IA progresse, nous pourrions assister à un changement dans la manière dont les logiciels sont conçus : les frameworks pourraient évoluer ou devenir moins pertinents. C'est certainement un sujet à surveiller !&lt;/p&gt;

&lt;h2&gt;
  
  
  Outils et versions que vous devriez connaître
&lt;/h2&gt;

&lt;p&gt;Voici quelques outils et versions clés qui méritent une place sur votre radar cette semaine :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parcel 2.13.0 :&lt;/strong&gt;  cette mise à jour inclut une mise en cache de résolution plus rapide (qui accélère les builds en améliorant la façon dont les dépendances sont résolues) et ajoute la prise en charge de glob dans package.json, vous permettant de faire correspondre plus facilement les modèles pour les fichiers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lexical 0.20 :&lt;/strong&gt; Lexical est un framework d'éditeur de texte extensible de Meta, axé sur la vitesse, l'accessibilité et la compatibilité multiplateforme. Il dispose même d'une variante Swift pour iOS, ce qui en fait un outil incontournable si vous créez des applications contenant beaucoup de texte.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;@clerk/nextjs v6 :&lt;/strong&gt;  la dernière version de Clerk prend en charge Next.js 15 avec async auth(), le rendu statique par défaut et le pré-rendu partiel. Il est rétrocompatible avec Next.js 14, ce qui en fait une mise à niveau transparente pour toute équipe de développement&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Storybook 8.4 :&lt;/strong&gt; développeurs front-end, découvrez-le ! Storybook 8.4 propose désormais des tests de composants en un clic directement dans votre navigateur, une prise en charge complète de Svelte 5 et des mises à jour de React Native Storybook. De plus, la taille du bundle est désormais 50 % plus petite, ce qui le rend plus rapide et plus léger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jsep :&lt;/strong&gt; vous souhaitez analyser des expressions en JavaScript ? jsep est une bibliothèque légère qui convertit les expressions &lt;code&gt;x * (1 + 2)&lt;/code&gt; en AST. Elle est flexible, légère et prend en charge les opérateurs personnalisés, ce qui la rend parfaite pour les projets côté client et côté serveur.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expo SDK 52 :&lt;/strong&gt;  développeurs React Native, cette version est pour vous ! Expo SDK 52 apporte à React Native 0.76 une amélioration des performances de 38 % grâce à sa nouvelle architecture. Cette version inclut également de nouvelles bibliothèques, des corrections de bugs et des améliorations de l'écosystème.&lt;/p&gt;

&lt;p&gt;Effectuez une mise à niveau maintenant avec &lt;code&gt;npx expo install expo@^52.0.0 --fix&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Si vous avez trouvé ces mises à jour JavaScript utiles, donnez un vote positif à cet article pour aider les autres à le découvrir. N'oubliez pas de le partager avec vos collègues développeurs et restez à l'affût pour plus d'informations sur le monde JavaScript.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>De la Maquette au Code : Comment Figma Simplifie l’Intégration Front-End</title>
      <dc:creator>Guillaume Sere</dc:creator>
      <pubDate>Mon, 25 Nov 2024 13:23:53 +0000</pubDate>
      <link>https://forem.com/guillaumesere/de-la-maquette-au-code-comment-figma-simplifie-lintegration-front-end-52e</link>
      <guid>https://forem.com/guillaumesere/de-la-maquette-au-code-comment-figma-simplifie-lintegration-front-end-52e</guid>
      <description>&lt;p&gt;Dans le développement web moderne, le passage de la maquette au code est une étape cruciale. Figma, outil de design collaboratif très populaire, a changé la donne en rendant ce processus plus fluide et collaboratif. Bien qu’il ne génère pas automatiquement du code parfait prêt pour la production, il fournit des outils et fonctionnalités qui facilitent grandement la vie des développeurs et des designers. Cet article explore comment Figma contribue à transformer des maquettes en projets web fonctionnels.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/FrgH2VMIOf8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Exportation directe des propriétés CSS
&lt;/h2&gt;

&lt;p&gt;Figma permet aux développeurs d’accéder rapidement aux propriétés CSS de chaque élément d’une maquette. Grâce au panneau Inspect, disponible dans l’interface ou via le partage des fichiers, vous pouvez :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Copier les styles CSS, tels que les tailles, couleurs, marges, polices, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exporter des images ou icônes en différents formats (PNG, SVG, JPG).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Obtenir des données spécifiques pour des plateformes mobiles (Swift pour iOS ou XML pour Android).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ces outils réduisent considérablement les échanges entre designers et développeurs, en fournissant des spécifications précises.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Utilisation de Plugins pour aller plus loin
&lt;/h2&gt;

&lt;p&gt;Pour automatiser ou simplifier davantage le processus, Figma dispose d’un riche écosystème de plugins. Voici quelques-uns des plus populaires :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zeplin :&lt;/strong&gt; Outil de collaboration entre designers et développeurs, il extrait les assets et fournit des snippets de code directement exploitables.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Anima :&lt;/strong&gt; Plugin puissant permettant de convertir des maquettes en HTML, CSS, et parfois même en React ou Vue.js. Il gère aussi les animations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Avocode :&lt;/strong&gt; Offre une alternative pour transférer les designs Figma vers du code front-end.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ces plugins permettent de passer rapidement de la conception statique à des fichiers exploitables par les développeurs.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/SJKkHbjniJw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Design Tokens et Workflow Automatisé
&lt;/h2&gt;

&lt;p&gt;Figma s’intègre bien dans des workflows design-to-code grâce aux design tokens. Ces tokens représentent les styles (couleurs, typographies, tailles) sous une forme standardisée, exportable dans des frameworks front-end. Par exemple :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Utilisez des outils comme Style Dictionary pour convertir les styles Figma en SCSS ou JSON utilisables dans vos projets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Associez Figma avec des pipelines CI/CD pour mettre à jour automatiquement les styles dans vos projets.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. API Figma pour l’automatisation
&lt;/h2&gt;

&lt;p&gt;Pour les équipes techniques, l’API de Figma offre des possibilités d’automatisation puissantes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Extraire les propriétés d’un design.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Générer des fichiers de styles directement à partir des données Figma.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Intégrer des composants dans des bibliothèques front-end comme Storybook.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L’utilisation de l’API nécessite des compétences en développement, mais elle ouvre la porte à des intégrations sur mesure pour des workflows plus efficaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Limites du Code Automatique
&lt;/h2&gt;

&lt;p&gt;Bien que certains plugins comme Anima génèrent du code HTML/CSS ou React, le code produit est souvent brut et nécessite un travail de refactoring. Voici pourquoi :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Le code généré manque parfois d’optimisation ou de sémantique.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Il est difficile d’intégrer directement ce code dans des projets complexes qui suivent des architectures spécifiques (comme BEM, Atomic Design, etc.).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ainsi, Figma doit être vu comme un outil de spécifications plutôt que comme un générateur de code "clé en main".&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Bonnes Pratiques pour une Intégration Réussie
&lt;/h2&gt;

&lt;p&gt;Pour tirer le meilleur parti de Figma dans un workflow design-to-code, voici quelques conseils :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Utilisez des Components : Les "Components" et "Variants" dans Figma permettent de créer des éléments réutilisables, alignés avec des bibliothèques comme Material UI.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Collaboration constante : Encouragez les développeurs à explorer les maquettes directement dans Figma pour clarifier les spécifications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tests et révisions : Validez régulièrement que le design final correspond aux attentes fonctionnelles et techniques.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Figma révolutionne le passage de la maquette au code en offrant des outils collaboratifs, une intégration avec des plugins et une API puissante. Bien qu’il ne remplace pas le travail d’un développeur, il simplifie la communication et accélère le processus d’intégration. En maîtrisant ses fonctionnalités et en combinant ses atouts avec des plugins ou workflows personnalisés, vous pouvez transformer vos maquettes en sites web fonctionnels tout en gagnant du temps et en minimisant les erreurs.&lt;/p&gt;

&lt;p&gt;Si vous êtes designer ou développeur, il est temps de tirer parti de ces outils pour optimiser votre workflow ! 🚀&lt;/p&gt;

</description>
      <category>figma</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>css</category>
    </item>
    <item>
      <title>Better – Un outil de révision de code basé sur l'IA</title>
      <dc:creator>Guillaume Sere</dc:creator>
      <pubDate>Thu, 21 Nov 2024 10:03:47 +0000</pubDate>
      <link>https://forem.com/guillaumesere/better-un-outil-de-revision-de-code-base-sur-lia-5gc1</link>
      <guid>https://forem.com/guillaumesere/better-un-outil-de-revision-de-code-base-sur-lia-5gc1</guid>
      <description>&lt;p&gt;Les revues de code ont toujours été cruciales pour maintenir des normes élevées et renforcer les meilleures pratiques dans un projet de codage. Cet article ne porte pas sur la manière dont les développeurs doivent réviser le code, mais plutôt sur la délégation d'une partie de celui-ci à l'IA.&lt;/p&gt;

&lt;p&gt;Je ne dis pas que l'IA doit être utilisée à la place des outils de formatage et des linters. Au lieu de cela, elle doit être utilisée en plus de cela, pour détecter des éléments triviaux qui pourraient être manqués par un humain. C'est pourquoi j'ai décidé de suivre une action GitHub créer par Murtuzaali Surti qui examine le code d'une demande d'extraction et génère des suggestions à l'aide de l'IA. Laissez-moi vous expliquer comment procéder.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🚨 REMARQUE :&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cette action GitHub est désormais disponible sur la  place de marché GitHub &lt;a href="https://github.com/marketplace/actions/better-code-reviewer-powered-by-ai" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;C'est une action JavaScript - apprenez-en plus sur la création d'actions JavaScript sur GitHub &lt;a href="https://docs.github.com/en/actions/sharing-automations/creating-actions/creating-a-javascript-action" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Obtenir la différence
&lt;/h2&gt;

&lt;p&gt;Pour interagir avec l'API github, j'ai utilisé octokit, qui est une sorte de SDK ou une bibliothèque cliente permettant d'interagir avec l'API github de manière automatique.&lt;/p&gt;

&lt;p&gt;Pour obtenir la différence de la demande d'extraction soulevée, vous devez transmettre l' Accepten-tête avec la valeur application/vnd.github.diffainsi que les paramètres requis.&lt;/p&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%2F1en2iagz29k3e6mhow5n.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%2F1en2iagz29k3e6mhow5n.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Si vous n'êtes pas du tout familier avec les actions GitHub, voici une série d'actions GitHub 101 par Victoria Lo et c'est un bon début: &lt;a href="https://lo-victoria.com/series/github-actions" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Une fois que j'obtiens le diff, je l'analyse et supprime les modifications indésirables, puis je le renvoie dans un schéma illustré ci-dessous :&lt;/p&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%2Fkh0gk4naebzwt7tgzp5p.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%2Fkh0gk4naebzwt7tgzp5p.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ignorer les fichiers
&lt;/h2&gt;

&lt;p&gt;Ignorer des fichiers est assez simple. La liste d'entrée utilisateur nécessite une chaîne de motifs glob séparés par des points-virgules. Elle est ensuite analysée, concaténée avec la liste par défaut des fichiers ignorés et dédupliquée.&lt;/p&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%2Fsov0f84dsia7omprp8a5.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%2Fsov0f84dsia7omprp8a5.png" alt=" " width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La liste des fichiers ignorés est ensuite utilisée pour supprimer les modifications différentielles qui font référence à ces fichiers ignorés. Cela vous donne une charge utile brute contenant uniquement les modifications souhaitées.&lt;/p&gt;

&lt;h2&gt;
  
  
  Générer des suggestions
&lt;/h2&gt;

&lt;p&gt;Une fois que j'obtiens la charge utile brute après avoir analysé la différence, je la transmets à l'API de la plateforme. Voici une implémentation de l'API OpenAI.&lt;/p&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%2Fgq5kljoaoc0wrma33tjn.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%2Fgq5kljoaoc0wrma33tjn.png" alt=" " width="800" height="574"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vous remarquerez peut-être l'utilisation du format de réponse dans l'implémentation de l'API. Il s'agit d'une fonctionnalité fournie par de nombreuses plateformes LLM, qui vous permet d'indiquer au modèle de générer la réponse dans un schéma/format spécifique. C'est particulièrement utile dans ce cas, car je ne veux pas que le modèle hallucine et génère des suggestions pour des fichiers ou des positions incorrects dans la demande d'extraction, ou ajoute de nouvelles propriétés à la charge utile de la réponse.&lt;/p&gt;

&lt;p&gt;L'invite système est là pour donner au modèle plus de contexte sur la manière dont il doit effectuer la révision du code et sur les éléments à garder à l'esprit. Vous pouvez consulter l'invite système ici &lt;a href="https://github.com/murtuzaalisurti/better/blob/main/utils/constants.js?ref=hackernoon.com#L10" rel="noopener noreferrer"&gt;&lt;/a&gt;. L'invite utilisateur contient la différence réelle, les règles et le contexte de la demande d'extraction. C'est ce qui déclenche la révision du code.&lt;/p&gt;

&lt;p&gt;Cette action GitHub prend en charge les modèles OpenAI et Anthropic. Voici comment elle implémente l'API Anthropic :&lt;/p&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%2Fvi2nbk50cb36pwxxd5y3.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%2Fvi2nbk50cb36pwxxd5y3.png" alt=" " width="800" height="818"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ajout de commentaires
&lt;/h2&gt;

&lt;p&gt;Enfin, après avoir récupéré les suggestions, je les nettoie et les transmets à l'API GitHub pour ajouter des commentaires dans le cadre de la révision.&lt;/p&gt;

&lt;p&gt;J'ai choisi la méthode ci-dessous pour ajouter des commentaires car en créant un nouvel avis, vous pouvez ajouter tous les commentaires en une seule fois au lieu d'ajouter un seul commentaire à la fois. L'ajout de commentaires un par un peut également déclencher une limitation du débit, car l'ajout de commentaires déclenche des notifications et vous ne voulez pas spammer les utilisateurs avec des notifications.&lt;/p&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%2Firw9a9cbpqtacgbl3m4i.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%2Firw9a9cbpqtacgbl3m4i.png" alt=" " width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si cet article vous a plu, n'hésitez pas à me suivre pour plus de contenu ou à partager vos propres expériences  dans les commentaires. 🙌&lt;/p&gt;

</description>
      <category>ai</category>
      <category>git</category>
      <category>github</category>
      <category>githubactions</category>
    </item>
    <item>
      <title>Les Nouveautés de React 19 : Une Révolution pour les Développeurs Frontend</title>
      <dc:creator>Guillaume Sere</dc:creator>
      <pubDate>Wed, 20 Nov 2024 10:38:24 +0000</pubDate>
      <link>https://forem.com/guillaumesere/les-nouveautes-de-react-19-une-revolution-pour-les-developpeurs-frontend-24cd</link>
      <guid>https://forem.com/guillaumesere/les-nouveautes-de-react-19-une-revolution-pour-les-developpeurs-frontend-24cd</guid>
      <description>&lt;p&gt;React 19, la dernière version de la célèbre bibliothèque JavaScript, introduit des fonctionnalités et optimisations majeures, améliorant significativement l'expérience des développeurs et des utilisateurs finaux. Voici un aperçu des innovations les plus marquantes.&lt;/p&gt;

&lt;p&gt;Aperçu des fonctionnalités&lt;/p&gt;

&lt;p&gt;⚛️Compilateur React&lt;br&gt;
🗄️ Composants du serveur 🖥&lt;br&gt;
🔄Traitement automatique par lots📦&lt;br&gt;
🗒️Métadonnées SEO&lt;br&gt;
📈Récupération de données améliorée avec Suspense&lt;br&gt;
💼 Chargement des actifs&lt;br&gt;
🪝 Crochets améliorés&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚛️ Compilateur React ⚛️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React19 se dote d'un nouvel assistant appelé React Compiler 💡. C'est comme un compilateur de code intelligent qui fait fonctionner votre code plus rapidement sans que vous ayez à faire de travail supplémentaire. Cela signifie que les personnes qui créent des sites Web peuvent écrire du code plus simple, et le compilateur s'assurera qu'il fonctionne vraiment bien. C'est comme avoir un assistant super intelligent qui nettoie et organise votre chambre pour vous, afin que vous puissiez vous concentrer sur le jeu et vous amuser avec React &lt;a href="https://react.dev/blog/2024/04/25/react-19?ref=hackernoon.com" rel="noopener noreferrer"&gt;&lt;/a&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  🗄️ Composants du serveur 🖥
&lt;/h2&gt;

&lt;p&gt;React19 est doté du super pouvoir « 🖥Composants serveur ».&lt;/p&gt;

&lt;p&gt;C'est comme avoir un outil de rendu intelligent qui fait une partie du travail avant même que vous le demandiez !&lt;/p&gt;

&lt;p&gt;React19 restitue les composants de l'interface utilisateur sur le serveur, indépendamment de votre application côté client ou de la configuration traditionnelle de rendu côté serveur (SSR). En pré-rendant les composants sur le serveur, les RSC peuvent automatiquement améliorer les temps de chargement des pages.&lt;/p&gt;

&lt;p&gt;Cela signifie que lorsque vous ouvrez un site Web, les images et les mots s'affichent beaucoup plus rapidement. C'est particulièrement utile pour les sites Web contenant de nombreuses fonctionnalités intéressantes. Le plus intéressant est que ces composants de serveur peuvent fonctionner de différentes manières en fonction des besoins du site Web.&lt;/p&gt;

&lt;p&gt;Exemple de code : composants du serveur&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fichier : ServerComponent.server.js&lt;/strong&gt;&lt;/p&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%2F1colracntncemzj5am7e.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%2F1colracntncemzj5am7e.png" alt=" " width="706" height="97"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ce composant React est un Server Component. Cela signifie qu'il est rendu côté serveur avant d'être envoyé au client. Le rendu côté serveur est particulièrement utile pour :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Améliorer les performances : Les données sont générées côté serveur, ce qui réduit la charge sur le client.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SEO : Le contenu généré est directement visible pour les moteurs de recherche.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ce composant est suffixé par .server.js, ce qui indique qu'il est destiné uniquement au rendu serveur. React utilise cette convention pour distinguer les composants rendus côté serveur de ceux rendus côté client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fichier : App.client.js&lt;/strong&gt;&lt;/p&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%2Fnwqdzstbhjz7392vn1u5.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%2Fnwqdzstbhjz7392vn1u5.png" alt=" " width="701" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Importation de ServerComponent&lt;br&gt;
Le composant ServerComponent (rendu côté serveur) est importé dans l'application React côté client.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Composant App&lt;br&gt;
Le composant App est un Client Component, destiné à être rendu côté client. Il inclut le ServerComponent dans son rendu.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rendu côté client avec ReactDOM&lt;br&gt;
La méthode createRoot initialise l'application dans un élément DOM avec l'ID root. Ensuite, le composant App (et par extension, ses composants enfants) est rendu.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Comment ça fonctionne ?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Côté serveur :&lt;br&gt;
ServerComponent.server.js est rendu sur le serveur, générant du HTML statique qui est envoyé au client.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Côté client :&lt;br&gt;
Une fois le contenu reçu, React hydrate l'application, en ajoutant l'interactivité client.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Pourquoi utiliser Server Components ?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Optimisation des performances&lt;br&gt;
Les calculs lourds ou les appels API sont gérés côté serveur, réduisant la latence pour l'utilisateur final.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Facilité de développement&lt;br&gt;
La séparation entre Server et Client Components permet de mieux structurer l'application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Flexibilité&lt;br&gt;
React Server Components peuvent être combinés avec des frameworks comme Next.js pour profiter du meilleur des deux mondes (Static Site Generation + Server-Side Rendering).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🔄Traitement automatique par lots📦
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;React 19 introduit le traitement par lots automatique pour toutes les mises à jour dans les gestionnaires d'événements. Cela signifie que plusieurs mises à jour d'état dans un seul gestionnaire d'événements seront désormais traitées par lots automatiquement, ce qui entraînera moins de rendus et des performances améliorées.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Exemple de code : traitement par lots automatique&lt;/p&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%2Fuga7g909kpdmcifogvhe.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%2Fuga7g909kpdmcifogvhe.png" alt=" " width="657" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🗒️Métadonnées SEO 📝
&lt;/h2&gt;

&lt;p&gt;React 19 est désormais une fonctionnalité AutoSEO qui permet de trouver des sites Web sur Internet ! Désormais, React simplifie les éléments sensibles au référencement et vous pouvez facilement contrôler les titres, les descriptions et d'autres éléments pertinents pour le référencement directement dans votre application React. De cette façon, lorsque quelqu'un recherche quelque chose sur Internet, il peut trouver les bons sites Web plus rapidement.&lt;/p&gt;

&lt;h2&gt;
  
  
  📈Récupération de données améliorée avec Suspense
&lt;/h2&gt;

&lt;p&gt;React 19 s'appuie sur la fonctionnalité Suspense pour rendre la récupération des données plus simple et plus intuitive. Grâce aux nouvelles fonctionnalités de récupération des données, vous pouvez désormais gérer les opérations asynchrones de manière plus élégante au sein de vos composants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemple de code : Récupération de données avec Suspense&lt;/strong&gt;&lt;/p&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%2Fiwhyl0esgd1tuwygi0ms.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%2Fiwhyl0esgd1tuwygi0ms.png" alt=" " width="720" height="797"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💼 Chargement des actifs
&lt;/h2&gt;

&lt;p&gt;React 19 dispose d'une fonctionnalité où les actifs se chargent automatiquement en arrière-plan afin que les sites Web fonctionnent plus rapidement et soient plus beaux !&lt;/p&gt;

&lt;p&gt;Il commence à charger des images et d'autres éléments pour la page suivante pendant que vous regardez toujours la page actuelle. Cela signifie que lorsque vous cliquez pour accéder à une nouvelle page, elle s'affiche très rapidement !&lt;/p&gt;

&lt;p&gt;Avez-vous déjà vu un site Web qui avait l'air bizarre pendant une fraction de seconde lors de son premier chargement ? Comme si les mots n'étaient pas au bon endroit ou que les couleurs étaient mélangées ? React 19 corrige également ce problème. Il s'assure que tout semble correct avant de vous le montrer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemple de code : rendu simultané&lt;/strong&gt;&lt;/p&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%2Fqk947vilpt561f6pzp6l.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%2Fqk947vilpt561f6pzp6l.png" alt=" " width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De cette façon, le site Web peut charger des éléments en arrière-plan sans vous déranger pendant que vous l'utilisez. Concentrez-vous sur ce qui compte.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Crochets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React 19 introduit de nouveaux hooks pour aider à gérer les événements et les mises à jour optimistes de l'interface utilisateur plus efficacement. Le hook useEvent fournit un moyen plus simple de gérer les écouteurs d'événements, tandis que le hook useOptimistic permet de gérer les états optimistes de l'interface utilisateur.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemple de code : hook useEvent&lt;/strong&gt;&lt;/p&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%2Fcz976zqkcfg79yp5zxjl.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%2Fcz976zqkcfg79yp5zxjl.png" alt=" " width="788" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemple de code : hook useOptimistic&lt;/strong&gt;&lt;/p&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%2F2bfbblq8cp8n4ra0tstk.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%2F2bfbblq8cp8n4ra0tstk.png" alt=" " width="732" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si cet article vous a plu, n'hésitez pas à me suivre pour plus de contenu ou à partager vos propres expériences dans les commentaires. 🙌&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>programming</category>
      <category>node</category>
    </item>
    <item>
      <title>Pourquoi Cursor révolutionne l'expérience des développeurs</title>
      <dc:creator>Guillaume Sere</dc:creator>
      <pubDate>Tue, 19 Nov 2024 13:42:01 +0000</pubDate>
      <link>https://forem.com/guillaumesere/pourquoi-cursor-revolutionne-lexperience-des-developpeurs-3kbn</link>
      <guid>https://forem.com/guillaumesere/pourquoi-cursor-revolutionne-lexperience-des-developpeurs-3kbn</guid>
      <description>&lt;p&gt;Depuis quelques années, les outils destinés aux développeurs ne cessent d’évoluer. Parmi eux, Cursor, un éditeur de code encore relativement peu connu, commence à se démarquer. Si vous cherchez un éditeur rapide, moderne et adapté aux besoins des développeurs d’aujourd’hui, Cursor mérite toute votre attention. Voici pourquoi cet outil pourrait bien révolutionner votre workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Une interface minimaliste et moderne&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cursor mise sur une interface épurée et une expérience utilisateur fluide. Contrairement à des éditeurs populaires comme Visual Studio Code ou IntelliJ IDEA, Cursor n’est pas encombré de fonctionnalités superflues dès son installation.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Moins de distractions pour se concentrer sur le code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Une navigation intuitive et simple à personnaliser.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;L’interface par défaut est un véritable vent de fraîcheur pour ceux qui souhaitent un éditeur rapide et sans surcharge visuelle.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;2. Performances impressionnantes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cursor a été conçu avec la vitesse en tête. Qu’il s’agisse d’ouvrir un projet complexe ou d’exécuter des tâches courantes, il excelle là où d'autres éditeurs peuvent souffrir de lenteurs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pourquoi c'est important ?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Un temps de chargement minimal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Une exécution fluide même pour les projets de grande envergure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Une gestion optimisée des extensions pour éviter les ralentissements.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Intégration de l’intelligence artificielle&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cursor va au-delà de la simple édition de code grâce à une intégration native de l’IA. Cet outil propose des suggestions contextuelles et des assistants intelligents pour :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Identifier les bugs potentiels.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Générer du code à partir de descriptions en langage naturel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Répondre aux questions directement dans l’éditeur (similaire à GitHub Copilot, mais mieux intégré).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Imaginez un assistant IA qui comprend votre projet et vous guide en temps réel. Avec Cursor, c'est une réalité.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;4. Compatibilité avec les projets modernes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cursor prend en charge les principaux langages et frameworks utilisés aujourd'hui, notamment :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;JavaScript, TypeScript, Python.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Les frameworks modernes comme React, Vue.js, et Next.js.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;De plus, l'éditeur propose une configuration simplifiée pour :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Linting et formatage (ESLint, Prettier).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gestion des dépôts Git avec une interface intuitive.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Une alternative aux éditeurs classiques&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pourquoi choisir Cursor au lieu de Visual Studio Code ou JetBrains ? Voici quelques points qui le distinguent :&lt;/p&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%2F6s246vaui6bkemyaiucg.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%2F6s246vaui6bkemyaiucg.png" alt=" " width="734" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Suggestions intelligentes avec l’IA&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cursor intègre une intelligence artificielle directement dans l’éditeur pour améliorer l’efficacité des développeurs. Voici un exemple :&lt;/p&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%2Fxwhfhrrr1p6aih8scd59.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%2Fxwhfhrrr1p6aih8scd59.png" alt=" " width="705" height="124"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En tapant cette description dans Cursor, l’éditeur pourrait automatiquement générer :&lt;/p&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%2Fgbes6ir4jk0oo6lcu0aj.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%2Fgbes6ir4jk0oo6lcu0aj.png" alt=" " width="705" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Refactorisation en un clic&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imaginez un projet React avec des composants mal organisés. Avec Cursor, vous pouvez utiliser son assistant IA pour améliorer le code.&lt;/p&gt;

&lt;p&gt;Avant refactorisation :&lt;/p&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%2F2hopdsjyvhzdyd1atwq7.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%2F2hopdsjyvhzdyd1atwq7.png" alt=" " width="706" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demande dans Cursor : “Refactorise ce composant pour utiliser un hook.”&lt;/p&gt;

&lt;p&gt;Après refactorisation :&lt;/p&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%2Fxp2p5s7gzgfjwigdt8iu.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%2Fxp2p5s7gzgfjwigdt8iu.png" alt=" " width="706" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Détection et correction d’erreurs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cursor peut détecter des erreurs potentielles et proposer des corrections automatiques. Par exemple, erreur dans le code :&lt;/p&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%2Fw1cfjsqhtnd5njt3062g.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%2Fw1cfjsqhtnd5njt3062g.png" alt=" " width="503" height="77"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cursor soulignera l’erreur d’indentation et proposera :&lt;/p&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%2F87a0c12dqx5fksx4zv2m.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%2F87a0c12dqx5fksx4zv2m.png" alt=" " width="418" height="75"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Génération de tests unitaires&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cursor peut également vous aider à créer des tests pour votre code.&lt;/p&gt;

&lt;p&gt;Code à tester :&lt;/p&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%2F0prm10lci9dnkedwp5h0.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%2F0prm10lci9dnkedwp5h0.png" alt=" " width="362" height="90"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demande à l’IA : “Génère un test unitaire pour cette fonction avec Jest.”&lt;/p&gt;

&lt;p&gt;Résultat généré :&lt;/p&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%2Fss6cm8l3e2wj18tri46b.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%2Fss6cm8l3e2wj18tri46b.png" alt=" " width="703" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Recherche de documentation intégrée&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cursor permet également de rechercher rapidement dans la documentation sans quitter l’éditeur. Par exemple :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Tapez une commande comme “Qu’est-ce que useState dans React ?”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cursor affichera un résumé de la documentation officielle de React directement dans l’éditeur.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;10. Collaboration simplifiée avec des commentaires IA&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lors d’une révision de code, Cursor peut générer des commentaires automatiques pour expliquer des sections complexes.&lt;/p&gt;

&lt;p&gt;Exemple :&lt;/p&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%2Ft9he78vie4q3dffw6dqw.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%2Ft9he78vie4q3dffw6dqw.png" alt=" " width="701" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demandez à l’IA : “Ajoute des commentaires pour expliquer ce code.”&lt;/p&gt;

&lt;p&gt;Résultat :&lt;/p&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%2Fif3359g5tjdaj61xjwjz.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%2Fif3359g5tjdaj61xjwjz.png" alt=" " width="704" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conclusion : Cursor, l’éditeur de demain&lt;/p&gt;

&lt;p&gt;Cursor ne cherche pas à remplacer vos outils actuels, mais à offrir une expérience moderne et simplifiée. Si vous êtes un développeur à la recherche d’un éditeur performant et axé sur la productivité, il est temps de tester Cursor.&lt;/p&gt;

&lt;p&gt;👉 Téléchargez Cursor &lt;a href="https://www.cursor.com/" rel="noopener noreferrer"&gt;https://www.cursor.com/&lt;/a&gt; et découvrez comment il peut révolutionner votre manière de coder.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
