<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - React</title>
		<link>https://www.developpez.net/forums/</link>
		<description><![CDATA[Forum d'entraide sur le framework React]]></description>
		<language>fr</language>
		<lastBuildDate>Wed, 06 May 2026 10:43:33 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.png</url>
			<title>Forum du club des développeurs et IT Pro - React</title>
			<link>https://www.developpez.net/forums/</link>
		</image>
		<item>
			<title>globalThis renvoie undefined</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2182953&amp;goto=newpost</link>
			<pubDate>Tue, 31 Mar 2026 11:53:01 GMT</pubDate>
			<description>Bonjour, 
 
Dans mon appli...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
Dans mon appli javascript (avec React), j'ai installé un package pour transformer des fichiers. Quand je lance mon code, j'ai l'erreur :<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #800000;">TypeError</span>: Invalid URL
    at <span style="color: #0000ff;">new</span> URL <span class="br0">&#40;</span><span style="color: #800000;">node</span>:internal/<span style="color: #800000;">url</span>:<span style="color: #cc66cc;">825</span>:<span style="color: #cc66cc;">25</span><span class="br0">&#41;</span>
...</pre></td></tr></table></code><hr />
</div>En creusant dans le code source du package, ça vient d'une fonction qui utilise globalThis:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">const</span> checkSuffix = <span class="br0">&#40;</span>base, suffix<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span>
  <span style="color: #0000ff;">const</span> url = <span style="color: #0000ff;">new</span> <span style="color: #0080ff;">URL</span><span class="br0">&#40;</span>base, globalThis?.<span style="color: #0080ff;">document</span>?.<span style="color: #0080ff;">location</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">return</span> url.pathname.<span style="color: #0080ff;">slice</span><span class="br0">&#40;</span><span style="color: #cc66cc;">-4</span><span class="br0">&#41;</span>.<span style="color: #0080ff;">toLowerCase</span><span class="br0">&#40;</span><span class="br0">&#41;</span> === suffix;
<span class="br0">&#125;</span>;</pre></td></tr></table></code><hr />
</div>En mettant des instructions console.log dans cette fonction, base me renvoie bien le chemin relatif de mon fichier, mais globalThis?.document?.location a pour valeur undefined.<br />
<br />
Est-ce qu'il y a quelque chose de particulier à paramétrer pour bien prendre en compte globalThis?<br />
<br />
Merci,<br />
<br />
Nico</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2196/javascript/bibliotheques-frameworks/react/">React</category>
			<dc:creator>DiverSIG</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2182953/javascript/bibliotheques-frameworks/react/globalthis-renvoie-undefined/</guid>
		</item>
		<item>
			<title>charger un fichier Excel</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2182865&amp;goto=newpost</link>
			<pubDate>Wed, 25 Mar 2026 18:09:09 GMT</pubDate>
			<description>Bonjour, 
 
Je voudrais dans...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
Je voudrais dans mon appli charger un fichier excel, le lire, et renvoyer des infos au format json<br />
Pour cela, j'utilise axios.<br />
Je commence d'abord par des choses simples (afficher la liste des noms des feuilles du classeur excel)<br />
<br />
côté frontend :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">import</span> axios <span style="color: #0000ff;">from</span> <span style="color: #FF0000;">'axios'</span>;
&nbsp;
<span style="color: #0000ff;">function</span> <span style="color: #0080ff;">MyComponent</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
  <span style="color: #0000ff;">const</span> <span class="br0">&#91;</span>file, setFile<span class="br0">&#93;</span> = <span style="color: #0080ff;">useState</span><span class="br0">&#40;</span><span style="color: #339933;">null</span><span class="br0">&#41;</span>
&nbsp;
  <span style="color: #0000ff;">const</span> handleFile = <span style="color: #0000ff;">async</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span>
    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>!file<span class="br0">&#41;</span> <span style="color: #0000ff;">return</span>;
    <span style="color: #0000ff;">const</span> formData = <span style="color: #0000ff;">new</span> <span style="color: #0080ff;">FormData</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
    formData.<span style="color: #0080ff;">append</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;file&quot;</span>, file<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">const</span> res = <span style="color: #0000ff;">await</span> axios.<span style="color: #0080ff;">post</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;/backend/uploadFile&quot;</span>, formData, <span class="br0">&#123;</span>
      <span style="color: #800000;">headers</span>: <span class="br0">&#123;</span> <span style="color: #FF0000;">'Content-Type'</span>: <span style="color: #FF0000;">'multipart/form-data'</span> <span class="br0">&#125;</span>,
      <span style="color: #800000;">onUploadProgress</span>: <span class="br0">&#40;</span>progressEvent<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span>
        console.<span style="color: #0080ff;">log</span><span class="br0">&#40;</span>
          <span style="color: #FF0000;">&quot;Upload progress: &quot;</span> +
            <span style="color: #0080ff;">Math</span>.<span style="color: #0080ff;">round</span><span class="br0">&#40;</span>
              <span class="br0">&#40;</span>progressEvent.loaded / <span class="br0">&#40;</span>progressEvent.total ?? <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> * <span style="color: #cc66cc;">100</span>
            <span class="br0">&#41;</span> +
            <span style="color: #FF0000;">&quot;%&quot;</span>
        <span class="br0">&#41;</span>;
      <span class="br0">&#125;</span>,
    <span class="br0">&#125;</span><span class="br0">&#41;</span>;
    console.<span style="color: #0080ff;">log</span><span class="br0">&#40;</span>res<span class="br0">&#41;</span>;
  <span class="br0">&#125;</span>
&nbsp;
&nbsp;
  <span style="color: #0000ff;">return</span> <span class="br0">&#40;</span>
    &lt;&gt;
    &lt;input type=<span style="color: #FF0000;">&quot;file&quot;</span> <span style="color: #0080ff;">name</span>=<span style="color: #FF0000;">&quot;filename2&quot;</span> id=<span style="color: #FF0000;">&quot;filename2&quot;</span> required onChange=<span class="br0">&#123;</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> =&gt; <span style="color: #0080ff;">setFile</span><span class="br0">&#40;</span>e.target.files<span class="br0">&#41;</span><span class="br0">&#125;</span>/&gt;
    &lt;<span style="color: #0080ff;">button</span> onClick=<span class="br0">&#123;</span>handleFile<span class="br0">&#125;</span>&gt;UPLOAD&lt;/button&gt;
    &lt;/&gt;
  <span class="br0">&#41;</span>;
<span class="br0">&#125;</span></pre></td></tr></table></code><hr />
</div><br />
côté backend :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">import</span> express <span style="color: #0000ff;">from</span> <span style="color: #FF0000;">&quot;express&quot;</span>;
<span style="color: #0000ff;">import</span> multer <span style="color: #0000ff;">from</span> <span style="color: #FF0000;">&quot;multer&quot;</span>;
&nbsp;
<span style="color: #0000ff;">import</span> * <span style="color: #0000ff;">as</span> XLSX <span style="color: #0000ff;">from</span> <span style="color: #FF0000;">'xlsx'</span>;
&nbsp;
<span style="color: #0000ff;">const</span> app = <span style="color: #0080ff;">express</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
app.<span style="color: #0080ff;">use</span><span class="br0">&#40;</span>express.<span style="color: #0080ff;">json</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
&nbsp;
app.<span style="color: #0080ff;">get</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;/helloText&quot;</span>, <span class="br0">&#40;</span>req, res<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span>
  res.<span style="color: #0080ff;">send</span><span class="br0">&#40;</span><span class="br0">&#123;</span> <span style="color: #800000;">myResponse</span>: <span style="color: #FF0000;">&quot;Hello World!&quot;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span><span class="br0">&#41;</span>;
&nbsp;
<span style="color: #0000ff;">const</span> upload = <span style="color: #0080ff;">multer</span><span class="br0">&#40;</span><span class="br0">&#123;</span> <span style="color: #800000;">dest</span>: <span style="color: #FF0000;">&quot;tmp/uploads/&quot;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span>;
app.<span style="color: #0080ff;">post</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;/uploadFile&quot;</span>, upload.<span style="color: #0080ff;">single</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;file&quot;</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span>req, res<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span>
&nbsp;
  <span style="color: #0000ff;">const</span> uploadedFile = req.file;
  console.<span style="color: #0080ff;">log</span><span class="br0">&#40;</span>req.file<span class="br0">&#41;</span>
&nbsp;
  console.<span style="color: #0080ff;">log</span><span class="br0">&#40;</span>uploadedFile.originalname<span class="br0">&#41;</span>;
&nbsp;
  <span style="color: #0000ff;">const</span> workbook = XLSX.<span style="color: #0080ff;">read</span><span class="br0">&#40;</span>uploadedFile.path, <span class="br0">&#123;</span><span style="color: #800000;">type</span>: <span style="color: #FF0000;">&quot;binary&quot;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;
  console.<span style="color: #0080ff;">log</span><span class="br0">&#40;</span>workbook.SheetNames<span class="br0">&#41;</span>
&nbsp;
  res.<span style="color: #0080ff;">send</span><span class="br0">&#40;</span><span class="br0">&#123;</span> <span style="color: #800000;">myResponse</span>: <span style="color: #FF0000;">&quot;File uploaded successfully&quot;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span><span class="br0">&#41;</span>;
&nbsp;
&nbsp;
app.<span style="color: #0080ff;">listen</span><span class="br0">&#40;</span><span style="color: #cc66cc;">8002</span>, <span class="br0">&#40;</span><span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span>
  console.<span style="color: #0080ff;">log</span><span class="br0">&#40;</span><span style="color: #FF0000;">`Server is running on port <span style="color: #800000;">${8002}</span>`</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span><span class="br0">&#41;</span>;</pre></td></tr></table></code><hr />
</div>Quand j'exécute, j'ai bien le fichier qui est téléchargé dans tmp/uploads, avec un nom bizarre (ex : b096c76afc89ab236a54729f5d8a2798), mais quand je lui remet l'extension .xls et que je l'ouvre, j'ai bien mon fichier<br />
<br />
Quand j'affiche req.file, j'ai les infos du fichier :<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span class="br0">&#123;</span>
  <span style="color: #800000;">fieldname</span>: <span style="color: #FF0000;">'file'</span>,
  <span style="color: #800000;">originalname</span>: <span style="color: #FF0000;">'Donnees XRF - 01-BIC3-R&Atilde;&copy;sultats2025-09.xlsx'</span>,
  <span style="color: #800000;">encoding</span>: <span style="color: #FF0000;">'7bit'</span>,
  <span style="color: #800000;">mimetype</span>: <span style="color: #FF0000;">'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'</span>,
  <span style="color: #800000;">destination</span>: <span style="color: #FF0000;">'tmp/uploads/'</span>,
  <span style="color: #800000;">filename</span>: <span style="color: #FF0000;">'a6cb9674be41e209358c46ed6e73eca6'</span>,
  <span style="color: #800000;">path</span>: <span style="color: #FF0000;">'tmp<span style="color: #800000;">\\</span>uploads<span style="color: #800000;">\\</span>a6cb9674be41e209358c46ed6e73eca6'</span>,
  <span style="color: #800000;">size</span>: <span style="color: #cc66cc;">61379</span>
<span class="br0">&#125;</span></pre></td></tr></table></code><hr />
</div>-&gt; à ce propos, comment gérer l'encodage et les lettres accentuées ? (voir originalname)<br />
<br />
<br />
Quand je veux afficher la liste des noms des feuilles du classeur excel, j'ai :<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><span class="br0">&#91;</span> <span style="color: #FF0000;">'Sheet1'</span> <span class="br0">&#93;</span></code><hr />
</div>Qu'est ce qui cloche ? comment avoir la liste des noms des feuilles ?<br />
<br />
<br />
Merci,<br />
Nico</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2196/javascript/bibliotheques-frameworks/react/">React</category>
			<dc:creator>DiverSIG</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2182865/javascript/bibliotheques-frameworks/react/charger-fichier-excel/</guid>
		</item>
		<item>
			<title>sélection dans une table Material React Table</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2182759&amp;goto=newpost</link>
			<pubDate>Thu, 19 Mar 2026 17:47:09 GMT</pubDate>
			<description><![CDATA[Bonjour, 
 
J'utilise un...]]></description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
J'utilise un composant Material React Table.<br />
J'ai un tableau avec des index (ex : [0, 5, 8]) et je voudrais, en cliquant sur un bouton à l'extérieur de la table, que les lignes de la table correspondant aux index de mon tableau soient sélectionnées.<br />
<br />
Comment faire cela ?<br />
<br />
Merci,<br />
<br />
Nico</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2196/javascript/bibliotheques-frameworks/react/">React</category>
			<dc:creator>DiverSIG</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2182759/javascript/bibliotheques-frameworks/react/selection-table-material-react-table/</guid>
		</item>
		<item>
			<title><![CDATA[Comment nous avons reconstruit Next.js avec l'IA en une semaine]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2182338&amp;goto=newpost</link>
			<pubDate>Thu, 26 Feb 2026 13:59:03 GMT</pubDate>
			<description>*Comment nous avons...</description>
			<content:encoded><![CDATA[<div><b><font size="4">Comment nous avons reconstruit Next.js avec l'IA en une semaine, l'interface API Next.js vinext permet de créer des applications de production jusqu'à 4 fois plus rapidement, par Steve Faulkner</font></b><br />
<br />
Next.js est un framework de développement web open source full-stack créé par la société privée Vercel, qui fournit des applications web basées sur React avec rendu côté serveur et rendu statique. La documentation React mentionne Next.js parmi les « chaînes d'outils recommandées » et le conseille aux développeurs qui « créent un site web rendu côté serveur avec Node.js ». Alors que les applications React traditionnelles ne peuvent rendre leur contenu que dans le navigateur côté client, Next.js étend cette fonctionnalité pour inclure les applications rendues côté serveur. Les droits d'auteur et les marques commerciales de Next.js sont détenus par Vercel, qui assure également la maintenance et dirige son développement open source.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p674574d1772122538/javascript/bibliotheques-frameworks/react/avons-reconstruit-next-js-l-ia-semaine/1.jpg/" border="0" alt="Nom : 1.jpg
Affichages : 86394
Taille : 35,7 Ko"  style="float: CONFIG" /></div><br />
La semaine dernière, un ingénieur et un modèle d'IA ont reconstruit de zéro le framework front-end le plus populaire. Le résultat, vinext (prononcé « vee-next »), est un remplacement direct de Next.js, construit sur Vite, qui se déploie sur Cloudflare Workers à l'aide d'une seule commande. Lors des premiers benchmarks, il construit des applications de production jusqu'à 4 fois plus rapidement et produit des bundles clients jusqu'à 57 % plus petits. Et nous avons déjà des clients qui l'utilisent en production. <br />
<br />
Le tout a coûté environ 1 100 dollars en jetons.<br />
<br />
<b><font size="3">Le problème de déploiement de Next.js</font></b><br />
<br />
Next.js est le framework React le plus populaire. Des millions de développeurs l'utilisent. Il alimente une grande partie du web de production, et pour cause. L'expérience développeur est excellente.<br />
<br />
Mais Next.js pose un problème de déploiement lorsqu'il est utilisé dans un écosystème sans serveur plus large. Les outils sont entièrement sur mesure : Next.js a investi massivement dans Turbopack, mais si vous souhaitez le déployer sur Cloudflare, Netlify ou AWS Lambda, vous devez reprendre le résultat de la compilation et le remodeler en quelque chose que la plateforme cible peut réellement exécuter.<br />
<br />
Si vous vous dites : « N'est-ce pas ce que fait OpenNext ? », vous avez raison. <br />
<br />
C'est en effet le problème qu'OpenNext a été conçu pour résoudre. De nombreux efforts d'ingénierie ont été consacrés à OpenNext par plusieurs fournisseurs, dont nous chez Cloudflare. Cela fonctionne, mais se heurte rapidement à des limites et devient un jeu de tape-taupe. <br />
<br />
S'appuyer sur le résultat de Next.js comme base s'est avéré être une approche difficile et fragile. Comme OpenNext doit procéder à une ingénierie inverse du résultat de la compilation de Next.js, cela entraîne des changements imprévisibles entre les versions, qui demandent beaucoup de travail pour être corrigés. <br />
<br />
Next.js travaille sur une API d'adaptateurs de premier ordre, et nous collaborons avec eux à ce sujet. Il s'agit encore d'un projet naissant, mais même avec des adaptateurs, vous continuez à vous appuyer sur la chaîne d'outils Turbopack sur mesure. Et les adaptateurs ne couvrent que la construction et le déploiement. Pendant le développement, next dev fonctionne exclusivement dans Node.js, sans possibilité d'intégrer un autre runtime. Si votre application utilise des API spécifiques à la plateforme telles que Durable Objects, KV ou AI bindings, vous ne pouvez pas tester ce code en développement sans recourir à des solutions de contournement.<br />
<br />
<b><font size="3">Présentation de vinext</font></b><br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p674576d1772122569/javascript/bibliotheques-frameworks/react/avons-reconstruit-next-js-l-ia-semaine/2.jpg/" border="0" alt="Nom : 2.jpg
Affichages : 5651
Taille : 6,8 Ko"  style="float: CONFIG" /></div><br />
Et si, au lieu d'adapter la sortie de Next.js, nous réimplémentions directement l'interface API de Next.js sur Vite ? Vite est l'outil de compilation utilisé par la plupart des écosystèmes front-end en dehors de Next.js, qui alimente des frameworks tels que Astro, SvelteKit, Nuxt et Remix. Une réimplémentation propre, pas simplement un wrapper ou un adaptateur. Honnêtement, nous ne pensions pas que cela fonctionnerait. Mais nous sommes en 2026, et le coût de développement des logiciels a complètement changé.<br />
<br />
Nous sommes allés beaucoup plus loin que prévu.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">npm install vinext</code><hr />
</div><br />
<br />
Remplacez next par vinext dans vos scripts et tout le reste reste inchangé. Vos fichiers app/, pages/ et next.config.js existants fonctionnent tels quels.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">vinext dev          # Development server <span style="color: #0000ff;">with</span> HMR
vinext build        # Production build
vinext deploy       # Build and deploy to Cloudflare Workers</pre></td></tr></table></code><hr />
</div><br />
<br />
Il ne s'agit pas d'un wrapper autour de Next.js et de la sortie Turbopack. Il s'agit d'une implémentation alternative de la surface API : routage, rendu serveur, composants React Server, actions serveur, mise en cache, middleware. Le tout est construit sur Vite en tant que plugin. Plus important encore, la sortie Vite fonctionne sur n'importe quelle plateforme grâce à l'API Vite Environment.<br />
<br />
<b><font size="3">Les chiffres</font></b><br />
<br />
Les premiers benchmarks sont prometteurs. Nous avons comparé vinext à Next.js 16 à l'aide d'une application App Router partagée à 33 routes. Les deux frameworks effectuent le même travail : compilation, regroupement et préparation des routes rendues par le serveur. Nous avons désactivé la vérification de type TypeScript et ESLint dans la compilation de Next.js (Vite ne les exécute pas pendant les compilations) et avons utilisé force-dynamic afin que Next.js ne passe pas de temps supplémentaire à pré-rendre les routes statiques, ce qui ralentirait injustement ses chiffres. L'objectif était de mesurer uniquement la vitesse du regroupement et de la compilation, rien d'autre. Les benchmarks sont exécutés sur GitHub CI à chaque fusion vers le réseau principal.<br />
<br />
<b>Temps de compilation en production :</b><br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p674577d1772122577/javascript/bibliotheques-frameworks/react/avons-reconstruit-next-js-l-ia-semaine/3.jpg/" border="0" alt="Nom : 3.jpg
Affichages : 5647
Taille : 32,5 Ko"  style="float: CONFIG" /></div><br />
<b>Taille du bundle client (compressé au format gzip) :</b><br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p674578d1772122615/javascript/bibliotheques-frameworks/react/avons-reconstruit-next-js-l-ia-semaine/4.jpg/" border="0" alt="Nom : 4.jpg
Affichages : 5643
Taille : 33,1 Ko"  style="float: CONFIG" /></div><br />
Ces benchmarks mesurent la vitesse de compilation et de regroupement, et non les performances de service en production. Le dispositif de test est une application unique à 33 routes, et non un échantillon représentatif de toutes les applications de production. Nous nous attendons à ce que ces chiffres évoluent à mesure que les trois projets continuent à se développer. La méthodologie complète et les résultats historiques sont publics. Considérez-les comme indicatifs et non définitifs.<br />
<br />
La tendance est toutefois encourageante. L'architecture de Vite, et en particulier Rolldown (le bundler basé sur Rust qui sera intégré à Vite 8), présente des avantages structurels pour les performances de compilation qui apparaissent clairement ici.<br />
<br />
<b><font size="3">Déploiement sur Cloudflare Workers</font></b><br />
<br />
vinext est construit avec Cloudflare Workers comme première cible de déploiement. Une seule commande vous permet de passer du code source à un Worker en cours d'exécution :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">vinext deploy</code><hr />
</div><br />
<br />
Cela gère tout : la construction de l'application, la génération automatique de la configuration du Worker et le déploiement. L'App Router et le Pages Router fonctionnent tous deux sur Workers, avec une hydratation complète côté client, des composants interactifs, une navigation côté client et l'état React.<br />
<br />
Pour la mise en cache de production, vinext inclut un gestionnaire de cache Cloudflare KV qui vous offre une régénération statique incrémentielle (ISR) prête à l'emploi :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">import</span> <span class="br0">&#123;</span> KVCacheHandler <span class="br0">&#125;</span> <span style="color: #0000ff;">from</span> <span style="color: #FF0000;">&quot;vinext/cloudflare&quot;</span>;
<span style="color: #0000ff;">import</span> <span class="br0">&#123;</span> setCacheHandler <span class="br0">&#125;</span> <span style="color: #0000ff;">from</span> <span style="color: #FF0000;">&quot;next/cache&quot;</span>;
&nbsp;
<span style="color: #0080ff;">setCacheHandler</span><span class="br0">&#40;</span><span style="color: #0000ff;">new</span> <span style="color: #0080ff;">KVCacheHandler</span><span class="br0">&#40;</span>env.MY_KV_NAMESPACE<span class="br0">&#41;</span><span class="br0">&#41;</span>;</pre></td></tr></table></code><hr />
</div><br />
<br />
KV est un bon choix par défaut pour la plupart des applications, mais la couche de mise en cache est conçue pour être modulable. L'appel setCacheHandler signifie que vous pouvez échanger n'importe quel backend qui vous semble pertinent. R2 peut être plus adapté aux applications avec des charges utiles mises en cache importantes ou des modèles d'accès différents. Nous travaillons également à l'amélioration de notre API Cache qui devrait fournir une couche de mise en cache solide avec moins de configuration. L'objectif est la flexibilité : choisissez la stratégie de mise en cache qui convient à votre application.<br />
<br />
Exemples en direct actuellement disponibles :<br />
<br />
- <a rel="nofollow" href="https://app-router-playground.vinext.workers.dev/" target="_blank">App Router Playground</a><br />
<br />
- <a rel="nofollow" href="https://hackernews.vinext.workers.dev/" target="_blank">Clone de Hacker News</a><br />
<br />
- <a rel="nofollow" href="https://app-router-cloudflare.vinext.workers.dev/" target="_blank">App Router minimal</a><br />
<br />
- <a rel="nofollow" href="https://pages-router-cloudflare.vinext.workers.dev/" target="_blank">Pages Router minimal</a><br />
<br />
Nous avons également un exemple en direct de Cloudflare Agents fonctionnant dans une application Next.js, sans avoir besoin de solutions de contournement telles que getPlatformProxy, car l'ensemble de l'application fonctionne désormais dans workerd, pendant les phases de développement et de déploiement. Cela signifie que vous pouvez utiliser Durable Objects, les liaisons IA et tous les autres services spécifiques à Cloudflare sans compromis. <a rel="nofollow" href="https://github.com/cloudflare/vinext-agents-example" target="_blank">Jetez un œil ici.</a><br />
<br />
<b><font size="3">Les frameworks sont un sport d'équipe</font></b><br />
<br />
La cible de déploiement actuelle est Cloudflare Workers, mais ce n'est qu'une petite partie du tableau. Environ 95 % de vinext est du pur Vite. Le routage, les shims de module, le pipeline SSR, l'intégration RSC : rien de tout cela n'est spécifique à Cloudflare.<br />
<br />
Cloudflare cherche à collaborer avec d'autres fournisseurs d'hébergement afin qu'ils adoptent cette chaîne d'outils pour leurs clients (l'effort est minime : nous avons obtenu une preuve de concept fonctionnant sur Vercel en moins de 30 minutes !). Il s'agit d'un projet open source, et pour assurer son succès à long terme, nous pensons qu'il est important de travailler avec des partenaires de l'ensemble de l'écosystème afin de garantir un investissement continu. Les PR provenant d'autres plateformes sont les bienvenues. Si vous souhaitez ajouter une cible de déploiement, ouvrez un ticket ou contactez-nous.<br />
<br />
<b><font size="3">Statut : expérimental</font></b><br />
<br />
Nous tenons à être clairs : vinext est expérimental. Il n'a même pas une semaine d'existence et n'a pas encore été testé en conditions réelles avec un trafic significatif à grande échelle. Si vous l'évaluez pour une application de production, procédez avec la prudence qui s'impose.<br />
<br />
Cela dit, la suite de tests est exhaustive : plus de 1 700 tests Vitest et 380 tests Playwright E2E, y compris des tests directement portés depuis la suite de tests Next.js et la suite de conformité Cloudflare d'OpenNext. Nous l'avons vérifié par rapport au Next.js App Router Playground. La couverture atteint 94 % de la surface API Next.js 16. Les premiers résultats obtenus auprès de clients réels sont encourageants. Nous avons travaillé avec National Design Studio, une équipe qui vise à moderniser toutes les interfaces gouvernementales, sur l'un de leurs sites bêta, CIO.gov. Ils utilisent déjà vinext en production, avec des améliorations significatives en termes de temps de compilation et de taille des paquets.<br />
<br />
Le fichier README est honnête sur ce qui n'est pas pris en charge et ne le sera pas, ainsi que sur les limitations connues. Nous préférons être francs plutôt que de faire des promesses excessives.<br />
<br />
<b><font size="3">Qu'en est-il du pré-rendu ?</font></b><br />
<br />
vinext prend déjà en charge la régénération statique incrémentielle (ISR) dès son installation. Après la première requête vers une page, celle-ci est mise en cache et revalidée en arrière-plan, tout comme Next.js. Cette partie fonctionne aujourd'hui.<br />
<br />
vinext ne prend pas encore en charge le pré-rendu statique au moment de la compilation. Dans Next.js, les pages sans données dynamiques sont rendues lors de la compilation suivante et servies sous forme de HTML statique. Si vous avez des routes dynamiques, vous utilisez generateStaticParams() pour énumérer les pages à construire à l'avance. vinext ne le fait pas... pour l'instant.<br />
<br />
Il s'agit d'une décision de conception intentionnelle pour le lancement. Cela fait partie de la feuille de route, mais si votre site est composé à 100 % de HTML pré-construit avec du contenu statique, vous ne verrez probablement pas beaucoup d'avantages à utiliser vinext aujourd'hui. Cela dit, si un ingénieur peut dépenser 1 100 dollars en jetons et reconstruire Next.js, vous pouvez probablement dépenser 10 dollars et migrer vers un framework basé sur Vite conçu spécifiquement pour le contenu statique, comme Astro (qui se déploie également sur Cloudflare Workers).<br />
<br />
Pour les sites qui ne sont pas purement statiques, cependant, nous pensons pouvoir faire mieux que de tout pré-rendre au moment de la compilation.<br />
<br />
<b><font size="3">Présentation du pré-rendu tenant compte du trafic</font></b><br />
<br />
Next.js pré-rend chaque page répertoriée dans generateStaticParams() pendant la compilation. Un site comportant 10 000 pages de produits signifie 10 000 rendus au moment de la compilation, même si 99 % de ces pages ne recevront peut-être jamais de requête. Les compilations évoluent de manière linéaire avec le nombre de pages. C'est pourquoi les grands sites Next.js finissent par nécessiter 30 minutes de compilation.<br />
<br />
Nous avons donc mis au point le pré-rendu tenant compte du trafic (TPR). Il est encore à l'état expérimental, mais nous prévoyons de le rendre par défaut une fois que nous aurons effectué davantage de tests en conditions réelles.<br />
<br />
L'idée est simple. Cloudflare est déjà le proxy inverse de votre site. Nous disposons de vos données de trafic. Nous savons quelles pages sont réellement visitées. Ainsi, au lieu de tout pré-rendre ou de ne rien pré-rendre, vinext interroge les analyses de zone de Cloudflare au moment du déploiement et ne pré-rend que les pages qui comptent.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0">vinext deploy --experimental-tpr
&nbsp;
  Building...
  Build complete <span class="br0">&#40;</span><span style="color: #cc66cc;">4</span>.2s<span class="br0">&#41;</span>
&nbsp;
  TPR <span class="br0">&#40;</span>experimental<span class="br0">&#41;</span>: Analyzing traffic <span style="color: #0000ff;">for</span> my-store.com <span class="br0">&#40;</span>last 24h<span class="br0">&#41;</span>
  <span style="color: #800000;">TPR</span>: <span style="color: #cc66cc;">12</span>,<span style="color: #cc66cc;">847</span> unique paths &#151; <span style="color: #cc66cc;">184</span> pages cover <span style="color: #cc66cc;">90</span>% <span style="color: #0000ff;">of</span> traffic
  <span style="color: #800000;">TPR</span>: Pre-rendering <span style="color: #cc66cc;">184</span> pages...
  <span style="color: #800000;">TPR</span>: Pre-rendered <span style="color: #cc66cc;">184</span> pages <span style="color: #0000ff;">in</span> <span style="color: #cc66cc;">8</span>.3s &rarr; KV cache
&nbsp;
  Deploying to Cloudflare Workers...</pre></td></tr></table></code><hr />
</div><br />
<br />
Pour un site comportant 100 000 pages de produits, la loi de puissance signifie que 90 % du trafic est généralement dirigé vers 50 à 200 pages. Celles-ci sont pré-rendues en quelques secondes. Tout le reste revient au SSR à la demande et est mis en cache via ISR après la première requête. Chaque nouveau déploiement actualise l'ensemble en fonction des modèles de trafic actuels. Les pages qui deviennent virales sont automatiquement sélectionnées. Tout cela fonctionne sans generateStaticParams() et sans coupler votre build à votre base de données de production.<br />
<br />
<b><font size="3">Relever le défi Next.js, mais cette fois-ci avec l'IA</font></b><br />
<br />
Un projet comme celui-ci prendrait normalement des mois, voire des années, à une équipe d'ingénieurs. Plusieurs équipes de différentes entreprises s'y sont essayées, mais l'ampleur de la tâche est tout simplement énorme. Nous avons essayé une fois chez Cloudflare ! Deux routeurs, plus de 33 modules shims, des pipelines de rendu serveur, du streaming RSC, du routage de système de fichiers, du middleware, de la mise en cache, de l'exportation statique. Il y a une raison pour laquelle personne n'y est parvenu.<br />
<br />
Cette fois-ci, nous l'avons fait en moins d'une semaine. Un ingénieur (techniquement responsable de l'ingénierie) dirigeait l'IA.<br />
<br />
Le premier commit a été effectué le 13 février. À la fin de la même soirée, le routeur Pages et le routeur App fonctionnaient tous deux avec un SSR de base, ainsi que des middlewares, des actions serveur et du streaming. Le lendemain après-midi, App Router Playground rendait 10 des 11 routes. Au troisième jour, vinext deploy expédiait des applications vers Cloudflare Workers avec une hydratation client complète. Le reste de la semaine a été consacré au renforcement : correction des cas limites, extension de la suite de tests, portée de la couverture API à 94 %.<br />
<br />
Qu'est-ce qui a changé par rapport aux tentatives précédentes ? L'IA s'est améliorée. Beaucoup améliorée.<br />
<br />
<b><font size="3">Pourquoi ce problème est-il fait pour l'IA ?</font></b><br />
<br />
Tous les projets ne se déroulent pas de cette manière. Celui-ci l'a fait parce que plusieurs éléments se sont alignés au bon moment.<br />
<br />
<b>Next.js est bien spécifié.</b> Il dispose d'une documentation complète, d'une base d'utilisateurs importante et de nombreuses années de réponses et de tutoriels Stack Overflow. L'interface API est présente dans toutes les données d'entraînement. Lorsque vous demandez à Claude d'implémenter getServerSideProps ou d'expliquer le fonctionnement de useRouter, il ne hallucine pas. Il sait comment fonctionne Next.<br />
<br />
<b>Next.js dispose d'une suite de tests élaborée.</b> Le dépôt Next.js contient des milliers de tests E2E couvrant toutes les fonctionnalités et tous les cas limites. Nous avons porté les tests directement à partir de leur suite (vous pouvez voir l'attribution dans le code). Cela nous a donné une spécification que nous avons pu vérifier mécaniquement.<br />
<br />
<b>Vite est une excellente base.</b> Vite gère les aspects complexes des outils front-end : HMR rapide, ESM natif, API de plugin propre, regroupement de production. Nous n'avons pas eu à créer de regroupeur. Nous avons simplement dû lui apprendre à parler Next.js. @vitejs/plugin-rsc en est encore à ses débuts, mais il nous a permis de bénéficier de la prise en charge des composants serveur React sans avoir à créer une implémentation RSC à partir de zéro.<br />
<br />
<b>Les modèles ont rattrapé leur retard.</b> Nous pensons que cela n'aurait pas été possible il y a encore quelques mois. Les modèles précédents ne pouvaient pas maintenir la cohérence d'une base de code de cette taille. Les nouveaux modèles peuvent prendre en compte l'architecture complète dans son contexte, raisonner sur la manière dont les modules interagissent et produire suffisamment souvent du code correct pour maintenir la dynamique. Parfois, je l'ai vu entrer dans les internes de Next, Vite et React pour détecter un bug. Les modèles de pointe sont impressionnants et semblent s'améliorer sans cesse.<br />
<br />
Tous ces éléments devaient être réunis en même temps. Une API cible bien documentée, une suite de tests complète, un outil de construction solide et un modèle capable de gérer la complexité. Si l'un de ces éléments venait à manquer, cela ne fonctionnerait pas aussi bien.<br />
<br />
<b><font size="3">Comment nous l'avons réellement construit</font></b><br />
<br />
Presque chaque ligne de code dans vinext a été écrite par l'IA. Mais voici ce qui importe davantage : chaque ligne passe les mêmes contrôles de qualité que ceux que vous attendriez d'un code écrit par un humain. Le projet compte plus de 1 700 tests Vitest, 380 tests Playwright E2E, une vérification complète des types TypeScript via tsgo et un linting via oxlint. L'intégration continue exécute tout cela à chaque pull request. Il est essentiel de mettre en place un ensemble de garde-fous efficaces pour rendre l'IA productive dans une base de code.<br />
<br />
Le processus a commencé par un plan. J'ai passé quelques heures à échanger avec Claude dans OpenCode pour définir l'architecture : quoi construire, dans quel ordre, quelles abstractions utiliser. Ce plan est devenu notre ligne directrice. À partir de là, le flux de travail était simple :<br />
<br />
1. Définir une tâche (« implémenter le shim suivant/de navigation avec usePathname, useSearchParams, useRouter »).<br />
<br />
2. Laisser l'IA écrire l'implémentation et les tests.<br />
<br />
3. Exécuter la suite de tests.<br />
<br />
4. Si les tests sont réussis, fusionner. Sinon, donner à l'IA la sortie d'erreur et la laisser itérer.<br />
<br />
5. Répéter.<br />
<br />
Nous avons également connecté des agents IA pour la révision du code. Lorsqu'une PR était ouverte, un agent la révisait. Lorsque les commentaires de révision revenaient, un autre agent les traitait. La boucle de rétroaction était en grande partie automatisée.<br />
<br />
Cela ne fonctionnait pas parfaitement à chaque fois. Certaines PR étaient tout simplement erronées. L'IA implémentait avec assurance quelque chose qui semblait correct, mais qui ne correspondait pas au comportement réel de Next.js. Je devais régulièrement corriger le tir. Les décisions architecturales, la hiérarchisation des priorités, savoir quand l'IA se dirigeait vers une impasse : tout cela me revenait. Lorsque vous donnez à l'IA une bonne direction, un bon contexte et de bonnes garde-fous, elle peut être très productive. Mais l'humain doit toujours tenir les rênes.<br />
<br />
Pour les tests au niveau du navigateur, j'ai utilisé agent-browser pour vérifier le rendu réel, la navigation côté client et le comportement d'hydratation. Les tests unitaires passent à côté de nombreux problèmes subtils liés au navigateur. Cela les a permis de les détecter.<br />
<br />
Au cours du projet, nous avons effectué plus de 800 sessions dans OpenCode. Coût total : environ 1 100 dollars en jetons API Claude.<br />
<br />
<b><font size="3">Ce que cela signifie pour les logiciels</font></b><br />
<br />
Pourquoi avons-nous autant de couches dans la pile ? Ce projet m'a obligé à réfléchir profondément à cette question. Et à considérer l'impact de l'IA sur la réponse.<br />
<br />
La plupart des abstractions dans les logiciels existent parce que les humains ont besoin d'aide. Nous ne pouvions pas garder tout le système en tête, alors nous avons construit des couches pour gérer la complexité à notre place. Chaque couche facilitait le travail de la personne suivante. C'est ainsi que l'on se retrouve avec des frameworks superposés, des bibliothèques wrapper et des milliers de lignes de code de liaison.<br />
<br />
L'IA n'a pas cette limitation. Elle peut appréhender l'ensemble du système dans son contexte et se contenter d'écrire le code. Elle n'a pas besoin d'un framework intermédiaire pour rester organisée. Elle a juste besoin d'une spécification et d'une base sur laquelle s'appuyer.<br />
<br />
On ne sait pas encore clairement quelles abstractions sont vraiment fondamentales et lesquelles ne sont que des béquilles pour la cognition humaine. Cette ligne va beaucoup évoluer au cours des prochaines années. Mais vinext est un point de données. Nous avons pris un contrat API, un outil de construction et un modèle d'IA, et l'IA a écrit tout ce qui se trouvait entre les deux. Aucun framework intermédiaire n'était nécessaire. Nous pensons que ce modèle se répétera dans de nombreux logiciels. Les couches que nous avons construites au fil des ans ne survivront pas toutes.<br />
<br />
<b>Remerciements</b><br />
<br />
Merci à l'équipe Vite. Vite est la base sur laquelle repose tout cela. @vitejs/plugin-rsc en est encore à ses débuts, mais il m'a apporté le support RSC sans que j'aie à le construire à partir de zéro, ce qui aurait été rédhibitoire. Les responsables de Vite ont été réactifs et serviables lorsque j'ai poussé le plugin dans un domaine où il n'avait jamais été testé auparavant.<br />
<br />
Nous tenons également à remercier l'équipe Next.js. Elle a passé des années à construire un framework qui a relevé la barre en matière de développement React. Le fait que leur API soit si bien documentée et leur suite de tests si complète a largement contribué à rendre ce projet possible. vinext n'existerait pas sans la norme qu'ils ont établie.<br />
<br />
<b>Essayez-le</b><br />
<br />
vinext comprend une compétence d'agent qui gère la migration pour vous. Elle fonctionne avec Claude Code, OpenCode, Cursor, Codex et des dizaines d'autres outils de codage IA. Installez-la, ouvrez votre projet Next.js et demandez à l'IA d'effectuer la migration :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">npx skills add cloudflare/vinext</code><hr />
</div><br />
<br />
Ouvrez ensuite votre projet Next.js dans n'importe quel outil pris en charge et dites :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">migrate <span style="color: #0000ff;">this</span> project to vinext</code><hr />
</div><br />
<br />
La compétence gère la vérification de la compatibilité, l'installation des dépendances, la génération de la configuration et le démarrage du serveur de développement. Elle sait ce que vinext prend en charge et signalera tout ce qui nécessite une attention manuelle.<br />
<br />
Ou si vous préférez le faire à la main :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">npx vinext init    # Migrate an existing Next.js project
npx vinext dev     # Start the dev server
npx vinext deploy  # Ship to Cloudflare Workers</pre></td></tr></table></code><hr />
</div><br />
<br />
Le code source se trouve sur github.com/cloudflare/vinext. Les problèmes, les PR et les commentaires sont les bienvenus.<br />
<br />
<b>Sources</b> : <a rel="nofollow" href="https://blog.cloudflare.com/vinext/" target="_blank">How we rebuilt Next.js with AI in one week</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que cet outil est crédible ou pertinent ?<br />
:fleche: Quel est votre avis sur le sujet ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://javascript.developpez.com/actu/378654/Next-js-16-1-le-framework-open-source-de-developpement-web-full-stack-est-desormais-disponible-avec-la-mise-en-cache-du-systeme-de-fichiers-Turbopack-un-analyseur-de-bundle-Next-js-et-bien-plus-encore/" target="_blank">Next.js 16.1, le framework open source de développement web full-stack, est désormais disponible avec la mise en cache du système de fichiers Turbopack, un analyseur de bundle Next.js et bien plus encore</a><br />
<br />
:fleche: <a href="https://intelligence-artificielle.developpez.com/actu/380059/Nous-avons-charge-Claude-Opus-4-6-d-utiliser-des-equipes-d-agents-pour-construire-un-compilateur-C-ce-que-cela-nous-a-appris-sur-l-avenir-du-developpement-logiciel-autonome/" target="_blank">Nous avons chargé Claude Opus 4.6 d'utiliser des équipes d'agents pour construire un compilateur C, ce que cela nous a appris sur l'avenir du développement logiciel autonome</a><br />
<br />
:fleche: <a href="https://intelligence-artificielle.developpez.com/actu/379965/Description-technique-detaillee-du-fonctionnement-interne-de-l-agent-de-codage-d-OpenAI-Codex-CLI-un-outil-de-codage-IA-qui-ecrit-du-code-execute-des-tests-et-corrige-des-bogues/" target="_blank">Description technique détaillée du fonctionnement interne de l'agent de codage d'OpenAI Codex CLI, un outil de codage IA qui écrit du code, exécute des tests et corrige des bogues</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p674574d1772122538/javascript/bibliotheques-frameworks/react/avons-reconstruit-next-js-l-ia-semaine/1.jpg/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p674576d1772122569/javascript/bibliotheques-frameworks/react/avons-reconstruit-next-js-l-ia-semaine/2.jpg/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p674577d1772122577/javascript/bibliotheques-frameworks/react/avons-reconstruit-next-js-l-ia-semaine/3.jpg/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p674578d1772122615/javascript/bibliotheques-frameworks/react/avons-reconstruit-next-js-l-ia-semaine/4.jpg/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2196/javascript/bibliotheques-frameworks/react/">React</category>
			<dc:creator>Steve Faulkner</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2182338/javascript/bibliotheques-frameworks/react/avons-reconstruit-next-js-l-ia-semaine/</guid>
		</item>
		<item>
			<title>connexion à une base sqlite</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2181899&amp;goto=newpost</link>
			<pubDate>Tue, 03 Feb 2026 13:10:50 GMT</pubDate>
			<description><![CDATA[Bonjour, 
 
J'essaie de créer...]]></description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
J'essaie de créer un backend avec une connexion à une base de données sqlite<br />
J'ai installé le package sqlite3.<br />
<br />
D'un côté, j'ai un fichier db.js :<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">import</span> <span class="br0">&#123;</span><span style="color: #0080ff;">open</span><span class="br0">&#125;</span> <span style="color: #0000ff;">from</span> <span style="color: #FF0000;">&quot;sqlite&quot;</span>;
<span style="color: #0000ff;">import</span> sqlite3 <span style="color: #0000ff;">from</span> <span style="color: #FF0000;">&quot;sqlite3&quot;</span>;
&nbsp;
<span style="color: #0000ff;">let</span> dbInstance = <span style="color: #339933;">null</span>;
&nbsp;
<span style="color: #0000ff;">export</span> <span style="color: #0000ff;">async</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">initDB</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  dbInstance = <span style="color: #0000ff;">await</span> <span style="color: #0080ff;">open</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
    <span style="color: #800000;">filename</span>: <span style="color: #FF0000;">&quot;./db/database.sqlite&quot;</span>,
    <span style="color: #800000;">driver</span>: sqlite3.Database,
  <span class="br0">&#125;</span><span class="br0">&#41;</span>
&nbsp;
  <span style="color: #0000ff;">await</span> dbInstance.<span style="color: #0080ff;">exec</span><span class="br0">&#40;</span><span style="color: #FF0000;">`</span>
<span style="color: #FF0000;">          CREATE TABLE IF NOT EXISTS users (</span>
<span style="color: #FF0000;">            id        INTEGER   PRIMARY KEY AUTOINCREMENT,</span>
<span style="color: #FF0000;">            name      TEXT      NOT NULL,</span>
<span style="color: #FF0000;">            createdAt DATETIME  NOT NULL  DEFAULT CURRENT_TIMESTAMP</span>
<span style="color: #FF0000;">          )</span>
<span style="color: #FF0000;">    `</span><span class="br0">&#41;</span>
&nbsp;
  <span style="color: #0000ff;">return</span> dbInstance
  <span style="color: #808080;">//console.log(dbInstance)</span>
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #0000ff;">export</span> <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">getDB</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>!dbInstance<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> Error <span class="br0">&#40;</span><span style="color: #FF0000;">&quot;InitDB must be called before getDB&quot;</span><span class="br0">&#41;</span>;
  <span class="br0">&#125;</span>
  <span style="color: #0000ff;">return</span> dbInstance
<span class="br0">&#125;</span></pre></td></tr></table></code><hr />
</div>et j'ai au même niveau un fichier index.js :<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">import</span> <span class="br0">&#123;</span>getDB, initDB<span class="br0">&#125;</span> <span style="color: #0000ff;">from</span> <span style="color: #FF0000;">&quot;./db.js&quot;</span>;
&nbsp;
<span style="color: #0000ff;">import</span> express <span style="color: #0000ff;">from</span> <span style="color: #FF0000;">&quot;express&quot;</span>;
<span style="color: #808080;">//const express = require('express')</span>
&nbsp;
&nbsp;
&nbsp;
<span style="color: #0000ff;">const</span> app = <span style="color: #0080ff;">express</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span style="color: #0000ff;">const</span> port = <span style="color: #cc66cc;">3001</span>
&nbsp;
app.<span style="color: #0080ff;">use</span><span class="br0">&#40;</span>express.<span style="color: #0080ff;">json</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
app.<span style="color: #0080ff;">use</span><span class="br0">&#40;</span><span style="color: #0000ff;">function</span> <span class="br0">&#40;</span>req, res, next<span class="br0">&#41;</span> <span class="br0">&#123;</span>
  res.<span style="color: #0080ff;">setHeader</span><span class="br0">&#40;</span><span style="color: #FF0000;">'Access-Control-Allow-Origin'</span>, <span style="color: #FF0000;">'http://localhost:3000'</span><span class="br0">&#41;</span>;
  res.<span style="color: #0080ff;">setHeader</span><span class="br0">&#40;</span><span style="color: #FF0000;">'Access-Control-Allow-Methods'</span>, <span style="color: #FF0000;">'GET,POST,PUT,DELETE,OPTIONS'</span><span class="br0">&#41;</span>;
  res.<span style="color: #0080ff;">setHeader</span><span class="br0">&#40;</span><span style="color: #FF0000;">'Access-Control-Allow-Headers'</span>, <span style="color: #FF0000;">'Content-Type, Access-Control-Allow-Headers'</span><span class="br0">&#41;</span>;
  <span style="color: #0080ff;">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span><span class="br0">&#41;</span>;
&nbsp;
app.<span style="color: #0080ff;">get</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;/users&quot;</span>, <span style="color: #0000ff;">async</span> <span class="br0">&#40;</span>req, res<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span>
&nbsp;
  <span style="color: #0000ff;">const</span> db = <span style="color: #0080ff;">getDB</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
  console.<span style="color: #0080ff;">log</span><span class="br0">&#40;</span>db<span class="br0">&#41;</span>
&nbsp;
  <span style="color: #0000ff;">const</span> users = <span style="color: #0000ff;">await</span> db.<span style="color: #0080ff;">all</span><span class="br0">&#40;</span>
    <span style="color: #FF0000;">&quot;SELECT * FROM users&quot;</span>
  <span class="br0">&#41;</span>;
  console.<span style="color: #0080ff;">log</span><span class="br0">&#40;</span>users<span class="br0">&#41;</span>
&nbsp;
  <span style="color: #0000ff;">return</span> res.<span style="color: #0080ff;">json</span><span class="br0">&#40;</span>users<span class="br0">&#41;</span>;
&nbsp;
<span class="br0">&#125;</span><span class="br0">&#41;</span>;
&nbsp;
app.<span style="color: #0080ff;">get</span><span class="br0">&#40;</span><span style="color: #FF0000;">'/'</span>, <span class="br0">&#40;</span>req, res<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span>
  res.<span style="color: #0080ff;">status</span><span class="br0">&#40;</span><span style="color: #cc66cc;">200</span><span class="br0">&#41;</span>.<span style="color: #0080ff;">send</span><span class="br0">&#40;</span><span style="color: #FF0000;">'Hello World!'</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span><span class="br0">&#41;</span>
&nbsp;
app.<span style="color: #0080ff;">listen</span><span class="br0">&#40;</span>port, <span class="br0">&#40;</span><span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span>
  console.<span style="color: #0080ff;">log</span><span class="br0">&#40;</span><span style="color: #FF0000;">`App running on port <span style="color: #800000;">${port}</span>.`</span><span class="br0">&#41;</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span></pre></td></tr></table></code><hr />
</div>résultat : ma requête me renvoie un tableau vide :<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">Database <span class="br0">&#123;</span>
  <span style="color: #800000;">config</span>: <span class="br0">&#123;</span> <span style="color: #800000;">filename</span>: <span style="color: #FF0000;">'./db/database.sqlite'</span>, <span style="color: #800000;">driver</span>: <span class="br0">&#91;</span><span style="color: #800000;">Function</span>: Database<span class="br0">&#93;</span> <span class="br0">&#125;</span>,
  <span style="color: #800000;">db</span>: Database <span class="br0">&#123;</span><span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span class="br0">&#91;</span><span class="br0">&#93;</span></pre></td></tr></table></code><hr />
</div>Pourtant j'ai bien des données dans ma table users<br />
Qu'est ce qui cloche ?<br />
<br />
<br />
Merci,<br />
Nico</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2196/javascript/bibliotheques-frameworks/react/">React</category>
			<dc:creator>DiverSIG</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2181899/javascript/bibliotheques-frameworks/react/connexion-base-sqlite/</guid>
		</item>
		<item>
			<title><![CDATA[Pas d'affiche à l'écran]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2181670&amp;goto=newpost</link>
			<pubDate>Fri, 23 Jan 2026 07:08:43 GMT</pubDate>
			<description>Bonjour, 
je suis nouveau...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
je suis nouveau dans React, s'il vous plait j'aimerais comprendre pourqui mon code ci-dessous n'affiche rien à l'écran.<br />
c'est mon fichier main.jsx<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">import</span> <span class="br0">&#123;</span> createRoot, useState <span class="br0">&#125;</span> <span style="color: #0000ff;">from</span> <span style="color: #FF0000;">'react-dom/client'</span>
&nbsp;
<span style="color: #0000ff;">function</span> <span style="color: #0080ff;">Counter</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span style="color: #808080;">// Destructuring the array returned by useState </span>
  <span style="color: #0000ff;">const</span> <span class="br0">&#91;</span>count, setCount<span class="br0">&#93;</span> = <span style="color: #0080ff;">useState</span><span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>;
&nbsp;
  <span style="color: #0000ff;">return</span> <span class="br0">&#40;</span>
    &lt;<span style="color: #0080ff;">button</span> onClick=<span class="br0">&#123;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> =&gt; <span style="color: #0080ff;">setCount</span><span class="br0">&#40;</span>count + <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span><span class="br0">&#125;</span>&gt;
      <span style="color: #800000;">Count</span>: <span class="br0">&#123;</span>count<span class="br0">&#125;</span>
    &lt;/button&gt;
  <span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
&nbsp;
<span style="color: #0080ff;">createRoot</span><span class="br0">&#40;</span><span style="color: #0080ff;">document</span>.<span style="color: #0080ff;">getElementById</span><span class="br0">&#40;</span><span style="color: #FF0000;">'root'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span style="color: #0080ff;">render</span><span class="br0">&#40;</span>
  &lt;Counter /&gt;
<span class="br0">&#41;</span>;</pre></td></tr></table></code><hr />
</div>Merci d'avance pour votre aide.<br />
cordialement,<br />
Dibak</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2196/javascript/bibliotheques-frameworks/react/">React</category>
			<dc:creator>dibak</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2181670/javascript/bibliotheques-frameworks/react/d-affiche-l-ecran/</guid>
		</item>
		<item>
			<title><![CDATA[customisation d'un composant treeview]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2181331&amp;goto=newpost</link>
			<pubDate>Tue, 06 Jan 2026 11:04:06 GMT</pubDate>
			<description><![CDATA[Bonjour, 
 
j'essaie de...]]></description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
j'essaie de customiser un composant MUI Treeview (<a rel="nofollow" href="https://mui.com/x/react-tree-view/simple-tree-view/items/" target="_blank">ici</a>)en m'appuyant sur <a rel="nofollow" href="https://mui.com/x/react-tree-view/simple-tree-view/customization/" target="_blank">les exemples</a><br />
<br />
Je récupère ce code :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">const</span> CustomTreeItem = <span style="color: #0080ff;">styled</span><span class="br0">&#40;</span>TreeItem<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#123;</span> theme <span class="br0">&#125;</span><span class="br0">&#41;</span> =&gt; <span class="br0">&#40;</span><span class="br0">&#123;</span>
  <span style="color: #800000;">color</span>: theme.palette.grey<span class="br0">&#91;</span><span style="color: #cc66cc;">200</span><span class="br0">&#93;</span>,
  <span class="br0">&#91;</span><span style="color: #FF0000;">`&amp; .<span style="color: #800000;">${treeItemClasses.content}</span>`</span><span class="br0">&#93;</span>: <span class="br0">&#123;</span>
    <span style="color: #800000;">borderRadius</span>: theme.<span style="color: #0080ff;">spacing</span><span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>.<span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>,
    <span style="color: #800000;">padding</span>: theme.<span style="color: #0080ff;">spacing</span><span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>.<span style="color: #cc66cc;">5</span>, <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>,
    <span style="color: #800000;">margin</span>: theme.<span style="color: #0080ff;">spacing</span><span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>.<span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>,
    <span class="br0">&#91;</span><span style="color: #FF0000;">`&amp; .<span style="color: #800000;">${treeItemClasses.label}</span>`</span><span class="br0">&#93;</span>: <span class="br0">&#123;</span>
      <span style="color: #800000;">fontSize</span>: <span style="color: #FF0000;">'0.8rem'</span>,
      <span style="color: #800000;">fontWeight</span>: <span style="color: #cc66cc;">500</span>,
    <span class="br0">&#125;</span>,
  <span class="br0">&#125;</span>,
  <span class="br0">&#91;</span><span style="color: #FF0000;">`&amp; .<span style="color: #800000;">${treeItemClasses.iconContainer}</span>`</span><span class="br0">&#93;</span>: <span class="br0">&#123;</span>
    <span style="color: #800000;">borderRadius</span>: <span style="color: #FF0000;">'50%'</span>,
    <span style="color: #800000;">backgroundColor</span>: theme.palette.primary.dark,
    <span style="color: #800000;">padding</span>: theme.<span style="color: #0080ff;">spacing</span><span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">1</span>.<span style="color: #cc66cc;">2</span><span class="br0">&#41;</span>,
    ...theme.<span style="color: #0080ff;">applyStyles</span><span class="br0">&#40;</span><span style="color: #FF0000;">'light'</span>, <span class="br0">&#123;</span>
      <span style="color: #800000;">backgroundColor</span>: <span style="color: #0080ff;">alpha</span><span class="br0">&#40;</span>theme.palette.primary.main, <span style="color: #cc66cc;">0</span>.<span style="color: #cc66cc;">25</span><span class="br0">&#41;</span>,
    <span class="br0">&#125;</span><span class="br0">&#41;</span>,
    ...theme.<span style="color: #0080ff;">applyStyles</span><span class="br0">&#40;</span><span style="color: #FF0000;">'dark'</span>, <span class="br0">&#123;</span>
      <span style="color: #800000;">color</span>: theme.palette.primary.contrastText,
    <span class="br0">&#125;</span><span class="br0">&#41;</span>,
  <span class="br0">&#125;</span>,
  <span class="br0">&#91;</span><span style="color: #FF0000;">`&amp; .<span style="color: #800000;">${treeItemClasses.groupTransition}</span>`</span><span class="br0">&#93;</span>: <span class="br0">&#123;</span>
    <span style="color: #800000;">marginLeft</span>: <span style="color: #cc66cc;">15</span>,
    <span style="color: #800000;">paddingLeft</span>: <span style="color: #cc66cc;">18</span>,
    <span style="color: #800000;">borderLeft</span>: <span style="color: #FF0000;">`1px dashed <span style="color: #800000;">${alpha(theme.palette.text.primary, 0.4)}</span>`</span>,
  <span class="br0">&#125;</span>,
  ...theme.<span style="color: #0080ff;">applyStyles</span><span class="br0">&#40;</span><span style="color: #FF0000;">'light'</span>, <span class="br0">&#123;</span>
    <span style="color: #800000;">color</span>: theme.palette.grey<span class="br0">&#91;</span><span style="color: #cc66cc;">800</span><span class="br0">&#93;</span>,
  <span class="br0">&#125;</span><span class="br0">&#41;</span>,
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</pre></td></tr></table></code><hr />
</div>Je veux afficher mon item en gras, donc je change la propriété fontWeight de 500 à 800.<br />
<br />
Mon item passe bien en gras, mais aussi tous ses fils.<br />
<br />
Comment faire pour que la customisation s'applique uniquement à l'item, et pas à ses fils ?<br />
<br />
<br />
Merci,<br />
Nico</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2196/javascript/bibliotheques-frameworks/react/">React</category>
			<dc:creator>DiverSIG</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2181331/javascript/bibliotheques-frameworks/react/customisation-d-composant-treeview/</guid>
		</item>
		<item>
			<title><![CDATA[[React Native/expo] Pourquoi App.tsx n'existe pas]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2181220&amp;goto=newpost</link>
			<pubDate>Tue, 30 Dec 2025 17:34:42 GMT</pubDate>
			<description>Bonjour à tous 
 
Je...</description>
			<content:encoded><![CDATA[<div>Bonjour à tous<br />
<br />
Je travaille sur une application IOS/Android avec React Native 0.83 et Expo 54 et j'ai créé un nouveau projet avec la commande<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">npx create-expo-app@latest</code><hr />
</div>Dans la structure il y a le fichier App.json et un dossier app où j'ai toutes mes vues.<br />
<br />
Je suis emprunté, car je vois souvent des tuto ou l'explication est donné dans le fichier <b>App.tsx</b>.<br />
<br />
Je retrouve vraiment très souvent le fichier <b>App.tsx</b> dans des tuto, que je n'ai pas dans ma structure et je ne comprends pas comment je dois procéder en suivant l'exemple dans App.tsx<br />
<br />
Par exemple, dans ce tuto <a rel="nofollow" href="https://docs.expo.dev/push-notifications/push-notifications-setup/#add-a-minimal-working-example" target="_blank">https://docs.expo.dev/push-notificat...orking-example</a> pour implémenter les push notification.<br />
et ecnore dans celui ci <a rel="nofollow" href="https://documentation.onesignal.com/docs/en/react-native-expo-sdk-setup#3-initialize-sdk" target="_blank">https://documentation.onesignal.com/...initialize-sdk</a>. Dans ce dernier tuto, il fait bien référence à expo 54 et RN 08.2. Donc je peux en déduire que App.tsx est fichier représentatif ou il peut être créé à quelque part. <br />
<br />
Dans un tuto, comment dois-je interpréter le fichier App.tsx? un fichier global que je peux mettre à la racine?<br />
Si non, ou puis-je mettre le code donné dans le fichier App.tsx du tuto, dans ma structure qui ne contient pas (ou pas encore) le fichier App.tsx?<br />
Est-ce qu'il peut etre dans /app/index.tsx ou /app/layout.tsx?<br />
<br />
Milles mercis pour vos lumières</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2196/javascript/bibliotheques-frameworks/react/">React</category>
			<dc:creator>pierrot10</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2181220/javascript/bibliotheques-frameworks/react/react-native-expo-pourquoi-app-tsx-n-existe/</guid>
		</item>
		<item>
			<title><![CDATA[Mise à jour d'un composant Select]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2180455&amp;goto=newpost</link>
			<pubDate>Thu, 13 Nov 2025 13:36:56 GMT</pubDate>
			<description>Bonjour, 
 
Pour créer un...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
Pour créer un composant, j'utilise les composants de base MUI. J'ai un json en entrée, que j'affiche sous forme de TreeView, un composant TextField, et un composant Select<br />
<br />
Chaque élément de mon json est de la forme :<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><span class="br0">&#123;</span> <span style="color: #800000;">id</span>: <span style="color: #cc66cc;">36</span>, <span style="color: #800000;">fr</span>: <span style="color: #FF0000;">&quot;003-003&quot;</span>, <span style="color: #800000;">en</span>: <span style="color: #FF0000;">&quot;003-003&quot;</span>, <span style="color: #800000;">type</span>: <span style="color: #FF0000;">&quot;JURI&quot;</span>, <span style="color: #800000;">children</span>: <span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#125;</span></code><hr />
</div>avec éventuellement dans children d'autres éléments de la même forme.<br />
<br />
Quand je clique sur un item du TreeView, je voudrais mettre à jour le TextField avec la propriété 'fr', et mettre à jour le Select avec la propriété 'type'.<br />
Pour cela, je passe par un useState pour récupérer les propriétés de l'élément du json qui a été sélectionné<br />
<br />
Le code :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">const</span> <span class="br0">&#91;</span>selectedItem, setSelectedItem<span class="br0">&#93;</span> = <span style="color: #0080ff;">useState</span><span class="br0">&#40;</span><span class="br0">&#123;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>; 
&nbsp;
  <span style="color: #0000ff;">const</span> onSiteSelect = <span class="br0">&#40;</span>itemId<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span>
    <span style="color: #0080ff;">setSelectedItem</span><span class="br0">&#40;</span>json.data.<span style="color: #0080ff;">filter</span><span class="br0">&#40;</span>el =&gt; el.id === itemId<span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
  <span class="br0">&#125;</span>
&nbsp;
  <span style="color: #0000ff;">return</span> <span class="br0">&#40;</span>
    &lt;Box sx=<span class="br0">&#123;</span><span class="br0">&#123;</span> <span style="color: #800000;">flexGrow</span>: <span style="color: #cc66cc;">1</span> <span class="br0">&#125;</span><span class="br0">&#125;</span>&gt;
      &lt;Grid container spacing=<span class="br0">&#123;</span><span style="color: #cc66cc;">2</span><span class="br0">&#125;</span>&gt;
        &lt;Grid size=<span class="br0">&#123;</span><span style="color: #cc66cc;">2</span><span class="br0">&#125;</span>&gt;
          &lt;Treeview json=<span class="br0">&#123;</span>json<span class="br0">&#125;</span> language=<span style="color: #FF0000;">&quot;fr&quot;</span> showTitle=<span class="br0">&#123;</span><span style="color: #339933;">false</span><span class="br0">&#125;</span> fctOnClick=<span class="br0">&#123;</span>onSiteSelect<span class="br0">&#125;</span>/&gt;,
        &lt;/Grid&gt;
        &lt;Grid size=<span class="br0">&#123;</span><span style="color: #cc66cc;">5</span><span class="br0">&#125;</span>&gt;
          &lt;Box
            component=<span style="color: #FF0000;">&quot;form&quot;</span>
            sx=<span class="br0">&#123;</span><span class="br0">&#123;</span> <span style="color: #FF0000;">'&amp; &gt; :not(style)'</span>: <span class="br0">&#123;</span> <span style="color: #800000;">m</span>: <span style="color: #cc66cc;">1</span>, <span style="color: #800000;">width</span>: <span style="color: #FF0000;">'25ch'</span> <span class="br0">&#125;</span> <span class="br0">&#125;</span><span class="br0">&#125;</span>
            noValidate
            autoComplete=<span style="color: #FF0000;">&quot;off&quot;</span>
          &gt;
            &lt;TextField value=<span class="br0">&#123;</span>selectedItem.fr<span class="br0">&#125;</span> label=<span style="color: #FF0000;">&quot;Nom&quot;</span> defaultValue=<span style="color: #FF0000;">&quot; &quot;</span> variant=<span style="color: #FF0000;">&quot;outlined&quot;</span> /&gt;
            &lt;FormControl fullWidth&gt;
              &lt;InputLabel&gt;Type&lt;/InputLabel&gt;
              &lt;Select
                defaultValue=<span style="color: #FF0000;">&quot;&quot;</span>
                value=<span class="br0">&#123;</span>selectedItem.type<span class="br0">&#125;</span>
                label=<span style="color: #FF0000;">&quot;Type&quot;</span>
              &gt;
                &lt;MenuItem value=<span class="br0">&#123;</span><span style="color: #FF0000;">&quot;GEOG&quot;</span><span class="br0">&#125;</span>&gt;Geographique&lt;/MenuItem&gt;
                &lt;MenuItem value=<span class="br0">&#123;</span><span style="color: #FF0000;">&quot;JURI&quot;</span><span class="br0">&#125;</span>&gt;Juridique&lt;/MenuItem&gt;
              &lt;/Select&gt;
            &lt;/FormControl&gt;
          &lt;/Box&gt;
        &lt;/Grid&gt;
        &lt;Grid size=<span class="br0">&#123;</span><span style="color: #cc66cc;">5</span><span class="br0">&#125;</span>&gt;
&nbsp;
        &lt;/Grid&gt;
      &lt;/Grid&gt;
    &lt;/Box&gt;
  <span class="br0">&#41;</span>;</pre></td></tr></table></code><hr />
</div><br />
Quand je clique sur un item du TreeView, je récupère bien les infos de l'élément json dans selectedItem, le TextField se met bien à jour, mais pas le Select.<br />
<br />
Qu'est ce qui cloche?<br />
<br />
<br />
Merci,<br />
<br />
Nico</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2196/javascript/bibliotheques-frameworks/react/">React</category>
			<dc:creator>DiverSIG</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2180455/javascript/bibliotheques-frameworks/react/mise-jour-d-composant-select/</guid>
		</item>
		<item>
			<title>Tracer un polygone sur une carte OpenLayers</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2180440&amp;goto=newpost</link>
			<pubDate>Wed, 12 Nov 2025 19:10:54 GMT</pubDate>
			<description><![CDATA[Bonjour, 
 
J'essaie de...]]></description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
J'essaie de développer un composant pour tracer des polygones sur une carte OpenLayers, inspiré de l'exemple <a rel="nofollow" href="https://openlayers.org/en/latest/examples/draw-and-modify-features.html" target="_blank">ici</a><br />
<br />
Voici le code :<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">function</span> <span style="color: #0080ff;">MapComponent</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
  <span style="color: #0000ff;">const</span> <span class="br0">&#91;</span>map, setMap<span class="br0">&#93;</span> = <span style="color: #0080ff;">useState</span><span class="br0">&#40;</span><span style="color: #339933;">null</span><span class="br0">&#41;</span>;
&nbsp;
  <span style="color: #0000ff;">let</span> draw, snap; <span style="color: #808080;">// global so we can remove them later</span>
&nbsp;
  <span style="color: #0000ff;">const</span> source = <span style="color: #0000ff;">new</span> <span style="color: #0080ff;">VectorSource</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
  <span style="color: #0000ff;">const</span> vector = <span style="color: #0000ff;">new</span> <span style="color: #0080ff;">VectorLayer</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
      <span style="color: #800000;">source</span>: source,
      <span style="color: #800000;">style</span>: <span class="br0">&#123;</span>
        <span style="color: #FF0000;">'fill-color'</span>: <span style="color: #FF0000;">'rgba(255, 255, 255, 0.2)'</span>,
        <span style="color: #FF0000;">'stroke-color'</span>: <span style="color: #FF0000;">'#ffcc33'</span>,
        <span style="color: #FF0000;">'stroke-width'</span>: <span style="color: #cc66cc;">2</span>,
        <span style="color: #FF0000;">'circle-radius'</span>: <span style="color: #cc66cc;">7</span>,
        <span style="color: #FF0000;">'circle-fill-color'</span>: <span style="color: #FF0000;">'#ffcc33'</span>,
      <span class="br0">&#125;</span>,
  <span class="br0">&#125;</span><span class="br0">&#41;</span>;
&nbsp;
  <span style="color: #0080ff;">useEffect</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span>
&nbsp;
    <span style="color: #0000ff;">const</span> osmLayer = <span style="color: #0000ff;">new</span> <span style="color: #0080ff;">TileLayer</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
      <span style="color: #800000;">preload</span>: <span style="color: #339933;">Infinity</span>,
      <span style="color: #800000;">source</span>: <span style="color: #0000ff;">new</span> <span style="color: #0080ff;">OSM</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,
    <span class="br0">&#125;</span><span class="br0">&#41;</span>
&nbsp;
    <span style="color: #0000ff;">const</span> map = <span style="color: #0000ff;">new</span> <span style="color: #0080ff;">Map</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
      <span style="color: #800000;">target</span>: <span style="color: #FF0000;">&quot;map&quot;</span>,
      <span style="color: #800000;">layers</span>: <span class="br0">&#91;</span>osmLayer, vector<span class="br0">&#93;</span>,
      <span style="color: #800000;">view</span>: <span style="color: #0000ff;">new</span> <span style="color: #0080ff;">View</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
          <span style="color: #800000;">center</span>: <span class="br0">&#91;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>,
          <span style="color: #800000;">zoom</span>: <span style="color: #cc66cc;">0</span>,
        <span class="br0">&#125;</span><span class="br0">&#41;</span>,
    <span class="br0">&#125;</span><span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #0000ff;">const</span> modify = <span style="color: #0000ff;">new</span> <span style="color: #0080ff;">Modify</span><span class="br0">&#40;</span><span class="br0">&#123;</span><span style="color: #800000;">source</span>: source<span class="br0">&#125;</span><span class="br0">&#41;</span>;
    map.<span style="color: #0080ff;">addInteraction</span><span class="br0">&#40;</span>modify<span class="br0">&#41;</span>;
&nbsp;
    <span style="color: #0080ff;">setMap</span><span class="br0">&#40;</span>map<span class="br0">&#41;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span class="br0">&#40;</span><span class="br0">&#41;</span> =&gt; map.<span style="color: #0080ff;">setTarget</span><span class="br0">&#40;</span><span style="color: #339933;">null</span><span class="br0">&#41;</span>
  <span class="br0">&#125;</span>, <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
&nbsp;
  <span style="color: #0000ff;">function</span> <span style="color: #0080ff;">addInteractions</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    draw = <span style="color: #0000ff;">new</span> <span style="color: #0080ff;">Draw</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
      <span style="color: #800000;">source</span>: source,
      <span style="color: #800000;">type</span>: <span style="color: #FF0000;">&quot;Polygon&quot;</span>,
    <span class="br0">&#125;</span><span class="br0">&#41;</span>;
    map.<span style="color: #0080ff;">addInteraction</span><span class="br0">&#40;</span>draw<span class="br0">&#41;</span>;
    snap = <span style="color: #0000ff;">new</span> <span style="color: #0080ff;">Snap</span><span class="br0">&#40;</span><span class="br0">&#123;</span><span style="color: #800000;">source</span>: source<span class="br0">&#125;</span><span class="br0">&#41;</span>;
    map.<span style="color: #0080ff;">addInteraction</span><span class="br0">&#40;</span>snap<span class="br0">&#41;</span>;
  <span class="br0">&#125;</span>
&nbsp;
  <span style="color: #0000ff;">return</span> <span class="br0">&#40;</span>
    &lt;Box&gt;
      &lt;Toolbar&gt;
        &lt;IconButton onClick=<span class="br0">&#123;</span>addInteractions<span class="br0">&#125;</span>&gt;
            &lt;MenuIcon /&gt;
        &lt;/IconButton&gt;
&nbsp;
      &lt;/Toolbar&gt;
      &lt;div style=<span class="br0">&#123;</span><span class="br0">&#123;</span><span style="color: #800000;">height</span>:<span style="color: #FF0000;">'600px'</span>,<span style="color: #800000;">width</span>:<span style="color: #FF0000;">'50%'</span><span class="br0">&#125;</span><span class="br0">&#125;</span> id=<span style="color: #FF0000;">&quot;map&quot;</span> className=<span style="color: #FF0000;">&quot;map-container&quot;</span> /&gt;
    &lt;/Box&gt;
  <span class="br0">&#41;</span>;
&nbsp;
<span class="br0">&#125;</span></pre></td></tr></table></code><hr />
</div>Quand je clique sur mon bouton de la toolbar, j'ai bien le mode &quot;création de polygone&quot; qui s'enclenche, je clique pour tracer mes points de polygone, mais quand je double-clique pour fermer le polygone, tout s'efface ...<br />
<br />
Pourquoi ? comment corriger ça ??<br />
<br />
<br />
Merci,<br />
Nico</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2196/javascript/bibliotheques-frameworks/react/">React</category>
			<dc:creator>DiverSIG</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2180440/javascript/bibliotheques-frameworks/react/tracer-polygone-carte-openlayers/</guid>
		</item>
		<item>
			<title>Ecrire dans un fichier Excel</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2179543&amp;goto=newpost</link>
			<pubDate>Mon, 29 Sep 2025 10:02:14 GMT</pubDate>
			<description>Bonjour, 
 
Je cherche à...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
Je cherche à écrire dans un fichier Excel modèle (xlsm) à partir de mon appli React.<br />
J'ai testé avec le module xlsx, j'arrive bien à écrire dans le fichier, mais j'ai perdu toute la mise en forme des feuilles, et les macros qui étaient dans le modèle.<br />
<br />
Comment faire?<br />
<br />
Merci,<br />
<br />
Nico</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2196/javascript/bibliotheques-frameworks/react/">React</category>
			<dc:creator>DiverSIG</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2179543/javascript/bibliotheques-frameworks/react/ecrire-fichier-excel/</guid>
		</item>
		<item>
			<title>Créer un module ou une librarire</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2178030&amp;goto=newpost</link>
			<pubDate>Sat, 12 Jul 2025 11:21:38 GMT</pubDate>
			<description>Bonjour à tous, 
 
Je cherche...</description>
			<content:encoded><![CDATA[<div>Bonjour à tous,<br />
<br />
Je cherche depuis des semaines à faire ceci et vos lumières seront grandement appréciées.<br />
<br />
Je dois faire une map avec OpenStreetMap. react-native-map ne répond pas à mon besoin, parce qu'il bug, ne support pas les clusters.<br />
<br />
J'ai déjà utilisé Leaflet et je viens d'essayer OpenLayer mais les deux necessite le DOM (balise html). Donc l'utilisation de react-native-webview est nécessaire.<br />
<br />
Les libraires existantes ne fonctionnent pas, ou ne sont pas à jours ou pas compatible.<br />
<br />
J'aimerais essayer donc de faire ma propre librarie, sans faire un truc de fou, mais d'utile, que je mettrai à disposition sur react native directory. Le problème est que je suis novice et j'ai besoin un peu d'aide pour commencer.<br />
<br />
J'ai lu cette page <a rel="nofollow" href="https://reactnative.dev/docs/the-new-architecture/create-module-library" target="_blank">https://reactnative.dev/docs/the-new...module-library</a> mais les options ne sont pas très claires.<br />
<br />
 J'aimerais que cette librairire soie compatible <br />
1. iOs, Android et le Web. <br />
2. Pour la nouvelle architecture<br />
3. je souhaite utiliser javascript en important la librairie <a rel="nofollow" href="https://leafletjs.com/download.html" target="_blank">Leaftlet</a> (tout ce trouve dans le zip<br />
4. construire ma carte dans mon fichier html<br />
5. Tout afficher grâce webview<br />
6. créer un componment pour facilement intégrer dans mon fichier app.tsx<br />
7. ajout d'option pour la cartes<br />
<br />
Après avoir lancé la commande<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">npx create-react-native-library@latest &lt;Name <span style="color: #0000ff;">of</span> Your Library&gt;</code><hr />
</div>J'ai des choix.<br />
<a rel="nofollow" href="https://reactnative.dev/assets/images/what-library-fdc7531153bfcf553ec30e2ab205480e.png" target="_blank">https://reactnative.dev/assets/image...2ab205480e.png</a><br />
<br />
Mais que dois-je choisir?<br />
<br />
La mon avis, la première option &quot;Javascript library&quot;<br />
<br />
Mais pourquoi pas &quot;Native module&quot; ou &quot;Turbo module&quot;<br />
<br />
Mais quelle est la différence entre ces trois options? Pourquoi l'un ou pourquoi pas l'autre?<br />
<br />
Je vous remercie pour vos clarifications<br />
Tout bon week-end à vous!</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2196/javascript/bibliotheques-frameworks/react/">React</category>
			<dc:creator>pierrot10</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2178030/javascript/bibliotheques-frameworks/react/creer-module-librarire/</guid>
		</item>
		<item>
			<title>Génération dynamique des balises Open Graph dans une SPA React avec backend Node.js/Express</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2177575&amp;goto=newpost</link>
			<pubDate>Wed, 18 Jun 2025 10:01:01 GMT</pubDate>
			<description>Bonjour à tous, 
 
Je...</description>
			<content:encoded><![CDATA[<div>Bonjour à tous,<br />
<br />
Je développe un site avec un frontend React (SPA) et un backend Node.js/Express. Je souhaite générer dynamiquement des balises Open Graph (OG) sur une route spécifique /Evenement/:id afin d’avoir un bon aperçu lorsque je partage un événement sur les réseaux sociaux (Facebook, LinkedIn…)<br />
Ce que j’ai fait :<br />
Dans mon backend Express, j’ai une route /Evenement/:id qui détecte les bots (user-agent facebookexternalhit, twitterbot, linkedinbot) et renvoie une page HTML avec des balises OG spécifiques à l’événement.<br />
<br />
Si ce n’est pas un bot, je renvoie la page React SPA classique (index.html).<br />
<br />
Voici un extrait simplifié de mon backend :<br />
<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
app.<span style="color: #0080ff;">get</span><span class="br0">&#40;</span><span style="color: #FF0000;">'/Evenement/:id'</span>, <span style="color: #0000ff;">async</span> <span class="br0">&#40;</span>req, res<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span>
  <span style="color: #0000ff;">const</span> isCrawler = <span style="color: #808080;">/facebookexternalhit|twitterbot|linkedinbot/i</span>.<span style="color: #0080ff;">test</span><span class="br0">&#40;</span>req.headers<span class="br0">&#91;</span><span style="color: #FF0000;">'user-agent'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>!isCrawler<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span style="color: #0000ff;">return</span> res.<span style="color: #0080ff;">sendFile</span><span class="br0">&#40;</span>path.<span style="color: #0080ff;">resolve</span><span class="br0">&#40;</span>__dirname, <span style="color: #FF0000;">'build'</span>, <span style="color: #FF0000;">'index.html'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
  <span class="br0">&#125;</span>
&nbsp;
  <span style="color: #0000ff;">const</span> eventData = <span style="color: #0000ff;">await</span> Evenements.<span style="color: #0080ff;">findById</span><span class="br0">&#40;</span>req.params.id<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">const</span> cleanDescription = eventData.texte.<span style="color: #0080ff;">replace</span><span class="br0">&#40;</span><span style="color: #808080;">/&lt;[^&gt;]*&gt;/g</span>, <span style="color: #FF0000;">''</span><span class="br0">&#41;</span>.<span style="color: #0080ff;">substring</span><span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">160</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">const</span> imageUrl = <span style="color: #FF0000;">`https://moncoach.tn/<span style="color: #800000;">${eventData.photo}</span>`</span>;
  <span style="color: #0000ff;">const</span> pageUrl = <span style="color: #FF0000;">`https://moncoach.tn/Evenement/<span style="color: #800000;">${eventData._id}</span>`</span>;
&nbsp;
  <span style="color: #0000ff;">return</span> res.<span style="color: #0080ff;">send</span><span class="br0">&#40;</span><span style="color: #FF0000;">`</span>
<span style="color: #FF0000;">    &lt;html&gt;</span>
<span style="color: #FF0000;">      &lt;head&gt;</span>
<span style="color: #FF0000;">        &lt;meta property=&quot;og:title&quot; content=&quot;<span style="color: #800000;">${eventData.titre}</span>&quot; /&gt;</span>
<span style="color: #FF0000;">        &lt;meta property=&quot;og:description&quot; content=&quot;<span style="color: #800000;">${cleanDescription}</span>&quot; /&gt;</span>
<span style="color: #FF0000;">        &lt;meta property=&quot;og:image&quot; content=&quot;<span style="color: #800000;">${imageUrl}</span>&quot; /&gt;</span>
<span style="color: #FF0000;">        &lt;meta property=&quot;og:url&quot; content=&quot;<span style="color: #800000;">${pageUrl}</span>&quot; /&gt;</span>
<span style="color: #FF0000;">      &lt;/head&gt;</span>
<span style="color: #FF0000;">      &lt;body&gt;&lt;/body&gt;</span>
<span style="color: #FF0000;">    &lt;/html&gt;</span>
<span style="color: #FF0000;">  `</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span><span class="br0">&#41;</span>;</pre></td></tr></table></code><hr />
</div>Mon problème :<br />
Quand je partage un lien /Evenement/:id sur Facebook ou LinkedIn, les balises OG affichées sont celles de ma page React SPA (index.html) et pas celles dynamiques envoyées par mon backend.<br />
<br />
Je précise que dans React, j’utilise aussi react-helmet pour gérer les balises meta côté client.<br />
<br />
Mes questions :<br />
<br />
Est-ce que le fait d’utiliser React Helmet côté client ne suffit pas pour que les bots récupèrent les bonnes balises OG ?<br />
<br />
Comment être sûr que ma route backend est bien prioritaire par rapport au serveur React SPA ?<br />
<br />
Y a-t-il des paramètres à vérifier côté proxy / serveur pour ne pas écraser ma réponse dynamique ?<br />
<br />
Quelle est la meilleure pratique pour gérer ces balises OG dynamiques dans une SPA React + backend Node.js ?<br />
<br />
Merci d’avance pour votre aide !</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2196/javascript/bibliotheques-frameworks/react/">React</category>
			<dc:creator>bas_ma</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2177575/javascript/bibliotheques-frameworks/react/generation-dynamique-balises-open-graph-spa-react-backend-node-js-express/</guid>
		</item>
		<item>
			<title><![CDATA[[React Native] Ou doit-on créer un module]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2177478&amp;goto=newpost</link>
			<pubDate>Thu, 12 Jun 2025 19:55:51 GMT</pubDate>
			<description>Bonjour, 
 
Je suis un tuto...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
Je suis un tuto pour créer son module avec la commande<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">npx create-expo-module@latest --local</code><hr />
</div>ou<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">npx create-expo-module@latest my-module</code><hr />
</div>Je comprends que pour la première commande, on va créer un module pour un projet existant, alors que la deuxième commande va créer un module que l'on va pouvoir partager. Je souhaiterais partager mon travail, mais j'en ai besoin pour mon projet.<br />
<br />
Le tuto ne dit pas une chose. Je comprends que si on crée un module pour son porjet, le faut êtres dans son projet, là ou se toruve le fichier package.json.<br />
<br />
Par contre, si je veux créé un module avec la seconde commande, ou dois-je me trouver? Doit-il être enfant à mon projet <br />
<br />
mon_projet/app/page.tsx<br />
mon_projet/package.json<br />
mon_projet/ICI<br />
<br />
ou au niveau de mon_projet, pour lancer la commande <br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">npx create-expo-module@latest my-module</code><hr />
</div>Ou si je crée un module pour mon projet avec la commande<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">npx create-expo-module@latest --local</code><hr />
</div>Est-ce que je peux aussi la partager dans React Native Directory?</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2196/javascript/bibliotheques-frameworks/react/">React</category>
			<dc:creator>pierrot10</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2177478/javascript/bibliotheques-frameworks/react/react-native-on-creer-module/</guid>
		</item>
		<item>
			<title>Quelle librairie pour faire une map avec cluster</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2177345&amp;goto=newpost</link>
			<pubDate>Thu, 05 Jun 2025 22:05:51 GMT</pubDate>
			<description>Bonjour, 
 
Voilà trois...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
Voilà trois bonnes soirées à lutter avec react-native-map-cluster, qui n'est plus maintenue depuis 4 ans :(. Avec éa version 0.76 et 53 du SDK, elle ne fonctionne plus et ... je suis au bout..<br />
<br />
J'arrive sans problème à afficher une carte avec react-native.maps avec OpenStreetMap.<br />
Mais je dois absolumen utiliser du clustering<br />
<br />
J'arrive donc à venir vers vous pour savoir si vous avec une expérience pour React Native (iOS/Android) pour affciher une carte avec les markers clusterisé.<br />
Pour &quot;simplifier&quot; le truc, j'aimerais utiliser OpenStreetMap.<br />
<br />
Sur ma version Web, j'utilise Leaflet, mais il n'y a pas de version pour Ract Native, ... du moins , j'en ai pas trouvé.<br />
Pensez-vous quîl serait facile de créer une librairie avec Leaflet, compatible avec la nouvelle architecture et qui colle avec <a rel="nofollow" href="https://bud.eco-sensors.ch/" target="_blank">ma version web</a>?<br />
<br />
Milles mercis</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f2196/javascript/bibliotheques-frameworks/react/">React</category>
			<dc:creator>pierrot10</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2177345/javascript/bibliotheques-frameworks/react/librairie-faire-map-cluster/</guid>
		</item>
	</channel>
</rss>
