<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Benjamin Auzanneau</title>
    <description>The latest articles on Forem by Benjamin Auzanneau (@necraidan).</description>
    <link>https://forem.com/necraidan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175138%2F37835bce-df07-4cfb-94ac-a7117a613aec.png</url>
      <title>Forem: Benjamin Auzanneau</title>
      <link>https://forem.com/necraidan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/necraidan"/>
    <language>en</language>
    <item>
      <title>Le package.json</title>
      <dc:creator>Benjamin Auzanneau</dc:creator>
      <pubDate>Fri, 30 Jan 2026 00:12:39 +0000</pubDate>
      <link>https://forem.com/necraidan/le-packagejson-3i2e</link>
      <guid>https://forem.com/necraidan/le-packagejson-3i2e</guid>
      <description>&lt;h2&gt;
  
  
  Le manifeste
&lt;/h2&gt;

&lt;p&gt;Le &lt;code&gt;package.json&lt;/code&gt; est le fichier &lt;a href="https://fr.wikipedia.org/wiki/Manifeste" rel="noopener noreferrer"&gt;manifeste&lt;/a&gt; d'un projet JavaScript. Il raconte ce que ton projet est, ce dont il dépend et comment il se construit ou se lance.&lt;/p&gt;

&lt;h2&gt;
  
  
  L'origine
&lt;/h2&gt;

&lt;p&gt;Au debut de Node.js, chaque module devait declarer son nom, sa version et ses dépendances pour etre installé correctement. Le &lt;code&gt;package.json&lt;/code&gt; s'est imposé avec npm comme format standard pour decrire un package.&lt;/p&gt;

&lt;p&gt;C'etait un moyen simple et lisible de partager un module et de permettre a npm de résoudre les dépendances.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Il n'y a pas que npm qui utilise le &lt;code&gt;package.json&lt;/code&gt; : &lt;a href="https://yarnpkg.com/" rel="noopener noreferrer"&gt;yarn&lt;/a&gt;, &lt;a href="https://pnpm.io/fr/" rel="noopener noreferrer"&gt;pnpm&lt;/a&gt; et d'autres gestionnaires de paquets s'appuient aussi dessus avec une façon différente de gérer les dépendances et surtout, le moyen de les résoudre.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Les attributs
&lt;/h2&gt;

&lt;p&gt;Dans les grandes lignes, on trouve plusieurs categories de champs dans le &lt;code&gt;package.json&lt;/code&gt; :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Catégorie&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Identité&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;name&lt;/code&gt;, &lt;code&gt;version&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, &lt;code&gt;license&lt;/code&gt;, &lt;code&gt;author&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dépendances&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;dependencies&lt;/code&gt;, &lt;code&gt;devDependencies&lt;/code&gt;, &lt;code&gt;peerDependencies&lt;/code&gt;, &lt;code&gt;optionalDependencies&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scripts&lt;/td&gt;
&lt;td&gt;commandes standardisées (&lt;code&gt;npm run dev&lt;/code&gt;, &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, etc.) ou non&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compatibilité&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;engines&lt;/code&gt;, &lt;code&gt;os&lt;/code&gt;, &lt;code&gt;cpu&lt;/code&gt; pour cadrer l'environnement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publication&lt;/td&gt;
&lt;td&gt;ce qui est inclus dans le package, la version, les fichiers d'entrée&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customisation&lt;/td&gt;
&lt;td&gt;des champs spécifiques aux outils (babel, eslint, jest, etc.) ou tout simplement que vous souhaitez utiliser&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Dans la partie scripts, j'ai récemmenet découvert un mécanisme sympa : &lt;code&gt;pre&amp;lt;nomScript&amp;gt;&lt;/code&gt; et &lt;code&gt;post&amp;lt;nomScript&amp;gt;&lt;/code&gt; se lancent automatiquement avant/après n'importe quel script (ex: &lt;code&gt;prebuild&lt;/code&gt; / &lt;code&gt;postbuild&lt;/code&gt; autour de &lt;code&gt;build&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mon-projet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;identite&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;du&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;package&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;publiee&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mon app de demo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"license"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MIT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;license&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;du&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;package&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"necraidan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;commande&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;dev&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vite build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;build&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;production&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vitest"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;tests&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"react"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^18.3.0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;deps&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;runtime&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"devDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^5.4.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;outils&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;dev&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vitest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.1.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"peerDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"react"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;=18"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;compatibilité&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;attendue&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"optionalDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fsevents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.3.3"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;optionnel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(ex:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;macOS)&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"engines"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;=20"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ciblee&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eslintConfig"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"eslint:recommended"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;champs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;custom&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Les types de dépendances
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dependencies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;indispensables au fonctionnement de l'app en production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;devDependencies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;utiles en développement (tests, lint, build), pas nécessaires en prod&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;peerDependencies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;indiquent la compatibilité attendue avec un autre package sans l'embarquer soi‑même (ex. une lib React qui attend React installé)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;optionalDependencies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;optionnelles ; si l'installation échoue, npm continue quand même. À toi de gérer l'absence au runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bundleDependencies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;dépendances &lt;strong&gt;embarquées&lt;/strong&gt; lors de la publication du package&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Pour aller plus loin, la &lt;a href="https://docs.npmjs.com/cli/v11/configuring-npm/package-json" rel="noopener noreferrer"&gt;documentation officielle du package.json&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Focus sur les &lt;code&gt;peerDependencies&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Une &lt;code&gt;peerDependency&lt;/code&gt;, c'est une dépendance que ton package &lt;strong&gt;n'installe pas lui-même&lt;/strong&gt; : il déclare seulement une compatibilité.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;le but : éviter les doublons et les conflits de versions (cas typiques : eslint, vite, react côté librairies).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Depuis npm 7+, les peers sont prises en compte automatiquement pendant la résolution et des conflits de versions peuvent faire échouer l'installation :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint-plugin-acme"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"peerDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"eslint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^9.0.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"peerDependenciesMeta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"typescript"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"optional"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ici, le plugin n'installe pas eslint : il annonce juste la version attendue. C'est le projet hôte qui doit fournir eslint (en &lt;code&gt;dependencies&lt;/code&gt; ou &lt;code&gt;devDependencies&lt;/code&gt; selon son usage).&lt;/p&gt;

&lt;p&gt;Le bloc &lt;code&gt;peerDependenciesMeta&lt;/code&gt; indique que &lt;code&gt;typescript&lt;/code&gt; est une peer &lt;strong&gt;optionnelle&lt;/strong&gt; : si &lt;code&gt;typescript&lt;/code&gt; n'est pas présent dans le projet hôte, l'installation ne doit pas échouer pour cette raison.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le lockfile de npm : le package-lock.json
&lt;/h2&gt;

&lt;p&gt;Un &lt;strong&gt;lockfile&lt;/strong&gt; permet de fixer des dépendances. Il est conçu pour être versionné dans votre repo afin de pouvoir avoir une rejouabilité des installations prédictibles. Cependant, cela peut varier selon l’OS ou l'architecture, les dépendances optionnelles ou les champs encore les ce qui est spécifié dans les champs &lt;code&gt;os&lt;/code&gt;/&lt;code&gt;cpu&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Le &lt;code&gt;package-lock.json&lt;/code&gt; décrit l’état exact résolu : l’arbre complet des dépendances (y compris transitives), avec versions précises, sources de téléchargement (&lt;code&gt;resolved&lt;/code&gt;) et empreintes (&lt;code&gt;integrity&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Ce qu’on trouve dedans
&lt;/h3&gt;

&lt;p&gt;Concrètement, on va y trouver un &lt;code&gt;lockfileVersion&lt;/code&gt; pour la version du format. La partie &lt;code&gt;packages&lt;/code&gt; est la description des packages par chemin, avec &lt;code&gt;resolved&lt;/code&gt; et &lt;code&gt;integrity&lt;/code&gt; (présent avec le package-lock.json v2+, npm 7+ ; aujourd'hui, npm 9+ génère un &lt;code&gt;lockfileVersion: 3&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;npm install&lt;/code&gt; vs &lt;code&gt;npm ci&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;La commande &lt;code&gt;npm install&lt;/code&gt; va installer les dépendances en s’appuyant sur &lt;code&gt;package.json&lt;/code&gt; et le &lt;code&gt;package-lock.json&lt;/code&gt;. Il peut le régénérer ou le modifier selon les cas.&lt;/p&gt;

&lt;p&gt;La commande &lt;code&gt;npm ci&lt;/code&gt; va suivre le &lt;code&gt;package-lock.json&lt;/code&gt;, elle échoue si le &lt;code&gt;package.json&lt;/code&gt; et le &lt;code&gt;package-lock.json&lt;/code&gt; ne correspondent pas, supprime les &lt;code&gt;node_modules&lt;/code&gt; (en théorie 😅) avant de lancer l'installation et ne touche pas au &lt;code&gt;package-lock.json&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  Cas avancés
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npm-shrinkwrap.json&lt;/code&gt; a priorité sur &lt;code&gt;package-lock.json&lt;/code&gt; et fige l'arbre des dépendances pour un package publié. En pratique, c'est surtout adapté aux applications/CLI publiées, et généralement déconseillé pour les bibliothèques.&lt;/p&gt;

&lt;p&gt;L'attribut &lt;code&gt;overrides&lt;/code&gt; peut être utiliser pour de forcer une version d’une dépendance transitive pour surcharger une version particulière.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Le &lt;code&gt;package.json&lt;/code&gt; décrit l’intention de ton projet (scripts, compatibilité, plages de versions). Le &lt;code&gt;package-lock.json&lt;/code&gt;, lui, fige l’état exact installé : c’est ce qui rend les builds reproductibles. En pratique : on versionne le lockfile, on installe avec &lt;code&gt;npm ci&lt;/code&gt; en CI, et on relit ses diffs comme du code. C’est ce duo qui évite les “ça marche chez moi” et stabilise le projet dans le temps.&lt;/p&gt;

&lt;p&gt;Encore une fois c'est un mémo sans doute trivial en partie mais qui permet de réunir en un seul endroit l'essentiel de ce qu'est le package.json.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.npmjs.com/cli/v11/configuring-npm/npm-shrinkwrap-json/" rel="noopener noreferrer"&gt;npm-shrinkwrap.json&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.npmjs.com/cli/v11/configuring-npm/package-lock-json/" rel="noopener noreferrer"&gt;package-lock.json&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>npm</category>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Guide du SemVer avec npm</title>
      <dc:creator>Benjamin Auzanneau</dc:creator>
      <pubDate>Wed, 28 Jan 2026 02:21:44 +0000</pubDate>
      <link>https://forem.com/necraidan/guide-du-semver-avec-npm-751</link>
      <guid>https://forem.com/necraidan/guide-du-semver-avec-npm-751</guid>
      <description>&lt;p&gt;Je ne compte pas le nombre de fois où je me suis posé la question de ce que faisait les symboles devant les versions dans un &lt;code&gt;package.json&lt;/code&gt; sans en être totalement sûrs. On va essayer d'y voir plus clair dans cet article.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Initialement, j'avais rédigé cet article en juillet 2021.&lt;/p&gt;

&lt;p&gt;Il comportait une petite erreur sur l'utilisation du &lt;code&gt;caret&lt;/code&gt;. J'en ai donc profité pour le corriger et l'enrichir, et j'ai désormais un article dédié au &lt;a href="https://dev.to/package-lock-json-avec-npm"&gt;&lt;code&gt;package-lock.json&lt;/code&gt;&lt;/a&gt; dans la même série.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Le &lt;code&gt;SemVer&lt;/code&gt;, c’est quoi ?
&lt;/h2&gt;

&lt;p&gt;Le &lt;code&gt;SemVer&lt;/code&gt; (&lt;strong&gt;Semantic Versioning&lt;/strong&gt;) est une convention de versionnement qui donne du sens aux numéros de version.&lt;/p&gt;

&lt;p&gt;Si l'on s'appuie sur le &lt;a href="https://semver.org" rel="noopener noreferrer"&gt;site officiel&lt;/a&gt;, on retrouve la forme :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;MAJEURE.MINEURE.CORRECTIF&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pour aller plus loin, n’hésitez pas à consulter &lt;a href="https://semver.org" rel="noopener noreferrer"&gt;semver.org&lt;/a&gt; et j'ai un article dédié sur le sujet : &lt;a href="https://dev.to/semver-les-bases"&gt;SemVer : les bases&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;npm&lt;/code&gt; va venir enrichir ces notions avec des &lt;strong&gt;symboles&lt;/strong&gt;. Ce sont des &lt;strong&gt;ranges&lt;/strong&gt; (plage de versions en bon français). Elles indiquent ce que le projet &lt;strong&gt;accepte&lt;/strong&gt; comme mises à jour, notamment lors des &lt;code&gt;npm install&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Le symbole &lt;code&gt;^&lt;/code&gt; : “jusqu’à la prochaine release majeure”
&lt;/h3&gt;

&lt;p&gt;Le &lt;strong&gt;caret&lt;/strong&gt; autorise les mises à jour tant que le premier chiffre non nul reste identique :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"react"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.2.3"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"shiki"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^0.2.3"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"tslib"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^0.0.3"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Sur les versions &lt;code&gt;0.x&lt;/code&gt;, le caret est plus restrictif. Dans notre exemple, &lt;code&gt;^0.2.3&lt;/code&gt; bloque le passage à tout ce qui est supérieur ou égal à &lt;code&gt;0.3.0&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Le symbole &lt;code&gt;~&lt;/code&gt; : “patchs uniquement”
&lt;/h3&gt;

&lt;p&gt;Le &lt;strong&gt;tilde&lt;/strong&gt; autorise des changements au niveau correctif, tant que la mineure ne bouge pas :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"shiki"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~1.2.3"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"tslib"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~0.2.3"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Les symboles &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;gt;=&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;lt;=&lt;/code&gt;, &lt;code&gt;=&lt;/code&gt; : comparateurs
&lt;/h3&gt;

&lt;p&gt;Ces opérateurs fonctionnent comme des comparateurs classiques :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"react"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;1.2.3"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;strictement&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;supérieur&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"shiki"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;=1.2.3"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;supérieur&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ou&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;égal&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"tslib"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;2.0.0"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;strictement&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;inférieur&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"axios"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;=2.0.0"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;inférieur&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ou&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;égal&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"redux"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.2.3"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(ou&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`=&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;`)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;exacte&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Le symbole &lt;code&gt;-&lt;/code&gt; : inclusif
&lt;/h3&gt;

&lt;p&gt;Un intervalle avec tiret est inclusif sur les bornes :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"tslib"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.2.3 - 2.3.4"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="mf"&gt;2.3&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"shiki"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.2.0 - 0.4.2"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;accepte&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mais&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;pas&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Le symbole &lt;code&gt;||&lt;/code&gt; : combiner des ensembles
&lt;/h3&gt;

&lt;p&gt;Un intervalle avec le &lt;em&gt;double pipe&lt;/em&gt; combine les deux ensembles :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"tslib"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^0.2.0 || &amp;gt;=0.5.0 &amp;lt;1.2.0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Compatible&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;avec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;l'ensemble&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;^&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ou&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Le dist-tag : &lt;code&gt;latest&lt;/code&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Point important : &lt;code&gt;latest&lt;/code&gt; n’est pas une règle SemVer. C’est un &lt;a href="https://docs.npmjs.com/cli/v8/commands/npm-dist-tag" rel="noopener noreferrer"&gt;&lt;strong&gt;dist-tag npm&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"shiki"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"latest"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Par défaut, la commande &lt;code&gt;npm install &amp;amp;lt;pkg&amp;amp;gt;&lt;/code&gt; installe la version pointée par le tag &lt;code&gt;latest&lt;/code&gt; (si on ne met ni &lt;code&gt;@&amp;amp;lt;version&amp;amp;gt;&lt;/code&gt; ni &lt;code&gt;@&amp;amp;lt;tag&amp;amp;gt;&lt;/code&gt;). Un mainteneur peut alors faire pointer &lt;code&gt;latest&lt;/code&gt; vers une version qui n’est pas forcément “la plus récente” au sens strict et utiliser d’autres tags (&lt;code&gt;beta&lt;/code&gt;, &lt;code&gt;next&lt;/code&gt;, etc.).&lt;/p&gt;

&lt;h3&gt;
  
  
  Bonus : &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt; et les pré-releases &lt;code&gt;-alpha&lt;/code&gt;, &lt;code&gt;-beta&lt;/code&gt;
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"tslib"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.2.x"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"shiki"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.2.*"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"redux"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;gt;=1.2.3-0 &amp;lt;1.3.0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;inclut&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;les&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;pré-releases&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;-*&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Les pré-releases (&lt;code&gt;-alpha&lt;/code&gt;, &lt;code&gt;-beta&lt;/code&gt;) ont des règles spécifiques : par défaut, elles sont exclues des ranges. Pour les inclure, on peut utiliser une borne avec &lt;code&gt;-0&lt;/code&gt; (ou une version pré-release) dans la range.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;La première fois que j'ai rédigé cet article, j'avais essayé d'être le plus minimal possible. Je me suis rendu compte que c'était quand même plus sympa d'aller un peu plus loin, pour bien comprendre le fonctionnement du versionnement avec &lt;code&gt;npm&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;J'ai rédigé cet article pour m'en faire un mémo, l'avoir toujours sous la main et le mettre dans mes favoris. Vous pouvez en faire autant !&lt;/p&gt;




&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tableau officiel &lt;code&gt;npm&lt;/code&gt; sur le SemVer et les ranges : &lt;a href="https://docs.npmjs.com/about-semantic-versioning" rel="noopener noreferrer"&gt;https://docs.npmjs.com/about-semantic-versioning&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Calculateur de ranges &lt;code&gt;npm&lt;/code&gt; : &lt;a href="https://semver.npmjs.com/" rel="noopener noreferrer"&gt;https://semver.npmjs.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>npm</category>
      <category>semver</category>
      <category>javascript</category>
      <category>web</category>
    </item>
    <item>
      <title>Le SemVer</title>
      <dc:creator>Benjamin Auzanneau</dc:creator>
      <pubDate>Wed, 28 Jan 2026 02:08:55 +0000</pubDate>
      <link>https://forem.com/necraidan/le-semver-3n15</link>
      <guid>https://forem.com/necraidan/le-semver-3n15</guid>
      <description>&lt;p&gt;Le &lt;strong&gt;Semantic Versioning&lt;/strong&gt;, plus connu sous le nom de &lt;strong&gt;SemVer&lt;/strong&gt;, est une convention assez simple : avoir des numéros qui indiquent &lt;strong&gt;ce qui change&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;L’idée n’est pas d’être parfait, mais d’être &lt;strong&gt;prévisible&lt;/strong&gt; pour celles et ceux qui consomment une lib ou un package.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aux origines
&lt;/h2&gt;

&lt;p&gt;Le Semantic Versioning est formalisé autour de 2010 par Tom Preston-Werner, cofondateur de GitHub.&lt;/p&gt;

&lt;p&gt;Le problème est simple : les numéros de version sont utilisés de manière incohérente, chacun fait un peu ce qu'il veut et il est difficile de savoir si une mise à jour va casser une application. L’objectif de cette convention va donc être de &lt;strong&gt;donner du sens aux numéros de version&lt;/strong&gt;, afin qu’ils deviennent &lt;em&gt;exploitables&lt;/em&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MAJEURE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Changements incompatibles avec les versions précédentes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MINEURE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nouvelles fonctionnalités rétrocompatibles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CORRECTIF&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Corrections de bugs rétrocompatibles&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cette simplicité est l’une des raisons majeures de son adoption.&lt;/p&gt;

&lt;h2&gt;
  
  
  Une convention
&lt;/h2&gt;

&lt;p&gt;Un point fondamental : ce système n’est pas un standard technique et n’est imposé par aucune autorité. La spécification officielle parle explicitement de règles, de recommandations et de bonnes pratiques. Cette convention repose entièrement sur &lt;strong&gt;la discipline et la bonne foi des mainteneurs&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le cœur de la convention : la notion d’API publique
&lt;/h2&gt;

&lt;p&gt;Elle suppose l’existence d’une &lt;strong&gt;API publique clairement définie&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Une API est un outil informatique qui permet à un site internet ou à un logiciel de communiquer avec un autre ordinateur et échanger des données.&lt;/p&gt;

&lt;p&gt;Source incroyable : &lt;a href="https://api.gouv.fr/apropos" rel="noopener noreferrer"&gt;https://api.gouv.fr/apropos&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;C’est cette &lt;strong&gt;API&lt;/strong&gt; qui sert de référence pour décider si un changement est majeur, mineur ou un correctif. En pratique, modifier un comportement interne non documenté &lt;strong&gt;n’est pas considéré comme un breaking change&lt;/strong&gt; au regard de l’API publique, même si cela casse le code de certains utilisateurs. Elle ne protège donc pas les usages implicites, détournés ou non documentés.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;C’est un &lt;strong&gt;engagement moral&lt;/strong&gt;, pas une garantie contractuelle.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Le cas particulier des versions &lt;code&gt;0.x&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;La spécification est très claire sur ce point : avant la version 1.0.0, l’API est considérée comme instable. On reviendra sur ce point dans l'article : &lt;a href="https://dev.to/guide-du-semver-avec-npm"&gt;Guide du SemVer avec npm&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Le SemVer est née d’un besoin très concret : rendre les mises à jour plus prévisibles dans un monde de dépendances automatisées. Il apporte un langage commun, une structure simple et surtout une convention. Mais attention, ça ne fonctionne que si l'ensemble de la chaîne la respecte.&lt;/p&gt;

&lt;p&gt;Cette convention aide à faire confiance mais ne dispense pas de vérifier.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Spécification officielle du &lt;strong&gt;Semantic Versioning&lt;/strong&gt;,&lt;br&gt;&lt;br&gt;
&lt;a href="https://semver.org/" rel="noopener noreferrer"&gt;https://semver.org/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Documentation npm – &lt;strong&gt;Semantic Versioning&lt;/strong&gt;, &amp;amp; ranges&lt;br&gt;&lt;br&gt;
&lt;a href="https://docs.npmjs.com/about-semantic-versioning" rel="noopener noreferrer"&gt;https://docs.npmjs.com/about-semantic-versioning&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tom Preston-Werner – &lt;em&gt;&lt;strong&gt;Semantic Versioning&lt;/strong&gt;,&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://tom.preston-werner.com/2010/08/23/semantic-versioning.html" rel="noopener noreferrer"&gt;https://tom.preston-werner.com/2010/08/23/semantic-versioning.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hynek Schlawack – &lt;em&gt;&lt;strong&gt;Semantic Versioning&lt;/strong&gt;, Will Not Save You&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://hynek.me/articles/semver-will-not-save-you/" rel="noopener noreferrer"&gt;https://hynek.me/articles/semver-will-not-save-you/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Discussions communautaires sur les limites du SemVer&lt;br&gt;&lt;br&gt;
&lt;a href="https://clojureverse.org/t/stop-using-semantic-versioning-any-writings-on-this/9951" rel="noopener noreferrer"&gt;https://clojureverse.org/t/stop-using-semantic-versioning-any-writings-on-this/9951&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>semver</category>
      <category>npm</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Npx, c'est quoi ?</title>
      <dc:creator>Benjamin Auzanneau</dc:creator>
      <pubDate>Sun, 29 Jan 2023 15:30:32 +0000</pubDate>
      <link>https://forem.com/necraidan/cest-quoi-npx--9ie</link>
      <guid>https://forem.com/necraidan/cest-quoi-npx--9ie</guid>
      <description>&lt;p&gt;&lt;strong&gt;Npx&lt;/strong&gt; est un outil développé par &lt;strong&gt;npm&lt;/strong&gt; qui facilite l'exécution de packages &lt;em&gt;Node.js&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
Il est livré avec &lt;strong&gt;npm&lt;/strong&gt; à partir de la version &lt;em&gt;5.2&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Avant l'arrivée de &lt;strong&gt;npx&lt;/strong&gt;, il était nécessaire d'installer des packages en tant que dépendance pour pouvoir les utiliser dans un projet.&lt;br&gt;&lt;br&gt;
Grâce à lui, il est maintenant possible d'exécuter des packages sans devoir les installer de manière permanente.&lt;/p&gt;
&lt;h2&gt;
  
  
  Comment fonctionne npx ?
&lt;/h2&gt;

&lt;p&gt;Lorsque vous utilisez &lt;strong&gt;npx&lt;/strong&gt; pour exécuter un package, celui-ci vérifie d'abord s'il existe déjà dans votre projet ou s'il est installé globalement :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;S'il existe, il l'exécute.&lt;/li&gt;
&lt;li&gt;S'il n'existe pas, &lt;strong&gt;npx&lt;/strong&gt; l'installe temporairement et l'exécute.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cela permet de tester des packages sans devoir les installer dans votre projet.&lt;/p&gt;

&lt;p&gt;Pour utiliser &lt;strong&gt;npx&lt;/strong&gt;, il suffit de taper la commande &lt;code&gt;npx&lt;/code&gt; suivie du nom du package que vous souhaitez exécuter.&lt;/p&gt;

&lt;p&gt;Par exemple :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx mon-super-package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Npx vs npm
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Npm&lt;/strong&gt; est un gestionnaire de packages qui vous aide à installer vos dépendances en lisant votre fichier package.json (à l'instar de &lt;strong&gt;yarn&lt;/strong&gt; et &lt;strong&gt;pnpm&lt;/strong&gt;) à l'aide des commandes :&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;ou&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Il permet également d'exécuter des commandes déjà définies dans votre projet.&lt;br&gt;&lt;br&gt;
A la différence de &lt;strong&gt;npx&lt;/strong&gt;, vous pouvez également lancer des commandes de package mais uniquement issues des packages déjà installés.&lt;/p&gt;
&lt;h2&gt;
  
  
  Et dlx ?
&lt;/h2&gt;

&lt;p&gt;A l'instar de &lt;strong&gt;npx&lt;/strong&gt;, &lt;strong&gt;dlx&lt;/strong&gt; vous permet d'exécuter des packages sans les installer.&lt;br&gt;&lt;br&gt;
Utilsable avec &lt;strong&gt;pnpm&lt;/strong&gt; ou &lt;strong&gt;yarn&lt;/strong&gt;, c'est l'équivalent de &lt;strong&gt;npx&lt;/strong&gt; avec ces &lt;em&gt;packages manager&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Cependant, &lt;strong&gt;dlx&lt;/strong&gt; n'utilisera jamais vos packages locaux pour l'exécution de commande.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Avant la version &lt;em&gt;5.2&lt;/em&gt;. de &lt;strong&gt;npm&lt;/strong&gt;, on devait installer nos packages pour les utiliser.&lt;/p&gt;

&lt;p&gt;Aujourd'hui, c'est beaucoup plus simple et ça permet de tester des packages avant de les installer.&lt;br&gt;
On peut également utiliser &lt;strong&gt;npx&lt;/strong&gt; ou &lt;strong&gt;dlx&lt;/strong&gt; pour lancer des &lt;em&gt;scaffolding&lt;/em&gt; d'application :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// init d'un projet nuxt
pnpm dlx nuxi init &amp;lt;project-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// init d'un projet react
npx create-react-app my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Merci d'avoir lu cet article ! &lt;br&gt;
Il a été posté initialement sur mon &lt;a href="https://necraidan.com" rel="noopener noreferrer"&gt;site&lt;/a&gt; : &lt;a href="https://necraidan.com/blog/npm-npx-dlx" rel="noopener noreferrer"&gt;https://necraidan.com/blog/npm-npx-dlx&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Cover par &lt;a href="https://unsplash.com/@jiaweizhao" rel="noopener noreferrer"&gt;Jiawei Zhao&lt;/a&gt; sur &lt;a href="https://unsplash.com/photos/BsXeYX3efOI" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>redux</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Angular 14 en 3 features</title>
      <dc:creator>Benjamin Auzanneau</dc:creator>
      <pubDate>Tue, 07 Jun 2022 21:50:29 +0000</pubDate>
      <link>https://forem.com/necraidan/angular-14-en-3-features-23pn</link>
      <guid>https://forem.com/necraidan/angular-14-en-3-features-23pn</guid>
      <description>&lt;p&gt;Depuis le 2 juin 2022, la core team Angular a released la version 14 d'Angular.&lt;/p&gt;

&lt;p&gt;Voici le top 3 de ce que j'ai retenu :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝐒𝐭𝐚𝐧𝐝𝐚𝐥𝐨𝐧𝐞 𝐜𝐨𝐦𝐩𝐨𝐧𝐞𝐧𝐭&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les composants autonomes font leur apparition en 𝘥𝘦𝘷𝘦𝘭𝘰𝘱𝘱𝘦𝘳 𝘱𝘳𝘦𝘷𝘪𝘦𝘸.&lt;br&gt;
Plus besoin de créer un NgModule pour pouvoir importer/utiliser votre composant.&lt;/p&gt;

&lt;p&gt;Disponible également pour les directives et les pipes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://angular.io/guide/standalone-components" rel="noopener noreferrer"&gt;https://angular.io/guide/standalone-components&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.ninja-squad.com/2022/05/12/a-guide-to-standalone-components-in-angular/" rel="noopener noreferrer"&gt;https://blog.ninja-squad.com/2022/05/12/a-guide-to-standalone-components-in-angular/&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝐂𝐨𝐦𝐩𝐢𝐥𝐞𝐫 𝐚𝐧𝐝 𝐩𝐫𝐨𝐭𝐞𝐜𝐭𝐞𝐝 𝐦𝐞𝐦𝐛𝐞𝐫𝐬&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vous le savez déjà mais jusqu'à Angular 14, on ne pouvait mettre que des 𝘢𝘵𝘵𝘳𝘪𝘣𝘶𝘵𝘴 de classe public dans les 𝘵𝘦𝘮𝘱𝘭𝘢𝘵𝘦𝘴.&lt;br&gt;
On peut désormais ajouter des attributs 𝐩𝐫𝐨𝐭𝐞𝐜𝐭𝐞𝐝 !&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝐓𝐲𝐩𝐞𝐝 𝐀𝐧𝐠𝐮𝐥𝐚𝐫 𝐅𝐨𝐫𝐦𝐬&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le typage strict des 𝘙𝘦𝘢𝘤𝘵𝘪𝘷𝘦 𝘍𝘰𝘳𝘮𝘴 arrive enfin !&lt;/p&gt;

&lt;p&gt;&lt;a href="https://angular.io/guide/typed-forms" rel="noopener noreferrer"&gt;https://angular.io/guide/typed-forms&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;𝐁𝐨𝐧𝐮𝐬 : 𝐂𝐡𝐚𝐧𝐠𝐞 𝐝𝐞𝐭𝐞𝐜𝐭𝐢𝐨𝐧 𝐛𝐲 Minko Gechev&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En bonus, Minko vous propose de revoir les optimisations que l'on peut faire avec le changement détection et l'optimisation du runtime.&lt;/p&gt;

&lt;p&gt;By the way, Thanks Minko Gechev for your video !&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/f8sA-i6gkGQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Vous voulez creuser un peu plus sur les nouveautés ?&lt;br&gt;
C'est par ici :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.angular.io/angular-v14-is-now-available-391a6db736af" rel="noopener noreferrer"&gt;https://blog.angular.io/angular-v14-is-now-available-391a6db736af&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.ninja-squad.com/2022/06/02/what-is-new-angular-14.0/" rel="noopener noreferrer"&gt;https://blog.ninja-squad.com/2022/06/02/what-is-new-angular-14.0/&lt;/a&gt;&lt;br&gt;
(Merci la Ninja Squad)&lt;/p&gt;



&lt;p&gt;Merci d'avoir lu cet article ! &lt;br&gt;
Il a été posté initialement sur mon &lt;a href="https://necraidan.com" rel="noopener noreferrer"&gt;site&lt;/a&gt; : &lt;a href="https://necraidan.com/blog/angular-14-3-features" rel="noopener noreferrer"&gt;https://necraidan.com/blog/angular-14-3-features&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;J'anime également un podcast sur le front-end :&lt;br&gt;
&lt;a href="https://anchor.fm/front-end-chronicles" rel="noopener noreferrer"&gt;https://anchor.fm/front-end-chronicles&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ou directement sur &lt;em&gt;spotify&lt;/em&gt; pour le dernier épisode : &lt;iframe src="https://open.spotify.com/embed/episode/4dgdQSPeo5SZbN71qikxcQ" width="100%" height="232px"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>angular</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>french</category>
    </item>
    <item>
      <title>A quoi servent les peerDependencies dans le package.json ?</title>
      <dc:creator>Benjamin Auzanneau</dc:creator>
      <pubDate>Thu, 20 May 2021 07:51:41 +0000</pubDate>
      <link>https://forem.com/younup/a-quoi-servent-les-peerdependencies-dans-le-package-json-3g29</link>
      <guid>https://forem.com/younup/a-quoi-servent-les-peerdependencies-dans-le-package-json-3g29</guid>
      <description>&lt;p&gt;Lors d'une installation &lt;code&gt;npm&lt;/code&gt; ou bien de la lecture d'un &lt;code&gt;package.json&lt;/code&gt;, vous avez sans doute remarqué qu'il y avait deux grands groupes de dépendances : les &lt;code&gt;dependencies&lt;/code&gt; et les &lt;code&gt;devDependencies&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Le premier représente les dépendances directs de votre projet (ce dont on a besoin pour que cela fonctionne).&lt;/p&gt;

&lt;p&gt;Le second représente ce qui entoure votre projet dans sa phase de développement (les outils qui vont permettre à celui-ci de fonctionner/builder/deployer par exemple).&lt;/p&gt;

&lt;p&gt;Il existe un troisième groupe à ne pas négliger : les &lt;code&gt;peerDependencies&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Dans cet article, on va vous expliquez ce que peut apporter le champs &lt;code&gt;peerDependencies&lt;/code&gt; dans votre &lt;code&gt;package.json&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ça sert à quoi les &lt;code&gt;peerDependencies&lt;/code&gt; ?
&lt;/h2&gt;

&lt;p&gt;En ajoutant une &lt;code&gt;dependencie&lt;/code&gt; dans cette section de votre package.json, vous indiquez :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Que votre code est compatible avec la version de la &lt;code&gt;dependencie&lt;/code&gt; indiquée&lt;/li&gt;
&lt;li&gt;Si la version de la &lt;code&gt;dependencie&lt;/code&gt; n'existe pas dans les &lt;em&gt;node_modules&lt;/em&gt;, on va lever un warning&lt;/li&gt;
&lt;li&gt;Si la version de la &lt;code&gt;dependencie&lt;/code&gt; existe dans les &lt;em&gt;node_modules&lt;/em&gt;, on ne fait rien&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cas d'école
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Ce cas est valable pour une version &lt;code&gt;npm&lt;/code&gt; &amp;gt; 3 et &amp;lt; 7 (on en parle à la fin de l'article).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Prenons un projet qui a pour dépendance &lt;code&gt;a&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Extrait&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;du&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;package.json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;notre&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;projet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;//...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"a"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si on se penche sur le package.json de la dépendance &lt;code&gt;a&lt;/code&gt; nous avons :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Extrait&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;du&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;package.json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;dépendance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;//...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"peerDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"b"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.0.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Un warning assez commun
&lt;/h3&gt;

&lt;p&gt;Il vous ait peut-être arrivé de tomber sur ce genre de message :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm WARN react-datepicker@0.25.0 requires a peer of react@^0.14.0 but none was installed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comme indiqué plus haut, ce &lt;code&gt;warning&lt;/code&gt; vous informe qu'un package possède une &lt;code&gt;dependencie&lt;/code&gt; qui n'est pas installée (non présente dans vos &lt;code&gt;node_modules&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Dans notre cas d'école, on va avoir :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm WARN a@1.0.0 requires a peer of b@^1.0.0 but none was installed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C'est donc à vous d'installer cette dépendance en l'ajoutant aux &lt;code&gt;dependencies&lt;/code&gt; de votre projet&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Extrait&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;du&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;package.json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;notre&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;projet&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;//...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"a"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"b"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Les versions installées doivent être compatibles entres elles en suivant la gestion sémantique de version (le semver pour les initié·e·s 👌).&lt;/p&gt;

&lt;h2&gt;
  
  
  Nouveauté de la version 7 de &lt;code&gt;npm&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Assez récente, cette nouvelle version vient changer cette façon de fonctionner.&lt;/p&gt;

&lt;p&gt;Comme mentionné plus haut, en fonction de la version de &lt;code&gt;npm&lt;/code&gt;, le comportement sera différent au niveau de l'installation des &lt;code&gt;dependencies&lt;/code&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avant la version 3.0 : &lt;code&gt;npm&lt;/code&gt; installait automatiquement les &lt;code&gt;peerDependencies&lt;/code&gt; mais cela occasionnait de nombreux problèmes (de versions...)&lt;/li&gt;
&lt;li&gt;Entre 3 et 7 : &lt;code&gt;npm&lt;/code&gt; lève un &lt;code&gt;warning&lt;/code&gt; vous informant qu'il y a des &lt;code&gt;peerDependencies&lt;/code&gt; à installer vous même&lt;/li&gt;
&lt;li&gt;7 : &lt;code&gt;npm&lt;/code&gt; réinstalle automatiquement les &lt;code&gt;peerDependencies&lt;/code&gt;. Une grosse refactorisation du code interne a permit de résoudre les problèmes rencontrés avant la version 3&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;La compréhension du concept est finalement assez simple à saisir, je vous encourage à aller jeter un œil à l'intérieur des packages que vous utilisez !&lt;/p&gt;

&lt;p&gt;Quant à la montée en version vers &lt;code&gt;npm&lt;/code&gt; 7, elle permet de nous facilité la vie sur la gestion de ces &lt;code&gt;dependencies&lt;/code&gt; en nous évitant de nous faire des nœuds au cerveau.&lt;/p&gt;




&lt;p&gt;Merci d'avoir lu cet article !&lt;br&gt;
Il a été posté initialement sur le &lt;a href="https://www.younup.fr/blog" rel="noopener noreferrer"&gt;blog&lt;/a&gt; de &lt;a class="mentioned-user" href="https://dev.to/younup_it"&gt;@younup_it&lt;/a&gt; :&lt;br&gt;
&lt;a href="https://www.younup.fr/blog/a-quoi-servent-les-peerdependencies-dans-le-package-json" rel="noopener noreferrer"&gt;https://www.younup.fr/blog/a-quoi-servent-les-peerdependencies-dans-le-package-json&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Cover par &lt;a href="https://unsplash.com/@jiaweizhao" rel="noopener noreferrer"&gt;Jackie Zhao&lt;/a&gt; sur &lt;a href="https://unsplash.com/photos/W-ypTC6R7_k" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>npm</category>
      <category>node</category>
      <category>peerdependencies</category>
    </item>
    <item>
      <title>nvm ou comment travailler avec plusieurs versions de Node.js</title>
      <dc:creator>Benjamin Auzanneau</dc:creator>
      <pubDate>Thu, 07 Jan 2021 08:55:35 +0000</pubDate>
      <link>https://forem.com/younup/nvm-ou-comment-travailler-avec-plusieurs-versions-de-node-js-39m3</link>
      <guid>https://forem.com/younup/nvm-ou-comment-travailler-avec-plusieurs-versions-de-node-js-39m3</guid>
      <description>&lt;p&gt;Aujourd'hui, il est assez commun de devoir installer &lt;strong&gt;Node.js&lt;/strong&gt; pour faire fonctionner un projet.&lt;/p&gt;

&lt;p&gt;L'installation étant assez simple, la modification et/ou la mise à jour de la version de &lt;strong&gt;Node.js&lt;/strong&gt; installée sur votre système l'est beaucoup moins&lt;/p&gt;

&lt;p&gt;Dans cet article on va parler d'une solution qui va nous permettre de changer simplement de version &lt;strong&gt;Node.js&lt;/strong&gt; à la volée : &lt;strong&gt;nvm&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Qu'est-ce que &lt;strong&gt;nvm&lt;/strong&gt; ?
&lt;/h2&gt;

&lt;p&gt;L'acronyme de &lt;em&gt;nvm&lt;/em&gt; signifie : &lt;em&gt;Node Version Manager&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Comment on l'a dit précédemment, cet outil va nous permettre de manager plusieurs version de &lt;strong&gt;Node.js&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Disponible uniquement sur environnement &lt;strong&gt;Unix&lt;/strong&gt; de base, un &lt;em&gt;fork&lt;/em&gt; a été réalisé pour &lt;em&gt;Windows&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation &lt;strong&gt;Unix&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.36.0/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vous pouvez également vous référer au &lt;a href="https://github.com/nvm-sh/nvm#install--update-script" rel="noopener noreferrer"&gt;readme&lt;/a&gt; pour des informations plus complètes sur l'installation &lt;strong&gt;Unix&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation &lt;strong&gt;Windows&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Pour &lt;strong&gt;Windows&lt;/strong&gt;, il faut se tourner vers le &lt;a href="https://github.com/coreybutler/nvm-windows/releases" rel="noopener noreferrer"&gt;fork&lt;/a&gt; et installer la dernière &lt;em&gt;release&lt;/em&gt; en date.&lt;/p&gt;

&lt;p&gt;Néanmoins, même si c'est fonctionnel, le projet n'a pas été mis à jour depuis Août 2018.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemples d'utilisation
&lt;/h2&gt;

&lt;p&gt;Voici un exemple d'installation d'une version de &lt;strong&gt;Node.js&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nb"&gt;install &lt;/span&gt;14.14.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En changeant le numéro de version, vous pourrez installer la version que vous souhaitez.&lt;/p&gt;

&lt;p&gt;Pour connaitre la liste des versions de &lt;strong&gt;Node.js&lt;/strong&gt; installées :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm list
    14.14.0
   &lt;span class="k"&gt;*&lt;/span&gt;14.11.0 &lt;span class="o"&gt;(&lt;/span&gt;Currently using 64-bit executable&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enfin, voici la commande pour pouvoir utiliser une version spécifique installée&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm use 14.14.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vos différentes variables d'environnement vont changer et pointer sur votre version de &lt;strong&gt;Node.js&lt;/strong&gt; voulue.&lt;/p&gt;

&lt;p&gt;Et... c'est tout !&lt;/p&gt;

&lt;h2&gt;
  
  
  Des alternatives existent
&lt;/h2&gt;

&lt;p&gt;Même si ces alternatives restent confidentielles à côté de &lt;strong&gt;nvm&lt;/strong&gt;, elles ne déméritent pas d'exister&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;n&lt;/strong&gt; : la différence notable avec &lt;strong&gt;nvm&lt;/strong&gt; est l'installation des packages globales. Dans &lt;strong&gt;nvm&lt;/strong&gt;, les packages globales sont séparés par version de &lt;strong&gt;Node.js&lt;/strong&gt; ce qui n'est pas le cas avec &lt;strong&gt;n&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nvs&lt;/strong&gt; : propose un interpréteur plus évolué et la possibilité de choisir également &lt;a href="https://github.com/microsoft/ChakraCore" rel="noopener noreferrer"&gt;ChakraCore&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Depuis l'annonce de &lt;strong&gt;Microsoft&lt;/strong&gt; de passer sur le même moteur de rendu que &lt;strong&gt;Chromium&lt;/strong&gt; (le &lt;em&gt;moteur V8&lt;/em&gt;, celui sur lequel est basé &lt;strong&gt;Node.js&lt;/strong&gt;), &lt;strong&gt;Microsoft&lt;/strong&gt; ne proposera plus de patch de sécurité sur &lt;strong&gt;ChakraCore&lt;/strong&gt; à partir du 9 Mars 2021&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  One more thing
&lt;/h2&gt;

&lt;p&gt;L'un des points fort de l'utilisation de &lt;strong&gt;nvm&lt;/strong&gt; quand vous êtes sur un environnement &lt;strong&gt;Unix&lt;/strong&gt; est de pouvoir placer un &lt;code&gt;.nvmrc&lt;/code&gt; à la racine de votre projet.&lt;br&gt;
&lt;strong&gt;nvm&lt;/strong&gt; changera automatiquement de version quand vous naviguerez dans votre dossier de projet !&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Pour du multi-projet ou pour votre poste de travail, l'utilisation de &lt;strong&gt;nvm&lt;/strong&gt; va vous permettre de pérenniser vos versions de &lt;strong&gt;Node.js&lt;/strong&gt;.&lt;br&gt;
A utiliser sans modération !&lt;/p&gt;




&lt;p&gt;Merci d'avoir lu cet article !&lt;br&gt;
Il a été posté initialement sur le &lt;a href="https://www.younup.fr/blog" rel="noopener noreferrer"&gt;blog&lt;/a&gt; de &lt;a class="mentioned-user" href="https://dev.to/younup_it"&gt;@younup_it&lt;/a&gt; :&lt;br&gt;
&lt;a href="https://www.younup.fr/blog/nvm-ou-comment-travailler-avec-plusieurs-versions-de-node-js" rel="noopener noreferrer"&gt;https://www.younup.fr/blog/nvm-ou-comment-travailler-avec-plusieurs-versions-de-node-js&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nvm</category>
      <category>node</category>
      <category>javascript</category>
      <category>french</category>
    </item>
    <item>
      <title>Comment publier son premier package npm</title>
      <dc:creator>Benjamin Auzanneau</dc:creator>
      <pubDate>Wed, 11 Nov 2020 10:30:31 +0000</pubDate>
      <link>https://forem.com/younup/comment-publier-son-premier-package-npm-cde</link>
      <guid>https://forem.com/younup/comment-publier-son-premier-package-npm-cde</guid>
      <description>&lt;p&gt;Dans cet article nous allons vous montrer comment nous pouvons simplement publier un package &lt;strong&gt;npm&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pour cela, nous allons utiliser un projet support, notre &lt;strong&gt;carte de visite Younup&lt;/strong&gt; !&lt;/p&gt;

&lt;h2&gt;
  
  
  Le projet
&lt;/h2&gt;

&lt;p&gt;L'idée du projet est de pouvoir afficher une carte de visite dans un terminal en exécutant notre package avec la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx younup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le code source du projet est disponible sur notre &lt;a href="https://github.com/Younup/card" rel="noopener noreferrer"&gt;github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Au passage, on parle de la commande &lt;strong&gt;npx&lt;/strong&gt; dans &lt;a href="https://www.younup.fr/blog/npx-ou-comment-comprendre-que-ce-n-est-pas-une-faute-d-orthographe-de-npm" rel="noopener noreferrer"&gt;notre blog&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Compte et connexion
&lt;/h2&gt;

&lt;p&gt;La première étape est de créer un compte &lt;strong&gt;npm&lt;/strong&gt; (pour cela rendez-vous &lt;a href="https://www.npmjs.com/signup" rel="noopener noreferrer"&gt;ici&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Ensuite, vous devez vous connecter à votre compte en ligne de commande :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le prompt va vous demander plusieurs informations :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm login
Username: younup
Password:
Email: &lt;span class="o"&gt;(&lt;/span&gt;this IS public&lt;span class="o"&gt;)&lt;/span&gt; helloyou@younup.fr
Logged &lt;span class="k"&gt;in &lt;/span&gt;as younup on https://registry.npmjs.org/.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Init du package
&lt;/h2&gt;

&lt;p&gt;Si vous démarrez de 0, il faudra &lt;em&gt;init&lt;/em&gt; votre package.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Après quelques questions, un fichier &lt;code&gt;package.json&lt;/code&gt; est créé.&lt;br&gt;
Il contient les informations essentiels pour pouvoir publier votre projet.&lt;/p&gt;

&lt;p&gt;Voici le &lt;em&gt;package.json&lt;/em&gt; de notre projet &lt;code&gt;carte de visite&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"younup"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The Younup Card"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./bin/card.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"bin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"younup"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./bin/card.js"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node ./bin/card.js"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"repository"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"git+https://github.com/Younup/card.git"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"keywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"younup"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"card"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"npx card"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Benjamin Auzanneau &amp;lt;b.auzanneau@younup.fr&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"license"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MIT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"boxen"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"chalk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.0.0"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Publication
&lt;/h2&gt;

&lt;p&gt;Le seul point noir que vous allez peut-être rencontrer en publiant, c'est la collision de nom.&lt;br&gt;
Vous ne pouvez pas avoir un projet publié sur &lt;em&gt;npm&lt;/em&gt; qui possède le même &lt;code&gt;name&lt;/code&gt; que dans votre &lt;code&gt;package.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pour pouvoir publiez votre projet, il suffit de taper la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm publish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La console affichera votre déploiement en temps réel :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm notice
npm notice package: younup@1.0.0   
npm notice &lt;span class="o"&gt;===&lt;/span&gt; Tarball Contents &lt;span class="o"&gt;===&lt;/span&gt; 
npm notice 623B  package.json
npm notice 98B   .prettierrc
npm notice 1.1kB LICENSE
npm notice 115B  README.md
npm notice 1.2kB ascii/logo.js
npm notice 2.4kB bin/card.js
npm notice &lt;span class="o"&gt;===&lt;/span&gt; Tarball Details &lt;span class="o"&gt;===&lt;/span&gt;
npm notice name:          younup
npm notice version:       1.0.0
npm notice package size:  2.7 kB
npm notice unpacked size: 7.4 kB
npm notice shasum:        2631976b0f4b3fe836ef945213d6d7c95c6ab7af
npm notice integrity:     sha512-ObT18M8pTkBz4[...]vuSXDf1lRcVbA&lt;span class="o"&gt;==&lt;/span&gt;
npm notice total files:   6
npm notice
+ younup@1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le projet est maintenant accessible au téléchargement sur le &lt;a href="https://www.npmjs.com/package/younup" rel="noopener noreferrer"&gt;&lt;strong&gt;registry&lt;/strong&gt; de &lt;strong&gt;npm&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  La carte de visite Younup
&lt;/h3&gt;

&lt;p&gt;Maintenant que notre projet est accessible à tous, il est possible de l'exécuter ou de l'installer dans votre projet en tant que dépendance.&lt;/p&gt;

&lt;p&gt;En ce qui concerne la carte de visite, elle n'existe que pour être exécuté dans votre terminal :&lt;/p&gt;

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




&lt;p&gt;Merci d'avoir lu cet article !&lt;br&gt;
Il a été posté initialement sur le &lt;a href="https://www.younup.fr/blog" rel="noopener noreferrer"&gt;blog&lt;/a&gt; de &lt;a class="mentioned-user" href="https://dev.to/younup_it"&gt;@younup_it&lt;/a&gt; :&lt;br&gt;
&lt;a href="https://www.younup.fr/blog/comment-publier-son-premier-package-npm" rel="noopener noreferrer"&gt;https://www.younup.fr/blog/comment-publier-son-premier-package-npm&lt;/a&gt;&lt;/p&gt;

</description>
      <category>npm</category>
      <category>package</category>
      <category>node</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Quick tip about setTimeout function</title>
      <dc:creator>Benjamin Auzanneau</dc:creator>
      <pubDate>Wed, 09 Sep 2020 10:01:28 +0000</pubDate>
      <link>https://forem.com/necraidan/quick-tip-about-settimeout-function-53aj</link>
      <guid>https://forem.com/necraidan/quick-tip-about-settimeout-function-53aj</guid>
      <description>&lt;p&gt;In JavaScript, we have the &lt;strong&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop" rel="noopener noreferrer"&gt;event loop&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So, without &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API]" rel="noopener noreferrer"&gt;Web Workers&lt;/a&gt;, &lt;strong&gt;JavaScript&lt;/strong&gt; is &lt;em&gt;single-threaded, non-blocking, asynchronous, concurrent language&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;What can I do with the &lt;strong&gt;setTimeout&lt;/strong&gt; function ?&lt;br&gt;
I can launch the execution of a part of your code after a delay.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout#Reasons_for_delays_longer_than_specified" rel="noopener noreferrer"&gt;The delay may be longer than intended&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;After the delay&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Before the delay&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Printed =&amp;gt; 'Before the delay'&lt;/span&gt;
&lt;span class="c1"&gt;// After ≈ 5 secondes =&amp;gt; 'After the delay'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  One more thing
&lt;/h3&gt;

&lt;p&gt;Sometimes you can see this kind of code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;someHTMLNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yellow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are manipulating a property of a &lt;em&gt;node element&lt;/em&gt; (it's a &lt;em&gt;DOM element&lt;/em&gt;).&lt;br&gt;
But the &lt;em&gt;DOM&lt;/em&gt; is not ready, &lt;code&gt;someHTMLNode&lt;/code&gt; doesn't exist.&lt;/p&gt;

&lt;p&gt;The&lt;code&gt;setTimeout(fn, 0)&lt;/code&gt; is a &lt;em&gt;workaround&lt;/em&gt;, we can delay our affection after the DOM rendering !&lt;/p&gt;

&lt;p&gt;That's it, make good use of it !&lt;/p&gt;




&lt;p&gt;I'm not a native English speaker so, thanks in advance if you want to improve my article with correct syntax/grammar/sentences.&lt;/p&gt;

&lt;p&gt;I can accept all kind remarks :)&lt;/p&gt;

&lt;p&gt;Cover by &lt;a href="https://unsplash.com/@icons8" rel="noopener noreferrer"&gt;Icons8 Team&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/dhZtNlvNE8M" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Merci d'avoir lu cet article ! &lt;br&gt;
Il a été posté initialement sur mon &lt;a href="https://necraidan.com" rel="noopener noreferrer"&gt;site&lt;/a&gt; : &lt;a href="https://necraidan.com/blog/back-to-basics-set-timeout" rel="noopener noreferrer"&gt;https://necraidan.com/blog/back-to-basics-set-timeout&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>function</category>
      <category>quicktips</category>
      <category>tips</category>
    </item>
    <item>
      <title>Quick tip about array and unique values</title>
      <dc:creator>Benjamin Auzanneau</dc:creator>
      <pubDate>Tue, 08 Sep 2020 07:18:31 +0000</pubDate>
      <link>https://forem.com/necraidan/quick-tip-about-array-and-unique-values-3fpn</link>
      <guid>https://forem.com/necraidan/quick-tip-about-array-and-unique-values-3fpn</guid>
      <description>&lt;p&gt;The naive way to do this is to check each value, add it to a data structure, and detect if we haven't added it before.&lt;/p&gt;

&lt;h3&gt;
  
  
  The naive way
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;namesFromAnotherGalaxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Luke&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Leia&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Obi-Wan&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Luke&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Obi-Wan&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;naiveWay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;unique&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
  &lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;unique&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;naiveWay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;namesFromAnotherGalaxy&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ['Luke', 'Leia', 'Obi-Wan']&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another simple way of thinking to get unique values from an array is to use the filter method to filter out the repetitive values. &lt;/p&gt;

&lt;h3&gt;
  
  
  The filter way
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;duelists&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Yugi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Kaiba&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Yugi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Joey&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Joey&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filterWay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;filterWay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;duelists&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ['Yugi', 'Kaiba', 'Joey'];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But with the new native Set object we can do something smoother and easier.&lt;/p&gt;

&lt;h3&gt;
  
  
  This is the way
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;thisIsTheWay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;kobe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;kobe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;michael&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;])];&lt;/span&gt; &lt;span class="c1"&gt;// ['kobe', 'michael', 23, 24]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it, make good use of it !&lt;/p&gt;




&lt;p&gt;I'm not a native English speaker so, thanks in advance if you want to improve my article with correct syntax/grammar/sentences.&lt;/p&gt;

&lt;p&gt;I can accept all kind remarks :)&lt;/p&gt;

&lt;p&gt;Cover by &lt;a href="https://unsplash.com/@pkmfaris" rel="noopener noreferrer"&gt;Faris Mohammed&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/PQinRWK1TgU" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>array</category>
      <category>set</category>
      <category>quicktips</category>
    </item>
    <item>
      <title>Quick tip about function vs function*</title>
      <dc:creator>Benjamin Auzanneau</dc:creator>
      <pubDate>Mon, 07 Sep 2020 13:35:21 +0000</pubDate>
      <link>https://forem.com/necraidan/quick-tip-about-function-vs-function-1jk3</link>
      <guid>https://forem.com/necraidan/quick-tip-about-function-vs-function-1jk3</guid>
      <description>&lt;p&gt;What is &lt;code&gt;function *&lt;/code&gt; ?&lt;/p&gt;

&lt;p&gt;It's &lt;strong&gt;generator function&lt;/strong&gt; which returns a &lt;strong&gt;Generator object&lt;/strong&gt;.&lt;br&gt;
&lt;strong&gt;Generators&lt;/strong&gt; are intricately linked with iterators.&lt;/p&gt;

&lt;p&gt;But what is a &lt;strong&gt;generator function&lt;/strong&gt; ?&lt;/p&gt;

&lt;p&gt;It's a &lt;strong&gt;function&lt;/strong&gt; that can stop &lt;em&gt;midway&lt;/em&gt; and then &lt;em&gt;continue&lt;/em&gt; from where it stopped !&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;generatorExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="s2"&gt;`First step ! &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="s2"&gt;`Second step ! &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;No yield, the function is done&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;generator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generatorExample&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;generator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// First step ! 1&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;generator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Second step ! 2&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;generator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// No yield, the function is done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;Generator object&lt;/strong&gt; offers a &lt;code&gt;next()&lt;/code&gt; function that you can call to go further into the next &lt;em&gt;step&lt;/em&gt; of the &lt;strong&gt;generator&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can check &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*" rel="noopener noreferrer"&gt;MDN&lt;/a&gt; for more information.&lt;/p&gt;

&lt;p&gt;That's it, make good use of it !&lt;/p&gt;




&lt;p&gt;I'm not a native English speaker so, thanks in advance if you want to improve my article with correct syntax/grammar/sentences.&lt;/p&gt;

&lt;p&gt;I can accept all kind remarks :)&lt;/p&gt;

&lt;p&gt;Cover by &lt;a href="https://unsplash.com/@quadratmedia" rel="noopener noreferrer"&gt;Wolfgang Rottmann&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/yjF6EZGvKys" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>quicktips</category>
      <category>function</category>
      <category>generator</category>
    </item>
    <item>
      <title>Quick tip about TypeScript and why to avoid these types</title>
      <dc:creator>Benjamin Auzanneau</dc:creator>
      <pubDate>Fri, 04 Sep 2020 08:09:25 +0000</pubDate>
      <link>https://forem.com/necraidan/quick-tip-to-understand-why-to-avoid-these-types-in-typescript-1lmb</link>
      <guid>https://forem.com/necraidan/quick-tip-to-understand-why-to-avoid-these-types-in-typescript-1lmb</guid>
      <description>&lt;p&gt;Avoid the non-primitive &lt;code&gt;Number&lt;/code&gt;, &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Boolean&lt;/code&gt;, &lt;code&gt;Object&lt;/code&gt;, and &lt;code&gt;Symbol&lt;/code&gt; types in &lt;strong&gt;TypeScript&lt;/strong&gt;. &lt;br&gt;
All of them refer to &lt;strong&gt;non-primitive&lt;/strong&gt; reference types.&lt;br&gt;
Instead, prefer the corresponding &lt;strong&gt;primitive&lt;/strong&gt; types.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;textToCheck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;textToCheck&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 'string'&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;textToCheck&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;

&lt;span class="nx"&gt;textToCheck&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;textToCheck&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 'object'&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;textToCheck&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's easy to failed your equality check with them.&lt;/p&gt;

&lt;p&gt;There is also a performance part that I will not detail here. I recommend this article from &lt;a href="https://hacks.mozilla.org/2012/12/performance-with-javascript-string-objects/" rel="noopener noreferrer"&gt;mozilla&lt;/a&gt; which makes a performance comparison between a literal string and its object version in &lt;strong&gt;JavaScript&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's it, make good use of it !&lt;/p&gt;




&lt;p&gt;I'm not a native English speaker so, thanks in advance if you want to improve my article with correct syntax/grammar/sentences.&lt;/p&gt;

&lt;p&gt;I can accept all kind remarks :)&lt;/p&gt;

&lt;p&gt;Cover by &lt;a href="https://unsplash.com/@markuswinkler" rel="noopener noreferrer"&gt;JC Dela Cuesta&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/QFPtc0EGCtI" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>tips</category>
      <category>javascript</category>
      <category>quicktip</category>
    </item>
  </channel>
</rss>
