<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[@nicoespeon's blog]]></title><description><![CDATA[I write about web development, agile practices and personal organization.]]></description><link>https://www.nicoespeon.com</link><generator>GatsbyJS</generator><lastBuildDate>Tue, 24 Mar 2026 14:42:46 GMT</lastBuildDate><item><title><![CDATA[The Proper Way to Decode Arrays (with Zod)]]></title><description><![CDATA[A 10-line Zod helper that gracefully handles malformed array items.]]></description><link>https://www.nicoespeon.com/en/2026/03/decoding-arrays-with-zod/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2026/03/decoding-arrays-with-zod/</guid><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;z.array(SomeSchema)&lt;/code&gt; is the go-to way to validate arrays in Zod. But it has a catch: if &lt;em&gt;any&lt;/em&gt; item fails parsing, the whole array is rejected. All valid or nothing.&lt;/p&gt;
&lt;p&gt;And that’s a scenario that comes up more often than you’d think:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An inconsistent third-party API sends one oddly-shaped item in a list of 50&lt;/li&gt;
&lt;li&gt;Your backend introduces a breaking change on one field, and suddenly your entire UI is blank&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I recently read &lt;a href=&quot;https://lucas-barake.github.io/the-proper-way-to-decode-arrays/&quot;&gt;The Proper Way to Decode Arrays&lt;/a&gt; by Lucas Barake, which tackles exactly this problem. The solution uses &lt;a href=&quot;https://effect.website/docs/schema/introduction/&quot;&gt;Effect Schema&lt;/a&gt;, and it works!&lt;/p&gt;
&lt;p&gt;But I really like to go where my teammates are. Effect has a steep learning curve, and most teams I work with are already using Zod. So I wondered: &lt;strong&gt;can we do the same thing without reaching for another library?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Turns out, yes. In about 10 lines.&lt;/p&gt;
&lt;h2 id=&quot;the-helper&quot;&gt;&lt;a href=&quot;#the-helper&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The helper&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; z &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;zod&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;DROPPED&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Symbol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;dropped&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; arrayFromFallible&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;z&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ZodType&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;schema&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; z
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;schema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;DROPPED&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; never&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;items &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; items&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; item &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;DROPPED&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; z&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;output&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Instead of &lt;code class=&quot;language-text&quot;&gt;z.array(Todo)&lt;/code&gt;, you write &lt;code class=&quot;language-text&quot;&gt;arrayFromFallible(Todo)&lt;/code&gt;. That’s it. &lt;code class=&quot;language-text&quot;&gt;.parse()&lt;/code&gt; returns a type-safe array with the invalid items silently dropped.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Todo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; z&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; z&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  title&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; z&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  completed&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; z&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;boolean&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Todos &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;arrayFromFallible&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Todo&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Todos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; title&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Buy milk&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; completed&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;oops&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; title&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; completed&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;maybe&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; title&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Write blog post&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; completed&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// ✅ [{ id: 1, ... }, { id: 2, ... }]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The bad item is gone. The good ones are preserved. Your UI isn’t blank anymore.&lt;/p&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;&lt;a href=&quot;#how-it-works&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How it works&lt;/h2&gt;
&lt;p&gt;The key is &lt;code class=&quot;language-text&quot;&gt;.catch()&lt;/code&gt;. When a Zod schema has &lt;code class=&quot;language-text&quot;&gt;.catch(value)&lt;/code&gt;, it returns &lt;code class=&quot;language-text&quot;&gt;value&lt;/code&gt; instead of throwing on failure. We exploit that in three steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;.catch(DROPPED as never)&lt;/code&gt;&lt;/strong&gt; wraps the item schema so failed items return a &lt;code class=&quot;language-text&quot;&gt;DROPPED&lt;/code&gt; symbol instead of failing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;z.array(...)&lt;/code&gt;&lt;/strong&gt; parses the full array, now containing a mix of valid items and &lt;code class=&quot;language-text&quot;&gt;DROPPED&lt;/code&gt; symbols&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-text&quot;&gt;.transform(...)&lt;/code&gt;&lt;/strong&gt; filters out the &lt;code class=&quot;language-text&quot;&gt;DROPPED&lt;/code&gt; symbols, keeping only the valid items&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Why a &lt;code class=&quot;language-text&quot;&gt;Symbol&lt;/code&gt;? Because it’s unique by definition: it can’t collide with any actual data in the array. The &lt;code class=&quot;language-text&quot;&gt;as never&lt;/code&gt; cast is a small lie to satisfy TypeScript, but &lt;code class=&quot;language-text&quot;&gt;.transform()&lt;/code&gt; cleans it up immediately.&lt;/p&gt;
&lt;h2 id=&quot;when-you-might-want-more&quot;&gt;&lt;a href=&quot;#when-you-might-want-more&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;When you might want more&lt;/h2&gt;
&lt;p&gt;This is a fire-and-forget approach: drop the bad items, keep the good ones. If you need to &lt;em&gt;collect&lt;/em&gt; the errors (e.g., to report which items failed and why), you can add some logs inside, like the Effect snippet does:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Array&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Schema&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Either&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; identity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Predicate&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ParseResult &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;effect&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; ArrayFromFallible &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;I&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;schema&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Schema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Schema&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;I&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  Schema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    Schema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;NullOr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;schema&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;annotations&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      decodingFallback&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; issue &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; formattedIssue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ParseResult&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;TreeFormatter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;formatIssueSync&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;issue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;warn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;[ArrayFromFallible]:\n&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; formattedIssue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; Either&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    Schema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Schema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;typeSchema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Schema&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;schema&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      decode&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Predicate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isNotNull&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      encode&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; identity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      strict&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Effect is a great library. But it doesn’t have to be all-or-nothing. Zod can do it fine.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/absolutes-779ee454943e406b94d2b17e79478c27-a810f.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 48.52652259332024%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAACoElEQVQozyWRy08TURTGJ2opBU3AgoAUygwtnc60hTLTdwutLVJbxBYEeZXyalUevg1RNBhQFyQad8aoidGNiUsTVi78z35ecPHl5p6b87vf+Y70vBBnN21wNJHieTrIhs/FfL8TpbGZ9oZGWhusBOyt1II6FVNnLuRjZkhjKuClNKRTGvZRNn1Mifq0kPR5dZJvCwWOxmNUvU5+VWc5TEfx2ppos1ixW6102mxs+jQexQzWRfPdQZ0loYrhZykUoBINsizeqqmwANbKfKle5zAXZr6vi+ONBd6PpbhmtyNbbXQ2/IfOyjIvI8YpbEVX2Y4a1MxhbkdMapEwG7EY9dErSB8q4xwUYmwH3TwxNX7MFFhzyVxtv4RLALsEsKXBwrSzlz0jyJLHRVVAH48kyDn7BVR8Eo1xJ55kKzOOtCNyq2guHojs6v4Bfi+JCErjp460k5EtFrqbmnms+3kY8FMfcLPlU9kJG4w5ZbbCw+wI6Cvh9L4AS8teD7dcCvumh2emyt/1KT6OJchetONvtNEigOmONt4OBXiq9vNuNMHxvTrTmkbZq3KQS/Ei4OFTXGXf8CLNyD2sBlTWBt1MOLv4WkzwxtAI2c6j25pxNNlYVDrZDShsehx8rZT58+ohOwK8m0tSS4pl6m7hvoO9sIJ0Px1nOztCynEZt9isKsbLX2zBb2nEcdbCOekMF4TLodbzlB0dfF+Z4+fmMvv5DPVIiJzsZVLpY7G3ib3hHqR8NErGDOF3uRl09uHplfGpGoaQR3GhejQUcXb3OBnod1MQkNfVBd6sVFhMZ7k6aHIzlWF9NEQ9qSHZ29q4USqRzeXQdJ1oNEL+Wp54IkFCqFgsks/nGUmlTu9GOEI6m+O66MlksyRF/UTFyRv0yQr/AP7KVWtlb+PnAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;absolutes&quot;
        title=&quot;&quot;
        src=&quot;/static/absolutes-779ee454943e406b94d2b17e79478c27-c83f1.png&quot;
        srcset=&quot;/static/absolutes-779ee454943e406b94d2b17e79478c27-569e3.png 240w,
/static/absolutes-779ee454943e406b94d2b17e79478c27-93400.png 480w,
/static/absolutes-779ee454943e406b94d2b17e79478c27-c83f1.png 960w,
/static/absolutes-779ee454943e406b94d2b17e79478c27-a810f.png 1018w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;</content:encoded></item><item><title><![CDATA[How to export git history in PDF]]></title><description><![CDATA[In case you need to export your git history, because reasons.]]></description><link>https://www.nicoespeon.com/en/2020/10/how-to-export-git-history-pdf</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2020/10/how-to-export-git-history-pdf</guid><pubDate>Sun, 16 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A friend recently asked me if I knew a trick to generate a somehow clean PDF of a git history, as he needed to share that to a non-technical person.&lt;/p&gt;
&lt;p&gt;I used to dig into git history a lot &lt;a href=&quot;https://github.com/nicoespeon/gitgraph.js/&quot;&gt;to generate git graphs in the browser&lt;/a&gt; (although I don’t maintain this project anymore). So I know some tricks indeed.&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;git&lt;/code&gt; CLI is a goldmine that’s overlooked. You can retrieve many things from &lt;code class=&quot;language-text&quot;&gt;git log&lt;/code&gt;, as long as you play around with the options.&lt;/p&gt;
&lt;h2 id=&quot;generate-a-pdf-from-git-history&quot;&gt;&lt;a href=&quot;#generate-a-pdf-from-git-history&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Generate a PDF from git history&lt;/h2&gt;
&lt;p&gt;The first step is to generate a text file from the logs:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git --no-pager log --graph --all --oneline &amp;gt; git-history.txt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, you can either convert that &lt;code class=&quot;language-text&quot;&gt;.txt&lt;/code&gt; into a PDF using an online service (if data is not sensitive): &lt;a href=&quot;http://www.convertfiles.com/converter.php&quot;&gt;http://www.convertfiles.com/converter.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Or you can use libreoffice if you don’t want to send your history to some online web converter (thank you &lt;a href=&quot;https://twitter.com/mcassard&quot;&gt;@mcassard&lt;/a&gt; 👍):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;libreoffice --convert-to &amp;quot;pdf&amp;quot; git-history.txt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;lets-decompose-the-git-command&quot;&gt;&lt;a href=&quot;#lets-decompose-the-git-command&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Let’s decompose the git command&lt;/h2&gt;
&lt;p&gt;I think this is a good excuse to learn some git options. These can be useful in other contexts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;git --no-pager&lt;/code&gt; tells git to &lt;strong&gt;not&lt;/strong&gt; use a pager, so we can get all of the history in one file&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;log --graph&lt;/code&gt; tells the log command to draw a graph representation, because that’s what we’re looking for (we want to see the branches!)&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;--all&lt;/code&gt; will show all commits from all branches (local and remote tracking) and tags, everything 👐&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;--oneline&lt;/code&gt; is a shorthand that abbreviates commits and renders a compact version of the graph (so it’s digestible on a PDF file)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To learn more about &lt;code class=&quot;language-text&quot;&gt;git log&lt;/code&gt; options, you can have a look &lt;a href=&quot;https://git-scm.com/docs/git-log&quot;&gt;at the docs&lt;/a&gt;. But it can feel a bit abstract. I recommend you fiddling with the options in a git project to really understand what’s going on!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Prevent VS Code extensions from updating automatically]]></title><description><![CDATA[How VS Code extensions update themselves and how to configure that.]]></description><link>https://www.nicoespeon.com/en/2020/10/prevent-vscode-extensions-automatic-updates/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2020/10/prevent-vscode-extensions-automatic-updates/</guid><pubDate>Mon, 10 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you use VS Code, you certainly have a couple of extensions installed.&lt;/p&gt;
&lt;p&gt;These extensions have a version number that looks like &lt;a href=&quot;https://semver.org/&quot;&gt;SemVer&lt;/a&gt;: vX.Y.Z. How X, Y, and Z evolve is totally up to the extension author. Good extensions usually provide a Changelog to understand the difference between 2 versions.&lt;/p&gt;
&lt;p&gt;At this point, a very legitimate question raises up: when a new version is published, how do you know you need to upgrade? Actually, do you need to upgrade extensions yourself? How do you upgrade a VS Code extension anyway?&lt;/p&gt;
&lt;p&gt;If you didn’t notice already, I’ve got good news for you: &lt;strong&gt;VS Code automatically checks for extension upgrades&lt;/strong&gt;. If it finds a more recent version, it will install it and update your extension the next time you open the editor.&lt;/p&gt;
&lt;p&gt;It’s good news because that means &lt;strong&gt;you don’t have to think about it&lt;/strong&gt;, you always get the latest version available. It keeps updating in the background.&lt;/p&gt;
&lt;p&gt;Now, maybe that’s not the behavior you want. Maybe you’ve got a limited internet bandwidth and you don’t want VS Code to install things under the hood. Or maybe you like to know what’s under the hood and you’d prefer check and install extensions updates yourself.&lt;/p&gt;
&lt;p&gt;To prevent VS Code extensions from updating automatically, open the editor settings, and search for “extension auto-update”:&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/prevent-extension-auto-update-54a722e5a7ea2c042a27b77705e27de3-faf14.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 27.206551410373063%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsSAAALEgHS3X78AAAA7UlEQVQY022QW3LDIAxFvYA0Djb4AcaYh19xkk470x10Bd3/Xm6F+tFMpx9nBAJdXalwMcE4j8aM6KxDS1HpAY22Twz/YKF6AxNWTMcbTNyo1qK4yAZ128P6iDEkqE7j5SKYU6YUOIsK56qm+ATdT2WJ8XjH6+cX3P0DQioUWUwSLi6wYWZx4wL8siNtV8z7AT1O5Gb449byNLLtUNWSY65lQUEu5/2O5XhAqJZHSfsNcb1yPm03bpAJlMvR+oSeVtSPHmaK1NT/ClZNxw6yUBbs7YQprSS4c5GkfHaV33/+DZCdYQFJK6pbzefMN3BQg8J/ewNoAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;prevent extension auto update&quot;
        title=&quot;&quot;
        src=&quot;/static/prevent-extension-auto-update-54a722e5a7ea2c042a27b77705e27de3-c83f1.png&quot;
        srcset=&quot;/static/prevent-extension-auto-update-54a722e5a7ea2c042a27b77705e27de3-569e3.png 240w,
/static/prevent-extension-auto-update-54a722e5a7ea2c042a27b77705e27de3-93400.png 480w,
/static/prevent-extension-auto-update-54a722e5a7ea2c042a27b77705e27de3-c83f1.png 960w,
/static/prevent-extension-auto-update-54a722e5a7ea2c042a27b77705e27de3-faf14.png 1099w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;You should see 2 options checked:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Extensions: Auto Check Updates&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extensions: Auto Update&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Disable both options. If you still want VS Code to check for updates in the background but install the updates manually, disable the “Auto Update” one.&lt;/p&gt;
&lt;p&gt;If you prefer to configure the settings from the JSON file, set the following IDs:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;extensions.autoCheckUpdates&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;extensions.autoUpdate&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Why files open over existing tabs in VS Code and how to change that]]></title><description><![CDATA[If you constantly loose the file you had open because you clicked on another one, here's the solution.]]></description><link>https://www.nicoespeon.com/en/2020/01/change-vscode-preview-files/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2020/01/change-vscode-preview-files/</guid><pubDate>Wed, 01 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Using Visual Studio Code, you probably noticed this behavior:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You click on a file. It opens in a new tab.&lt;/li&gt;
&lt;li&gt;You click on another file. It opens the file in the same tab, replacing the previous file.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;/open-preview-3927b8de39afed43f75760e5c49547a0.gif&quot; alt=&quot;open-preview&quot;&gt;&lt;/p&gt;
&lt;p&gt;And that can feel a bit annoying. What if you want to open each file in a new tab when you click them? Why is it behaving like that? 😭&lt;/p&gt;
&lt;p&gt;Well, if you look closer, you can notice the tab name is &lt;em&gt;italicised&lt;/em&gt;. In fact, this tab is &lt;strong&gt;a preview&lt;/strong&gt; of the file. When you click on a file, you preview its content. Since there can only be one preview tab, the preview will change if you select another file.&lt;/p&gt;
&lt;p&gt;Actually, this is a VS Code feature. It’s meant to prevent you from opening 10 different tabs if you are just looking for something, but you don’t intent to keep the files open. That way, you can easily see what’s inside a file, just by clicking on it.&lt;/p&gt;
&lt;p&gt;If you want the file to open and stick in it’s own tab, you can double-click on the file name, or on the tab.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/keep-file-open-6540fc01710dab99c9334fde5e81b768.gif&quot; alt=&quot;keep-file-open&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;ok-but-id-prefer-to-open-files-when-i-click-on-them-how-can-i-do-that&quot;&gt;&lt;a href=&quot;#ok-but-id-prefer-to-open-files-when-i-click-on-them-how-can-i-do-that&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;OK, but I’d prefer to open files when I click on them. How can I do that?&lt;/h2&gt;
&lt;p&gt;I hear you. Maybe you usually want to open the files you select and you find that behavior kinda annoying.&lt;/p&gt;
&lt;p&gt;It just adds friction because you think the file is open but it’s hard to make the difference with a preview. So you forget, you click on another file and snap, your previous file is gone and you need to go get it again!&lt;/p&gt;
&lt;p&gt;I’ve got a good news for you: &lt;strong&gt;you can configure this behavior!&lt;/strong&gt; 😉&lt;/p&gt;
&lt;p&gt;To do so, open VS Code settings. Search for “enable preview”. You’ll see a &lt;strong&gt;Workbench › Editor: Enable Preview&lt;/strong&gt; option that’s certainly checked.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/settings-77069fe2783eca4e0254bd0213cdc434-b9035.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 28.62944162436548%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABCUlEQVQY022QSVLDMBBFfQISsDXYkjxFdiwpjpNAFVuq2LPIGbj/FT4tOVAUZPGqpS/17yHT/QimajzkHBsm7yBWil/ctJgT3q94vX7Cv30grwyyfu9g+gG5kHjiAtuCERzbnGFDPDJOCHqTdxDgukXZ9BQb8iiR+eUZioRoojuLMSywboabTwjLGXVvIU0DqWsIFTErej3zUoGVFXilUdA5GXajI1EldtMBg59hKVp3QL/3aIcJpWlR1d0/ykSbmoqm2TSf6XOTxopiNG/thMGFhJ089mEmbUQhKzBKWovf4s9dpTVk4fSCejcmwzhCHNkdL4iF/HJJ3dW0Y0PrqJouFf3Ltx53+AUajKGxImV/tQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;settings&quot;
        title=&quot;&quot;
        src=&quot;/static/settings-77069fe2783eca4e0254bd0213cdc434-c83f1.png&quot;
        srcset=&quot;/static/settings-77069fe2783eca4e0254bd0213cdc434-569e3.png 240w,
/static/settings-77069fe2783eca4e0254bd0213cdc434-93400.png 480w,
/static/settings-77069fe2783eca4e0254bd0213cdc434-c83f1.png 960w,
/static/settings-77069fe2783eca4e0254bd0213cdc434-b9035.png 985w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Uncheck that&lt;/strong&gt; to change your editor behavior.&lt;/p&gt;
&lt;p&gt;Notice you can also control this behavior for files you open through the &lt;strong&gt;Quick Open&lt;/strong&gt; feature.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/quick-open-16fe678438939bdad17c847f3fc8e715-948e3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 635px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 34.960629921259844%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsSAAALEgHS3X78AAABLElEQVQoz3WQ2XKCQBBF+QRjDIogbuwyo+AygiKh1Jik8pT//5ebnhHXqjycmu6eqlO3WzPHPpodCy8dE6/dHpqGhZZpn6G+1bWvvfxv6MaNt3aNjkbbgG4NoI1Zivz7F+vqhHmxx6I8IFpkZ5bZra4J5+sagTD7QLj5gp99Ii1PGAYTaA6bYXX8QbbbI8kKzMQGXjzDwAvRdwP1/ksQEwx9P8YoZDBsSiglCdlFUSlZnK7AKVnA01ocwRw6sCQjF72xd4d7hua240E3e9C4yDHdHSC2lRJxWsuj1FImcSJOMLiTqUolRbbjPyBncps23VkTuUBRFVhu6X6bkoRrOBN+lUnRhXvhvVjVJNSl0IlirN6PWOSlSsjo4DKhzxL4PEEwnav6su6z7Fn4B7E5zm60j/erAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;quick-open&quot;
        title=&quot;&quot;
        src=&quot;/static/quick-open-16fe678438939bdad17c847f3fc8e715-948e3.png&quot;
        srcset=&quot;/static/quick-open-16fe678438939bdad17c847f3fc8e715-ce909.png 240w,
/static/quick-open-16fe678438939bdad17c847f3fc8e715-d81a4.png 480w,
/static/quick-open-16fe678438939bdad17c847f3fc8e715-948e3.png 635w&quot;
        sizes=&quot;(max-width: 635px) 100vw, 635px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;When you open a file by its name through the &lt;strong&gt;Quick Open&lt;/strong&gt; feature, it’s probable you want to have it open instead of previewed. If so, uncheck the &lt;strong&gt;Workbench › Editor: Enable Preview From Quick Open&lt;/strong&gt; option too.&lt;/p&gt;
&lt;p&gt;Finally, if you prefer to update the &lt;code class=&quot;language-text&quot;&gt;settings.json&lt;/code&gt;, here are the keys you’re looking for:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;workbench.editor.enablePreview&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;workbench.editor.enablePreviewFromQuickOpen&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[How to add colors to plain text copied in VS Code]]></title><description><![CDATA[If you wonder why your code is all grey, here's how to solve the problem.]]></description><link>https://www.nicoespeon.com/en/2019/12/vscode-syntax-highlight-on-copied-text/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/12/vscode-syntax-highlight-on-copied-text/</guid><pubDate>Tue, 31 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You might be in a situation where you have a text file open in VS Code, but &lt;strong&gt;everything is grey&lt;/strong&gt;. You have some code written. Maybe it’s CSS, maybe it’s JavaScript, maybe it’s Python. But you don’t have these nice colors that differentiate the variables from the properties, the functions, etc.&lt;/p&gt;
&lt;p&gt;Sometimes you end up here because you copy pasted some code from the Internet. Everything looks grey and it seems that VS Code doesn’t “understand” your code. 😭&lt;/p&gt;
&lt;p&gt;This is a legit question you have to face when you start using this editor.&lt;/p&gt;
&lt;p&gt;Hopefully, there is a simple answer. This is not about editor theme or something, it’s called the &lt;strong&gt;syntax highlighting&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If everything is grey, chances are your file is highlighted as a “plain text”. So it’s just a big lump of text, without any syntax.&lt;/p&gt;
&lt;p&gt;To add relevant colors, you need to select the correct “language mode”. There are 3 ways to do this.&lt;/p&gt;
&lt;h2 id=&quot;manually-change-the-language-mode&quot;&gt;&lt;a href=&quot;#manually-change-the-language-mode&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Manually change the language mode&lt;/h2&gt;
&lt;p&gt;At the bottom right of the editor, you’ll see “Plain Text” written. Click on this and select the appropriate language from the list.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/select-language-mode-1a8cfd9592603e3e91d89dd7830bb44f.gif&quot; alt=&quot;select-language-mode&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;with-the-command-palette&quot;&gt;&lt;a href=&quot;#with-the-command-palette&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;With the Command Palette&lt;/h2&gt;
&lt;p&gt;As for every action in VS Code, you can use the Command Palette. Use the shortcut &lt;code class=&quot;language-text&quot;&gt;Ctrl+Shift+P&lt;/code&gt; and start typing “Change Language Mode”.&lt;/p&gt;
&lt;p&gt;It will pop up the list where you can select the appropriate language.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/command-palette-3d03e9b2995969560bf3f0b7119a741c-8faff.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 602px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 17.441860465116278%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAAsSAAALEgHS3X78AAAAoklEQVQI14XKWQqCYABFYTdQCqklUSmSpplhg1bq7xBNUETtoP0v4iQ9RtDD93AuVxrYLo4foOgGrY5GW9Ub3U//I+s9FK35ajqyqqL2h0iuuBLeXqTHK+J8/0iqE7MkI4jTn6brlHCTs60ORMWFaXEnKB+E4oJkRCWD/Eki9qyzijivWe0KJvMlo7GH6fqYzjcPq9ltb4YdCayowFrUuCvBG7OjWcOc1dkOAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;command-palette&quot;
        title=&quot;&quot;
        src=&quot;/static/command-palette-3d03e9b2995969560bf3f0b7119a741c-8faff.png&quot;
        srcset=&quot;/static/command-palette-3d03e9b2995969560bf3f0b7119a741c-b7afd.png 240w,
/static/command-palette-3d03e9b2995969560bf3f0b7119a741c-e6da0.png 480w,
/static/command-palette-3d03e9b2995969560bf3f0b7119a741c-8faff.png 602w&quot;
        sizes=&quot;(max-width: 602px) 100vw, 602px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;h2 id=&quot;with-the-shortcut&quot;&gt;&lt;a href=&quot;#with-the-shortcut&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;With the shortcut&lt;/h2&gt;
&lt;p&gt;As you can see in the Command Palette, there’s a default shortcut to change the language mode. On Mac OS, it’s &lt;code class=&quot;language-text&quot;&gt;⌘ M&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can use this shortcut to open the list directly.&lt;/p&gt;
&lt;p&gt;Tadaaaa! Now you have meaningful colors again 🎉&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Building a (Crafters) community in Montreal]]></title><description><![CDATA[My reflexions after a year of growing a new tech community in Montreal, Canada.]]></description><link>https://www.nicoespeon.com/en/2019/12/building-crafters-community-montreal/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/12/building-crafters-community-montreal/</guid><pubDate>Sun, 22 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As we’re approaching the new year, I’m taking some time to reflect on what happened in 2019. In particular, I would like to share my thoughts regarding the Software Crafters community of Montreal.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/craft-bee0fd5c4b0117118564860151e8b013-5992f.jpeg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 600px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 56.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBAgX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHME2JFh//EABkQAQACAwAAAAAAAAAAAAAAAAEAAhARIf/aAAgBAQABBQIrNcQhn//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABYQAAMAAAAAAAAAAAAAAAAAABAgMf/aAAgBAQAGPwIVP//EABoQAQEAAgMAAAAAAAAAAAAAAAEAEEERITH/2gAIAQEAAT8hJ47fLcuoDgZv/9oADAMBAAIAAwAAABD0D//EABYRAAMAAAAAAAAAAAAAAAAAAAEQEf/aAAgBAwEBPxChf//EABYRAAMAAAAAAAAAAAAAAAAAAAEQEf/aAAgBAgEBPxCFf//EABsQAQACAwEBAAAAAAAAAAAAAAEAETFBYSHw/9oACAEBAAE/EDAktseRA2WFrv1RCW1rkTWYmom5/9k=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;craft&quot;
        title=&quot;&quot;
        src=&quot;/static/craft-bee0fd5c4b0117118564860151e8b013-5992f.jpeg&quot;
        srcset=&quot;/static/craft-bee0fd5c4b0117118564860151e8b013-9995a.jpeg 240w,
/static/craft-bee0fd5c4b0117118564860151e8b013-b7826.jpeg 480w,
/static/craft-bee0fd5c4b0117118564860151e8b013-5992f.jpeg 600w&quot;
        sizes=&quot;(max-width: 600px) 100vw, 600px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;h2 id=&quot;2018-arriving-at-montreal-&quot;&gt;&lt;a href=&quot;#2018-arriving-at-montreal-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2018, arriving at Montreal 🛬&lt;/h2&gt;
&lt;p&gt;That was almost 2 years ago, in February 2018. My wife and I left Paris for a one-way trip to Montreal, Canada. I won’t go into the details of this decision (that would worth a dedicated blog post), but I can tell you today that we’ve found the perfect work-life balance here. We enjoy such a high-quality life that we’ve started to build our family: our daughter, Alice, was born in September 2019. We’re here to stay 👪 🇨🇦&lt;/p&gt;
&lt;p&gt;On a personal note, I was really involved in the tech community, back in Paris. Meetups. I did a lot of meetups since 2013. I attended to a lot of them, I talked to some of them and I even got into organizing a few of them: &lt;a href=&quot;https://www.meetup.com/fr-FR/backbone-paris/&quot;&gt;Backbone.js Paris&lt;/a&gt;, &lt;a href=&quot;https://www.meetup.com/fr-FR/paris-webComponents/&quot;&gt;Paris Web Components&lt;/a&gt; and the &lt;a href=&quot;http://bestofweb.paris/&quot;&gt;Best of Web&lt;/a&gt; conference I initiated in 2016 with &lt;a href=&quot;https://twitter.com/cbalit&quot;&gt;Cyril Balit&lt;/a&gt; and other meetup organizers.&lt;/p&gt;
&lt;p&gt;When I arrived in Montreal in 2018, I was really looking into joining the tech community.&lt;/p&gt;
&lt;p&gt;And certainly more than any other tech meetup, I was looking for some kind of “Software Crafters” community. &lt;a href=&quot;https://www.meetup.com/fr-FR/paris-software-craftsmanship/&quot;&gt;The one in Paris&lt;/a&gt; is huge and one of the most interesting meetups I’ve been to. It’s not yet another group of people interested in some technology or hyped framework who’d watch amateur talks about that technology or framework every month. The “Software Crafters” community is &lt;a href=&quot;https://www.softwarecrafters.org/&quot;&gt;a worldwide group&lt;/a&gt; of diverse people who are interested in building high-quality software. Communication and practices matter more than specific tools. We talk about testing, software architecture, how to better understand business problems, how to write maintainable code, how to build great teams, etc.&lt;/p&gt;
&lt;figure&gt;
	
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/software-crafters-worldwide-69263c96483e7c94398acd3cd13993a5-828ba.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 50.38434661076171%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAACN0lEQVQozzWRW1MTQRCF949aBApKoaC8/xgLECykgBKDCNGHeIkQYpYku5vdZOc+kxAuopbim2/H3ll86Jqt6dnT3zkdhJVp9GZn0ZmdQzI3h5PKDE6m6G5mGuFUBc2lB2g/foqvj56ge/8hju9U8HlqBq278zi9N49kcRH9pSV/RgsLCLjUuL66wuW379AX1/gwtPiUSUipsJ8obHUlVkKJ3UgiH+ZoUe9ooJAygQHVmXOYUF1NJrj5fYNAWAdjLWoDi7eZxeHAoZo5HNC5Gjls9R3W0zM0uUHINHJtMSIB58tCXP5E9+IPYqYwHo8RaK2hlEaLWYTC+h82YovVnsVaMsKLNkP1S4R6IhAOFYxWsNbAGOO/zeUPiF9/IUfnuDifICgahSgzFslQ4jhV2E4d1iKL9ZjoSLz6sYf6Xh1pnBCJREYxMSEJREEaB6Yd7GiM8zMilJ0uTbSwSqIRCyyf6lKIBJ+T5Y3YoNmOUIs49psJTjKOiERzzsEZuyXVHqqVKwQHPUYTDOoDg52ERG6piioE97ocQgjkFEuHcoy58nTdXILxsqcIRpPDKjkLVuMRXveN3+hOrLFJRCtRabk4j1IOJxi0lN7FkAucpkOfcz2VeJ9pNGjr7/oSmx2B4L+19cigkZVW6vRog0iL+22iPkwk2gMORaKciGqpwTL1NiPto3mVGNRIcDcmywXJi7ikaRDN2GiMqEJOW/akDs96Dm/6GkYKb7Wg80uLyjcvaehuv4zsH3r4nzA3GlYaAAAAAElFTkSuQmCC&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;software crafters worldwide&quot; title=&quot;&quot; src=&quot;/static/software-crafters-worldwide-69263c96483e7c94398acd3cd13993a5-c83f1.png&quot; srcset=&quot;/static/software-crafters-worldwide-69263c96483e7c94398acd3cd13993a5-569e3.png 240w,
/static/software-crafters-worldwide-69263c96483e7c94398acd3cd13993a5-93400.png 480w,
/static/software-crafters-worldwide-69263c96483e7c94398acd3cd13993a5-c83f1.png 960w,
/static/software-crafters-worldwide-69263c96483e7c94398acd3cd13993a5-828ba.png 1431w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
	&lt;figcaption&gt;Software Crafters communities, worldwide&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Ok, you got the point.&lt;/p&gt;
&lt;p&gt;But when we arrived in Canada in 2018, there was no “Software Crafters” community in Montréal. At all. To be honest, tech meetups, in general, are less popular here than they are in Paris, even today. I’d say that’s cultural. Every day, I’m home before 6pm, sometimes even at 5! In Paris, I was hardly back home before 8pm. That’s 2-3 hours I can spend with my family. Hence, that’s not surprising it’s harder to get people to stay after 7pm to attend a tech meetup compared to Paris!&lt;/p&gt;
&lt;p&gt;Still, I knew that a community of Crafters was missing. I mean, there are plenty of developers in Montréal. I bet they also have issues with continuously delivering value to their business without creating bugs in the process. Regardless of the language or company they’re working with, they would certainly love to talk with other people about these issues to find better ways.&lt;/p&gt;
&lt;p&gt;All it needed was a spark. I thought I could be that spark. I knew what it looked like, and I organized meetups before. So I created &lt;a href=&quot;https://www.meetup.com/fr-FR/Software-Crafters-Montreal&quot;&gt;Software Crafters Montréal&lt;/a&gt; in September 2018.&lt;/p&gt;
&lt;h2 id=&quot;2019-a-growing-community-&quot;&gt;&lt;a href=&quot;#2019-a-growing-community-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2019, a growing community 🌱&lt;/h2&gt;
&lt;p&gt;I remember &lt;a href=&quot;https://www.meetup.com/fr-FR/Software-Crafters-Montreal/events/251774287/&quot;&gt;the first meetup we had&lt;/a&gt;. It was the 4th of September 2019, a Tuesday. 3 people joined. We were 4, sitting around a table. I presented the idea of the meetup.&lt;/p&gt;
&lt;p&gt;Indeed, unlike other tech meetups, the “Software Crafters” one has a different format. People don’t come to attend a few talks passively. Instead, the meetup adopts &lt;a href=&quot;https://en.wikipedia.org/wiki/Unconference&quot;&gt;the unconference format&lt;/a&gt;: participants drive the content of the meeting.&lt;/p&gt;
&lt;p&gt;A typical “Software Crafters” meetup in Montréal looks like that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;People arrive progressively, food is available, that’s networking time where you meet and talk with other participants&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All participants regroup, the organizers do a short intro of the meetup for the newcomers and announcements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is a 30min window for lightning talks. These could be 5min talks with slides, but generally, people spontaneously take 2-3 min to share a book, a blog post or a video they really enjoyed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Then, all participants can propose topics for discussions. Typical topics could be “Feature branches vs. Trunk based-development” or “Burn-out: how to prevent and recover” or specific needs like “My coworkers don’t want to pair-program, what could I do to make them try?“.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/proposing-topics-58e245d9a763a615a2d770ac9f68b1b1-97f0b.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 56.25%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABAAD/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgAB/9oADAMBAAIQAxAAAAHQx2h5Qaz/xAAaEAEAAgMBAAAAAAAAAAAAAAACAAEDESEy/9oACAEBAAEFAkzKZuLPj3XVRrS9f//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAEDAQE/AVf/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPwFH/8QAGRAAAgMBAAAAAAAAAAAAAAAAAAECETEh/9oACAEBAAY/AqaMORZTMGf/xAAcEAACAgIDAAAAAAAAAAAAAAAAAREhMUFRcbH/2gAIAQEAAT8hUaQsjtvTUzsrMbXEi7wmCKrWT//aAAwDAQACAAMAAAAQcP8A/8QAFhEAAwAAAAAAAAAAAAAAAAAAARAh/9oACAEDAQE/EBE//8QAFhEBAQEAAAAAAAAAAAAAAAAAARAR/9oACAECAQE/EF0j/8QAGRABAQEBAQEAAAAAAAAAAAAAAREhADFh/9oACAEBAAE/EEU9lCRDgtZGlH12cIANJvVoB0pyeKY4BEPk7//Z&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;People proposing topics&quot;
        title=&quot;&quot;
        src=&quot;/static/proposing-topics-58e245d9a763a615a2d770ac9f68b1b1-d564d.jpg&quot;
        srcset=&quot;/static/proposing-topics-58e245d9a763a615a2d770ac9f68b1b1-865fd.jpg 240w,
/static/proposing-topics-58e245d9a763a615a2d770ac9f68b1b1-d40a0.jpg 480w,
/static/proposing-topics-58e245d9a763a615a2d770ac9f68b1b1-d564d.jpg 960w,
/static/proposing-topics-58e245d9a763a615a2d770ac9f68b1b1-c67c1.jpg 1440w,
/static/proposing-topics-58e245d9a763a615a2d770ac9f68b1b1-667be.jpg 1920w,
/static/proposing-topics-58e245d9a763a615a2d770ac9f68b1b1-85f07.jpg 2880w,
/static/proposing-topics-58e245d9a763a615a2d770ac9f68b1b1-97f0b.jpg 4032w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, everyone votes on the proposed topics. The most voted topics got discussed during 1h as we split into groups of ~10 people. Anyone can attend any discussion and move from one group to another if they want to.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/discussing-topics-4b5dbb73266d09a99e11e348b91fe7a0-97f0b.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 56.25%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQFAgP/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB45TbmqJKA//EABsQAAICAwEAAAAAAAAAAAAAAAECAAQDERMz/9oACAEBAAEFAse2HZ1is4BJlQBpZ9//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAcEAABBAMBAAAAAAAAAAAAAAAAAQIRIRIiMkH/2gAIAQEABj8C1QpaOWEeSQ68Vocf/8QAGxABAAIDAQEAAAAAAAAAAAAAAQARITFBcZH/2gAIAQEAAT8hTs2e4gY2HnZX1PWmG30YitFLA8i+8//aAAwDAQACAAMAAAAQID//xAAXEQADAQAAAAAAAAAAAAAAAAAAARFR/9oACAEDAQE/EKVYf//EABcRAAMBAAAAAAAAAAAAAAAAAAABEVH/2gAIAQIBAT8QkI9P/8QAHxABAAMAAQQDAAAAAAAAAAAAAQARITFBUWFxgbHR/9oACAEBAAE/EBewVVAB8sDqx681h+kPOLvhPZ3hwWNEcLHdBVGm618hENOj6J//2Q==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;People discussing topics&quot;
        title=&quot;&quot;
        src=&quot;/static/discussing-topics-4b5dbb73266d09a99e11e348b91fe7a0-d564d.jpg&quot;
        srcset=&quot;/static/discussing-topics-4b5dbb73266d09a99e11e348b91fe7a0-865fd.jpg 240w,
/static/discussing-topics-4b5dbb73266d09a99e11e348b91fe7a0-d40a0.jpg 480w,
/static/discussing-topics-4b5dbb73266d09a99e11e348b91fe7a0-d564d.jpg 960w,
/static/discussing-topics-4b5dbb73266d09a99e11e348b91fe7a0-c67c1.jpg 1440w,
/static/discussing-topics-4b5dbb73266d09a99e11e348b91fe7a0-667be.jpg 1920w,
/static/discussing-topics-4b5dbb73266d09a99e11e348b91fe7a0-85f07.jpg 2880w,
/static/discussing-topics-4b5dbb73266d09a99e11e348b91fe7a0-97f0b.jpg 4032w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That’s it, we regroup for each group to do a summary of what was discussed. Then we say goodbye.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It’s a very &lt;strong&gt;social&lt;/strong&gt; meetup.&lt;/p&gt;
&lt;p&gt;Over 2019, the community progressively grew. For the first 4-5 meetups, we were less than 10 participants, with a no-show rate of ~40%. The “no-show rate” is the percentage of people who registered, but finally didn’t show up. For tech meetups, I’d say the average rate in Montréal is 50% since these events are free.&lt;/p&gt;
&lt;p&gt;In the 3 last meetups, we were about 25 to attend, with a no-show rate of ~33%.&lt;/p&gt;
&lt;p&gt;That makes me really happy. I don’t care much about the numbers as long as the quality is here. &lt;strong&gt;I can feel the community is growing&lt;/strong&gt;. I met a lot of new people. I saw people coming back. I saw people bringing friends. Every meetup, I connect with new persons and I see familiar faces. And we always have insightful topics. At the last meetup, I was in the group talking about burn-out (preventing it and recovering from it) which triggered powerful feedbacks from people who experienced it. The other group was a roundtable of everyone sharing the tools that saved them a lot of time. A lot of helpful tips and links were shared.&lt;/p&gt;
&lt;figure&gt;
	
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/presented-tools-87bdbb60bbebcfe976298cb871173aff-97f0b.jpg&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 56.25%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAMBAgQF/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAECA//aAAwDAQACEAMQAAABtr5MoeJI0//EABsQAAMAAgMAAAAAAAAAAAAAAAABAgMREyEj/9oACAEBAAEFAsfZOjOvRU0clFU2/wD/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAZEAEAAgMAAAAAAAAAAAAAAAAAITEBEBH/2gAIAQEABj8Cz1SEL1//xAAZEAADAQEBAAAAAAAAAAAAAAAAAREhQTH/2gAIAQEAAT8hygno0SCD8NHpoalcbfD/2gAMAwEAAgADAAAAEKwP/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAx/9oACAEDAQE/EBjL/8QAFREBAQAAAAAAAAAAAAAAAAAAAQD/2gAIAQIBAT8QQm//xAAZEAEBAQEBAQAAAAAAAAAAAAABEQAxIVH/2gAIAQEAAT8QVzbAdA3pBk8mFJgEwiKHCUr5wzA1g4b/2Q==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;presented tools&quot; title=&quot;&quot; src=&quot;/static/presented-tools-87bdbb60bbebcfe976298cb871173aff-d564d.jpg&quot; srcset=&quot;/static/presented-tools-87bdbb60bbebcfe976298cb871173aff-865fd.jpg 240w,
/static/presented-tools-87bdbb60bbebcfe976298cb871173aff-d40a0.jpg 480w,
/static/presented-tools-87bdbb60bbebcfe976298cb871173aff-d564d.jpg 960w,
/static/presented-tools-87bdbb60bbebcfe976298cb871173aff-c67c1.jpg 1440w,
/static/presented-tools-87bdbb60bbebcfe976298cb871173aff-667be.jpg 1920w,
/static/presented-tools-87bdbb60bbebcfe976298cb871173aff-85f07.jpg 2880w,
/static/presented-tools-87bdbb60bbebcfe976298cb871173aff-97f0b.jpg 4032w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
	&lt;figcaption&gt;List of tools that were shared&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Retrospectively, in 2019 we did:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 regular meetup every month (so 12 in total)&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2 special meetups with guests:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.meetup.com/fr-FR/Software-Crafters-Montreal/events/261631034/&quot;&gt;J. B. Rainsberger&lt;/a&gt; who improvised an amazing workshop on universal software architecture&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.meetup.com/fr-FR/Software-Crafters-Montreal/events/263866536/&quot;&gt;Adam Dymitruk&lt;/a&gt; who did a workshop on CQRS and Event Sourcing&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2 dojos “Introduction to TDD” animated by &lt;a href=&quot;https://www.meetup.com/fr-FR/Software-Crafters-Montreal/events/263779706/&quot;&gt;Christophe Fernandez&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;We participated in the &lt;a href=&quot;https://www.coderetreat.org/&quot;&gt;Global Day of Coderetreat&lt;/a&gt;, hosting an event in Montréal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of that was possible thanks to the different hosts and sponsors we had. But most of all, 2 companies really supported us in this initiative:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.busbud.com/&quot;&gt;Busbud&lt;/a&gt;, my employer, which sponsors and hosts the meetup since the very beginning. They give me full support to do what I need to make all of this happens, playing a big part in making this even possible.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zenika.ca/&quot;&gt;Zenika&lt;/a&gt;, a French consulting company that recently arrived in Canada. Their consultants are really into Craft, so they know what they’re talking about. Actually, a lot of Zenika consultants participate in the monthly meetup.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If I ignited the meetup in September 2018, two people rapidly helped me make the flame grow: &lt;a href=&quot;https://twitter.com/damienbeaufils&quot;&gt;Damien Beaufils&lt;/a&gt; co-organizes the meetups with me since April 2019 and &lt;a href=&quot;https://twitter.com/khaledsouf&quot;&gt;Khaled Souf&lt;/a&gt; joined us when he arrived in Canada in November—but he started providing support remotely before that, helping me to get in touch with Adam Dymitruk. Not surprisingly, these two great people were part of the Software Crafters Paris community and are Zenika consultants 😉&lt;/p&gt;
&lt;h2 id=&quot;2020-to-many-more-&quot;&gt;&lt;a href=&quot;#2020-to-many-more-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2020, to many more 🍻&lt;/h2&gt;
&lt;p&gt;End of 2018, I was the one guy organizing a meetup of ~7 persons at Busbud every month.&lt;/p&gt;
&lt;p&gt;End of 2019, we’re 3 organizers who bring ~25 people every month to different venues in Montréal for regular or special meetups.&lt;/p&gt;
&lt;p&gt;I think the community will continue to gently grow in 2020. Maybe we’d be ~50 every month to join and talk.&lt;/p&gt;
&lt;p&gt;At least, here’s what we’ve planned for 2020:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Our monthly meetup&lt;/strong&gt;, as usual, every 1st Wednesday of the month&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Another monthly event&lt;/strong&gt;, oriented on hands-on and practice (think “coding dojo”). We did 2 experimental dojos on TDD in 2019. We’ll have that every month in 2020. Thanks to &lt;a href=&quot;https://twitter.com/badraone&quot;&gt;Badradine Boulahia&lt;/a&gt; who’s joining us in the organization, we’ll have the bandwidth to make that happens. It’s called &lt;a href=&quot;https://www.meetup.com/fr-FR/Software-Crafters-Montreal/events/tcpzlrybccbtb/&quot;&gt;“Craft your skills”&lt;/a&gt; and it will occur every 3rd Wednesday of the month.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The very first &lt;a href=&quot;https://socrates-ca.github.io/&quot;&gt;SoCraTes Canada conference&lt;/a&gt;&lt;/strong&gt;. We’ll bring 20 people in a lodge near Mont-Tremblant in March, for 2 days. Craft discussions, coding dojos, snow and fun to be expected 🍁&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Punctual special meetups&lt;/strong&gt; if there is a special guest in town. Who knows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s it. 2019 is about to end and I’m really proud to realize how much the Craft community of Montréal is developing.&lt;/p&gt;
&lt;p&gt;To many more!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/to-many-more-6d749235d41e781b89be4d28cef7261a.gif&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you want to get in touch, you can join us on Slack, channel &lt;strong&gt;#montreal&lt;/strong&gt;: &lt;a href=&quot;http://slack.softwarecraftsmanship.org/&quot;&gt;http://slack.softwarecraftsmanship.org/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;my-tips-and-tricks-to-help-you-build-such-a-community-&quot;&gt;&lt;a href=&quot;#my-tips-and-tricks-to-help-you-build-such-a-community-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;My tips and tricks to help you build such a community 📝&lt;/h2&gt;
&lt;p&gt;I was recently asked if I could provide some advice to people who’d like to build such a community. I think that could be useful to you, so let me share that here.&lt;/p&gt;
&lt;p&gt;First of all, if you’re willing to build it, thank you. It takes someone to take the initiative. Thanks for being that person ❤️&lt;/p&gt;
&lt;h3 id=&quot;it-takes-courage-to-create-something-from-the-void&quot;&gt;&lt;a href=&quot;#it-takes-courage-to-create-something-from-the-void&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It takes courage to create something from the void.&lt;/h3&gt;
&lt;p&gt;Nothing is in place, you have to set up everything. You’ll have to explain something new to people again, and again. Don’t give up. Push it through. It’s fine to have only 3 people attending.&lt;/p&gt;
&lt;p&gt;After a few months, you’ll see more and more people attend. Communities are built through time.&lt;/p&gt;
&lt;h3 id=&quot;be-consistent&quot;&gt;&lt;a href=&quot;#be-consistent&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Be consistent.&lt;/h3&gt;
&lt;p&gt;Make sure people can count on you. Have a clear frequency for the meetup (e.g. 1st Wednesday of the month). That helps to set a pace. It will also push you to find a place and a sponsor.&lt;/p&gt;
&lt;h3 id=&quot;dont-do-this-alone&quot;&gt;&lt;a href=&quot;#dont-do-this-alone&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Don’t do this alone.&lt;/h3&gt;
&lt;p&gt;Check if your employer can host/sponsor the first meetups. That helps. If not, ask around.&lt;/p&gt;
&lt;p&gt;After some time, tell your community you’re looking for co-organizers. They will help you carry the load. You want the community to live even when you can’t attend because you’re enjoying holidays with your family!&lt;/p&gt;
&lt;h3 id=&quot;in-doubt-ask&quot;&gt;&lt;a href=&quot;#in-doubt-ask&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;In doubt, ask.&lt;/h3&gt;
&lt;p&gt;If you don’t, then it’s already a “no”.&lt;/p&gt;
&lt;p&gt;If you ask, you increase the odds of getting a “yes”.&lt;/p&gt;
&lt;p&gt;That’s why I pinged JBrains and Adam Dymitruk when I learned they were in town. “Hey, do you think we could set up something with the community and you when you’re here?“. It’s not bold. It’s the only way to make good things happen. Surprisingly, they said “yes” and we all had a great time. So go ahead, ask!&lt;/p&gt;
&lt;h3 id=&quot;propose-other-kinds-of-food-than-pizzas-beers&quot;&gt;&lt;a href=&quot;#propose-other-kinds-of-food-than-pizzas-beers&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Propose other kinds of food than pizzas-beers.&lt;/h3&gt;
&lt;p&gt;I mean, these are convenient and quite cheap. But that’s not super healthy food. Sometimes, that’s just a sloppy organizer fallback.&lt;/p&gt;
&lt;p&gt;If you look a bit around, you can find alternatives. Sushis, for example. They are not much more expensive than pizzas because people will eat less of them.&lt;/p&gt;
&lt;p&gt;If you have enough time before the event, you can even go to a supermarket to bring some fruits, chips, nuts, snacks, bread, cheese, vegetables… Whatever you want. People like that better and are not used to it.&lt;/p&gt;
&lt;h3 id=&quot;account-for-the-no-show&quot;&gt;&lt;a href=&quot;#account-for-the-no-show&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Account for the no-show.&lt;/h3&gt;
&lt;p&gt;I’d recommend keeping track of it, so you can anticipate the food better.&lt;/p&gt;
&lt;p&gt;It’s fine to do mistakes at first. But you can progressively adjust. After some time, you’ll have a good idea of how much sushis to order regarding the number of attendees (for us, it’s the number of registered people x 4.5).&lt;/p&gt;
&lt;h3 id=&quot;dont-open-registrations-until-1-week-before-the-event&quot;&gt;&lt;a href=&quot;#dont-open-registrations-until-1-week-before-the-event&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Don’t open registrations until 1 week before the event.&lt;/h3&gt;
&lt;p&gt;To limit the no-show. Otherwise, people register and forget.&lt;/p&gt;
&lt;p&gt;It’s also a good idea to send a short email the day before to ask people to free their spot if they finally can’t attend.&lt;/p&gt;
&lt;h3 id=&quot;celebrate&quot;&gt;&lt;a href=&quot;#celebrate&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Celebrate!&lt;/h3&gt;
&lt;p&gt;For the meetup 1-year anniversary, I bought a little cake (thanks to sponsors) and had a little word. It was a chill moment.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/birthday-cake-292e8483435e3c43ab49ae29c1461bf9-4d09d.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 429px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 118.18181818181819%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAYCAYAAAD6S912AAAACXBIWXMAAAsSAAALEgHS3X78AAAGeklEQVQ4yyWTWVCVRxqGf4KIbAqoIMIgOHBA4hbBFUFMEBFR1EgMiIZdFhHXATWyKMYAIo6JCLgQBQ4EBEQwbMoi+2E7HM5hU9xwpryaqqnM1FTNXDzTkIu3+qvu/t9++v36l/p6u+jr7hBqR9HZRktTPT3tLQz1dTM8oPhDQ/2MqJSoR4Znx+HhISElSuUQQ2JtYKCPHkUPnV0dSMrBfpT9CgYVXfR3tNLbUs9gVyua4QEmNKpZjY4IM7WKMVGrVUOMjY4IqRkfHxUaY3RUM7uu1qiRxsZGZzdoxEcj4jSVoh1VXyeTY2rev53ig9DkxChKQfVW1G/evOLd2zdifM2792/58HGaqakpxsY0jE+OIw10v6S/s0XQNdP38jm9L2rpfV7LYGczI4oONAPd4pBOlL3djKv6mdQohYaZEBCvhMHr16+YmBhjXBhOvppEUrQ3o2gTRq2N9DTX090kDJtq6GuuE/MvaCgvplYup628io7nDXS+aKRPZKxoa0TZMwMjYhJ1d2sDPW1NSGrlIBoRtEZkoxkeFBRDjI+oqKso417OHU4GBxPtf5jrcYlEfuPPiaNB/HDmBDUV5bNXnSEdnclVUI+PjSANKbqZkWqgl1HRCEV7K4/yckhKPM8qO3viouNorKljoENBbW09vt67cbSyJDEylIqih6JJwkitnDWekTTY0ylwnzPc341GOcCT0lKyrqSyysGJPT57eT/9iY9//8S7D9P8/u//Ut/YgszWnq1rVnH14gW6urr+oBQw4+ohceX+HjSiu2/GR/gl7y5XTsZyIiKceXPmERYSzu//gddTH5h6M80///U/XnZ0YWlmzmp7GTFBhykvekRbczMTgnJyVIX05GEeNYX5NJUVEBsZT0ZqGvFRx7A0t8R59VrK5SVMf/zE3z79A0XfEN5eO1lgYMBSYxOigwJ5cDOTB3m59LQ0zDZKelpeQvOzas6ejMd5zWZy0lKofVyO3979SJKEuYkJnu7ueHvuwMbSEvvl9sjsHNiyxZ3c6+nkZl0jOuIYlcUFvKj+FamjoZbG6kpkshVYLLbmL1ExFGencfPmLRztHbA2NUFXSwt9HV3sl9ngIOZcN7pSUyrn54w0AnbvZKPzRtLS0pgSb1Tq+K2SH1MuoaNrwDJrO1w/X835qDB+q3hM9dNnXEy4QFBQMC7rXNjksp7o0BBuZ2WSGHGYw/v98BDz9rbL2e7xJcrO50jttWUc9f8arTn6ODnI2OO6gT1ublyNPUJ26kWqH+RSIS+i7F4uVy5dZJe7K/mZl3FzEUaLzIgO2IeP13Zsbe1oq6tAaq4s5mtfHyQtXZzsbclOCMd73UpWWZiyyW4ZZ7/dQ6CXG1knQwjc64WpoSErra1wWmKOp8tarl86jqfHZmxmDGtKkBpK7xPsvw9tHT3MFppyLsCT66fCOOi2Hp8Na9j2uYw/GRqwysoCOwszLBfMR2a+mEDfrwg7tJekGH+WmC1m84b1tD55iFSSncqF8AD09Y2Yq6vP9tXWpEf6Eee/i+SoQLLOhBOwYys+W5yJ+GY3sUH7iA85xOnoEMLEHs/1K9Ceq8/x0AB66uRIWRfiuRoXzIrlNoJSF2MjQ464O5C4fxMJgbtJijzEpehALsUGcT46iDMRAUQG+hGxfxtezssxMJyP+eLFZJwNo+x2GtKzknyq7mZy8Ts/YWaA9hxhaqiP3xcWnPN2JOnABhIOunPygAcRvq4Ee31BgJsd21YuxUBPDyOjBcQH7aEw6wJFN5KQKvIzKPnpCgXJMUR6OWNioI/02Vx05+oiMzPE48/GeDmYssNxEVvtFrLW2gTLhYZoaesyX2Qb4beVuvuXaa/5he6GUkFYdEs8jUzk1xPJOR1I/M61rF5qjJGeLp8JY0maMystbR3xEnRma715eqy0Mef4vk2UZsTx7FEmDb/m8KLqPlJV7mWqcpKRp5/jQeoJck59S9pBF0I3WuEpW8Q6K2MczIxwNJ/PWlF7OS0h1MORlCMeFKSGU5EnftXCbOpLb9NUeQ+p+u5VHv+chDwzgcJrZ8j//hhZMQdIP7qdawfXkeq7guRdMlJ8HPjRfx3Z37lyM2qXODwcedYpKu98z9MHP1BXmEFj6S1BmHeZ8tvJlGTNGJ7mnsgyJyGMm/EB/DXuADcivMkO+5KfonaQd8qPu4mHKEgJpTg9FvmN01Tkp4impgrKdOrK7/B/zSKwETp4wcIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;The 1-year birthday cake&quot;
        title=&quot;&quot;
        src=&quot;/static/birthday-cake-292e8483435e3c43ab49ae29c1461bf9-4d09d.png&quot;
        srcset=&quot;/static/birthday-cake-292e8483435e3c43ab49ae29c1461bf9-dc89c.png 240w,
/static/birthday-cake-292e8483435e3c43ab49ae29c1461bf9-4d09d.png 429w&quot;
        sizes=&quot;(max-width: 429px) 100vw, 429px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;The community we’re building is not just another “XYZ Framework” meetup. It’s a social group of people who want to have meaningful conversations with others.&lt;/p&gt;
&lt;p&gt;These kinds of moments make everyone feel we’re part of a human community. I believe that’s part of why our no-show rate is lower than other tech meetups out there. And most of all: it feels good.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Workshop: Build your First VS Code Extension]]></title><description><![CDATA[A talk I gave at Node+JS Interactive 2019. We build together a VS Code extension that refactors code for you.]]></description><link>https://www.nicoespeon.com/en/2019/12/workshop-build-vscode-extension/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/12/workshop-build-vscode-extension/</guid><pubDate>Fri, 20 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is a workshop / live-coding talk I gave at Node+JS Interactive 2019 with my friend &lt;a href=&quot;https://twitter.com/flovilmart&quot;&gt;Florent Vilmart&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Visual Studio Code is a text editor that has become very popular. A reason for such fame is Extensions. You can pick and install just the ones that fit your needs. You can customize VS Code to be super-productive. That’s cool.&lt;/p&gt;
&lt;p&gt;But have you ever considered going further, and &lt;strong&gt;build your own VS Code Extension?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this hands-on, we show you how to create, configure, package and publish a VS Code Extension. You will understand how you can manipulate the structure of your code, using the Abstract Syntax Tree (AST). With this, you’ll build your first VS Code Extension that will perform your own, custom, automated refactorings.&lt;/p&gt;
&lt;p&gt;You can follow the workshop using this repository: &lt;a href=&quot;https://github.com/nicoespeon/talk-build-your-first-vscode-extension&quot;&gt;nicoespeon/talk-build-your-first-vscode-extension&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/udNV7zPN1H8&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;p&gt;Following up this workshop, I’d advise you to try &lt;a href=&quot;https://vscode-abracadabra.com&quot;&gt;Abracadabra&lt;/a&gt;. It’s an open-source VS Code extension I’m building to perform intuitive, automated refactorings for you, in JS and TS.&lt;/p&gt;
&lt;p&gt;I recommend you to install it, use it and maybe &lt;a href=&quot;https://github.com/nicoespeon/abracadabra#contributing&quot;&gt;help me by contributing&lt;/a&gt; 😉&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TIL: How to stabilize a cutting board]]></title><description><![CDATA[Today, I learned how to stabilize a cutting board with a simple trick.]]></description><link>https://www.nicoespeon.com/en/2019/10/til-stabilize-cutting-board/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/10/til-stabilize-cutting-board/</guid><pubDate>Tue, 10 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Another cooking trick today 👨‍🍳&lt;/p&gt;
&lt;p&gt;Maybe you’re like me and you have a very basic, yet efficient cutting board.&lt;/p&gt;
&lt;p&gt;If so, you might struggle as well to stabilize it when you cut food. It might even have little rubber feet to prevent it from moving, but it’s not always very efficient.&lt;/p&gt;
&lt;p&gt;A few months ago, I did a cooking class with my wife at &lt;a href=&quot;https://www.ateliersetsaveurs.com/en/&quot;&gt;Ateliers et Saveurs&lt;/a&gt;, in Montréal. They taught us a very simple trick to make sure the cutting board won’t move at all.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Put 4 jar gaskets under your cutting board.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/before-39dcb56037203a9f6b59675d305d03c6-97f0b.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAUCAwT/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAbtSOWa8EYf/xAAZEAADAQEBAAAAAAAAAAAAAAAAAQIUEiH/2gAIAQEAAQUCmReHEM1s2s2M/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8BiP/EABgQAAMBAQAAAAAAAAAAAAAAAAABMRAR/9oACAEBAAY/As6yIiIj/8QAGBABAQEBAQAAAAAAAAAAAAAAAQARECH/2gAIAQEAAT8hCxHxhsF2bv/aAAwDAQACAAMAAAAQjM//xAAWEQEBAQAAAAAAAAAAAAAAAAAAEQH/2gAIAQMBAT8QuK//xAAWEQEBAQAAAAAAAAAAAAAAAAAAEXH/2gAIAQIBAT8Qph//xAAbEAEAAgIDAAAAAAAAAAAAAAABACFR0WGR8f/aAAgBAQABPxAiUQAUJiMWbiJ10sE1u557uf/Z&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;4 jar gaskets&quot;
        title=&quot;&quot;
        src=&quot;/static/before-39dcb56037203a9f6b59675d305d03c6-d564d.jpg&quot;
        srcset=&quot;/static/before-39dcb56037203a9f6b59675d305d03c6-865fd.jpg 240w,
/static/before-39dcb56037203a9f6b59675d305d03c6-d40a0.jpg 480w,
/static/before-39dcb56037203a9f6b59675d305d03c6-d564d.jpg 960w,
/static/before-39dcb56037203a9f6b59675d305d03c6-c67c1.jpg 1440w,
/static/before-39dcb56037203a9f6b59675d305d03c6-667be.jpg 1920w,
/static/before-39dcb56037203a9f6b59675d305d03c6-85f07.jpg 2880w,
/static/before-39dcb56037203a9f6b59675d305d03c6-97f0b.jpg 4032w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/after-4f16ac1dd456b9d32a53455e20b3a824-97f0b.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMGBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAABSzMYVRk6Wf/EABkQAAMBAQEAAAAAAAAAAAAAAAECAwAUEv/aAAgBAQABBQIs2Brpn0osynqpuqm//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAHBAAAgICAwAAAAAAAAAAAAAAAAERMQIhI0KR/9oACAEBAAY/AuNM7eE5aZKLLP/EABsQAQACAgMAAAAAAAAAAAAAAAEAETFhIVGh/9oACAEBAAE/IXoUjLWZTgA7YSMk5h2/JsT/2gAMAwEAAgADAAAAEPAv/8QAFxEBAAMAAAAAAAAAAAAAAAAAARARIf/aAAgBAwEBPxBS8j//xAAWEQEBAQAAAAAAAAAAAAAAAAABABH/2gAIAQIBAT8QBsb/xAAfEAACAQIHAAAAAAAAAAAAAAAAATEh0RFRYXGBofH/2gAIAQEAAT8QT8wOOQmlEeywlxQ9gNgp6J6GaOLB+dY//9k=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Then the cutting board&quot;
        title=&quot;&quot;
        src=&quot;/static/after-4f16ac1dd456b9d32a53455e20b3a824-d564d.jpg&quot;
        srcset=&quot;/static/after-4f16ac1dd456b9d32a53455e20b3a824-865fd.jpg 240w,
/static/after-4f16ac1dd456b9d32a53455e20b3a824-d40a0.jpg 480w,
/static/after-4f16ac1dd456b9d32a53455e20b3a824-d564d.jpg 960w,
/static/after-4f16ac1dd456b9d32a53455e20b3a824-c67c1.jpg 1440w,
/static/after-4f16ac1dd456b9d32a53455e20b3a824-667be.jpg 1920w,
/static/after-4f16ac1dd456b9d32a53455e20b3a824-85f07.jpg 2880w,
/static/after-4f16ac1dd456b9d32a53455e20b3a824-97f0b.jpg 4032w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;It’s very efficient. My simple cutting board is stable, so I can chop safely 🔪🥒&lt;/p&gt;
&lt;p&gt;If you don’t already have some, you can easily find and buy these. They are usually cheap (~3$ CAD each).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And you, do you have tips &amp;#x26; tricks for cooking?&lt;/strong&gt; 😜&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TIL: How to checkout to "previous" branch]]></title><description><![CDATA[Today, I learned how to go back to the previous branch with one simple command.]]></description><link>https://www.nicoespeon.com/en/2019/12/til-git-checkout-previous-branch/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/12/til-git-checkout-previous-branch/</guid><pubDate>Tue, 03 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Git is the kind of awesome tool that keeps giving. Ok, this feature is not as impressive as &lt;a href=&quot;https://spin.atomicobject.com/2016/06/26/parallelize-development-git-worktrees/&quot;&gt;git worktree&lt;/a&gt; or &lt;a href=&quot;http://effectif.com/git/recovering-lost-git-commits&quot;&gt;the powerful reflog&lt;/a&gt;, but it’s very handy.&lt;/p&gt;
&lt;p&gt;Say you’re on a branch. You checkout to &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; temporarily. Then, you want to come back to your branch. Wait… what’s the name of your branch again?&lt;/p&gt;
&lt;p&gt;Turns out, you can just ask git to go back to the previous branch you were on with &lt;code class=&quot;language-text&quot;&gt;git checkout -&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It works like &lt;code class=&quot;language-text&quot;&gt;cd -&lt;/code&gt;: it checkouts the previous branch and if you run it twice, you’ll end up on the same branch you’re now.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/demo-052f12175df84da87974fa49677307c2.gif&quot; alt=&quot;Demo of the command&quot;&gt;&lt;/p&gt;
&lt;p&gt;And you, do you have any git trick? 😜&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Find and fix performance issues of your VS Code Extension]]></title><description><![CDATA[I fixed a performance issue on a VS Code Extension I'm developing. Let me share with you what I learned.]]></description><link>https://www.nicoespeon.com/en/2019/11/fix-vscode-extension-performance-issue/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/11/fix-vscode-extension-performance-issue/</guid><pubDate>Tue, 26 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’m developing a VS Code Extension that provides intuitive automated refactorings in JavaScript and TypeScript. It’s called &lt;a href=&quot;https://vscode-abracadabra.com/&quot;&gt;Abracadabra&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Recently, I looked for performance bottlenecks to make it faster. In this article, I’ll explain how I did that, so you can do the same.&lt;/p&gt;
&lt;h2 id=&quot;how-do-you-know-you-need-to-improve-performances&quot;&gt;&lt;a href=&quot;#how-do-you-know-you-need-to-improve-performances&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How do you know you need to improve performances?&lt;/h2&gt;
&lt;p&gt;When I make things, I try to follow the mantra:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Make it work, make it right, make it fast.”&lt;/p&gt;
&lt;p&gt;— Kent Beck&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Abracadabra is a side-project. I first developed the features I needed and shipped that. As I learned along the way, I kept refactoring the code to improve readability, thus maintainability. During this process, I took decisions I knew were a bit naive from a performance standpoint, but they simplify a lot the development. A few months after the first release, I had developed more than 20 automated refactorings. Today, it makes me much more productive when I code.&lt;/p&gt;
&lt;p&gt;Most refactorings are exposed as VS Code &lt;a href=&quot;https://code.visualstudio.com/docs/editor/refactoring#_code-actions-quick-fixes-and-refactorings&quot;&gt;Quick Fixes&lt;/a&gt;. Regarding where your cursor is, VS Code will tell you the relevant refactorings you can perform through the lightbulb 💡&lt;/p&gt;
&lt;p&gt;To determine what are the relevant refactorings, Abracadabra naively tries to perform each of them. Each refactoring that could change the code would be considered relevant. Any time the cursor changes position, VS Code would ask Abracadabra the same question: what are the relevant refactorings on this code, from the current selection? Hence, any time the cursor changes position, Abracadabra recomputes all refactorings of the catalog, again.&lt;/p&gt;
&lt;p&gt;That doesn’t sound very performant, does it?&lt;/p&gt;
&lt;p&gt;Indeed, &lt;a href=&quot;https://github.com/nicoespeon/abracadabra/issues/18#issue-472611520&quot;&gt;I thought about it at the beginning&lt;/a&gt;, 2 weeks after the very first release. However, &lt;strong&gt;it wasn’t needed at that time&lt;/strong&gt;. At that time, despite the theory, I couldn’t feel performance issues from usage. Thus, the naive implementation was fine. It kept the code simple, allowing me to develop more and understand the problem better.&lt;/p&gt;
&lt;p&gt;Improving performance implies writing less naive, harder to maintain code to make it fast enough for the users.&lt;/p&gt;
&lt;p&gt;Improving performance is a tradeoff on code maintainability.&lt;/p&gt;
&lt;p&gt;That’s why I think you shouldn’t improve performance without measuring it. &lt;strong&gt;Measure performance.&lt;/strong&gt; That’s how you know if you need to improve it or if it’s good enough.&lt;/p&gt;
&lt;h2 id=&quot;how-to-measure-the-performance-of-a-vs-code-extension&quot;&gt;&lt;a href=&quot;#how-to-measure-the-performance-of-a-vs-code-extension&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to measure the performance of a VS Code Extension?&lt;/h2&gt;
&lt;p&gt;VS Code provides quite a good tooling to do so.&lt;/p&gt;
&lt;h3 id=&quot;show-running-extensions&quot;&gt;&lt;a href=&quot;#show-running-extensions&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Show Running Extensions&lt;/h3&gt;
&lt;p&gt;The first thing you need to do is to &lt;a href=&quot;https://code.visualstudio.com/api/get-started/your-first-extension#debugging-the-extension&quot;&gt;debug your extension&lt;/a&gt;. You certainly want to measure performance before and after your changes. Debugging your extension opens an extension host that will compile your extension code, so you can run it live.&lt;/p&gt;
&lt;p&gt;In the Extension Host, open the Palette (&lt;code class=&quot;language-text&quot;&gt;⌘ ⇧ P&lt;/code&gt; / &lt;code class=&quot;language-text&quot;&gt;Ctrl Shift P&lt;/code&gt;) and search for &lt;strong&gt;Show Running Extensions&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/show-running-extensions-8f7a0eb252f077560dd728ed263883a6-db395.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 14.309484193011649%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAoElEQVQI133MUQvBUADF8b27G7aEsEvYbgwzY7MptiWU8v0/zd9VPCh5+HUezukYI3dI22nh1Go4wqQhrDeTplnHtv5pYJuWprdC0NU/xuF0IUwLZHLHS67E6VE7sctKgjDBn0eoYPPF/+SrW+Wo+IzaVKgwx1jsSzrpg97+QaCPo6zAX26RXoA7ndMfz+hPfhgrBn6IXFfI6IyMbwxmO56KwFW/vKf7QQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;show running extensions&quot;
        title=&quot;&quot;
        src=&quot;/static/show-running-extensions-8f7a0eb252f077560dd728ed263883a6-c83f1.png&quot;
        srcset=&quot;/static/show-running-extensions-8f7a0eb252f077560dd728ed263883a6-569e3.png 240w,
/static/show-running-extensions-8f7a0eb252f077560dd728ed263883a6-93400.png 480w,
/static/show-running-extensions-8f7a0eb252f077560dd728ed263883a6-c83f1.png 960w,
/static/show-running-extensions-8f7a0eb252f077560dd728ed263883a6-db395.png 1202w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;That will open a tab wich list your running extensions:&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/running-extensions-33f5f2bc71e36d546afcaea79b002a17-02ac4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 46.45669291338583%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABTklEQVQoz32S2XKDMAxFee2SBGxjY3YISxM60742zfpTpH9/KxGaZKalD2ck7LlCurJj4hw2zlBULap2hWbVoaxbuMpABvEkfpgiSApYIi5qooKyCRzfphDaonp5Rdu9DVRth6JeQfgBZp7CXPiYeyOU8xnfpWWDOK+QUMEwLRBlFRdMhm5cqa8sBEdDBdQ0VPimMaTxh84dTa0rSpruHVFew/UtpIkgiKlx+S7MliiaDnm9Rt6skdFEbIHDc3MBTV6yLz/85x+j7MVHHWVXBg+FDuGpANmyRUl/Yu9K8lDS+cyVkyPzHTMshbq1SU4aSx2SUJLBihDkxz2e9O8Yv8UFwa9ghLVy1Dtz2vKzCeFnJR6VHjEj+hdPJHyg6NFTC+ipmWVzibTxRUgjfx1P6Jn9Hv32E+fjccjPB+J0usUhP6DffPzBhjQ79LstvgHiNfOKu9DeYgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;running extensions&quot;
        title=&quot;&quot;
        src=&quot;/static/running-extensions-33f5f2bc71e36d546afcaea79b002a17-c83f1.png&quot;
        srcset=&quot;/static/running-extensions-33f5f2bc71e36d546afcaea79b002a17-569e3.png 240w,
/static/running-extensions-33f5f2bc71e36d546afcaea79b002a17-93400.png 480w,
/static/running-extensions-33f5f2bc71e36d546afcaea79b002a17-c83f1.png 960w,
/static/running-extensions-33f5f2bc71e36d546afcaea79b002a17-02ac4.png 1270w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;The first thing you can see from this tab is the &lt;em&gt;Startup Activation&lt;/em&gt; time. It tells you the time each extension took to activate.&lt;/p&gt;
&lt;p&gt;As a rule of thumb, if your extension takes more than 500ms to activate, there’s probably something you could do to speed that up—it’d be a good idea to &lt;a href=&quot;https://code.visualstudio.com/api/working-with-extensions/bundling-extension&quot;&gt;bundle your extension&lt;/a&gt; if you don’t do that already.&lt;/p&gt;
&lt;p&gt;If you’re below that, I’d say that’s OK. Around 100-200ms is great. Below is amazing 😉👍&lt;/p&gt;
&lt;p&gt;Now, that was for startup activation time. But if you’re probably concerned with your extension &lt;em&gt;runtime&lt;/em&gt; performance. So how can we track that?&lt;/p&gt;
&lt;h3 id=&quot;record-extension-profile&quot;&gt;&lt;a href=&quot;#record-extension-profile&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Record Extension profile&lt;/h3&gt;
&lt;p&gt;On the top right, you have a series of icons that will allow you to record a performance profile of the extension at runtime.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/running-extensions-icons-3db68c794980c76ea1af041b0191879e-41965.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 326px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 20.858895705521473%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAtUlEQVQY001Q2Q6CMBDkCzw4C7RgPRARgWCCZyT6aGLi///MymxS4sOmuzOd2WktR0iyg5hwotxQ0cwLGUMPbOoKxswcyAV5UTJq/rUWmu2+pvWuZGDuR5QfGlJ6wz2E9fFEWVGxaZSuqO0uA9aNPBb4ccqmFoC8bFiAfuIIuvUvKqqWk+Hy+/Ol870fuIDUMmP++ngyL5QmqTNexIZIFSaahSY2jO1Ajk80X4IZBROTyPDmi35iEWuV+clEtwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;running extensions icons&quot;
        title=&quot;&quot;
        src=&quot;/static/running-extensions-icons-3db68c794980c76ea1af041b0191879e-41965.png&quot;
        srcset=&quot;/static/running-extensions-icons-3db68c794980c76ea1af041b0191879e-f1b80.png 240w,
/static/running-extensions-icons-3db68c794980c76ea1af041b0191879e-41965.png 326w&quot;
        sizes=&quot;(max-width: 326px) 100vw, 326px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;Click on the record button (the dot in the circle). It will turn red, meaning it’s recording.&lt;/p&gt;
&lt;p&gt;Then, go back to your code. Trigger your extension. In the case of Abracadabra, I was suspecting performance issues on Quick Fixes, so I moved my cursor around the code, to trigger Quick Fixes.&lt;/p&gt;
&lt;p&gt;When you’re done, go back to the &lt;strong&gt;Running Extension&lt;/strong&gt; tab and stop the recording. Then, click on the most-left icon to download the &lt;code class=&quot;language-text&quot;&gt;.cpuprofile&lt;/code&gt; you just recorded.&lt;/p&gt;
&lt;p&gt;This CPU profile can be loaded in some DevTools. You can use the DevTools available in VS Code! Open the Palette again, and search for &lt;strong&gt;Toggle Developer Tools&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/toggle-devtools-ef334f5651b471517fc094a67de59ac9-bb136.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 14.572864321608039%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAq0lEQVQI123Kyw7BQACF4a6ZtkosSNUlQnW0JaWmoxlEkLDy/g/zmyBWFt/iXJxRGNHxA7yGwG+6lqBlBcIlcD3L/6slvM8uxFvbijpdHH15ouoz2tyozJW9uZDXD5bVFbmqSHJFkpU/CytdVyh9pNgZ5O5Gou5I9Xj/nbg8Idcly0KTbWvSjUZuahKbw5UhinN6wyn98Yz+6Gs8ZzCZMYgLwtRYB8LsZPuYF9+mVlp1mOl+AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;toggle devtools&quot;
        title=&quot;&quot;
        src=&quot;/static/toggle-devtools-ef334f5651b471517fc094a67de59ac9-c83f1.png&quot;
        srcset=&quot;/static/toggle-devtools-ef334f5651b471517fc094a67de59ac9-569e3.png 240w,
/static/toggle-devtools-ef334f5651b471517fc094a67de59ac9-93400.png 480w,
/static/toggle-devtools-ef334f5651b471517fc094a67de59ac9-c83f1.png 960w,
/static/toggle-devtools-ef334f5651b471517fc094a67de59ac9-bb136.png 1194w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;If you’re familiar with Chrome DevTools, well, it’s the same. Open the &lt;strong&gt;JavaScript Profiler&lt;/strong&gt; tab. This one is hidden: you need to reach for the 3 dots menu → More tools → JavaScript Profiler.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/javascript-profiler-4471a5826d07181f434e2e3643c4e52a-518f5.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 53.45454545454545%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB3ElEQVQoz4WTW08TURSF+2f9G76jEp9JfFIkPvho1EJCCAZIfKlYKr3MrXPp3O+XFmnn88xQtQiNO1lZZ59k1l77ZE3HNE10XScMQ2RZpul930dRlJYNw2jvTDugN5DoD2Uc1yOKI/I0JVQkIk8lSVLiyKejqiqO42BZFkEQtCJRFP05e55PlmWkWU4QpShmyMy2kWQFW7AhhjXDNSF8KQd0lsslq9WKhn+fN/vNu1ogE65sYaARMoWJZgPDaLbysBwhyH+qrus17vqiKJjIKv3BNVNduNN0NMFhFLdDOn8/uI9tNa8KXEtDmVwz02XKxIXbnJvcJ3a1+w43xeaLhXj4BD8IWy7Kivm8QjJjDk5nvD2e8u7MZ/8s4815zuvzir3j6KEga9GyyJiqE66+f8OzTao8ZjWPGWkee0ce+19CXp3EvDzM2e0W7Hwu2elW2xzW6G7GSU/nw+mAr0Of/jTnYpwz0GI8S2U8vCIJZnCTtoPqRcyyCh8KrtYrf+ylPH3vs/sp5sXhgmdHP3lycMvzbo4qj+n/GBGEUQs/aDgW+fQfWZk7l1WZiWxNUKQRnmMyMzTKLCQV4XVct81q8zP8i87jEanbMI8mEr3LfhuRhhVtSiJy2GRyW/0C9xQ7HP+6pUUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;javascript profiler&quot;
        title=&quot;&quot;
        src=&quot;/static/javascript-profiler-4471a5826d07181f434e2e3643c4e52a-c83f1.png&quot;
        srcset=&quot;/static/javascript-profiler-4471a5826d07181f434e2e3643c4e52a-569e3.png 240w,
/static/javascript-profiler-4471a5826d07181f434e2e3643c4e52a-93400.png 480w,
/static/javascript-profiler-4471a5826d07181f434e2e3643c4e52a-c83f1.png 960w,
/static/javascript-profiler-4471a5826d07181f434e2e3643c4e52a-518f5.png 1100w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;From there, you can start profiling JS—but we already did that using VS Code Running Extension. You also have a &lt;strong&gt;Load&lt;/strong&gt; button you can use to load your &lt;code class=&quot;language-text&quot;&gt;.cpuprofile&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: on Mac OS, if your finder doesn’t show all file extensions, it might save the file as &lt;code class=&quot;language-text&quot;&gt;.cpuprofile.txt&lt;/code&gt; and you won’t notice. If you can’t it that in DevTools, use the terminal to rename it with the proper extension (remove the &lt;code class=&quot;language-text&quot;&gt;.txt&lt;/code&gt; part).&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;analyze-the-profile&quot;&gt;&lt;a href=&quot;#analyze-the-profile&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Analyze the profile&lt;/h3&gt;
&lt;p&gt;I prefer to use the Flame Chart, it’s much more visual.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/flame-chart-a2a10140a5d2011060ca1e0616b3b661-d50df.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 29.9860529986053%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAABRUlEQVQY0z2Qy0rDUBCG88Ru3fgELlxUFAUREXEhIiI+gFshQgMSStqm5H47SXNtQtPkd+YEO/AzA2fmO/+M4jgOgiCAZdmI45hqH7NXFWcPKk7vf3By/Y23Lx1J5NNbKHtYYRjCdV0EkcBiZcFY29jYARTLnkDb7RZ1XaMsSzw9v2B2dYubu0ecX1zi/eMTnu8jihiWEMiTvU3ToChKlFUtVZQVFNvxsLEcxEkioaxUCJimCY8ciDia3Hg+8jyHECmM5RpJIgjaYDgc0Pc9DiyqFcP4haqqmM816LoOTdOQZRmaXSt/7boObdshLwrKrcyeH8Bxfeyoh2PEFOxaSVNBgPTojmEMEWk2uagq1LRaEEbyHLzJcm1SFhNsHKU4BG2mMJVV0SCLh/r9Xg6wqqrEjpwxsCB3fMOFsZInGIbhCP0H/gGy8byzxJP9jwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;flame chart&quot;
        title=&quot;&quot;
        src=&quot;/static/flame-chart-a2a10140a5d2011060ca1e0616b3b661-c83f1.png&quot;
        srcset=&quot;/static/flame-chart-a2a10140a5d2011060ca1e0616b3b661-569e3.png 240w,
/static/flame-chart-a2a10140a5d2011060ca1e0616b3b661-93400.png 480w,
/static/flame-chart-a2a10140a5d2011060ca1e0616b3b661-c83f1.png 960w,
/static/flame-chart-a2a10140a5d2011060ca1e0616b3b661-d50df.png 1434w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/flame-chart-2-04285138b2cdd14bbd50ec39d0f0ab5c-71b64.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 70.51162790697674%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAACwElEQVQ4y11SaXPaQAzl//+QfumVhPuGgIFwQwg2PtcXYAzGQIDQtLzKdptk4hnNWz1JTyuvYrZtwTQNWJYBXdchyVroG4b+CRkM04LGotyoxgzj7zkGYoxZUBQT8/maCAcqcynoRP4nZPoKlr2FaSyhqiYYm2Ox2LzlM8YQK2d5ZG9EtCse2uUNOlUPD4TtyuYfeh9wHcabxSUS30aoZkx07rfkrzFqbXE8nhGbNCTwdRq3twHrrt8s8D9z/3m5vUC/yENtO6GvdVxYEw/XP6CRqwx2zsa+sceO24Xmcz7sgg234mLPvfOBBXke50FOyVhX16Hv13wc+gdcf18RU+8ZrMIcXmNHiX6Ibt2DlFFglxYR98E23BZ2ZQE5q8K5X8NvUoO6D3+wpxuSoE7jzktLEnov2pKolmdYVBzsWodQZENNAt6t0a8o0YPk9TDOCgYcmmQ3OESCYllC68sD1lSg5hiGP8Ywizae4jz634eYJSUoGQ0ijRicpbQCKStjcjfFlHJGPx8xoAdSKhpwDf5hnWF6y9P1HYhJEXxcgJbTqFAmERFCQqBGGokqECgmE7ICI06FklXAJ3jMEjPoNR3BF5txKoa3U4iUNE4KeMpQ97SEISU+pmbkS5hSYcAP6FZBTChomBA/Ts/QvXnEOCFCbZiRINfV8SOlIF02Ec9rSFByPK/ilsZKUJM7ukmyqIfnr/EpUiUdhZqBdEmjs0pxieIMXHcRCY4FF82uAc08YSp6ZLRn7BkzxQ9R0g6EB0h0FiRa/PGWin3UOh7qnS1yVQtFboXh9BAJWosjZEWhF7rQptNO+Ru8vp7x63IK7fLBcH0Bs84kekJ3ckJvcka5uSJhH7xyQfAqMd064qGnYDjRIchLMGMLx33BfHnE3Dli6Z4jW52Je4aoHTHiA7Ej+k8nVFsrcL0dZupLKPgXCHfmWw/fDKwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;flame chart 2&quot;
        title=&quot;&quot;
        src=&quot;/static/flame-chart-2-04285138b2cdd14bbd50ec39d0f0ab5c-c83f1.png&quot;
        srcset=&quot;/static/flame-chart-2-04285138b2cdd14bbd50ec39d0f0ab5c-569e3.png 240w,
/static/flame-chart-2-04285138b2cdd14bbd50ec39d0f0ab5c-93400.png 480w,
/static/flame-chart-2-04285138b2cdd14bbd50ec39d0f0ab5c-c83f1.png 960w,
/static/flame-chart-2-04285138b2cdd14bbd50ec39d0f0ab5c-23e13.png 1440w,
/static/flame-chart-2-04285138b2cdd14bbd50ec39d0f0ab5c-10d8f.png 1920w,
/static/flame-chart-2-04285138b2cdd14bbd50ec39d0f0ab5c-71b64.png 2150w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;I’ll suppose you know &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Tools/Performance/Flame_Chart&quot;&gt;how to interpret Flame Charts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From this specific one, we can see 2 things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The extension &lt;code class=&quot;language-text&quot;&gt;parse()&lt;/code&gt; the code repeatedly, which adds up and takes a lot of time in the end.&lt;/li&gt;
&lt;li&gt;It runs one &lt;code class=&quot;language-text&quot;&gt;provideCodeActions()&lt;/code&gt; per refactoring, which could also be optimized.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That’s even clearer if we zoom in a bit:&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/flame-chart-2-zoomed-in-546da4efc8ba0afe5f9f5884671d469a-9aef4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 25.119846596356666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAABE0lEQVQY04WN3VKCYBRFef8nqalpQq00QkvBxDE1RS1KSNAyLUEsfnLG1adXedXFmj17n3P2kbSsSevSxjHCf7FrIeNWRE/30GQTS5vzfOuLfClY4bZXSAfyPbLiohpfqCJUxdFOjdWeFsW8oPvcNITXXQ6zPRR9zlX1k1J9KXZ8jM43klIe0ej6DIYRze6Mu847lpMKEiw7+aMpfSukZX5Qrr1SrC6otSMK12PO1RE5xUGrz5C0ms3Qttls1vykMWEYkApNkmiPOI5YrxOCZUTF8DjODXYFmYLF6cUjJ2cD8Wi6LXyh2X7A7D8xdCZMZwF+ELPwIxbBH4TflnkTH73ucZQxRcGYfMlBqbwh5y2KmssvbpZjKhvHz8IAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Flame chart before optimization, it&apos;s wide and has a lot of operations&quot;
        title=&quot;&quot;
        src=&quot;/static/flame-chart-2-zoomed-in-546da4efc8ba0afe5f9f5884671d469a-c83f1.png&quot;
        srcset=&quot;/static/flame-chart-2-zoomed-in-546da4efc8ba0afe5f9f5884671d469a-569e3.png 240w,
/static/flame-chart-2-zoomed-in-546da4efc8ba0afe5f9f5884671d469a-93400.png 480w,
/static/flame-chart-2-zoomed-in-546da4efc8ba0afe5f9f5884671d469a-c83f1.png 960w,
/static/flame-chart-2-zoomed-in-546da4efc8ba0afe5f9f5884671d469a-23e13.png 1440w,
/static/flame-chart-2-zoomed-in-546da4efc8ba0afe5f9f5884671d469a-10d8f.png 1920w,
/static/flame-chart-2-zoomed-in-546da4efc8ba0afe5f9f5884671d469a-9aef4.png 2086w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;So I went back to the code and optimized for that.&lt;/p&gt;
&lt;p&gt;I parsed the code only once, then gave the AST to all refactorings. Then, I collected the list of available refactorings and provided them to VS Code only once. Here’s the same profiling, after the changes:&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/flame-chart-after-optimization-0823b0473fd68eaefd9560c5a201d677-29c8d.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 91.63722025912838%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAABYlAAAWJQFJUiTwAAACo0lEQVQ4y6VUaVfaQBTl//+KfuiXarWtYj2loiwJiCKGQCDBo0kgG0vIVkHW28cEKljb04Vz7rnvzh3uvMlkkuh0OlBVDe12zLreXus2NI1YX7HOxja+TlrXY2ispjnkGYaBhGWb6PZsOF2LoWMZsBwTNtUxNjXN6TnMc3bGY7D/UnMJSVSRS9dRq1iQxQHkmotmtQ+lPkST9AoKG9vyiNnctbfiluRC1SwkykUVe2/KuEgaKKRc8IRCarjm3Xrbe/ap/uLiMj3E6HGBRFux0Czcw6wPYNT6MMTeM7+sxf7P3lqb0gCzpzkStmCjeSDDzboIuBB+PthB8EK/6uWoLoSYj6hDS7QhH7Vg57rwigGGBf/vwfvwSkEcaFfp5M4ceIWAGf8EjgIv14GmYKF2KMG4sH506G2tzhba0a942x36dz7K7yoQPojoZvvw+OD/OhybTxAORNweVmGc27Tii8DCb4LWnstvB9pjCHu3aCUV+JyHkCaFtHXGfwoKDGnLi1Vg5I2RPaqDP1HQyNObT8ffyA8h5T00+ZB0hAYXoLkBH3NjU/NxrVyGmKwCvfEYxxkV6VKETDlE9spA/kpBS38kjFCjZ6xaUzyYv8KEsWpNMJlS4Gg2Q5rTkMo6ECTqSunAog8E+y3n6Pd7mM+mhAlm0wnjjWaYT2NNvFxS4JxSM7yGvU8ihHoXkmxAVlq4u1dhOz1o9Fkbej6CMIIfhAgIHmnPpxuyhSj6hsWCAhfTJXLFNt4fS7itOdStjmRKwul5C8WbAaqNCBW6r1zJQEWKUBY9XHAPqNRD5EsmimUT10KPtIvZfInEamc3dOn36WDkuyEFaUietXGUekCGXoXr2gSZoo1DOrQMPeczro+3+zf4fG6yOR9PZXzNWTSnR4HAd8s7FeBtU+zbAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Flame chart after optimization, it&apos;s narrow and shows less operations&quot;
        title=&quot;&quot;
        src=&quot;/static/flame-chart-after-optimization-0823b0473fd68eaefd9560c5a201d677-c83f1.png&quot;
        srcset=&quot;/static/flame-chart-after-optimization-0823b0473fd68eaefd9560c5a201d677-569e3.png 240w,
/static/flame-chart-after-optimization-0823b0473fd68eaefd9560c5a201d677-93400.png 480w,
/static/flame-chart-after-optimization-0823b0473fd68eaefd9560c5a201d677-c83f1.png 960w,
/static/flame-chart-after-optimization-0823b0473fd68eaefd9560c5a201d677-23e13.png 1440w,
/static/flame-chart-after-optimization-0823b0473fd68eaefd9560c5a201d677-29c8d.png 1698w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;Much. Better. 😘👌&lt;/p&gt;
&lt;h3 id=&quot;anecdote-optimizing-for-performance-makes-code-less-intuitive&quot;&gt;&lt;a href=&quot;#anecdote-optimizing-for-performance-makes-code-less-intuitive&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Anecdote: optimizing for performance makes code less intuitive&lt;/h3&gt;
&lt;p&gt;As you can see, profiling Abracadabra made me confident the problem was essentially due to every individual refactoring reparsing the same code. This was naive and I optimized so the code is now only parsed once.&lt;/p&gt;
&lt;p&gt;But when I did so, I created issues that didn’t exist before! I had to tackle them.&lt;/p&gt;
&lt;p&gt;Indeed, all refactorings now share the reference to the same AST. If one refactoring were to modify that reference, that would cause problems to the others. Cloning the AST could sound like a solution. I actually tried that and measure the performances after. It was worse. In fact, cloning the AST between each refactoring was &lt;strong&gt;more expensive&lt;/strong&gt; than parsing the code each time.&lt;/p&gt;
&lt;p&gt;That’s the heart of performance optimization: don’t guess, measure. Sometimes you’ll guess right. Sometimes, you won’t.&lt;/p&gt;
&lt;p&gt;The actual fix was to ensure each refactoring wouldn’t mutate the AST when running for Quick Fixes. I had to introduce a bit more complexity in the code to optimize it. That’s usually the case when you optimize for performances. That’s why I follow Kent Beck’s mantra. If the code is simple enough, it’s easy to tweak it where necessary, for performance reasons.&lt;/p&gt;
&lt;p&gt;Oh and a useful tip: when you do that, leave a comment to explain why this part of the code is not simpler. Your future-self and colleagues will thank you.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;If you’re developing a VS Code Extension, I hope this guide would have helped you to find and fix performance issues.&lt;/p&gt;
&lt;p&gt;If you have a problem with your VS Code performances in general, I suggest you read &lt;a href=&quot;https://github.com/microsoft/vscode-wiki/blob/master/Performance-Issues.md&quot;&gt;their wiki page on performance issues&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;If you’re using VS Code to code in JavaScript or TypeScript, I can only recommend you give a try to &lt;a href=&quot;http://bit.ly/vscode-abracadabra&quot;&gt;Abracadabra&lt;/a&gt;. I craft these automated refactorings so they are useful and quick to use. It should save you a lot of time every day. It does for me 🙂&lt;/p&gt;
&lt;p&gt;Finally, I wish I made you think twice about handling performance issues. Make it work, make it right, make it fast. What do you think?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How I used VS Code for my talk instead of Keynote or Powerpoint]]></title><description><![CDATA[Instead of using a regular presentation tool, I did everything from VS Code. And I really think this is a powerful format for technical talks.]]></description><link>https://www.nicoespeon.com/en/2019/11/vscode-as-a-presentation-tool/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/11/vscode-as-a-presentation-tool/</guid><pubDate>Sun, 17 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last week, &lt;a href=&quot;https://www.bgphp.org/speakers/&quot;&gt;I spoke at Bulgaria PHP 2019&lt;/a&gt;. After &lt;a href=&quot;https://joind.in/event/bulgaria-php-conference-2019/the-secrets-of-hexagonal-architecture&quot;&gt;the great feedback I got&lt;/a&gt;, a few people asked me about my “original delivery” of the talk. Indeed, instead of using a regular presentation tool, I did everything from my code editor: Visual Studio Code.&lt;/p&gt;
&lt;p&gt;Here’s the why and how I did that, so I can just refer to it instead of repeating my explanations. Hopefully, it will inspire you to do the same. I really think this is a powerful format for technical talks.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TL;DR I made a VS Code Extension to help you do the same.&lt;br /&gt;
👉 &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=nicoespeon.slides&quot;&gt;It’s called Slides&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;vs-code-as-a-presentation-tool-but-why&quot;&gt;&lt;a href=&quot;#vs-code-as-a-presentation-tool-but-why&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;VS Code as a presentation tool. But, why?&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/why-8998b4d6158f7f80b5a2e28302d2711e.gif&quot;&gt;&lt;/p&gt;
&lt;p&gt;Well, I got inspired by &lt;a href=&quot;https://www.youtube.com/watch?v=zCJyiBu12Jw%20link%20to%20tweet&quot;&gt;Kent C. Dodds’ talk on “Managing an Open Source Project”&lt;/a&gt;. I read &lt;a href=&quot;https://staltz.com/your-ide-as-a-presentation-tool.html&quot;&gt;the original blog post from André Staltz&lt;/a&gt; and I liked it a lot. I recommend you to read it, but here’s my recap:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What really matters in a technical talk, is &lt;strong&gt;the content&lt;/strong&gt;. Using your code editor really helps focus on what matters. You don’t go fancy on animations and all, you deliver the content.&lt;/li&gt;
&lt;li&gt;When you explain technical concepts with code, it’s better to &lt;strong&gt;show that in action&lt;/strong&gt;. Live-code it from a blank file. Show people there’s no black magic and what you say actually works.&lt;/li&gt;
&lt;li&gt;It helps people understand your message. It really just feels like you’re showing a colleague how to do something.&lt;/li&gt;
&lt;li&gt;If you want to show code, it’s even better to stay in your code editor than switching from a presentation tool.&lt;/li&gt;
&lt;li&gt;You can still show images if you need to.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My talk was about “The Secrets of Hexagonal Architecture”. I wanted people to understand what’s the universally true axiom behind a maintainable codebase, regardless of the language, the architecture or the tooling. Thus, I wanted to show the code. I needed to illustrate the theory with concrete, working examples.&lt;/p&gt;
&lt;p&gt;That’s why I decided to use exclusively VS Code for this presentation. And &lt;strong&gt;it was great!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now, I learned a few things along the way. If you want to do the same, I think it’d be helpful I share that with you 😉&lt;/p&gt;
&lt;h2 id=&quot;how-to-build-a-great-presentation-with-vs-code&quot;&gt;&lt;a href=&quot;#how-to-build-a-great-presentation-with-vs-code&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to build a great presentation with VS Code&lt;/h2&gt;
&lt;p&gt;Putting the theory aside, here’s my recipe to build a nice talk using VS Code only:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Raw content in Markdown files&lt;/li&gt;
&lt;li&gt;Rich content through diagrams &amp;#x26; drawings&lt;/li&gt;
&lt;li&gt;Live-coding from executable, blank files&lt;/li&gt;
&lt;li&gt;Use a non-fancy terminal to favor clarity&lt;/li&gt;
&lt;li&gt;Make live-coding smooth&lt;/li&gt;
&lt;li&gt;Don’t stay behind the computer the whole talk, use a clicker&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;raw-content-in-markdown-files&quot;&gt;&lt;a href=&quot;#raw-content-in-markdown-files&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Raw content in Markdown files&lt;/h3&gt;
&lt;p&gt;Focus on the content. Write this content in plain Markdown. Show that.&lt;/p&gt;
&lt;p&gt;For your (great) content to be seen comfortably, it’s better to configure VS Code appropriately. Based on André Staltz’s advice, it’s better if you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Use a light theme&lt;/strong&gt;. Contrast is always better so people can read regardless of how dark is the room.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use a big enough font size&lt;/strong&gt;, so anyone can read from the back of the room.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Get rid of distractions&lt;/strong&gt;. Hide the sidebars and everything. Just show the file content.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;rich-content-through-diagrams-and-drawings&quot;&gt;&lt;a href=&quot;#rich-content-through-diagrams-and-drawings&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Rich content through diagrams and drawings&lt;/h3&gt;
&lt;p&gt;I talked about Hexagonal Architecture. It’s easier to understand the theory with some diagrams. In such a scenario, I don’t want to try my luck with ASCII art.&lt;/p&gt;
&lt;p&gt;I draw my diagrams somewhere else (this can even be Keynote, whatever), and export an image. VS Code will show the image—so it’s just like a slide after all.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/slide-hexagonal-architecture-22217355defeaa3e4fc5716a3dbabded-4cf8a.jpeg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 56.3%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAECAwX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHuKDVI/8QAGhABAAEFAAAAAAAAAAAAAAAAAQACEBEiMf/aAAgBAQABBQJYQ5jam3//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAVEAEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAQAGPwJr/8QAGxABAQEAAgMAAAAAAAAAAAAAAREAEDFBYXH/2gAIAQEAAT8hl2wz+lyodFeR7xKnH//aAAwDAQACAAMAAAAQL8//xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAwEBPxCn/8QAFREBAQAAAAAAAAAAAAAAAAAAERD/2gAIAQIBAT8QGf/EABkQAQEBAQEBAAAAAAAAAAAAAAERIQAxEP/aAAgBAQABPxAk582z3gQQgyzeRg9OXZUmKs5TKjqK/P/Z&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Slide representing the Hexagonal Architecture as a diagram&quot;
        title=&quot;&quot;
        src=&quot;/static/slide-hexagonal-architecture-22217355defeaa3e4fc5716a3dbabded-d564d.jpeg&quot;
        srcset=&quot;/static/slide-hexagonal-architecture-22217355defeaa3e4fc5716a3dbabded-865fd.jpeg 240w,
/static/slide-hexagonal-architecture-22217355defeaa3e4fc5716a3dbabded-d40a0.jpeg 480w,
/static/slide-hexagonal-architecture-22217355defeaa3e4fc5716a3dbabded-d564d.jpeg 960w,
/static/slide-hexagonal-architecture-22217355defeaa3e4fc5716a3dbabded-4cf8a.jpeg 1000w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;For this talk, I even decided to illustrate everything I said with hand drawings. Though, that’s personal and specific to this talk. That’s also because I had my slides ready from previous presentations of this talk 🤓&lt;/p&gt;
&lt;h3 id=&quot;live-coding-from-executable-blank-files&quot;&gt;&lt;a href=&quot;#live-coding-from-executable-blank-files&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Live coding from executable, blank files&lt;/h3&gt;
&lt;p&gt;I name files in alphabetical order. For convenience, I use a counter as a prefix. So I go &lt;code class=&quot;language-text&quot;&gt;01.md&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;02.md&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;03.jpg&lt;/code&gt;, etc.&lt;/p&gt;
&lt;p&gt;When I want to live-code, I put an empty file in which I’ll code. For example &lt;code class=&quot;language-text&quot;&gt;04.php&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;04.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It’s better to leave the file empty. If it has content inside, it should be something the audience already knows for sure.&lt;/p&gt;
&lt;p&gt;Since &lt;strong&gt;it’s just a regular file in my code editor&lt;/strong&gt;, I can run the code from the terminal afterward. No black magic involved!&lt;/p&gt;
&lt;h3 id=&quot;use-a-non-fancy-terminal-to-favor-clarity&quot;&gt;&lt;a href=&quot;#use-a-non-fancy-terminal-to-favor-clarity&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Use a non-fancy terminal to favor clarity&lt;/h3&gt;
&lt;p&gt;When it comes to the terminal, we, developers, can be very fancy. I bet yours is not configured like mine. We all adapt our tools to our specific needs and personal style. That’s fine!&lt;/p&gt;
&lt;p&gt;However, this can be very distracting during the talk. I don’t want people to think about my git aliases or my shell theme. &lt;strong&gt;I want them to focus on the content of my talk&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Thus, I recommend getting rid of the fancy stuff during the presentation. A basic bash shell should be enough and won’t surprise anyone.&lt;/p&gt;
&lt;p&gt;I also prefer to use VS Code embedded terminal, so I stay in my code editor—that’s why I don’t use Keynote after all. That way, I can configure it to use a non-fancy version of my terminal without changing the terminal I use every day!&lt;/p&gt;
&lt;h3 id=&quot;make-live-coding-smooth&quot;&gt;&lt;a href=&quot;#make-live-coding-smooth&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Make live-coding smooth&lt;/h3&gt;
&lt;p&gt;Live-coding is a risky format for a presentation. Especially when you’re not used to doing it. It takes a lot of practice to be able to code confidently in front of an audience while keeping the talk entertaining.&lt;/p&gt;
&lt;p&gt;You’ll write typos because your hands will be shaking off from stress. You will forget basic stuff because everyone will be looking at you. But most of all, you’ll probably break the connection with your audience when you start coding. That’s for 2 reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You stop looking at them as you look at your computer. When you do that, you break the visual connection with people. Visual connection is important to deliver a great talk. Breaking it sometimes is fine, as long as you keep talking to them in the meantime. Problem is…&lt;/li&gt;
&lt;li&gt;You stop talking too. At least, your flow is considerably slower. It’s filled with “hmmmmmm” as you’re thinking about the code you want to write and you can’t focus on talking at the same time.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When you’re looking at your computer, trying to remember what to type next, without saying meaningful information, that’s when people get bored and disconnect.&lt;/p&gt;
&lt;p&gt;That’s why it takes practice. So you can keep a meaningful speech while you’re coding. Or you can look at your audience while you’re typing. Don’t underestimate how much preparation a decent live-coding requires! Coding in front of people, and making that interesting, is really hard.&lt;/p&gt;
&lt;p&gt;Thus, you have 2 options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Practice, practice, practice in front of people until you get comfortable enough.&lt;/li&gt;
&lt;li&gt;Use &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=jevakallio.vscode-hacker-typer&quot;&gt;the VS Code Hacker Typer extension&lt;/a&gt;. It allows you to &lt;strong&gt;record your live-coding&lt;/strong&gt; in advance and replay that, in live.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;But, that’s not live-coding anymore! What’s the point? Why not just showing code in slides then?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The main difference is &lt;strong&gt;the delivery&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In my talk, I wanted people to see the code being written, from a blank file, in the context of a code editor. When the code is written, I can run it. I think it’s best for understanding.&lt;/p&gt;
&lt;p&gt;My typing skills matter less to attendees. While I replay the macro I saved, I’m able to focus my attention on my speech and keep the contact with my audience. What I say is more interesting, and connected with what people see appearing on the screen.&lt;/p&gt;
&lt;p&gt;Of course, it still takes preparation and practice to make it smooth.&lt;/p&gt;
&lt;p&gt;You may not like the idea, and that’s fine. I think what matters is &lt;strong&gt;the content&lt;/strong&gt; of the talk and &lt;strong&gt;the delivery&lt;/strong&gt;. And this really helps deliver great content to people.&lt;/p&gt;
&lt;h3 id=&quot;dont-stay-behind-the-computer-the-whole-talk-use-a-clicker&quot;&gt;&lt;a href=&quot;#dont-stay-behind-the-computer-the-whole-talk-use-a-clicker&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Don’t stay behind the computer the whole talk, use a clicker&lt;/h3&gt;
&lt;p&gt;I told you about how important it is to engage with the audience to make the talk entertaining.&lt;/p&gt;
&lt;p&gt;While coding, you’re stuck behind the computer. That’s OK. But when you’re not coding, it’d be better if you could move out and get closer to the people. Don’t stay hidden, behind your computer stand. Engage with your audience.&lt;/p&gt;
&lt;p&gt;To do so, you should be able to switch slides “remotely”. It’s smoother if you don’t have to come back to your computer every minute or so to go to the next slide. That’s what clickers are for!&lt;/p&gt;
&lt;p&gt;But how can you use a clicker with VS Code? I mean, “slides” really are files open in different tabs. So how can your clicker make VS Code go to the next tab?&lt;/p&gt;
&lt;p&gt;The answer is almost in the question. To do so, you need 2 things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Define a shortcut in VS Code that will move to the next tab. The command is &lt;code class=&quot;language-text&quot;&gt;workbench.action.nextEditor&lt;/code&gt; and you can configure a keyboard shortcut for it.&lt;/li&gt;
&lt;li&gt;Remap your clicker to match the shortcuts you’ve defined.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;How to remap your clicker depends on your OS and your clicker. Being on MacOS, I used a tool named &lt;a href=&quot;https://pqrs.org/osx/karabiner/&quot;&gt;Karabiner-Elements&lt;/a&gt; to remap my clicker. I found &lt;a href=&quot;http://weibeld.net/mac/remap-presenter-keys.html&quot;&gt;this tutorial to remap a wireless presenter&lt;/a&gt; very helpful.&lt;/p&gt;
&lt;h3 id=&quot;the-settings-i-used&quot;&gt;&lt;a href=&quot;#the-settings-i-used&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The settings I used&lt;/h3&gt;
&lt;p&gt;Based on André Staltz’s recommendation, here are the settings I typically use to ensure the previous points:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;workbench.colorTheme&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;GitHub Clean White&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;workbench.colorCustomizations&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;editorCursor.background&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#ffffff&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;editorCursor.foreground&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#0000bb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;editor.lineHighlightBackground&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#f0f0f0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;editor.selectionBackground&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#aaeeff&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;workbench.statusBar.visible&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;workbench.activityBar.visible&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;editor.minimap.enabled&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;explorer.openEditors.visible&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;editor.renderWhitespace&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;none&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;editor.renderIndentGuides&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;editor.fontFamily&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;SF Mono&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;terminal.integrated.fontFamily&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;SF Mono&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;editor.fontWeight&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;600&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;editor.fontSize&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;terminal.integrated.fontWeight&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;800&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;terminal.integrated.fontSize&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;28&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;terminal.integrated.shell.linux&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/bin/bash&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;terminal.integrated.shell.osx&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/bin/bash&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;editor.formatOnSave&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;workbench.editor.enablePreview&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I installed the &lt;code class=&quot;language-text&quot;&gt;GitHub Clean White&lt;/code&gt; theme and the &lt;code class=&quot;language-text&quot;&gt;SF Mono&lt;/code&gt; because it will look like GitHub, and developers are likely used to that theme. That’s readable and less distractive than a fancy theme or font.&lt;/p&gt;
&lt;p&gt;At the beginning of the talk, I go to the back of the room to check the font size. I adapt it so it’s comfortable to read from the back.&lt;/p&gt;
&lt;h2 id=&quot;automate-most-of-the-process-with-an-extension&quot;&gt;&lt;a href=&quot;#automate-most-of-the-process-with-an-extension&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Automate most of the process with an extension&lt;/h2&gt;
&lt;p&gt;If we recap, at the beginning of my talk I need to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update my VS Code settings&lt;/li&gt;
&lt;li&gt;Configure the shortcuts so I can switch between slides&lt;/li&gt;
&lt;li&gt;Open all files, in order&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At the end of the talk, I usually get rid of that because it’s not convenient when I work on the talk, on my computer. This is, the “slides” mode if you will.&lt;/p&gt;
&lt;p&gt;Because I don’t want to manually do the back and forth, I automated that in an extension, and I published it. It’s called &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=nicoespeon.slides&quot;&gt;Slides&lt;/a&gt; and you can try it yourself.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/slides-showcase-f79c2e8c06473806d2853bf484d1cce0.gif&quot; alt=&quot;Gif showing Slides in action&quot;&gt;&lt;/p&gt;
&lt;p&gt;Slides make it convenient for you to use VS Code as a presentation tool. You can toggle “slides” mode. It will adapt your settings for presentation and open your slides in a single shortcut. It allows you to navigate between your slides. Finally, you can exit “slides” mode when you’re done.&lt;/p&gt;
&lt;p&gt;What do you think? Will you use VS Code for your next talk? If not, what’s holding you back?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[5 refactorings I use every day]]></title><description><![CDATA[Today, I want to share with you the refactorings I use the most on VS Code!]]></description><link>https://www.nicoespeon.com/en/2019/11/5-refactorings-i-use-every-day/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/11/5-refactorings-i-use-every-day/</guid><pubDate>Sun, 03 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hello there 👋&lt;/p&gt;
&lt;p&gt;Refactoring code. Changing the way code is written, without breaking it. This is something I do constantly. I do it for many reasons, usually as preparatory work for further changes.&lt;/p&gt;
&lt;p&gt;Today, I want to share with you the refactorings I use every day!&lt;/p&gt;
&lt;p&gt;Because I apply these refactorings so often, I need them to be fast and reliable. Being a VS Code user, I developed an Extension to automate the refactorings for me, in an intuitive way. I called this extension &lt;a href=&quot;http://bit.ly/vscode-abracadabra&quot;&gt;Abracadabra&lt;/a&gt;. The following examples will use the extension to illustrate, but refactorings can be done by hand too, regardless of the language you’re working with.&lt;/p&gt;
&lt;h2 id=&quot;extract-variable&quot;&gt;&lt;a href=&quot;#extract-variable&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Extract Variable&lt;/h2&gt;
&lt;p&gt;This is certainly the most frequent refactoring I do! Extract things into variables allows me to name the concepts and make the code easier to read.&lt;/p&gt;
&lt;p&gt;When concepts are named, they can be reused. This is a solution to prevent logic duplication.&lt;/p&gt;
&lt;p&gt;To extract any variable, I put my cursor on the variable and hit Abracadabra default shortcut: &lt;code class=&quot;language-text&quot;&gt;⌘ ⌥ V&lt;/code&gt; (&lt;code class=&quot;language-text&quot;&gt;Ctrl Alt V&lt;/code&gt; if you’re not on Mac).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/extract-variable-partial-ff7a70954a50b63ddea5bceb419d8c23.gif&quot; alt=&quot;Illustration of the refactoring&quot;&gt;&lt;/p&gt;
&lt;p&gt;Since it works wherever my cursor is inside the variable I want to extract, it’s quite convenient to use. I simply have to &lt;em&gt;think&lt;/em&gt; about extracting this thing into a variable, and here I am, naming this.&lt;/p&gt;
&lt;p&gt;It also detects when there are multiple occurrences, so I can remove the duplication in the same shot!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/extract-variable-multiple-occurrences-620f4382c2cccc6d4fab1c2e6484bda5.gif&quot; alt=&quot;Illustration of the refactoring&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;inline-variable&quot;&gt;&lt;a href=&quot;#inline-variable&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Inline Variable&lt;/h2&gt;
&lt;p&gt;The opposite refactoring. They go in pairs.&lt;/p&gt;
&lt;p&gt;Sometimes, a variable is not reused and its name doesn’t bring much value. If I can’t find a better name, then inlining it is an option I’d consider.&lt;/p&gt;
&lt;p&gt;The typical scenario is temporary, intermediate variables. They often have poor names. They might have been valid before, but after some other refactorings they have become unnecessary and they just add noise.&lt;/p&gt;
&lt;p&gt;In that situation, I put my cursor somewhere in the variable I want to inline. Then I press &lt;code class=&quot;language-text&quot;&gt;⌘ ⌥ N&lt;/code&gt; (&lt;code class=&quot;language-text&quot;&gt;Ctrl Alt N&lt;/code&gt; if not on a Mac) and it gets inlined for me:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/inline-variable-174d3ed9c60eb1f3e0b4ad40f7d53862.gif&quot; alt=&quot;Illustration of the refactoring&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;rename-symbol&quot;&gt;&lt;a href=&quot;#rename-symbol&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Rename Symbol&lt;/h2&gt;
&lt;p&gt;This one is a classic.&lt;/p&gt;
&lt;p&gt;Actually, it’s a first-class refactoring in VS Code. The editor does it pretty well: I simply put my cursor on a symbol (like a variable name) and press &lt;code class=&quot;language-text&quot;&gt;F2&lt;/code&gt;. That makes me enter “rename mode”. Enter a better name, press enter and the editor will rename all references to that symbol.&lt;/p&gt;
&lt;p&gt;It’s faster and more reliable than renaming using search and replace.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/rename-8efeaf79c20007ad62aa30d5fcbdc500-60448.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 702px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 38.034188034188034%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAABJ0AAASdAHeZh94AAABF0lEQVQY022R207DMAyG+x40ieM4x7XpeV0PDAYTmgTiAXj/ByEdN2jbr0+2b+zfsrNxHLz3AGCtJdJKbWzFFSJzjVprc0+mNUkkqYzZlaiUddp7S6lIkHIbhKg4F0LADZngDHSwcWiWkwvFNNXrcV8GdyjdHMMc/RiDcy7Pc36nDBEFILgyNzsJTGvUWgnOWZ6Lq92f+CNlUkrOwfTH5fvndHr5uJzXdWnarqwaVJQMWVKaldjyXbNE6Qv3/Dotb+s4H4qhqfrUXIEiQCVTFAIBUMqbFTKWP83vl/PnVx1d603nqev6sm66yvdNHdq9b4f0gGioCF4p+u+fpak2lLsYrUlvwXThwlDy0WkdrSQAY9upHq79C18zRpI9o1N3AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Illustration of the refactoring&quot;
        title=&quot;&quot;
        src=&quot;/static/rename-8efeaf79c20007ad62aa30d5fcbdc500-60448.png&quot;
        srcset=&quot;/static/rename-8efeaf79c20007ad62aa30d5fcbdc500-2fc1b.png 240w,
/static/rename-8efeaf79c20007ad62aa30d5fcbdc500-28ccd.png 480w,
/static/rename-8efeaf79c20007ad62aa30d5fcbdc500-60448.png 702w&quot;
        sizes=&quot;(max-width: 702px) 100vw, 702px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;h2 id=&quot;convert-to-template-literal&quot;&gt;&lt;a href=&quot;#convert-to-template-literal&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Convert To Template Literal&lt;/h2&gt;
&lt;p&gt;This one is specific to JavaScript.&lt;/p&gt;
&lt;p&gt;So, it turns out I frequently need to convert a regular string into a template, so I can put variables in it. However, I find the backtick symbol a bit annoying to use with my keyboard—which is a &lt;a href=&quot;https://ccm.net/faq/32759-bepo-a-keyboard-layout-optimized-for-the-french-language&quot;&gt;bépo one, optimized for the French language&lt;/a&gt;. I need to press the key twice to enter the symbol, otherwise, it might merge it with the next letter. Thus, I’m glad I can trigger the conversion with a simple shortcut!&lt;/p&gt;
&lt;p&gt;With Abracadabra, whenever my cursor is on a string, VS Code shows me a little bulb icon 💡. That’s a &lt;a href=&quot;https://code.visualstudio.com/docs/editor/refactoring#_code-actions-quick-fixes-and-refactorings&quot;&gt;Code Action, commonly known as “Quick Fix”&lt;/a&gt;. It works because Abracadabra detects that a refactoring can be made here. The Quick Fix is a shortcut to execute that refactoring!&lt;/p&gt;
&lt;p&gt;I recommend you to &lt;strong&gt;put a shortcut that’s easy for you to trigger Quick Fixes&lt;/strong&gt;, so you don’t have to aim and click on the lightbulb. To do so, look for the &lt;code class=&quot;language-text&quot;&gt;editor.action.quickFix&lt;/code&gt; command in your VS Code keycap configuration. I put &lt;code class=&quot;language-text&quot;&gt;⌥ Enter&lt;/code&gt; because I was used to this shortcut with Webstorm. The habits stuck when I moved to VS Code.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/convert-to-template-literal-ec6717cdc3332955c3b9204d186ee5d3.gif&quot; alt=&quot;Illustration of the refactoring&quot;&gt;&lt;/p&gt;
&lt;p&gt;By the way: it also works on any part of a concatenated string. This is useful when I update some old code that didn’t use template strings.&lt;/p&gt;
&lt;h2 id=&quot;remove-redundant-else&quot;&gt;&lt;a href=&quot;#remove-redundant-else&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Remove Redundant Else&lt;/h2&gt;
&lt;p&gt;Finally, I use this refactoring when I want to unnest some code logic, to make it more readable. I prefer to use &lt;a href=&quot;https://refactoring.guru/replace-nested-conditional-with-guard-clauses&quot;&gt;guard clauses&lt;/a&gt; instead of nested conditionals.&lt;/p&gt;
&lt;p&gt;Again, as a lot of Abracadabra refactorings, it’s a Quick Fix. This is nice because I only have to care about it when I can perform this refactoring. Looking at a piece of code, the extension tells me what refactorings can be executed. Less cognitive load for me.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/remove-redundant-else-0c0b3c3039426dc739ec547c5d7dd586.gif&quot; alt=&quot;Illustration of the refactoring&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-refactorings-do-you-use-every-day&quot;&gt;&lt;a href=&quot;#what-refactorings-do-you-use-every-day&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What refactorings do &lt;em&gt;you&lt;/em&gt; use every day?&lt;/h2&gt;
&lt;p&gt;That’s it. These are the 5 refactorings I use the most.&lt;/p&gt;
&lt;p&gt;Through these, I wish I was able to illustrate why I developed Abracadabra and how it serves me every day!&lt;/p&gt;
&lt;p&gt;What about you? Do you refactor often? What are the refactorings you do frequently? Did you learn something from this post? Let me know!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Introducing a refactoring tool for VS Code]]></title><description><![CDATA[I built "Abracadabra", a VS Code extension to do automated refactorings.]]></description><link>https://www.nicoespeon.com/en/2019/07/introducing-refactoring-tool-vscode/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/07/introducing-refactoring-tool-vscode/</guid><pubDate>Sat, 13 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I use VS Code every day. I use it exclusively since February 2018, both personally and professionally. I like it a lot.&lt;/p&gt;
&lt;p&gt;But I am &lt;em&gt;frustrated&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I am frustrated because I miss a &lt;strong&gt;great&lt;/strong&gt; tool to perform &lt;strong&gt;automated refactorings&lt;/strong&gt; for me. And neither VS Code, neither existing extensions provide the experience I’m looking for!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/frustrated-6b45b4f3e49978b3ac79a693e637d601.gif&quot;&gt;&lt;/p&gt;
&lt;p&gt;Thus, 2 months ago, I decided to follow &lt;a href=&quot;/en/2019/06/drawing-git-graphs-browser/&quot;&gt;my own advice&lt;/a&gt; and hack my own problem. I started creating the VS Code extension I was looking for. This extension analyzes my code, suggests refactorings and executes them with the minimal amount of keystrokes needed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It helps me focus on my intention instead of manually following the scripted mechanics of a refactoring.&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;
  &lt;blockquote&gt;
    &lt;p&gt;I called this extension: &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=nicoespeon.abracadabra&quot;&gt;Abracadabra&lt;/a&gt; ✨&lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;img src=&quot;/abracadabra-demo-ff7a70954a50b63ddea5bceb419d8c23.gif&quot; alt=&quot;Gif of extracting variables with Abracadabra&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;why-wasnt-i-satisfied-with-vs-code-refactorings&quot;&gt;&lt;a href=&quot;#why-wasnt-i-satisfied-with-vs-code-refactorings&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why wasn’t I satisfied with VS Code refactorings?&lt;/h2&gt;
&lt;p&gt;It’s true that VS Code ships with &lt;a href=&quot;https://code.visualstudio.com/docs/editor/refactoring&quot;&gt;basic refactoring operations&lt;/a&gt;. So what’s wrong?&lt;/p&gt;
&lt;p&gt;Well, speaking from a personal point of view, few things aren’t great:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;I need more than that.&lt;/strong&gt; There are a lot of automated refactorings that I know and aren’t proposed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I can’t just have the cursor on a variable and trigger an extraction.&lt;/strong&gt; To get an appropriate suggestion requires selecting &lt;em&gt;exactly&lt;/em&gt; the code to refactor. I need to select the whole extracted statement first, which is slowing me down.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I don’t like the UX much.&lt;/strong&gt; Talking about extraction, I often feel confused in front of all the suggested options. I need to play the computer in my head and decipher what “enclosing scope” vs. “module scope” means in terms of the resulting code. I &lt;em&gt;know&lt;/em&gt; that there is a better way.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 32.20815752461322%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAABYlAAAWJQFJUiTwAAABUklEQVQY0x3MS0/CQAAE4P5TDxp/g9FICBIQ49WDioJ4MV4NaNCoQMEI4VFMUKQFjBCghdJlu+12H12Lk8ncvpGAJSxDEIcSbFG8YhhSFzAMmAsQRAgSz/UIo8jDQW0crGe52EYO51zCcPWroq6mDyfGcLL4mS7644U6RtoM9CZAm0JtBjUdqobTNWhH91TdJSyA3Pd9iXOcyVYOktlEOh9PPRym89HkY/j8fe+yuJ+phK7k0HVlN1WK37yVB6A8hNW+ubSAECLQEqP05FYOnT1FLp5j6UI4+RJNlWIZeee0uJm43zrKbR/nNuJ3kfTrEpguggHzfS7+IzHGR4NOp1H4UsqfLbmryEqt0qhqSuejpjTrH61au1lV6u3e92Bujeam6XgGgDZcv0iEEEo9ghH1nPUSB9n2Cgqb+TYTiAtIBWQCEr50sOngBcI6WCGEAvwHk0Y3HcX2qDkAAAAASUVORK5CYII=&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;VS Code shows a popup to either &quot; extract=&quot;&quot; to=&quot;&quot; function=&quot;&quot; in=&quot;&quot; module=&quot;&quot; scope&quot;,=&quot;&quot; or=&quot;&quot; &quot;extract=&quot;&quot; constant=&quot;&quot; enclosing=&quot;&quot; scope&quot;&quot;=&quot;&quot; title=&quot;&quot; src=&quot;/static/confusing-vscode-extraction-572e00251e6e2f0e096b770c58fc0ade-c83f1.png&quot; srcset=&quot;/static/confusing-vscode-extraction-572e00251e6e2f0e096b770c58fc0ade-569e3.png 240w,
/static/confusing-vscode-extraction-572e00251e6e2f0e096b770c58fc0ade-93400.png 480w,
/static/confusing-vscode-extraction-572e00251e6e2f0e096b770c58fc0ade-c83f1.png 960w,
/static/confusing-vscode-extraction-572e00251e6e2f0e096b770c58fc0ade-fa384.png 1422w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;figcaption&gt;I understand what it means, but it takes precious seconds to process. Don&amp;apos;t make me think!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Before using VS Code exclusively, I used Webstorm professionally for a few years. And I prefer VS Code: it’s free, feels lighter to use and has a very active community.&lt;/p&gt;
&lt;p&gt;But there is one thing Webstorm nailed that VS Code doesn’t provide: many, intuitive, automated refactorings.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/extract-function-webstorm-253e9f49e2323fddd9d5fcb72c7de396.gif&quot; alt=&quot;Gif of extracting a function in Webstorm&quot;&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 281px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 142.34875444839858%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAcCAYAAABh2p9gAAAACXBIWXMAABYlAAAWJQFJUiTwAAAEbElEQVRIx31WaVMbRxDdP5JKQgJGQkKHBehAq/sAdF/oxggJDDoQmMuYqpBUKp9SlZ/80q9lgWIUf+ia3dmZnn79XvescXb6Eaf9M0zGlxgNxzg/O8f19Bqfrm8wnUwxHk1we3OLwckAe6l9VEpVxCJxBAMmzN3QqwVDCAXDMJLxJHY8XjhsDrgd7+FxbcFpd8K56dLn987ZHL/brZtwbbr1m9P+1vzeAIwt9zZojKbf6+P4qIdWo43ehxMUckWNaHg+lPlj3WBd21DHNov9je1seWGEJFxGcH93j7FApp0NzjC6GKFZbyKd3BPnPUwEejQcw/qqZanDjXUbtj07MKLhqC5YXVnDTz+siP2stvLjL7CsWXUxnbz7dR2bG7O0EPa3xjRohH5fAAd7GZwI3LubO/Ql+ePRGN3OESKhKMJm5MWY9EUiOJfPFlCr1JCIJeHb8cPwbvuUvWwmh267i4bAbDXbArel8/FoAsl4So3scuOiZfYzyB7kZF18BtnlcKNx2JRTDkEJdVodJeFU8tg7PsEHIWN0McbjwyOOJOoL+Xbx8QI3n240r+PhRN/p1PLOKg4F/376QGHncwWNikQQEiHTSAZt/h4RqIx2Ps+9nN+w2GBUylWUixWFS2YpHUbFBczZ92yex1KxrPDJtOqwKkktFUpKBCEzfJ68SMgyo1MeXMyXNGKNcFMqoFquyWRRHR6L5g6rdV3M8qLx+f8c8uBcNo9oJAYrIzR3TRVwvVbH9PJKa5fV8vT4pDXMVITN6BvnhJtKpAVRV0mNSqRO0bORlElKgkTkMnmFqzKSkWXHDQUhi8Rl9rP/yS2fVT7SD6JyiNfuhhH0eUSQAez6g6J0H6hLmse9hQPR2PNvz1KWD/h8/1mlM3c4h8x9tKBEbGUO4+YO2hJFURrByXFfK4b66vcGevq8KhbZnTsjZCqESmEubXTokDAPJX8sIcKjeJlD5oUwFx0sksNnVhE7ElnmnM1qF4c2pzojKVfTK61jnsZCZ7taxux8JIKqRFevNTQVbG1GTOimQ57UOGyofPheKpSVmG+dLDpOxBJKJPdGQjEEY9tCSmAmm7KonRXC/J1LbTJaVg6JCYcib7TId4qZBcFK4RrPtos5dKIt3aUu0Q3FwaA/0I5NGKHgW6iLxhyzKCqlikrPsiqQKQ/qjWyxM5OgZqOlTqnHuYiXQY4LZKaFsF9YZj+rf3XCm296OdV2xKvgQfTXbR/p4mVs86AXHUrqlGWvsJlOpiWaPYWQSqReWhNlMWtby5sD180bsMpGrgsjLmXTbh3hcnIlzXOMdCojcgki4DPh98noNyUC8+s9bL7cxxxZrpoi6e50bF2XHO5KudWrci+U8mjWimq1Uk6tWsyhXBDL55CXKyIj+couMeaQdc7OZexJJ3m67eL3+zae79r45482/vrSwd/PHfz52MGX69l4Pexor2w1O6KKVyN5HBklu79h25C/AYcHbvlDcDleje+8Mmd/EzPjX4T7O8Yc/gtSAQb+tyZOPQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;List of available refactorings in Webstorm&quot;
        title=&quot;&quot;
        src=&quot;/static/webstorm-list-refactorings-422f35440b5c7a1cdd67c412817bfb4c-22c77.png&quot;
        srcset=&quot;/static/webstorm-list-refactorings-422f35440b5c7a1cdd67c412817bfb4c-5fe8f.png 240w,
/static/webstorm-list-refactorings-422f35440b5c7a1cdd67c412817bfb4c-22c77.png 281w&quot;
        sizes=&quot;(max-width: 281px) 100vw, 281px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;This made me so productive back in the days. I relied on my editor to move fast 🏇&lt;/p&gt;
&lt;p&gt;And I think it matters. If refactoring code takes 2 keystrokes I’m very likely to do it. If I have to find the correct combination of 5 keystrokes to make it work, I’m less likely. If I have to do it by hand… You get the idea.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Great automated refactorings are a productivity boost for every developer.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;but-wait-wasnt-there-an-extension-already&quot;&gt;&lt;a href=&quot;#but-wait-wasnt-there-an-extension-already&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;But wait, wasn’t there an extension already?&lt;/h2&gt;
&lt;p&gt;Yes! And I used it for some time.&lt;/p&gt;
&lt;p&gt;I essentially work with JavaScript (and TypeScript). If you search for “JS refactoring” &lt;a href=&quot;https://marketplace.visualstudio.com/search?term=js%20refactoring&amp;#x26;target=VSCode&amp;#x26;category=All%20categories&amp;#x26;sortBy=Relevance&quot;&gt;on VS Code Marketplace&lt;/a&gt;, you’ll find a promising extension called “JS Refactor”:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 32.7134404057481%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAABYlAAAWJQFJUiTwAAABI0lEQVQY001Qu07EMBDMd/MBlCc+gCspaKioEdJxdFchSiSEooRc/Fq/X8FMQsFNYc/Oztq7203Tt7UmXMKHkKI5M/7woqQkTZfQWv+dxphuHDmRJ1L/eaVIG+WjmvnqcxZWuYEx1vc9yDiOIB2bnrV6S3lJKaaUMq5cCrH8foh1id6bYfTOtdZOp9Px9ZhzjhHyiu7r45pN9z+tQXTW1ZJra8vjzXJ3BRKI5qeDMwbF+/3tbrcDKaWgstbacXHWWnkf5nnmnKOlEOLcf0o2w3GGSIoLkXJWSmFO/Izmh2EQQnRSQLLWWcHhERgSPW0DFOedJoUQERahhMAq44Ytn7uIVee0fk4ESXvjSVZrkdOWkhQ1BBu9JYkHsBIyq62W6oL7BfkuiKF5wENdAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;marketplace js refactoring&quot;
        title=&quot;&quot;
        src=&quot;/static/marketplace-js-refactoring-c73c9a2aae5ecf8dd3a4de7251c25c29-c83f1.png&quot;
        srcset=&quot;/static/marketplace-js-refactoring-c73c9a2aae5ecf8dd3a4de7251c25c29-569e3.png 240w,
/static/marketplace-js-refactoring-c73c9a2aae5ecf8dd3a4de7251c25c29-93400.png 480w,
/static/marketplace-js-refactoring-c73c9a2aae5ecf8dd3a4de7251c25c29-c83f1.png 960w,
/static/marketplace-js-refactoring-c73c9a2aae5ecf8dd3a4de7251c25c29-23e13.png 1440w,
/static/marketplace-js-refactoring-c73c9a2aae5ecf8dd3a4de7251c25c29-10d8f.png 1920w,
/static/marketplace-js-refactoring-c73c9a2aae5ecf8dd3a4de7251c25c29-a78a6.png 2366w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;I appreciate the good efforts that were put in it. At least someone worked to provide more refactorings, &lt;strong&gt;shared that for free&lt;/strong&gt; and maintained it 👏👏&lt;/p&gt;
&lt;p&gt;But at this point, it was not exactly what I needed, for a few reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I needed more refactorings operations. I’d consider operations like “Add Export”, “Negate Expression” or “Wrap Selection” not being “refactorings”. Even if they’re handy, they modify code behavior.&lt;/li&gt;
&lt;li&gt;Also, sometimes, it didn’t work well. It had some hiccups working on classes or on TypeScript.&lt;/li&gt;
&lt;li&gt;It handles partial selection better than VS Code, but it was still not as smooth as I was looking for. The UX was not the one I expected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At that point, the best move for me would have been:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OK, maybe I can contribute and improve it!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Heading to &lt;a href=&quot;https://github.com/cmstead/js-refactor&quot;&gt;the repository&lt;/a&gt;, I was really happy to see it seemed well tested 👍&lt;/p&gt;
&lt;p&gt;But I felt the architecture was not quite what I’d have in mind. I’d have done abstractions differently…&lt;/p&gt;
&lt;p&gt;Now, I’m not saying this is bad and I know better. Actually, I think the code is quite clean and well tested. But I started imagining how I’d build such solution, and I had this desire to make it happen. In fact, it would be a great opportunity for me to work on something where I could try things, fast, to scratch my own itch.&lt;/p&gt;
&lt;p&gt;Sure, building another extension is not the best idea, community wise. For the greater good, I should have reached the author of the existing extension and see how could I help. And, at some point, I’ll probably ping him to see how I could help, now that I’ve a clearer idea of how all of this could work.&lt;/p&gt;
&lt;p&gt;But for the moment, &lt;strong&gt;I wanted to build something on my own&lt;/strong&gt;. Not to replace the existing extension, but to try something different. Something aligned with what I needed. Without having to deal with existing code and users.&lt;/p&gt;
&lt;h2 id=&quot;abracadabra&quot;&gt;&lt;a href=&quot;#abracadabra&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Abracadabra!&lt;/h2&gt;
&lt;p&gt;That’s why, 2 months ago, I started to build this extension.&lt;/p&gt;
&lt;p&gt;My goal is essentially to &lt;strong&gt;build the tool I’m missing&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;There is a very cool side-effect of this: the learning part. Digging into &lt;a href=&quot;https://en.wikipedia.org/wiki/Abstract_syntax_tree&quot;&gt;Abstract Syntax Trees&lt;/a&gt; manipulations is super interesting. Also, I’m discovering how to build a VS Code extension for the first time. Finally, it’s a playground for me to test architectural decisions and practices, like &lt;a href=&quot;https://github.com/nicoespeon/abracadabra/tree/master/docs/adr&quot;&gt;documenting architectural decisions through ADRs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I implemented a couple of refactorings across these 2 months. I published the extension a few days ago &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=nicoespeon.abracadabra&quot;&gt;on the Marketplace&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now I’m waiting for feedback to improve these first refactorings, fix edge cases and improve the UX to match what I’d expect from a &lt;strong&gt;great&lt;/strong&gt; extension!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/magic-98f51cd9f53554f6d6ea08dbc350e379.gif&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;what-about-you&quot;&gt;&lt;a href=&quot;#what-about-you&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What about you?&lt;/h3&gt;
&lt;p&gt;Well first, if you do JavaScript or TypeScript and you’re looking for great automated refactorings, you can &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=nicoespeon.abracadabra&quot;&gt;give Abracadabra a try&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Then, if you want to help me, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Give me your feedbacks on what you like and what you’d like to improve. Whether you find a bug, have a suggestion or just want to share something, &lt;a href=&quot;https://github.com/nicoespeon/abracadabra/issues&quot;&gt;have a look at existing issues or open a new one&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you’d like to contribute, you can start with the &lt;a href=&quot;https://github.com/nicoespeon/abracadabra/issues?q=is%3Aissue+is%3Aopen+label%3A%22%3Awave%3A+Good+first+issue%22&quot;&gt;“Good First Issues” I’ve listed&lt;/a&gt;. Any kind of contribution is welcomed 🙂&lt;/li&gt;
&lt;li&gt;Spread the word so I can get more use-cases and more feedbacks to improve the extension!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s it. I’m really excited about this and happy to start spreading the word.&lt;/p&gt;
&lt;p&gt;Now, &lt;em&gt;I feel better&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/thumbs-up-b8bf8658dd216b2ec14a1b9a27123f20.gif&quot;&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Drawing Git Graphs in the Browser]]></title><description><![CDATA[A talk I gave at FullStack NYC 2019 to present GitGraph.js.]]></description><link>https://www.nicoespeon.com/en/2019/06/drawing-git-graphs-browser/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/06/drawing-git-graphs-browser/</guid><pubDate>Tue, 04 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In this talk I presented a side-project that I’ve been developing with my friend &lt;a href=&quot;https://twitter.com/fabien0102&quot;&gt;Fabien Bernard&lt;/a&gt; since 2013: &lt;a href=&quot;https://gitgraphjs.com&quot;&gt;GitGraph.js&lt;/a&gt; 🎉&lt;/p&gt;
&lt;p&gt;It’s a JS library that allows you to draw git graphs in the browser. Very handy to prepare presentations or write blog posts. Creating and updating those git illustrations becomes easy!&lt;/p&gt;
&lt;p&gt;I already &lt;a href=&quot;/en/2013/11/gitgraphjs/&quot;&gt;wrote about GitGraph.js in the past&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If there is one thing you should retain from my talk, it’s that &lt;strong&gt;you can hack your own problems&lt;/strong&gt;. You certainly have this crazy idea in mind, that problem you want to solve for yourself… Stop waiting the perfect moment, just start doing it. &lt;strong&gt;Good things will happen!&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://player.vimeo.com/video/336845529&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; fullscreen&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;p&gt;Click on the following image to access the slides:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.nicoespeon.com/talk-drawing-git-graphs/&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 44.53627180899908%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABBUlEQVQoz62SMauDMBSFo3QQERRaRRQpiJYuog5aRCgoIhTc1MHSSVTExf8/nYcZHlp8PAodDkluTi4nX0IIIVjEMMzvuNb7/p5/XSdvi2+IgGVZXC4X6LoOTdNgGAbCMKRzjuMQRRFutxt4nofrurAsC7Is43q9wnEcHA6HbcMldhzHqOsaTdPg9Xphmib0fQ/bttF1HeZ5hqqqeD6fGIYB4ziibVvqWwKsrv93fNM0qektAZUoipAkaY/jFnSWZTidTrjf7yjLkh5cakVRwPd9eJ5HESxIjsfjPsO10jSFoiiUT1VVOJ/PlNvj8UAQBEiShGLJ8xyCIPzf8Cuv/Il2/t1GP9Uz2PEEdgU2AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Link to slides&quot;
        title=&quot;&quot;
        src=&quot;/static/slides-preview-273794fdc2d01a793e8f4e0c23ae6962-c83f1.png&quot;
        srcset=&quot;/static/slides-preview-273794fdc2d01a793e8f4e0c23ae6962-569e3.png 240w,
/static/slides-preview-273794fdc2d01a793e8f4e0c23ae6962-93400.png 480w,
/static/slides-preview-273794fdc2d01a793e8f4e0c23ae6962-c83f1.png 960w,
/static/slides-preview-273794fdc2d01a793e8f4e0c23ae6962-23e13.png 1440w,
/static/slides-preview-273794fdc2d01a793e8f4e0c23ae6962-10d8f.png 1920w,
/static/slides-preview-273794fdc2d01a793e8f4e0c23ae6962-8808a.png 2178w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The project is available on GitHub: &lt;a href=&quot;https://github.com/nicoespeon/gitgraph.js/&quot;&gt;https://github.com/nicoespeon/gitgraph.js/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Different libraries are available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/@gitgraph/js&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;@gitgraph/js&lt;/code&gt;&lt;/a&gt; for the vanilla JS version&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/@gitgraph/react&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;@gitgraph/react&lt;/code&gt;&lt;/a&gt; for the React version&lt;/li&gt;
&lt;li&gt;There is a &lt;a href=&quot;https://github.com/nicoespeon/gitgraph.js/tree/master/packages/gitgraph-js#browser-bundle-ready-to-use&quot;&gt;browser bundle&lt;/a&gt; you can use directly in the browser 💪&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to play with the GitGraph.js, have a look at the online playground:&lt;/p&gt;
&lt;iframe height=&quot;722&quot; style=&quot;width: 100%;&quot; scrolling=&quot;no&quot; title=&quot;@gitgraph/js playground&quot; src=&quot;//codepen.io/nicoespeon/embed/preview/arqPWb/?height=722&amp;theme-id=dark&amp;default-tab=js,result&quot; frameborder=&quot;no&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;
  See the Pen &lt;a href=&apos;https://codepen.io/nicoespeon/pen/arqPWb/&apos;&gt;@gitgraph/js playground&lt;/a&gt; by Nicolas Carlo
  (&lt;a href=&apos;https://codepen.io/nicoespeon&apos;&gt;@nicoespeon&lt;/a&gt;) on &lt;a href=&apos;https://codepen.io&apos;&gt;CodePen&lt;/a&gt;.
&lt;/iframe&gt;</content:encoded></item><item><title><![CDATA[The Secrets of Hexagonal Architecture]]></title><description><![CDATA[A talk I gave at ConFoo Montréal 2019 about Hexagonal Architecture.]]></description><link>https://www.nicoespeon.com/en/2019/03/the-secrets-of-hexagonal-architecture/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/03/the-secrets-of-hexagonal-architecture/</guid><pubDate>Tue, 12 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If there is one thing you should retain from my talk, it’s that &lt;strong&gt;you should separate the Domain from the Infrastructure if you want to write maintainable software&lt;/strong&gt;.&lt;/p&gt;
&lt;figure&gt;
	
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 56.25%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQX/xAAUAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAFN5tKMRA//xAAbEAADAAIDAAAAAAAAAAAAAAABAgMEERIyM//aAAgBAQABBQLIYAJVGozz2pPGfbI9f//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAEDAQE/AVf/xAAWEQEBAQAAAAAAAAAAAAAAAAAAEWH/2gAIAQIBAT8BxH//xAAdEAACAgEFAAAAAAAAAAAAAAAAAQIREhAiMTJB/9oACAEBAAY/AoOriSxhtx4Ool5oz//EAB0QAQACAgIDAAAAAAAAAAAAAAEAESFBMVFhcaH/2gAIAQEAAT8hEQtFTfiK2Rgu4+1D5Mr+kF1dcQARP//aAAwDAQACAAMAAAAQBP8A/8QAFhEAAwAAAAAAAAAAAAAAAAAAEBFB/9oACAEDAQE/EKw//8QAFhEBAQEAAAAAAAAAAAAAAAAAAAFB/9oACAECAQE/EMJL/8QAHRABAAICAgMAAAAAAAAAAAAAAREhAFExQYGR8P/aAAgBAQABPxAPohlIN+k4pAADq1vYFk5C1Xhjs7x6m2tx9eEwSRBo1giQAAeM/9k=&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;giving the talk&quot; title=&quot;&quot; src=&quot;/static/giving-the-talk-dad9e46da0733422bebda0915bb1bc3d-d564d.jpg&quot; srcset=&quot;/static/giving-the-talk-dad9e46da0733422bebda0915bb1bc3d-865fd.jpg 240w,
/static/giving-the-talk-dad9e46da0733422bebda0915bb1bc3d-d40a0.jpg 480w,
/static/giving-the-talk-dad9e46da0733422bebda0915bb1bc3d-d564d.jpg 960w,
/static/giving-the-talk-dad9e46da0733422bebda0915bb1bc3d-c67c1.jpg 1440w,
/static/giving-the-talk-dad9e46da0733422bebda0915bb1bc3d-667be.jpg 1920w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;figcaption&gt;Giving the talk at ConFoo Montr&amp;#xE9;al 2019.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The Domain is the business part. Today, I work at &lt;a href=&quot;https://www.busbud.com/&quot;&gt;Busbud&lt;/a&gt;. We sell intercity bus tickets, worldwide. We talk about things like Seat, Departure, Leg, Stop, Roundtrip… These are specific to our business, and we understand this vocabulary in a given context. We also have Taxes, Fees, Discount Code that you probably have to. This is a more generic Domain for us, but it’s still business.&lt;/p&gt;
&lt;p&gt;The Infrastructure part is how is our current solution made. Fastly, Postgres databases, Redis instances, Express server, React… All of these technologies we use to provide busbud.com to travellers across the planet. But we could change the infrastructure, still we do the same business.&lt;/p&gt;
&lt;p&gt;The Hexagonal Architecture is the simplest way to do this separation. Put your Domain at the heart of your software. Make your Infra depends on your Domain, and your Domain not depending on your Infra. Use business vocabulary inside the Domain part, to define intention-revealing interfaces (aka Ports). Build concrete implementations of these interfaces in your Infra (aka Adapters). That gives you the flexibility to plug any adapter to your domain.&lt;/p&gt;
&lt;p&gt;It makes testing easy. It allows you to start with something simple, and evolve the infrastructure when actually needed. Finally, It’s a good first step towards Clean Architecture.&lt;/p&gt;
&lt;p&gt;Here are the slides of the talk:&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 81.5126050420168%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/Mj96vePpslBlHM&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot; allowfullscreen&gt; &lt;/iframe&gt; &lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;//www.slideshare.net/nicolascarlo1/the-secrets-of-hexagonal-architecture&quot; title=&quot;The Secrets of Hexagonal Architecture&quot; target=&quot;_blank&quot;&gt;The Secrets of Hexagonal Architecture&lt;/a&gt; &lt;/strong&gt; de &lt;strong&gt;&lt;a href=&quot;https://www.slideshare.net/nicolascarlo1&quot; target=&quot;_blank&quot;&gt;Nicolas Carlo&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;p&gt;I also gave that talk at Bulgaria PHP 2019, and it was recorded:&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/iQE_XDJVAZA?si=F9CvDms8b4Ay-VAX&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;</content:encoded></item><item><title><![CDATA[TIL: Tools can limit the potential of agile ceremonies]]></title><description><![CDATA[Today, I realized how not using an online tool could improve team engagement in a ceremony.]]></description><link>https://www.nicoespeon.com/en/2019/01/til-online-tools-can-hurt-agile/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/01/til-online-tools-can-hurt-agile/</guid><pubDate>Fri, 18 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today is Friday. And not any Friday, but the end of our 2-weeks Sprint. End of the Sprint means demos, but also a ceremony that I really like: &lt;em&gt;Sprint Retrospective&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Whatever is your process, the core thing of Agile is to reduce the feedback loop. Having a recurring ceremony when people pause and reflect on how things went during the last few days is really valuable. It gives time to all of us to share our thoughts and feelings. We give feedback to others about how we operate as a team, and how we could do better. As the team grows in maturity, this feedback will be part of daily work. Still, having a recurring ceremony is really valuable as it helps us to step back and reflect.&lt;/p&gt;
&lt;p&gt;At Busbud, we usually do retrospective using an online board. It’s a typical &lt;a href=&quot;https://www.mountaingoatsoftware.com/blog/a-simple-way-to-run-a-sprint-retrospective&quot;&gt;“Start, Stop, Continue”&lt;/a&gt; (SSC) board, with a column for “Next Actions”. I think the best part of it is that people can participate, even when they are not at the office—it’s really common for us to work from home when we need to.&lt;/p&gt;
&lt;p&gt;But today was different!&lt;/p&gt;
&lt;p&gt;Today, the meeting room was taken for unexpected, important reasons. So we didn’t have a place to regroup. That’s when I suggested &lt;strong&gt;to do the retrospective offline&lt;/strong&gt;—nobody was remote anyway.&lt;/p&gt;
&lt;p&gt;So we went to our big whiteboard. We bring the post-its, the markers and we stood up in half-circle around the whiteboard. We did a SSC and even a &lt;a href=&quot;http://www.funretrospectives.com/happiness-radar/&quot;&gt;Mood Meter&lt;/a&gt; roundtable.&lt;/p&gt;
&lt;figure&gt;
  &lt;blockquote&gt;
    &lt;p&gt;It. Was. Effective.&lt;/p&gt;
    &lt;footer&gt;
      &lt;cite&gt;&lt;/cite&gt;
    &lt;/footer&gt;
  &lt;/blockquote&gt;
&lt;/figure&gt;
&lt;p&gt;I remember retrospective meetings where we usually meet around a table. We’ll bring our laptops because, you know, we need to put our items in the online board. And I always get this feeling at some point that it’s more about the process than the content. We usually get some discussions, but it’s always the same people talking—me, definitely included.&lt;/p&gt;
&lt;p&gt;Being all here, standing up and writing on post-its was &lt;strong&gt;much more engaging&lt;/strong&gt;! Everybody was clearly involved in the retrospective. Everybody was here and present. We had really insightful exchanges, and we took very interesting “Next Actions”. I asked for feedback at the end of the session, and the team quite liked the offline format.&lt;/p&gt;
&lt;p&gt;Sometimes, convenient tools can play against the meaning of the ceremony. Dropping the tool turned to unleash the potential of our retrospective. I have this feeling we may have found a better way of working, as a team. I’m looking forward in 2 weeks, to see how it goes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And you, are you using an online tool for your retrospectives?&lt;/strong&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TIL: Easy file sharing from the command line]]></title><description><![CDATA[Today, I learned how to easily retrieve a file from a distant server.]]></description><link>https://www.nicoespeon.com/en/2019/01/til-get-files-from-distant-machine/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/01/til-get-files-from-distant-machine/</guid><pubDate>Wed, 16 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today, I was working on Busbud “Preview” environment. I was connected to the distant Heroku machine, through ssh (with the Heroku CLI command &lt;code class=&quot;language-text&quot;&gt;heroku run bash&lt;/code&gt;). I ran a task that generates a CSV report and I wanted to get it on my local machine so I can read it more conveniently.&lt;/p&gt;
&lt;p&gt;In such a scenario, I usually use &lt;code class=&quot;language-text&quot;&gt;scp&lt;/code&gt; from my machine to download the file from the distant server. But I didn’t know the address of the machine I was connected to since I used the convenient Heroku CLI. I could have searched for it, but instead, a Google search gave me a nice solution: &lt;a href=&quot;https://transfer.sh/&quot;&gt;transfer.sh&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
  &lt;blockquote&gt;
    &lt;p&gt;Easy file sharing from the command line&lt;/p&gt;
    &lt;footer&gt;
      &lt;cite&gt;— Transfer.sh website&lt;/cite&gt;
    &lt;/footer&gt;
  &lt;/blockquote&gt;
&lt;/figure&gt;
&lt;p&gt;The idea is to send data to this service from CLI, then retrieve it from an URL. Data could also be encrypted, and upload is made through https 🔐&lt;/p&gt;
&lt;p&gt;Usage is very simple. Say I want to get my &lt;code class=&quot;language-text&quot;&gt;task-report.csv&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;curl --upload-file ./task-report.csv https://transfer.sh/my-report.csv&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After the upload is complete, I get the URL where I can retrieve it (e.g. &lt;code class=&quot;language-text&quot;&gt;https://transfer.sh/66nb8/my-report.csv&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Data are stored 14 days by default. But this can be configured on upload, with other different options like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;curl -H &amp;quot;Max-Downloads: 1&amp;quot; -H &amp;quot;Max-Days: 5&amp;quot; --upload-file ./hello.txt https://transfer.sh/hello.txt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I can also configure an alias for convenience, but I didn’t feel I need to—I’d usually use that from a distant server which I don’t have the address on hand.&lt;/p&gt;
&lt;p&gt;So yeah. I did that and got my CSV file in no time. Thank you transfer.sh!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And you, do you have tips &amp;#x26; tricks for retrieving distant files?&lt;/strong&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TIL: A parchment paper trick]]></title><description><![CDATA[Today, I learned how to easily make parchment paper fits a recipient.]]></description><link>https://www.nicoespeon.com/en/2019/01/til-parchment-paper-trick/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/01/til-parchment-paper-trick/</guid><pubDate>Tue, 15 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today &lt;em&gt;aha moment&lt;/em&gt; is cooking related 👨‍🍳&lt;/p&gt;
&lt;p&gt;I usually use parchment paper to protect baking sheets and the like—essentially when I bake cakes, cookies, and other niceties 🍪&lt;/p&gt;
&lt;p&gt;Sometimes, I also struggle to make it fit the recipient. Especially when it goes 3D. I used to measure and cut to adapt. But overall, it’s not really convenient.&lt;/p&gt;
&lt;figure&gt;
	
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 431px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 139.21113689095125%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAcABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAMCBAUG/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAIDAf/aAAwDAQACEAMQAAAB0JULM6KEgOsO5lk1zJF3/8QAGxAAAgMBAQEAAAAAAAAAAAAAAQIAAxIRIjL/2gAIAQEAAQUCzAy6dvS9J8pFhTD8rUG+kG346TMif//EABgRAQEAAwAAAAAAAAAAAAAAAAASASEx/9oACAEDAQE/Ad5W6l//xAAXEQADAQAAAAAAAAAAAAAAAAAAARES/9oACAECAQE/AYkYLDZ//8QAHRAAAwACAgMAAAAAAAAAAAAAAAERECECEjFBYf/aAAgBAQAGPwIfGGiUi8vGyvqj2y/CtvH/xAAbEAEAAwADAQAAAAAAAAAAAAABABEhMUFxEP/aAAgBAQABPyFJXu7xKQtXcW1cJzRsXgoDG3uZIzpmEesflWbYRe2pZUl7X4f/2gAMAwEAAgADAAAAEIDoj//EABkRAAMBAQEAAAAAAAAAAAAAAAABESExQf/aAAgBAwEBPxBerwcOEY31n//EABkRAAMAAwAAAAAAAAAAAAAAAAABESFBUf/aAAgBAgEBPxDXWRUhoJ4f/8QAHRABAQEBAAEFAAAAAAAAAAAAAREAIUExYXGhwf/aAAgBAQABPxDgpGFicMeIuWFOGmIhV73d5HDrVffLBKIcSt78hT5wKMfIBf11NJVw/bmoqUEfRm8uTUOEKm//2Q==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;using parchment paper&quot; title=&quot;&quot; src=&quot;/static/using-parchment-paper-3753dce8f49f09f635f641018a06ad97-11fd1.jpg&quot; srcset=&quot;/static/using-parchment-paper-3753dce8f49f09f635f641018a06ad97-f902b.jpg 240w,
/static/using-parchment-paper-3753dce8f49f09f635f641018a06ad97-11fd1.jpg 431w&quot; sizes=&quot;(max-width: 431px) 100vw, 431px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;figcaption&gt;Making the paper fits the recipient properly can be painful. Credits &lt;a href=&quot;https://thepioneerwoman.com/food-and-friends/7-reasons-to-use-parchment-paper/&quot; rel=&quot;nofollow noopener&quot;&gt;The Pioneer Woman&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Today, I learned that you can actually &lt;strong&gt;wet the parchment paper and crumple it&lt;/strong&gt; to make this easy! Parchment paper is strong, even when it’s wet. Crumple it, put it under water, press it to eliminate the excess of water then unfold it. It will be easier to make it fit the recipient you want to protect.&lt;/p&gt;
&lt;p&gt;Also, I learned that you can use it almost any time a recipe tells you to put some butter on your cake mold. Wet parchment paper will do the trick faster and leave the mold in a cleaner state—so you can reuse more quickly if you need to.&lt;/p&gt;
&lt;p&gt;And voilà!&lt;/p&gt;
&lt;figure&gt;
	
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 717px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 77.26638772663877%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAUBAwT/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABa04IhuLQ/8QAGhAAAQUBAAAAAAAAAAAAAAAAAAECAxETEv/aAAgBAQABBQKxJZK0aLKanZ//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAaEAABBQEAAAAAAAAAAAAAAAABAAIRICFh/9oACAEBAAY/AkJYO7X/xAAaEAEAAgMBAAAAAAAAAAAAAAABABEQIWFR/9oACAEBAAE/IVnZoqb08TrgLsDU/9oADAMBAAIAAwAAABD3L//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/EKf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPxCH/8QAHhABAAICAQUAAAAAAAAAAAAAAQARIUGhMVFhcZH/2gAIAQEAAT8Q6RlWC4JWjNTROfkGMs8VEGzm4mZe1xWQX6n/2Q==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;I like parchment paper&quot; title=&quot;&quot; src=&quot;/static/i-like-parchment-paper-da4fecb2a0e3f1aba5ff72ffdb971dd5-36000.jpg&quot; srcset=&quot;/static/i-like-parchment-paper-da4fecb2a0e3f1aba5ff72ffdb971dd5-f4d17.jpg 240w,
/static/i-like-parchment-paper-da4fecb2a0e3f1aba5ff72ffdb971dd5-31063.jpg 480w,
/static/i-like-parchment-paper-da4fecb2a0e3f1aba5ff72ffdb971dd5-36000.jpg 717w&quot; sizes=&quot;(max-width: 717px) 100vw, 717px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;figcaption&gt;Credits &lt;a href=&quot;https://altonbrown.com/parchment-paper-vs-wax-paper/&quot; rel=&quot;nofollow noopener&quot;&gt;Alton&amp;#xA0;Brown&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;And you, do you have tips &amp;#x26; tricks for cooking?&lt;/strong&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TIL: How to start a talk]]></title><description><![CDATA[Today, I learned how to do a great introduction for a conference talk.]]></description><link>https://www.nicoespeon.com/en/2019/01/til-how-to-start-a-talk/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/01/til-how-to-start-a-talk/</guid><pubDate>Mon, 14 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;2019 is a challenging year for me.&lt;/strong&gt; I’ll give my first talk, in English, in front of a larger audience than the 40-folks standard of local meetups I’m used to.&lt;/p&gt;
&lt;p&gt;Actually, I’ll give two talks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In March, I’ll present &lt;a href=&quot;https://confoo.ca/en/speaker/nicolas-carlo&quot;&gt;“The secrets of Hexagonal Architecture”&lt;/a&gt; at Confoo Montreal&lt;/li&gt;
&lt;li&gt;In May, I’ll talk about &lt;a href=&quot;https://skillsmatter.com/conferences/11077-fullstack-nyc-2019-the-conference-on-javascript-node-and-internet-of-things#program&quot;&gt;“Drawing Git Graphs in the browser”&lt;/a&gt; at FullStack NYC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I did quite a few talks in the past, but they usually were in French – my native language – and in front of the local tech community, in meetups. As you might imagine, I’m both thrilled and scared. Thus, I’m preparing these talks – the last thing I want would be to screw up in front of hundreds of people I don’t know 😅&lt;/p&gt;
&lt;p&gt;I already have &lt;a href=&quot;https://dev.to/aspittel/public-speaking-as-a-developer-2ihj&quot;&gt;plenty of&lt;/a&gt; &lt;a href=&quot;https://medium.com/@zenorocha/what-ive-learned-after-giving-100-talks-8f175654e945&quot;&gt;good&lt;/a&gt; &lt;a href=&quot;http://blog.testdouble.com/posts/2014-04-04-crafting-a-conference-talk.html&quot;&gt;resources&lt;/a&gt; about giving such talks and &lt;a href=&quot;https://www.deconstructconf.com/blog/how-to-prepare-a-talk&quot;&gt;preparing great slides&lt;/a&gt;. In fact, I used to provide such advice when I was coaching colleagues to speak at meetups, back in Paris.&lt;/p&gt;
&lt;p&gt;But today, I came across a short video titled “How to Start a Speech”. The fact it’s a 9min video is great: it goes to the point. I watched it after lunchtime, and it was both catchy and insightful. Here’s what I learned.&lt;/p&gt;
&lt;p&gt;There are 2 common mistakes speakers usually do when they start their talk:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;A very formal talk introduction: &lt;em&gt;“My name is Nicolas Carlo, I work at Busbud, today I’m gonna talk about ‘The secrets of Hexagonal Architecture’”&lt;/em&gt;. All of this, people already know – they do have a program. As I’m spending time repeating this information, it gives the audience time to disconnect from me and look at their phone while I’m going through usual stuff.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A very hesitating introduction: &lt;em&gt;“Aaaaaah eeeeeeeeeh… Is the mic working?… Yes… Ok… Right… hmmmm…”&lt;/em&gt;. Which is obviously not very engaging. It could happen though because of stress. My personal advice here is to practice the talk before – in front of colleagues at work, or/and in a local meetup. Practicing out loud at home and recording the video is also really helpful to self-improve our talk delivery.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The second one is obvious, but I didn’t think too much about the first one. It’s obviously the classical way of doing it, and most of the speakers I know do it like that – including myself.&lt;/p&gt;
&lt;p&gt;Then, here are 3 better ways to start a talk:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;🤔 &lt;strong&gt;Ask a question that matters to the audience.&lt;/strong&gt; The idea is to make people relate to the problem. If I raise a question that you also have at work, it’s likely you’ll be interested in knowing the answer. The talk is here to answer that question.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🙀 &lt;strong&gt;Start with a fact that shocks.&lt;/strong&gt; It’s really easy today to access facts, studies, and different resources. A fact can illustrate the whole point of the talk, or be somehow related. Having a powerful fact that will force the audience into rethinking what they know is really catchy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;📖 &lt;strong&gt;Tell a story.&lt;/strong&gt; Actually, it’s not something new. Still, it holds true. Even more for conferences talks. “Once upon a time” makes children lean forward. And the grown-up way of saying “Once upon a time” is to tell a story, usually one from your own life. A story that connects you to the subject of the talk. A story that explains why it is important to you. For example, “the first time” you discover the benefits of the thing you’re presenting.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That’s it. I’ll personally try to rework the introduction of my Confoo talk to start with a story – which is not that hard, I do have a story and fun facts to tell about it!&lt;/p&gt;
&lt;p&gt;Here’s the full video if you have some more time to watch it. In my opinion, it worth it:&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/w82a1FT5o88&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;And you, do you have tips &amp;#x26; tricks for public speaking?&lt;/strong&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA["I need to change this code, but it has no test"]]></title><description><![CDATA[An introduction to "Approval Testing" in JavaScript with Jest.]]></description><link>https://www.nicoespeon.com/en/2019/01/approval-testing-on-legacy-code/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/01/approval-testing-on-legacy-code/</guid><pubDate>Sat, 12 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here’s the deal: you need to change the code to make this awesome new feature work, but that code is not covered by an automated test. How do you know you didn’t break anything when you’re done?&lt;/p&gt;
&lt;p&gt;That’s a typical scenario I frequently face.&lt;/p&gt;
&lt;p&gt;I see different approaches in such a situation:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;🤞 &lt;strong&gt;Cross fingers&lt;/strong&gt;, do the change and hope nothing breaks. Manually test different use cases you know. After all, you’re just adding a feature. You know the codebase, more or less. What could go wrong?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🤔 &lt;strong&gt;Spend time to understand&lt;/strong&gt;, test and refactor the code before changing it. &lt;a href=&quot;https://twitter.com/kentbeck/status/250733358307500032&quot;&gt;“Make the change easy, then make the easy change”&lt;/a&gt;. Sure, it will take some time. You didn’t estimate that task to take that much time actually. That’s unexpected complexity. But, in the end, you will leave codebase in a better state and you’ll be able to go faster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;📸 &lt;strong&gt;Take a snapshot of existing code behavior&lt;/strong&gt;. Consider it a black box and capture enough of its behavior to feel confident touching it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I clearly think the first approach is shooting yourself in the foot − except if you know you won’t need to maintain that code. Heck, it seems you’re maintaining this code already, otherwise, you wouldn’t have this question in the first place! If you want to keep moving fast without breaking everything, there is a better, more professional way.&lt;/p&gt;
&lt;p&gt;The second approach would be ideal. Working effectively with legacy code requires putting the existing code into a test harness, first. Then, you can refactor. But, it takes skills to write good tests. You should practice these skills though, they will help you with these – so common – scenarios. Now, I hear you: client demo is next week and you need to ship that cool feature before. You need a pragmatic solution to the problem. You’re gonna take this shortcut consciously so you can deliver, then you’ll pay the technical debt back. Now, are you stuck with approach #1 then?&lt;/p&gt;
&lt;p&gt;Nope. Approach #3 is more… pragmatic. You have to put your code under test before you touch it anyway. But, who said you need to completely understand current code to do so? What you want is to know if you break existing behavior when you touch the code. This, you can do with &lt;strong&gt;Approval Testing&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The main idea is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;take a snapshot of existing code behavior, in all possible variations&lt;/li&gt;
&lt;li&gt;use test coverage to discover parts of the code not covered with the variations&lt;/li&gt;
&lt;li&gt;use mutations to ensure you detect any broken behavior&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;You don’t need to understand existing code to do so.&lt;/strong&gt; That’s the good news.&lt;/p&gt;
&lt;p&gt;There is a pre-requisite though: you need to take a snapshot of your code behavior, meaning that you &lt;strong&gt;should be able to stringify the output of your code&lt;/strong&gt;, including side-effects. If your codebase was not designed with tests in mind, you probably need to rely on &lt;a href=&quot;https://www.oreilly.com/library/view/working-effectively-with/0131177052/&quot;&gt;Michael Feather’s book&lt;/a&gt; to help you get started.&lt;/p&gt;
&lt;p&gt;Now, let see how you can do that in JavaScript.&lt;/p&gt;
&lt;h2 id=&quot;approval-testing-in-javascript&quot;&gt;&lt;a href=&quot;#approval-testing-in-javascript&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Approval Testing in JavaScript&lt;/h2&gt;
&lt;p&gt;My personal go-to for JavaScript testing nowadays is &lt;a href=&quot;https://jestjs.io/&quot;&gt;Jest&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is simple to set up – almost no configuration needed. It has a wonderful test runner baked in, with a powerful watch mode. Finally, and that’s what you’re looking for, it can take snapshots.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/jest-runner-88925241a8fcb472f4d8cc8479a7174f.gif&quot; alt=&quot;Jest runner in action&quot;&gt;
  &lt;figcaption&gt;Jest runner in action &amp;#x2013; damn it&amp;apos;s so cool!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Snapshots are powerful. But they are a &lt;em&gt;test-after&lt;/em&gt; technique. I usually recommend to practice &lt;a href=&quot;https://en.wikipedia.org/wiki/Test_driven_development&quot;&gt;Test-Driven Developement&lt;/a&gt;, so you should barely need snapshots. Actually, &lt;strong&gt;snapshots have very few valid use-cases&lt;/strong&gt;. Putting tests on existing code, before refactoring it, is one of these.&lt;/p&gt;
&lt;p&gt;Now, I need an example. I’ll use the &lt;a href=&quot;http://iamnotmyself.com/2011/02/13/refactor-this-the-gilded-rose-kata/&quot;&gt;Gilded Rose kata&lt;/a&gt; to illustrate that. It’s an exercise to practice refactoring techniques, which is really convenient here. I made a &lt;a href=&quot;https://github.com/nicoespeon/kata-gilded-rose-js&quot;&gt;JS starter&lt;/a&gt; of the kata that you can use.&lt;/p&gt;
&lt;p&gt;So you have 2 classes: &lt;code class=&quot;language-text&quot;&gt;Shop&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;Item&lt;/code&gt;. &lt;code class=&quot;language-text&quot;&gt;Item&lt;/code&gt; is pretty simple:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Item&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sellIn&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; quality&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sellIn &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sellIn
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quality &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quality
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then you have &lt;code class=&quot;language-text&quot;&gt;Shop&lt;/code&gt; which takes a list of &lt;code class=&quot;language-text&quot;&gt;items&lt;/code&gt; and have a method &lt;code class=&quot;language-text&quot;&gt;updateQuality()&lt;/code&gt; that will update the &lt;code class=&quot;language-text&quot;&gt;quality&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;sellIn&lt;/code&gt; attributes of every item. There is a bunch of logic that’s currently supposed to work. It is not pretty though, so I won’t put it here but give you &lt;a href=&quot;https://github.com/nicoespeon/kata-gilded-rose-js/blob/954274fb04741e9c2992f9b31482daca366e0055/gilded-rose.js#L14-L69&quot;&gt;a link to the beast&lt;/a&gt; instead.&lt;/p&gt;
&lt;p&gt;Your goal: change &lt;code class=&quot;language-text&quot;&gt;updateQuality()&lt;/code&gt; so it deals with &lt;code class=&quot;language-text&quot;&gt;&amp;quot;Conjured&amp;quot;&lt;/code&gt; items too (they degrade in quality twice as fast as normal items).&lt;/p&gt;
&lt;p&gt;There is no test. A good idea is to refactor this code first – make the change easy, remember?&lt;/p&gt;
&lt;p&gt;Let me show you how to apply the Approval Testing technique in such a scenario.&lt;/p&gt;
&lt;h3 id=&quot;1-generate-an-output-you-can-snapshot&quot;&gt;&lt;a href=&quot;#1-generate-an-output-you-can-snapshot&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Generate an output you can snapshot&lt;/h3&gt;
&lt;p&gt;The first step is to generate a snapshot from &lt;code class=&quot;language-text&quot;&gt;updateQuality()&lt;/code&gt;. It doesn’t return a string, but it changes &lt;code class=&quot;language-text&quot;&gt;items&lt;/code&gt;. Thus, my first move is to write a function returning something which captures the changes so Jest can take a snapshot of it:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// I put that code in my test file, since it&apos;s test-related.&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sellIn&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; quality&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; gildedRose &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Shop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sellIn&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; quality&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; items &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gildedRose&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;updateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I could have returned &lt;code class=&quot;language-text&quot;&gt;items&lt;/code&gt;, but I’m simplifying things a bit here: I’m only testing a shop with one item. That’s because I already know the behavior is the same regardless the number of items. It might not be your case. You should adapt to your situation, this is the tricky part.&lt;/p&gt;
&lt;p&gt;Now I have a &lt;code class=&quot;language-text&quot;&gt;doUpdateQuality(name, sellIn, quality)&lt;/code&gt; I can call from my tests. It will instantiate the shop, call the method I’m testing and return me the updated item.&lt;/p&gt;
&lt;p&gt;My next move is to write the first test, taking a snapshot from the output:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;should update quality&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sellIn&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; quality&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you’re not familiar with Jest snapshot testing, I suggest you take a few minutes to have a look at &lt;a href=&quot;https://jestjs.io/docs/en/snapshot-testing#snapshot-testing-with-jest&quot;&gt;their documentation&lt;/a&gt;. I will wait 😉&lt;/p&gt;
&lt;h3 id=&quot;2-using-test-coverage-to-find-all-input-combinations&quot;&gt;&lt;a href=&quot;#2-using-test-coverage-to-find-all-input-combinations&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Using test coverage to find all input combinations&lt;/h3&gt;
&lt;p&gt;At this point, I generated a first snapshot, given a set of parameters. Jest will tell me if any regression happens to that scenario. Can I go refactor &lt;code class=&quot;language-text&quot;&gt;updateQuality()&lt;/code&gt; now? Nope. Because I’m not covering all the code with this snapshot. This, I can know thanks to the test coverage!&lt;/p&gt;
&lt;p&gt;To generate test coverage, I run Jest with the &lt;code class=&quot;language-text&quot;&gt;--coverage&lt;/code&gt; option.&lt;/p&gt;
&lt;p&gt;I find the &lt;code class=&quot;language-text&quot;&gt;html&lt;/code&gt; report to be the best in this scenario. To do so, I need to configure Jest options. This can be done in a config file, or quickly in &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;gilded-rose-kata&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;jest&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;jest&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;coverageReporters&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;html&quot;&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// I could add &quot;text&quot; or &quot;text-summary&quot; to see output in the console&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, I run &lt;code class=&quot;language-text&quot;&gt;yarn test --coverage&lt;/code&gt; (or &lt;code class=&quot;language-text&quot;&gt;npm run test -- --coverage&lt;/code&gt;), which generates a &lt;code class=&quot;language-text&quot;&gt;coverage/&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;I open the &lt;code class=&quot;language-text&quot;&gt;coverage/index.html&lt;/code&gt; file:&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/coverage-1-a3b44c81d9f13b612fb7923841071d85-d02bf.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 97.87878787878788%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABYlAAAWJQFJUiTwAAADKElEQVQ4y41Ui3KbOhD1/3/STdJMH3bT9N72pnFix8TGNm8LhBAIgcCcLthN0oybKTNndoVgtTp7dkezsMKNb/Bg+5jfTbG213i0LCSMYXj2HdAR9vvDuuue0e+9ejfaxBxeViAuFJI8QyQ4WQkvZihMDb1vkdcVKnTgRX7wuz1U20CTDVNOvkFJ66zSGO3O3iM+/4jd+Rjxu89g5xPwS7IXn8DejZFcTsgfD3509oG++3TYGzBG8M977MgfQHFGmsXgWxeB5WJ1a2E7teBO5xCuj8wLwOwN8iBAk2bP4IKsONrs4KcHf2S6BpFaoSEq1m4Ke7tGwEI4voeqMWh7GvH3z6gmTuLMQUM/57JCyjm01uA8QVkWR9J7vru/wsgYA0GpVlX9fEz3wh0+fOl3b2eodQmexohjiZUdYGM78DYBiuIexjhHNfyexa/gJwOWpUIsfJJZQ0EqgkRJV87ziLbLkz+9lSUFLJGKFEpRYNJkStcvdT5sGqqUqWuCQUOLlrTWkfZOcffroFFPfCgstNQJP25u4W19yCKjTAtkQtFhHIwzCLJ1pYaAb2U9ZMjTZFikIkcYCUSRhx1JR0oBVjPYcgM/9yAqAdWUSHSCmJDVEqlOf8+wvypL3KEvd74Dd7VCynJEvg++C8FI1DzZgUtGSiigCYWWyJVArRXaIwVPATVlqKMQzcZDTh3iXt3CntxiNZ6QnWA9+YLg+xTW9TW2366x+e8rlv9eIZhPUVEfv5bToSg8HRYNkd7jj88weY6tc0KbTxkq6ueWESePDrY3K4R3FqLZDMHdDNH9AvFiTf1Mtyg1tMxhiKan0fW6KH3AOmQwKwfV/RLB1znChyXY0kK4sJCut2BrB4H9CObYCNfEsetAZDFKKpBuNKq2eiEbVUIkHHvSWkeaK0iHvVxkJqi3BUqVQ2oBXiZQnUZN46IfGanJhirndQ5l1HPAiq5hKMN6YaP6MUfx/wzbDzewzq6wODvH48UlVhcf4X3+hthawuRUaSFhpDoo/9SVFfHX9nONcbTULYUXQbo9XGSEnOZi4ZO4tx7NyB4kfnpXSznU5mVRfgJ5QPp/u0qpuQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Coverage output with a lot of red lines&quot;
        title=&quot;&quot;
        src=&quot;/static/coverage-1-a3b44c81d9f13b612fb7923841071d85-c83f1.png&quot;
        srcset=&quot;/static/coverage-1-a3b44c81d9f13b612fb7923841071d85-569e3.png 240w,
/static/coverage-1-a3b44c81d9f13b612fb7923841071d85-93400.png 480w,
/static/coverage-1-a3b44c81d9f13b612fb7923841071d85-c83f1.png 960w,
/static/coverage-1-a3b44c81d9f13b612fb7923841071d85-d02bf.png 1320w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;All the red lines, I don’t test.&lt;/p&gt;
&lt;figure&gt;
  &lt;blockquote&gt;
    &lt;p&gt;Test coverage can only tell you&lt;br&gt;what code is not tested, nothing else.&lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/figure&gt;
&lt;p&gt;Let’s figure out another combination that would cover more lines… An item with a positive quality should do:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;should update quality&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I run the test again. A new snapshot is generated.&lt;/p&gt;
&lt;p&gt;Coverage report is updated:&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/coverage-2-04a789346aece6e4a881623da856728a-5b83d.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 97.87556904400606%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABYlAAAWJQFJUiTwAAAC1klEQVQ4y5VUbW/TMBjs//9FvHxASIgvgAZjY+tKmzTvadzEzrudtMfZiG0t0waWTo4d5XLn5x4vrtIBF4nB0k9x8+Manu9jtVqhKAo8Hsfj0eF8nO8tgjhFmAkU+xJCFMiyDPv9HlEUoaoqdF0HpZSby7J06PseTdO4Oc9zt/fn/WLoO1h03YBh0HweYbTBOI5cD/ezhSV4DLtniR7vLbQxTkFRKARBjiTKkYaxU9C2LVXavzf3ll8CCQdk6g7TNMP3BTabNZI0JvmWCnrM80TM+NdBwhFCRSTUVDWipCJrpSz3tND9VZQXFRpalpWC1vpR6c6r+3ylTxRaW6UUrHCDjZdi64WItxma9juM8RzZ8Xg4UfFUXO4JrS0hE8yHiUUYiJpWB9oXfK2f/Og5lQtbail/500wi5VUJKzdy2kC7JHYGNnZFuhc7blqErZI5YoKD/j69RuiIEHT1S4ySjGsskRRCUhVQo+9I3xOtVNYlpVbSNkw+YrdEmG3S1GrCmLcYaM8xCqA7OnE9BC9cKjHGnKUpwq7rkVebl1ptR6RJGw9oVwbCrFzPV23PAbDjppHjEQ/sfU0W4/k02xOErDoB2t5aXcwTwY31ze0XSAMAoShh2Drs7clol1CbJEUMWIib3ZoqPBwmP+2vGeYXRHsgeP/x4nlgYTdTmDOCqilj+DLHbLLW+Tfr5BeXnH+AXGzRhPFmFraljVM0/Lv89NFsYSaZIaBHvlh+nmJbOWh8DbIfq5RBSFEmCD11ygiH5nvoYpDJkDwLHkLEfZcH2LD/Enm72hDR7RUoGTLCks0tUTPm6YeJMp+D+pj1A8wRDUpSK1Qa0bMtA+EIxVOVKhv1xgurtF8uUbw7gKr1x+xfPUaqzdvsX7zHvGHTxC3K2hVY2DvG0USbZ623Io9DnWLuWLV2Cktb/A6ZVx4e1s02Q5tXkHGXKcJVMKMMl6ad+bxrCi/AA2KCClRYBLfAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Coverage output with less red lines&quot;
        title=&quot;&quot;
        src=&quot;/static/coverage-2-04a789346aece6e4a881623da856728a-c83f1.png&quot;
        srcset=&quot;/static/coverage-2-04a789346aece6e4a881623da856728a-569e3.png 240w,
/static/coverage-2-04a789346aece6e4a881623da856728a-93400.png 480w,
/static/coverage-2-04a789346aece6e4a881623da856728a-c83f1.png 960w,
/static/coverage-2-04a789346aece6e4a881623da856728a-5b83d.png 1318w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;Yay, less red lines!&lt;/p&gt;
&lt;p&gt;So you get the idea: during this phase, I need to find all the possible combinations that would cover all the code. No more red lines.&lt;/p&gt;
&lt;p&gt;Let’s fast-forward a bit. Here’s what I’ve got:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;should update quality&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Aged Brie&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Backstage passes to a TAFKAL80ETC concert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/coverage-3-77c53f9aeb0d0f9bc39da61b93d4378e-2c575.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 101.74326465927099%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAABYlAAAWJQFJUiTwAAAC80lEQVQ4y41UaY/bNhDV//9HOdqP3U2RoNkgAda3XVsHRYmHJIoidbwO5WODxtmExoDjEfU0w/dmoqfE4lPi8LyP8eXLP9gfDlgsF2AsQ1jT5TdO483/aYz+RxlTKISFUi1UqSG4hCgU0pihMx6DG2GqFoOfoEUN2ziMHnBtT/sESe/0dCbErXGIHldv8GH9Fg/Ld3jc/InH9Xv8vfmD/Hf4sCF/S/767P+1fIMH8h8vdo0F/2H1dn4WybpAwo/Yxycsthusd2tsNs/IyhO4ypDkR+QyQWUF6k6dzV53+RK7WNT3HrzaYRyA478K8SkGzxmSOIHrHIZ+pGcjfndFnbPI9R5936MUBnmeo64rcH7er2uapt+yyHsPKRVCpvdWYI7OzYevwK9maK0lQIGybJBmEjkjn/auO9FH4rvZvQYcmbYBlycC6KhcRcYIXKIolhiG7Jbd92CvArZtO5fsvUPwg3nf4eV8kOyv7/H6fM6Q6Q2s7XA4pNQhHFVTzaA1ibXSNSqlZ/NE4Dj0P7nr6ZqhAS/Pbda2A7FbI8tS2lPqAgFuGDZyi1gdIRsON3jUrobuNFrfwniDIWjulqFpqPXyORAIEtReJQEJwaG1gmokOAHpTsL0Bp76rukbSBJxAKtchX7sXwCbtsJJfp0DQUKfPn7E8ZBju9tjt1tiv9ui4CV1C0dM3ZPJFLnKwWqGwhQkfPdjyYVgl8BE6U9wzpNZMjdbT91iLWVG1YQ7b5oGnnQ7jOM9UgiwZHOAF5yyOxJIT/fZEYhB+GCQVEckAa+L+gJY4yTOJWutsVrsiRQaGMlptkBQUVZIsgyCyhaihK70/IHxjnSiUEYhs1vA2h7GkGRqSaVVNCA6IqFGYQsImjiSJkwggxuOpE6hiJyyLW9MzzrMxHaevmGt11/x7ekzyqJFHAddxsjShK6jIMZpmF5IuFf9XHJrCVCt5iEQVk1ZLZ5X1HoVGLUhYwkylpKUNOlV0kTKUVHJSik46q7/l/wf5KUDByaCJPkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Coverage output with no red line&quot;
        title=&quot;&quot;
        src=&quot;/static/coverage-3-77c53f9aeb0d0f9bc39da61b93d4378e-c83f1.png&quot;
        srcset=&quot;/static/coverage-3-77c53f9aeb0d0f9bc39da61b93d4378e-569e3.png 240w,
/static/coverage-3-77c53f9aeb0d0f9bc39da61b93d4378e-93400.png 480w,
/static/coverage-3-77c53f9aeb0d0f9bc39da61b93d4378e-c83f1.png 960w,
/static/coverage-3-77c53f9aeb0d0f9bc39da61b93d4378e-2c575.png 1262w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;No more red lines, but I still have these &lt;code class=&quot;language-text&quot;&gt;E&lt;/code&gt; symbols. These symbols mean that I’m covering the &lt;code class=&quot;language-text&quot;&gt;if&lt;/code&gt; case, but I’m missing the &lt;code class=&quot;language-text&quot;&gt;else&lt;/code&gt; clause – that’s why only 68.57% of branches are covered. I need to cover them too:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;should update quality&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Aged Brie&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Aged Brie&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Sulfuras, Hand of Ragnaros&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Sulfuras, Hand of Ragnaros&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Backstage passes to a TAFKAL80ETC concert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;    &lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Backstage passes to a TAFKAL80ETC concert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;    &lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Backstage passes to a TAFKAL80ETC concert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;49&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So far, so good. I’m covering every line and branch. Can I go refactor &lt;code class=&quot;language-text&quot;&gt;updateQuality()&lt;/code&gt; now?&lt;/p&gt;
&lt;p&gt;Well… not yet. Remember when I said test coverage can only tell you “what code is not tested”? That means it doesn’t tell you if the covered code is properly tested.&lt;/p&gt;
&lt;p&gt;This is why setting a test coverage objective to ensure test quality doesn’t work. Test coverage tells you parts that are not tested – and that might be fine not to test these parts. Other than that, it says nothing.&lt;/p&gt;
&lt;p&gt;To me, good test coverage comes as a side-effect of a good testing strategy (TDD). It’s not a target.&lt;/p&gt;
&lt;h3 id=&quot;3-use-mutations-to-verify-snapshots&quot;&gt;&lt;a href=&quot;#3-use-mutations-to-verify-snapshots&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Use mutations to verify snapshots&lt;/h3&gt;
&lt;p&gt;To ensure the covered code is actually tested, I’m gonna introduce little mutations in the code.&lt;/p&gt;
&lt;p&gt;The goal here is to see the test fail. If I change the existing code and a test fail, I’ll feel safe refactoring this code! When the test has failed, I revert the mutation and move to another line.&lt;/p&gt;
&lt;p&gt;What mutations should you introduce? Again, it depends on what you’re testing – sorry. Usually, mutate the side-effects that you’re capturing in your snapshot. In my case, that means I don’t have to change &lt;code class=&quot;language-text&quot;&gt;if&lt;/code&gt;s, but only the updates to &lt;code class=&quot;language-text&quot;&gt;item&lt;/code&gt;. There are 8 of them.&lt;/p&gt;
&lt;p&gt;Let’s start with the first assignment, line 22:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Sulfuras, Hand of Ragnaros&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quality &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quality &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I’ll introduce a little mutation, just to check:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Sulfuras, Hand of Ragnaros&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quality &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quality &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I run my tests again:&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/failed-snapshot-1-f75bbfacdee7a1d2f70764aec33dd59a-49d4c.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 38.7%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA10lEQVQoz5WSa26DMBCEOUfxg2XXLwhVQqWo97/YdHFCQ0hp1R+fxpat2dHYzel8RZ4uKGVEjAVEAdYLjOvRmg7GUlXre1AUdOGOPNQzV7We0HzOV5zOHwhphKQBxjPe1GA1W1n2bfsHeqeZ44h3KZiUizKHEdnJzeAXtsO2NIWzGjByHDBoyqJKHdf41tFN97hH6hfDIQREktpdxxGkuJ5rL37V3Xo5N+7AsISsieS7t7WLFzXPXW0f7MkwJe1vmiASD3s54seE3AckSfD6Tcwy+Z+me74Agqjb140/D1gAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;A snapshot failed&quot;
        title=&quot;&quot;
        src=&quot;/static/failed-snapshot-1-f75bbfacdee7a1d2f70764aec33dd59a-c83f1.png&quot;
        srcset=&quot;/static/failed-snapshot-1-f75bbfacdee7a1d2f70764aec33dd59a-569e3.png 240w,
/static/failed-snapshot-1-f75bbfacdee7a1d2f70764aec33dd59a-93400.png 480w,
/static/failed-snapshot-1-f75bbfacdee7a1d2f70764aec33dd59a-c83f1.png 960w,
/static/failed-snapshot-1-f75bbfacdee7a1d2f70764aec33dd59a-23e13.png 1440w,
/static/failed-snapshot-1-f75bbfacdee7a1d2f70764aec33dd59a-10d8f.png 1920w,
/static/failed-snapshot-1-f75bbfacdee7a1d2f70764aec33dd59a-49d4c.png 2000w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;Great! I know my test will catch any regression here. I can revert my mutation.&lt;/p&gt;
&lt;p&gt;Let’s move on the other ones. I introduce a similar mutation line 33:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quality &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quality &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quality &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Run tests again and…&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/passing-tests-53842161570902bb6f2a34eaa3782299-41e23.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 572px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 60.48951048951049%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAACWUlEQVQozz2S6XbaQAyFeQmSAN7wboPHG94NcRNIIKSQNu0T9B36qz199FuNCPmhczRjz9XVJ400X0CNShj5GoonoGU9dDprywJ62kJZlgiEQF/ZiIWLOCnRND38IEKSrtC0axhzB9OZDkWdY5RXLR6ej0jKFnnZYP24R1z2KLoB7eYBadnRYx+eY0A3LNi2D4tC0y3MTYdzKTRTjItgVw/o6nuUWYs0LpFSVdv2EIYRh+eF9PMc41sVk6nGcXM7+8zvJuqnoIzR8HONzY8ex197NF8rjG9mMC0PjhsiXMRwvQVFiIBalHdz0+V76Uzm8tu1XXb49ucJ3//u8f5vj9PvHUzTw9PzCx63z3h7e8f+8IqSsByPJwzDFmlW4Hz+zuxWqxr9esDtnQpVMy8OJxMN+apCVXcoioYfRyKlc08DWJHjKT1QuE3Zngx5lq6uIcVk++yQrRKjuefACQJ0NIyy6lh4GSVcqOvvUdNkw4XAqqg5T7OSCwfEWbpumjXlghx+QJ4qOldRP1go2hyaJqcawNBdDmVmEhKfGeuGzetyZWfZl7uRVJcuJHTJpG037DCKUpguCfkkGrnwclqdLODcMC7r4rgB/+f5CzbDDGuyKuHLNgraQ3mWeZ5XhMCHm/jItimKl5wig+gFbCuASyJxkqPtNiz6yVDy2e722O0OzOQ6rfF4BsOxsGyWEGvi9JggHgREJ0gsZF6RyFDT8ESc8dLLt6PhyxYnWoPT+RsOtCLH1zMPYTrVSdBG8hAjKEIUx5wEYxSHHO4ygIhyLJYxu5SDkuik6H9c0G6CRLzXBgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;All tests passing&quot;
        title=&quot;&quot;
        src=&quot;/static/passing-tests-53842161570902bb6f2a34eaa3782299-41e23.png&quot;
        srcset=&quot;/static/passing-tests-53842161570902bb6f2a34eaa3782299-c2b80.png 240w,
/static/passing-tests-53842161570902bb6f2a34eaa3782299-bf6fa.png 480w,
/static/passing-tests-53842161570902bb6f2a34eaa3782299-41e23.png 572w&quot;
        sizes=&quot;(max-width: 572px) 100vw, 572px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;That’s not good.&lt;/p&gt;
&lt;p&gt;Before going further, I revert the mutation in the code. &lt;strong&gt;Don’t let mutations live long.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Then, at that point, I need to think a bit about the code – yeah, I lied, but you don’t have to understand &lt;em&gt;all&lt;/em&gt; the code. How could this happen? I suspect that a further update makes me take another path in the following logic, resulting in a similar result with my given combinations. Looking at the lines of code I want to mutate, I find this one to be interesting:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Sulfuras, Hand of Ragnaros&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sellIn &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sellIn &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sellIn &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That means if &lt;code class=&quot;language-text&quot;&gt;sellIn&lt;/code&gt; is &lt;code class=&quot;language-text&quot;&gt;0&lt;/code&gt;, then it doesn’t execute the rest of the code. I try to add another combination:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;should update quality&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Aged Brie&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Aged Brie&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Sulfuras, Hand of Ragnaros&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Sulfuras, Hand of Ragnaros&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Backstage passes to a TAFKAL80ETC concert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Backstage passes to a TAFKAL80ETC concert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Backstage passes to a TAFKAL80ETC concert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;49&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;    &lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Backstage passes to a TAFKAL80ETC concert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;gatsby-highlight-code-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I generate the new snapshot, then retry the mutation:&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/failed-snapshot-2-7355dbad31ce95777e7b18aa5a2d7d9d-14179.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 50%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABQ0lEQVQoz41SW3LCMAzMMUoejh3JrzwoSckA0x6gZ+n9/7eyoZ0yA4WPtSTbI620KuL+hDAf0C9H+H4AEYM4whgL63qEcYdaEapao27MQxRfyzs+t3uspw+s6xHOD3BhgGoJL6VCKfhJ9kzSYtIOx2nBPK8Y+i36MKKPE7yN4M6heYLVVUIlx0wBi3EYtMVO/DeKGXMX4Jtzu8+iSAyitBmEaWgZQdjFBGHLNqBpDRrdib3gni//aiUM69rAyQUbgpW5ddKmIY9OoMlCM8FYFstof33Ksb7c5zciKClQJJqeHUbv87w2SYiqvcKmFPsHVaVvI7VcysHCZhhfhZkFOxFDBCEOmaURxl5UTyuUYmIprDpUzW3FM0MtLS/ThCn2cDI3LTuY0GrO63OOOccJ/61QTpg+WVGXRGkl1VObj9S8l/QbCpMWNshtG48AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;A snapshot is now failing&quot;
        title=&quot;&quot;
        src=&quot;/static/failed-snapshot-2-7355dbad31ce95777e7b18aa5a2d7d9d-c83f1.png&quot;
        srcset=&quot;/static/failed-snapshot-2-7355dbad31ce95777e7b18aa5a2d7d9d-569e3.png 240w,
/static/failed-snapshot-2-7355dbad31ce95777e7b18aa5a2d7d9d-93400.png 480w,
/static/failed-snapshot-2-7355dbad31ce95777e7b18aa5a2d7d9d-c83f1.png 960w,
/static/failed-snapshot-2-7355dbad31ce95777e7b18aa5a2d7d9d-23e13.png 1440w,
/static/failed-snapshot-2-7355dbad31ce95777e7b18aa5a2d7d9d-14179.png 1532w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/yes-ff326b278cccfa096e43ed222b460064.gif&quot;&gt;&lt;/p&gt;
&lt;p&gt;It worked!&lt;/p&gt;
&lt;p&gt;I revert my mutation and continue to the next assignment. I do that until I know all of them are &lt;em&gt;actually&lt;/em&gt; covered with tests.&lt;/p&gt;
&lt;p&gt;Hopefully, I didn’t found other false positive for coverage. Here’s the final list of tests:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;should update quality&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Aged Brie&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Aged Brie&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Sulfuras, Hand of Ragnaros&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Sulfuras, Hand of Ragnaros&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Backstage passes to a TAFKAL80ETC concert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Backstage passes to a TAFKAL80ETC concert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Backstage passes to a TAFKAL80ETC concert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;49&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;doUpdateQuality&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Backstage passes to a TAFKAL80ETC concert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toMatchSnapshot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Can I go refactor &lt;code class=&quot;language-text&quot;&gt;updateQuality()&lt;/code&gt; now?&lt;/p&gt;
&lt;p&gt;Yes! All the code is now covered by snapshots. A wrong move and I’ll automatically know that. I can now refactor the code without introducing bugs. Then I’ll add the feature 🤘&lt;/p&gt;
&lt;h3 id=&quot;4-these-tests-are-technical-debt&quot;&gt;&lt;a href=&quot;#4-these-tests-are-technical-debt&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. These tests are technical debt&lt;/h3&gt;
&lt;p&gt;If you apply this recipe, remember this: you accepted to take technical debt here. You traded well-written tests against snapshots of existing behavior to get a test harness faster so you can refactor.&lt;/p&gt;
&lt;p&gt;Snapshots are powerful, but they don’t help you understand what the code is supposed to do. Once the code is refactored, you should pay the debt back: write proper, comprehensive tests on your clean code to replace your snapshots. If you do so, this part of the codebase will be easier to maintain in the future, and you’ll add new features faster.&lt;/p&gt;
&lt;h2 id=&quot;introducing-jest-extended-snapshot&quot;&gt;&lt;a href=&quot;#introducing-jest-extended-snapshot&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Introducing jest-extended-snapshot&lt;/h2&gt;
&lt;p&gt;Looking at the resulting test code, I thought that was a lot of boilerplate code in a single &lt;code class=&quot;language-text&quot;&gt;it&lt;/code&gt;!&lt;/p&gt;
&lt;p&gt;So I refactored it with a custom Jest matcher: &lt;code class=&quot;language-text&quot;&gt;toVerifyAllCombinations()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;With it, the previous code could be written the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;should update quality&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;doUpdateQuality&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toVerifyAllCombinations&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&apos;Aged Brie&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&apos;Backstage passes to a TAFKAL80ETC concert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&apos;Sulfuras, Hand of Ragnaros&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;49&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It will generate all possible combinations of the following arguments, call &lt;code class=&quot;language-text&quot;&gt;doUpdateQuality()&lt;/code&gt; with each and take a snapshot of all results.&lt;/p&gt;
&lt;p&gt;I like it because it expresses the intention better: “current behavior should be preserved for all these scenarios”.&lt;/p&gt;
&lt;p&gt;I extracted that into a library so you can use it too: &lt;a href=&quot;https://github.com/nicoespeon/jest-extended-snapshot#readme&quot;&gt;jest-extended-snapshot&lt;/a&gt; 👹&lt;/p&gt;
&lt;h2 id=&quot;inspiration&quot;&gt;&lt;a href=&quot;#inspiration&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Inspiration&lt;/h2&gt;
&lt;p&gt;I discovered Approval Testing thanks to &lt;a href=&quot;https://twitter.com/emilybache&quot;&gt;Emily Bache&lt;/a&gt;. She made a very nice 20-min screencast where she runs a demo of this very example, in Java:&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube.com/embed/zyM2Ep28ED8&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;p&gt;You can read more about Approval Testing on &lt;a href=&quot;http://approvaltests.com/&quot;&gt;http://approvaltests.com/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;They have a library to do that in JS, with Mocha: &lt;a href=&quot;https://github.com/approvals/Approvals.NodeJS&quot;&gt;https://github.com/approvals/Approvals.NodeJS&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Hexagonal Architecture & Elixir]]></title><description><![CDATA[A talk I gave at the Montreal Elixir meetup of November 2018.]]></description><link>https://www.nicoespeon.com/en/2019/01/hexagonal-architecture-elixir/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2019/01/hexagonal-architecture-elixir/</guid><pubDate>Mon, 07 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is a talk I gave at the &lt;a href=&quot;https://www.meetup.com/fr-FR/montrealelixir/events/256148599/&quot;&gt;Montréal Elixir&lt;/a&gt; meetup of November 2018.&lt;/p&gt;
&lt;p&gt;Let’s start from scratch and go beyond the buzzwords.&lt;/p&gt;
&lt;p&gt;We’ll go together through these ideas to understand how you can improve the maintainability of your projects, either greenfield or legacy.&lt;/p&gt;
&lt;p&gt;We’ll see how it can be achieved in Elixir to check if it goes along the philosophy of the language.&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/sdM1KkjtCe8&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;</content:encoded></item><item><title><![CDATA[I built a tool to work with complicated Sass codebases]]></title><description><![CDATA[Introducing sass-graph-viz, a tool to draw a visual graph of Sass dependencies.]]></description><link>https://www.nicoespeon.com/en/2018/12/tool-work-with-complicated-sass-codebases/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2018/12/tool-work-with-complicated-sass-codebases/</guid><pubDate>Wed, 12 Dec 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 58.62516212710766%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsSAAALEgHS3X78AAACCElEQVQoz1VS2W7bMBDU/39Kgb4XSIMESd3EdpwmtnPYlg9JtmQdPHTwJqWsohZICQoYLciZ5cx6bdt2n6vtelAq+la8GKtb11proeJaN4sny2wO+FQdJ8exj9fCCPj1gjBgnPWX/7HsyZYK6rRbJ6uHeFrL2ra2YDmR+Ca8nh7Hk9P4IZ68pEuvc92nZKerWmrRaCZsz+qcE0pwzYH0QHYAoJ1GNr2Ma7do83R+9AKyn6dPwnAexUkRLNPFa7YIUSCkgMZTdp7F09+H27Q69wquW6fviCHK6V008hrecMutMyBvjdZKMNNs8jVlRDk5im6u9j+NtsaZSpSM8SAJhBawJ6d7b3gneEMIBpDVyYX/Y0e2s+N0l2yhwljvSED399HIgYgx/TGWbcnGAz5llZQySRJUoAIXjWmklpQSxprXfBmeA+gWpJhqBndyls2T56v9pfdevIGTUDIWSM0Qj9YauDDGtKZgT1zF17vLAB/SJl0kz2u02qBVrStvSPItf4V4XeeYYqv8nXICdYRRFIVK6R32L/2LdbGSVgb0ENenYS48+GBbZwklUsk/yeP3xbdxeAcxKqXO6PzLvx0SqsoKI/x1ov4a1nuQZU3dQNW0+iVf+GiTVdnjZpahbDgAXEIIMAjSJQL/dxmmAt5ZliXgLfGX2SIqw2MdwXh1X5bQfE92iBeAPwAKbaGykjsl9gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;cover&quot;
        title=&quot;&quot;
        src=&quot;/static/cover-75379648f7083acdb0f5acd535838e5c-c83f1.png&quot;
        srcset=&quot;/static/cover-75379648f7083acdb0f5acd535838e5c-569e3.png 240w,
/static/cover-75379648f7083acdb0f5acd535838e5c-93400.png 480w,
/static/cover-75379648f7083acdb0f5acd535838e5c-c83f1.png 960w,
/static/cover-75379648f7083acdb0f5acd535838e5c-23e13.png 1440w,
/static/cover-75379648f7083acdb0f5acd535838e5c-69a3e.png 1542w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;I currently work as a web developer at Busbud.&lt;/p&gt;
&lt;p&gt;Part of our stack is the public website that you can see at &lt;a href=&quot;https://www.busbud.com/&quot;&gt;https://www.busbud.com&lt;/a&gt;. The first commit of its source code was made on January 2011. Today is December 12th, 2018. It has been almost 8 years!&lt;/p&gt;
&lt;p&gt;For 8 years, the codebase has been growing. Today, code is still constantly updated to add new features, adopt or remove experiments, fix bugs… As we work, we need to deal with existing, working, legacy code and ensure nothing breaks when we change it.&lt;/p&gt;
&lt;p&gt;Today, I’d like to tell you about the styles part.&lt;/p&gt;
&lt;h2 id=&quot;a-lot-of-sass-files&quot;&gt;&lt;a href=&quot;#a-lot-of-sass-files&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A lot of Sass files…&lt;/h2&gt;
&lt;p&gt;A choice has been made, long time ago, to use &lt;a href=&quot;https://sass-lang.com/&quot;&gt;Sass&lt;/a&gt; as a pre-processor for our stylesheets.&lt;/p&gt;
&lt;p&gt;This is great. It simplifies maintenance of styles thanks to variables, mixins and other niceties Sass brings to us.&lt;/p&gt;
&lt;p&gt;Among the niceties, we do use &lt;code class=&quot;language-text&quot;&gt;@import&lt;/code&gt; a lot. It allows us to import partial files into others and compile them into a single CSS stylesheet. Again: this is great. It allows us to split styles into smaller chunks (convenient for development) and get a single stylesheet in the end (convenient for production).&lt;/p&gt;
&lt;p&gt;But &lt;code class=&quot;language-text&quot;&gt;@import&lt;/code&gt; creates dependency relationships between Sass files. Today, we face issues of dependency graph management in a growing codebase. Now, I’m not talking about critical problems like circular dependencies − Sass does a great job dealing with that. I’m talking about understanding the dependency graph as a whole. It usually boils down to these questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In which final CSS will this style be compiled to?&lt;/li&gt;
&lt;li&gt;Will this style be compiled into a CSS file where it’s not needed?&lt;/li&gt;
&lt;li&gt;Is there any file not imported anymore?&lt;/li&gt;
&lt;li&gt;Is there any (useless) duplicated import of the same partial?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are tricky questions to answer when you have a lot of files.&lt;/p&gt;
&lt;p&gt;The dependency graph of our codebase is not trivial. It started with a bunch of Sass files along Jade templates ; now we miss a clear architecture to maintain our styles with ease. Hopefully, we’ve identified this technical debt, and we’re taking actions to pay it back.&lt;/p&gt;
&lt;p&gt;But, until then, we have to work with this complicated Sass codebase.&lt;/p&gt;
&lt;p&gt;Now, to visualise what we’re working with, I realised we need a tool to turn on the light.&lt;/p&gt;
&lt;h2 id=&quot;turn-on-the-light-please&quot;&gt;&lt;a href=&quot;#turn-on-the-light-please&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Turn on the light, please&lt;/h2&gt;
&lt;p&gt;I first went to &lt;a href=&quot;https://www.npmjs.com/package/sass-graph&quot;&gt;sass-graph&lt;/a&gt;. It’s a library which computes the dependency graph of a Sass codebase. Unfortunately, it was only able to output some sort of graph in my terminal, or a JSON structure. But to answer rapidly previous questions, I needed something &lt;strong&gt;visual&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Thus, I decided to &lt;em&gt;plug&lt;/em&gt; sass-graph with a rendering library:&lt;/p&gt;
&lt;figure&gt;
  &lt;blockquote&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/nicoespeon/sass-graph-viz&quot;&gt;sass-graph-viz&lt;/a&gt;&lt;/p&gt;
    &lt;footer&gt;
      &lt;cite&gt;Draw a visual graph of Sass dependencies&lt;/cite&gt;
    &lt;/footer&gt;
  &lt;/blockquote&gt;
&lt;/figure&gt;
&lt;p&gt;The difference is that sass-graph-viz generates a visual graph of dependencies in the browser.&lt;/p&gt;
&lt;p&gt;You can use it as a CLI tool, as illustrated in this gif (a demo of v1):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/demo-07ef05a2624944f6de4b49250710b39d.gif&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can quickly try it out with npx: &lt;code class=&quot;language-text&quot;&gt;npx sass-graph-viz path/to/your/scss&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Or, you can install it with npm: &lt;code class=&quot;language-text&quot;&gt;npm i -g sass-graph-viz&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Then use it in your terminal:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ sassgraphviz --help
  Usage: sassgraphviz [options] &amp;lt;target&amp;gt;

  Options:
    -e, --exclude-externals  Omit files that are not under given target
    -s, --simple             Generate a simpler visualization (not recommended for complex graphs)
    -p, --port &amp;lt;port&amp;gt;        Port to use [3000]
    -h, --help               Output usage information

  Examples:
    sassgraphviz assets/scss
    sassgraphviz .
    sassgraphviz main.scss
    sassgraphviz main.scss -s -e -p 3001&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Alternatively, you can use the alias &lt;code class=&quot;language-text&quot;&gt;sgv&lt;/code&gt; if &lt;code class=&quot;language-text&quot;&gt;sassgraphviz&lt;/code&gt; is too cumbersome to type.&lt;/p&gt;
&lt;h2 id=&quot;how-is-this-built&quot;&gt;&lt;a href=&quot;#how-is-this-built&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How is this built?&lt;/h2&gt;
&lt;p&gt;It’s merely a plug of something that generates the dependency graph (sass-graph) and a graph rendering library. It exposes a CLI for convenient usage, and uses the browser to render the graph.&lt;/p&gt;
&lt;p&gt;For graph rendering, I first went for &lt;a href=&quot;https://github.com/mdaines/viz.js&quot;&gt;viz.js&lt;/a&gt; because the API was simple and the result looked great.&lt;/p&gt;
&lt;p&gt;The core idea of sass-graph-viz is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Expose a CLI command to get the path to the directory I want to parse&lt;/li&gt;
&lt;li&gt;Delegates to sass-graph the generation of dependencies graph&lt;/li&gt;
&lt;li&gt;Translate sass-graph’s Graph into my own &lt;code class=&quot;language-text&quot;&gt;Graph&lt;/code&gt; model&lt;/li&gt;
&lt;li&gt;Delegates to viz.js the rendering of the &lt;code class=&quot;language-text&quot;&gt;Graph&lt;/code&gt; in the browser&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 450px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 175.99999999999997%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAYAAACU9ioYAAAACXBIWXMAABYlAAAWJQFJUiTwAAADc0lEQVRIx6VWi1baQBD1///JVgsCR5LykISqpVUegUAiD3kl+7id2SSIBaK0OWdOltndm5mde2e5QM6jtT7Lz8/FqQ3ZJik14kgak+LNfwr0Q8BRP8ZkBIRjHgvEW/WvgGZkgCqVe9Tqv+AN4v8HDHyNRr2LZrOL4eCMCPfPZj9ln6IaDTT8IRkDRurgWPbBTwAqKJUYP0EQYuyPzTjzfwiYl8ZyucR8Pv8UhQ4iFELgpljEzc0NqtUqSvS2bRuWZePu7g4W+0olVC0LURQdRvh32CIWcFotKkQDjuNSMZoGpNVy4Lpt1Gs11Gp1Ax5F8cFxXXzEfH7W6xVeXxf4jKp2EbIKtmuJzUpgvYyNrV4jKAm4rQdUShY0jdmXzfPazUpC7FV+B/gyERh5GrMXYMoWki9Ixv5QGQ7Op6kvTI3mJj7ZUDAa9FuE2ixuNnpUjDsqxk+yBzp8B7e3D3R+fUPscqWNRuPZ+CzrEcVCA/X6s/mITim2A5yFGg/3IcpllyrYMYBmI4E7jkcbn/Ct0IT9vYOrqxp9uGU+3nKGCCcHgCBAgfEwiZTTnqVpzUxaCuORNHPTIJ0nm5MFxPfAFyYovQ+o1FubyizaClOI8SigM/RNgeIt6/n9OiU/TRu9o81qtUw9+nO02W8KbJmOXcdBoVDE5eWlGWfZ/L3+aITHFg36fVRvqwT4Bb1u9+S6XYR5jSHzrSjl5fI19ancBnEQIStGxGpXFH7ufzxSlLYZs4/n2Y7dMe8ApSBF9KihekyFRAVMi2FfU5U10YorTsqheb5n+k+CPqDyAGmTF+HrVxuFYgPXVzaur2t0p7QN0ZncpbJjlFOuuOg9b0jHOh/Q92Ji/8BIjOVVp7fjeiRDF+22b0CbzR4su2MA4zxAJigLnaX0MklUweZ7ktKVxsfGN6HxU8PY7zQn7xQllTEppPGFId0p40mahUzmyLTai+59hMepk/2eTqd0UQW5a07SZp+smfQWizlms+k734fEPpZ6tBFm/w/3EbeVhIfbtTDSOyWGk4DML68rsZjBdGuP/uNw+xr2JJYLeS4gqYVuyM7jHJdfqoYqtv2TOOji6Yk6zyJZcxZgTIC/O0tD4FrtNyoEVqQu3X3eEqA6FzBJedSnLj1LOzelyyn7niJAef4Z8pv/GHFhoo1M30m31jlF+QNHkpjzGNOv7wAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;graph core idea&quot;
        title=&quot;&quot;
        src=&quot;/static/graph-core-idea-bc4c3d421000b69878f99d28bb1672a8-b0fbe.png&quot;
        srcset=&quot;/static/graph-core-idea-bc4c3d421000b69878f99d28bb1672a8-bd530.png 240w,
/static/graph-core-idea-bc4c3d421000b69878f99d28bb1672a8-b0fbe.png 450w&quot;
        sizes=&quot;(max-width: 450px) 100vw, 450px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Now you might wonder: what’s the point in parsing sass-graph outputs into another &lt;code class=&quot;language-text&quot;&gt;Graph&lt;/code&gt; model?&lt;/p&gt;
&lt;p&gt;I’d say this is the heart of the lib. This is my domain. Now, it’s probably really thin and might feel &lt;em&gt;useless&lt;/em&gt;, but I have a few arguments in favor of this choice:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The rendering lib doesn’t need all of the details sass-graph generates in its “Graph” modelling.&lt;/li&gt;
&lt;li&gt;The “Graph” from sass-graph doesn’t quite fit the rendering lib expected format anyway. A parsing is necessary at some point.&lt;/li&gt;
&lt;li&gt;Maybe I’ll swap sass-graph for another tool, if I found a better one. If so, I’d better not tie the rendering lib to sass-graph implementation.&lt;/li&gt;
&lt;li&gt;I don’t know yet all the features I’ll need to implement with the rendered graph. I don’t want to be limited by sass-graph capacity.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I quickly got it working for simple structures with viz.js. It helped me set up the architecture of the solution, exposing a CLI command to generate the graph.&lt;/p&gt;
&lt;p&gt;For example, running &lt;code class=&quot;language-text&quot;&gt;sass-graph-viz assets/scss/&lt;/code&gt; would produce following result:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 822px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 68.61313868613139%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAABXklEQVQ4y32TW8+CMAyG+f8/ysR7LrwzRsADkQjiWSNyqnmalOzD+TVZNrru3dN2BH3fC+bOtr7f7zqu16tUVfW177NgLOSK3W43ieNYsiyT4/EoTdN4Y78E3dF1nW5AtNvtZL1eS5qmKmo2PuP6At9NbdvK4XCQx+Oh6dZ1rbRQ2oWuuRqBOd/vt6Z0uVwkz3MVwWazmZRlOVBzkaXPtwujhNCcTiclYJ5Op0pIMOJRFKkIa+jYm0wmUhSFPJ9P9ZPFQGhi1Gmz2WgQAVCQMj72oObw+XxWOmo6n891Hz8aKkiqiO73ex0cgARhyPAhyJpYBiWwRtlFkA81tFTM6TaHVLjdCLDX66UZWMyfGo477HsO2GKxkNVqpRmEYfjzZ/h6h74giEiPN7ndbiVJEvX5zgRjEt/bon78OczL5VLXdNnepHv2p6Dro6s0jroxM2iO79/+l3DsHzfOB/EBYDNCcjWWorIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;simple graph&quot;
        title=&quot;&quot;
        src=&quot;/static/simple-graph-f77f5025b5b613c1d7604fd5a82a28dd-18c80.png&quot;
        srcset=&quot;/static/simple-graph-f77f5025b5b613c1d7604fd5a82a28dd-fd329.png 240w,
/static/simple-graph-f77f5025b5b613c1d7604fd5a82a28dd-51707.png 480w,
/static/simple-graph-f77f5025b5b613c1d7604fd5a82a28dd-18c80.png 822w&quot;
        sizes=&quot;(max-width: 822px) 100vw, 822px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h2 id=&quot;but-my-graphs-are-more-complex-than-that&quot;&gt;&lt;a href=&quot;#but-my-graphs-are-more-complex-than-that&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;But my graphs are more complex than that!&lt;/h2&gt;
&lt;p&gt;Otherwise, I wouldn’t have needed this tool anyway.&lt;/p&gt;
&lt;p&gt;I moved to more realistic examples, running the tool against the codebase I was working on. There I confirmed I needed a better rendering lib to handle complex graphs.&lt;/p&gt;
&lt;p&gt;I found &lt;a href=&quot;http://visjs.org/&quot;&gt;vis.js&lt;/a&gt; − yeah, the one-letter difference is subtle. The lib showcases very cool, interactive graphs and the API looked nice. It was the solution I was looking for!&lt;/p&gt;
&lt;p&gt;As the graph generation, the domain and the rendering were independent, is was really just about plugging another rendering adapter. One that would do the rendering with vis.js.&lt;/p&gt;
&lt;p&gt;I enhanced the CLI a bit so vis.js became the default rendering lib and viz.js would be opt-in (with the &lt;code class=&quot;language-text&quot;&gt;-s, --simple&lt;/code&gt; option). I also provided a shorthand alias, so I wouldn’t need to type &lt;code class=&quot;language-text&quot;&gt;sassgraphviz&lt;/code&gt; every time.&lt;/p&gt;
&lt;p&gt;At that point, running &lt;code class=&quot;language-text&quot;&gt;sgv assets/scss/&lt;/code&gt; on previous example would produce following graph:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 784px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 59.43877551020408%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABWUlEQVQoz5WTX0vDMBTF+7kFHwQRRJhMFHwQ/AoFn3wQBHUboqyCTGWMIWxs6/51Nm1ZbtJjk9qadXXMS0PSm/DLPfe0FpKI4zgfKvpBD4+DBjpeG0kW+jH2N4VVBrzq2ti/2cPl8wUY95GdMec/gcWDXC4REEMUhwiXIZjPVi4sGzKWeqh1XqGSpZKBYGu3cs6xbVimhDlNUWxBtu95HlzX1XBdlZQQJMCWDK3ZKz7mb4k6nlYYUICXaRP3o1uIWKCsr47jwLZtDVU5EgQeEd4nLVTqRzipVTAMBymwMarh8O4A1YdjfPpdDVDyzd5GUQTGWKkpC+6Bkf/rspAC48jF06wOkjwHptAfeULkgLKWZPmVHmqHlSlmEcmaiNYAmZFFeO5yJpEkaegXLTDhY/SnPQ3c9lu0zFszqIKdO6fYvd7BWaOq302p//5T1DxkA3TmbT0XDdoU3yDMpcAuZ5XGAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;graph&quot;
        title=&quot;&quot;
        src=&quot;/static/graph-47b11755a0e01f2545b784d352084143-949f9.png&quot;
        srcset=&quot;/static/graph-47b11755a0e01f2545b784d352084143-101f6.png 240w,
/static/graph-47b11755a0e01f2545b784d352084143-bee96.png 480w,
/static/graph-47b11755a0e01f2545b784d352084143-949f9.png 784w&quot;
        sizes=&quot;(max-width: 784px) 100vw, 784px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Few things to say here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unlike previous graph, this one is interactive. You can zoom, select and move nodes, as showcased in demo gif.&lt;/li&gt;
&lt;li&gt;We visually distinct regular Sass files (e.g. &lt;code class=&quot;language-text&quot;&gt;main.scss&lt;/code&gt;) from partials (e.g. &lt;code class=&quot;language-text&quot;&gt;_header.scss&lt;/code&gt;). Partials are meant to be imported. I thought the distinction would be interesting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And here’s where the separation of the domain started to pay off: I realised that I could add features to my graph, so it would be more useful. Identifying partial files is not the role of sass-graph, nor the one of the rendering lib. This belongs to the domain I created here. That also means it can be unit tested really easily: no need to manipulate actual Sass files, nor to spy on the browser.&lt;/p&gt;
&lt;h2 id=&quot;features-i-want-moar&quot;&gt;&lt;a href=&quot;#features-i-want-moar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Features, I want moar!&lt;/h2&gt;
&lt;p&gt;From usage, I noticed few quirks that I fixed. I also identified (and implemented) useful features.&lt;/p&gt;
&lt;p&gt;The first one is the ability to exclude “external files” from the rendered graph. By “external files” I mean files that are outside the scope of the target folder. For example, we do import some source files from Bootstrap package which lives in &lt;code class=&quot;language-text&quot;&gt;node_modules/&lt;/code&gt; − which is probably not the best idea, but these things happen. As I certainly can’t change all of these Bootstrap Sass files, I’d prefer they don’t show up and clutter my graph. I want to think about what I &lt;em&gt;can&lt;/em&gt; change.&lt;/p&gt;
&lt;p&gt;So here it is: &lt;code class=&quot;language-text&quot;&gt;sgv -e assets/scss/&lt;/code&gt; will omit these external nodes from the generated graph.&lt;/p&gt;
&lt;p&gt;Another feature from sass-graph-viz is the ability to focus on a file only. It’s very handy to only see a subset of the Sass files, the ones that are linked to a specific file. Intuitively, &lt;code class=&quot;language-text&quot;&gt;sgv assets/scss/core.scss&lt;/code&gt; does the trick and focus on &lt;code class=&quot;language-text&quot;&gt;core.scss&lt;/code&gt; dependencies (parents and children) only.&lt;/p&gt;
&lt;p&gt;The last feature I wanted to highlight is the guidance the tool can provide. After all, since it computes the dependency graph of my Sass files, it could certainly detect suspicious patterns. One I identified was “the orphan partial” pattern. An “orphan partial” is a partial file that doesn’t have a parent. Which is weird, as partials are meant to be imported. These are likely dead code we can remove. And it paid off: I was able to detect some of them in our codebase, and get rid of these unused files!&lt;/p&gt;
&lt;p&gt;Typically, the tool would render suspicious nodes in red, like so:&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 45.56451612903226%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA9klEQVQoz51SywrCMBDM/x/04AcoiKce/AkPFhGKYLVa76W1Ldrah2kydgMVk/oAF5awm8zszm4Y/jQppTqbqkK83SL2PEjOwX6BOiCdQgotJquiCM54DGc2Q5PnOqFJYILN7sw8GXsFqwdSj6krsuv9Aj89ouC3Humrs171D/LX4Qqj5RD7yFVxV6hHqC7bwfIsgxQNvcQtDTE/WJhuJvAuLvImUwTkZVHqigzpDO1mPMvCYjBA6Dh0izIMcIoP2J1dlLzQWldjEKI3zychJao0RREE6gt823YHzlo1vu+jrus3HX4AdxLfbT1JEti2jbz9JibhAxsEvwpy8YY6AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;orphan nodes&quot;
        title=&quot;&quot;
        src=&quot;/static/orphan-nodes-dfed4e1542a62f05391030e2b7f5180d-c83f1.png&quot;
        srcset=&quot;/static/orphan-nodes-dfed4e1542a62f05391030e2b7f5180d-569e3.png 240w,
/static/orphan-nodes-dfed4e1542a62f05391030e2b7f5180d-93400.png 480w,
/static/orphan-nodes-dfed4e1542a62f05391030e2b7f5180d-c83f1.png 960w,
/static/orphan-nodes-dfed4e1542a62f05391030e2b7f5180d-da6c5.png 992w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h2 id=&quot;this-was-fun&quot;&gt;&lt;a href=&quot;#this-was-fun&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;This was fun&lt;/h2&gt;
&lt;p&gt;I had a great time building this little tool. So far, it was useful to understand the relationship between all of these Sass files. It might become useless when we’ll solve the root cause of this mess, but it’s a handy tool to work with a complicated Sass codebase.&lt;/p&gt;
&lt;p&gt;I hope it might be useful to you, if you face such situation. If you do, let me know about it!&lt;/p&gt;
&lt;p&gt;If you have any comment, I’ll be happy to reply here or directly on &lt;a href=&quot;https://github.com/nicoespeon/sass-graph-viz/issues&quot;&gt;GitHub issues&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;PS: If you’re into &lt;a href=&quot;http://fideloper.com/hexagonal-architecture&quot;&gt;Hexagonal Architecture&lt;/a&gt;, what I described may sounds like ports &amp;#x26; adapters. It is. Just, I didn’t made interfaces &amp;#x26; the hexagon explicit yet (functions and types were simple enough to do so).&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Git rebase onto]]></title><description><![CDATA[Une histoire à propos de cette commande utile.]]></description><link>https://www.nicoespeon.com/fr/2018/07/git-rebase-onto/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2018/07/git-rebase-onto/</guid><pubDate>Thu, 19 Jul 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;C’est jeudi.&lt;/p&gt;
&lt;p&gt;Le Sprint M a commencé lundi, sous les applaudissements rituels qui ponctuent chaque daily standup. Le backlog de cette itération te semblait ambitieux, trop optimiste, plein à craquer. Une nouvelle montagne que l’équipe s’attelait à dépecer méthodiquement, morceau par morceau, pour former progressivement un nouveau tas dans la colonne “Done”. La montagne s’écoule à présent dans chaque colonne du flow. Chaque story affiche la tête de la personne − souvent un développeur − qui travaille actuellement dessus. Le tout forme une chaîne, les stories s’écoulent de gauche à droite, portées par les membres de l’équipe…&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Comme des fourmis qui ramènent des provisions dans la fourmilière.
Tu voudrais t’attarder sur cette métaphore, mais Ahmed te ramène à la réalité : « Pour la code review que tu m’as demandé : c’est bon si je te fais ça à 15 h ? J’ai pas vraiment de temps avant… »&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tu fronces les sourcils :&lt;/p&gt;
&lt;p&gt;« Hmmmm j’veux bien mais ça m’embête un peu. La prochaine feature que je dois attaquer dépend de ces changements alors… Ça me bloque.&lt;/p&gt;
&lt;p&gt;− J’comprends, mais je peux vraiment pas le faire avant. Et je voudrais pas faire ça à l’arrache non plus.&lt;/p&gt;
&lt;p&gt;− OK, va pour 15 h !&lt;/p&gt;
&lt;p&gt;− Et puis t’as qu’à commencer à partir de cette branche. Tu rebaseras après.&lt;/p&gt;
&lt;p&gt;− Comment ça ?&lt;/p&gt;
&lt;p&gt;− Ben t’as qu’à commencer à partir de cette branche. Tu crées une nouvelle branche à partir de celle-ci, et tu travailles dessus.&lt;/p&gt;
&lt;p&gt;− Heuuuuu… Oui, mais non. Si je fais ça, je vais avoir tous les changements des 2 branches dans le diff de la PR. On va s’emmêler les pinceaux !&lt;/p&gt;
&lt;p&gt;− Fais-moi confiance. Crée une nouvelle branche, travaille dessus et on verra toute à l’heure comment gérer ça.&lt;/p&gt;
&lt;p&gt;− Si tu le dis… Merci. »&lt;/p&gt;
&lt;p&gt;Tu te retournes vers ton écran pendant qu’Ahmed se dirige, le pas pressé, vers la salle de réunion, son ordinateur sous le bras. Tu hésites encore un peu.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ma foi, tant pis.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;
  &lt;img src=&quot;/create-branch-command-f7174dd46e5198d9f484c77d95126208.gif&quot; alt=&quot;Cr&amp;#xE9;ation de la branche&quot;&gt;
  &lt;figcaption&gt;Cr&amp;#xE9;ation de la branche `feat/dynamic-campaigns`&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;p&gt;15 h 30. Tu reçois la notification qui t’annonce que ta PR a été approuvée. Un sentiment de satisfaction dessine un sourire sur ton visage. Au même moment, Ahmed fait rouler sa chaise jusqu’à ton poste.&lt;/p&gt;
&lt;p&gt;« Legit to me. Beau boulot sur la feature, j’ai rien trouvé à redire, c’était limpide !&lt;/p&gt;
&lt;p&gt;− C’était une petite PR aussi, ça aide.&lt;/p&gt;
&lt;p&gt;− C’est sûr. En tout cas, tu peux merger.&lt;/p&gt;
&lt;p&gt;− Yep, j’étais en train de le faire eeeeet… C’est fait !&lt;/p&gt;
&lt;p&gt;− Top ! »&lt;/p&gt;
&lt;p&gt;Alors qu’il s’apprête à faire rouler sa chaise dans le sens opposé, tu le rattrapes.&lt;/p&gt;
&lt;p&gt;« Attends une minute. J’ai créé une branche comme tu m’as dit. J’ai commit dessus, mais maintenant elle part de l’autre branche, celle qui est mergée.&lt;/p&gt;
&lt;p&gt;− C’est pas un problème. Faut que tu la rebase sur master.&lt;/p&gt;
&lt;p&gt;− Et comment je fais ça s’il te plaît ?&lt;/p&gt;
&lt;p&gt;− C’est pas sorcier tu vas voir. Montre-moi ton historique git pour commencer.&lt;/p&gt;
&lt;p&gt;− Voilà. »&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/git-history-46ab8f3f3d49b00cb574a72dd81aa69b-3c5ba.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 890px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 42.47191011235955%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsSAAALEgHS3X78AAABTklEQVQY05WP20vCYBjG97d12wHMG+miP6GLLjrQTRdZkFhRSHaAcBYICW6aHSxQWWA6NbULJd2cXygWm7ituYN935oRESFRP16eiwee931ejAxHXC43QYbN/4BME5omViiWFhaXVpxrWTrXajYbHAcajScAmFotRJDlcgUAwH2HrXPtdiFwCgJBDELI80KpUrmlM6Km8pIoSJIgy7zYrdYY5VXp67quab0vFEU1DIFhu49VzOqgG8Zs8MR25LEf7thw7yTuHfVuTvn3njsdq5usqxp8G1p+EEYIqYYu9ZRUlnaeExtXkfUosZ2Itdg6TsX3qaQ/fTfsb4T9cCBCEKKBWisR1I1+nskdx3zxh5tcPWNNlkmnq6kCm/+8/BvQxBMHy6H5Od/MtMfu2B1zbI1PuEbcZ6t/CH88ZWlPVKliMkqT1/mLy/sIL79Y5jvgGqTvawvpwgAAAABJRU5ErkJggg==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Historique git&quot; title=&quot;&quot; src=&quot;/static/git-history-46ab8f3f3d49b00cb574a72dd81aa69b-3c5ba.png&quot; srcset=&quot;/static/git-history-46ab8f3f3d49b00cb574a72dd81aa69b-fcb28.png 240w,
/static/git-history-46ab8f3f3d49b00cb574a72dd81aa69b-0aff0.png 480w,
/static/git-history-46ab8f3f3d49b00cb574a72dd81aa69b-3c5ba.png 890w&quot; sizes=&quot;(max-width: 890px) 100vw, 890px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Historique git, `feat/dynamic-campaigns` partant de `feat/create-campaigns`&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;« Bon, tu vois le dernier commit de master ? C’est la branche que tu viens de merger. On applique une stratégie de “squash and merge”, donc ta feature devient un seul commit sur master.&lt;/p&gt;
&lt;p&gt;− J’ai jamais trop compris pourquoi on faisait ça d’ailleurs…&lt;/p&gt;
&lt;p&gt;− C’est un autre débat. Pour te la faire courte, certains préfèrent le côté unitaire de “1 commit = 1 feature”. En pratique, vu que nos branches sont assez courtes, ça passe. Et master est toujours stable.&lt;/p&gt;
&lt;p&gt;− Mouais… M’enfin j’ai lu que c’était mieux de garder l’historique.&lt;/p&gt;
&lt;p&gt;− Peut-être. En tout cas, c’est notre convention pour le moment. Si tu veux la challenger, propose le sujet pendant l’atelier tech, demain.&lt;/p&gt;
&lt;p&gt;− OK.&lt;/p&gt;
&lt;p&gt;− Bref, ce que tu veux faire toi, c’est prendre cette branche feat/dynamic-campaigns en vert, et la déplacer pour la faire partir de master.&lt;/p&gt;
&lt;p&gt;− Hmmmmm… Oui c’est ça.&lt;/p&gt;
&lt;p&gt;− Et pour ça, il va falloir utiliser &lt;code class=&quot;language-text&quot;&gt;git rebase&lt;/code&gt;. Il y a une option “onto” qui te permets de faire exactement ça.&lt;/p&gt;
&lt;p&gt;− Genre “rebase onto master” ?&lt;/p&gt;
&lt;p&gt;− Un truc comme ça oui, regarde. »&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/rebase-5645284cef21eb1f61edc3bb4845c27a.gif&quot; alt=&quot;Rebasage de la branche&quot;&gt;
  &lt;figcaption&gt;Rebase de la branche depuis l&amp;#x2019;ancien parent sur master
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Perplexe, tu essaies de comprendre ce qu’il vient de se passer :&lt;/p&gt;
&lt;p&gt;« Attends une minute, tu peux m’expliquer ?&lt;/p&gt;
&lt;p&gt;− Bien sûr. La commande &lt;code class=&quot;language-text&quot;&gt;git rebase&lt;/code&gt; peut prendre un paramètre “onto” quand tu veux faire des choses un peu moins classiques. Et “onto” accepte 3 arguments.&lt;/p&gt;
&lt;p&gt;− Le premier c’est &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;. C’est la branche d’arrivée ?&lt;/p&gt;
&lt;p&gt;− Exact ! C’est la référence du nouveau parent de la branche que tu rebase. Ensuite, tu précises la référence de l’ancien parent de la branche en question : feat/create-campaigns dans ton cas.&lt;/p&gt;
&lt;p&gt;− Mais, on ne l’avait pas merge celle-là ?&lt;/p&gt;
&lt;p&gt;− Sur origin oui. En local, non. Rappelles-toi de ton historique git, tu as toujours cette branche-là sur ta machine.&lt;/p&gt;
&lt;p&gt;− OK je vois. Donc nouveau parent, puis ancien parent…&lt;/p&gt;
&lt;p&gt;− Et enfin, la référence de la branche que tu veux rebase. En pratique d’ailleurs, n’importe quelle référence de commit fonctionne. Mais généralement, on manipule les branches.&lt;/p&gt;
&lt;p&gt;− C’est plus pratique.&lt;/p&gt;
&lt;p&gt;− Ouais. D’ailleurs, le dernier argument est optionnel. Si tu ne le donnes pas, il prendra &lt;code class=&quot;language-text&quot;&gt;HEAD&lt;/code&gt; comme référence. Mais bon, je préfère être explicite, ça fait moins de surprises. »&lt;/p&gt;
&lt;p&gt;Tu acquiesces tout en affichant à nouveau l’historique git pour visualiser le résultat :&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/git-history-after-rebase-22991ff0dc27e078ba87db3cd5ca88ee-b3064.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 930px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 40.43010752688172%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsSAAALEgHS3X78AAABSUlEQVQY041QW0sCYRDdH9drUUggRPQrutBjD1I+ibZq0YXoIUu0xC4qrqhlD5VbumqYpq27La0XVtNkd7++2bb1RZGgw5lhGM6ZGYaIJ5Kkyx2lYtrfAIPjIBgmt7i0YrGsM1nmQxD4Wk2nKAiZx6dQOMJzHFcXMxdXgj/wK8d4xAwAkiTRhXwyfS/J/Xqn3ei0m70uL4ocz2MV6aLWG1u8SRk3jFxA6KGo6vKpx3ywZdpxTO2T03vkBGldDZwAQo1et97tqADlcklRFdAAAx5QrwljHCCMZVm+pdOOWGj7mrKFzy+zNFepOBNRdzxaklpKu9/7/BqIRzaP/QeGf4WQGnzwuyK2LcoezPkCGe8Z7T2+OyywOWLUBcMZGwX6Rr6UZ5dybhytzdtNc/YZs3VyYXP2mc0T2r8BilYVXkt8sfz+wjareucHHzmqSm6yK8oAAAAASUVORK5CYII=&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Historique git apr&amp;#xE8;s rebase&quot; title=&quot;&quot; src=&quot;/static/git-history-after-rebase-22991ff0dc27e078ba87db3cd5ca88ee-b3064.png&quot; srcset=&quot;/static/git-history-after-rebase-22991ff0dc27e078ba87db3cd5ca88ee-55094.png 240w,
/static/git-history-after-rebase-22991ff0dc27e078ba87db3cd5ca88ee-3e74a.png 480w,
/static/git-history-after-rebase-22991ff0dc27e078ba87db3cd5ca88ee-b3064.png 930w&quot; sizes=&quot;(max-width: 930px) 100vw, 930px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Historique git apr&amp;#xE8;s rebase de la branche&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;« Hé, ça a marché ! C’est comme si la branche était partie de &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; !&lt;/p&gt;
&lt;p&gt;− C’était le but.&lt;/p&gt;
&lt;p&gt;− Merci beaucoup ! Je vais noter l’astuce dans un coin.&lt;/p&gt;
&lt;p&gt;− Tout le plaisir était pour moi ! »&lt;/p&gt;
&lt;p&gt;Concluant sur cette tirade, Ahmed s’élance à nouveau pour tenter de rejoindre son bureau d’un seul coup. Raté. Pendant qu’il piétine pour rouler le dernier mètre qui le sépare de son poste, tu finis de nettoyer ta branche locale qui n’a plus vraiment de raison d’être.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Adieu.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;
  &lt;img src=&quot;/deleting-branch-3bf003702cd2cae25738cbaf5b01a4c0.gif&quot; alt=&quot;Suppression de la branche&quot;&gt;
  &lt;figcaption&gt;Suppression de la branche `feat/create-campaigns`&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Le sourire aux lèvres, tu jettes un coup d’œil à l’historique git.&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/final-git-history-c952b3ce027c861f77578d43901d8212-9e60d.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 566px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 43.109540636042404%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsSAAALEgHS3X78AAABYElEQVQoz2M4ePDQ0aPHDhw4dPbsuf/////9+xdI/vv3D4j/EwIMcfFJsfFJUTFxre0dEM3/QFr///hPGDBcvHipqKSsp7e3rr5x+YpVq1aumr9sxd55C84GRn559w5hHAYAaf79+/eyFSv37d8P1Lli5aq1a9YuWLHyxJq1uzz83jx/DvUCLpsx5SAit589P3XizJ/vf75++vbl45evH7+BGJ++fv0MIr9/+QFUxgBRDXHb7z+/gdwtxzcGTHKOnxkYNNEtbUVE7OzA9OUxGWuikheEpyyKSJwXmrwwPGVe5Mt3LxmQ7fz7DxTUp2+cbFpT2bO5tWVVTf6M9NbVtdFTA4qXZKZMj0qaEpkzNSWky6tvQ/uHT+8Z8AQm0C23rt/etm5H2rLISat7y+blVq8q7p7fXrgt+fsnUGwwYNXz5+8fCIJE9/O3z798//L+0/u3H998/f712ZunQDcCpQCctcd7N1t2ggAAAABJRU5ErkJggg==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Historique git final&quot; title=&quot;&quot; src=&quot;/static/final-git-history-c952b3ce027c861f77578d43901d8212-9e60d.png&quot; srcset=&quot;/static/final-git-history-c952b3ce027c861f77578d43901d8212-9f1de.png 240w,
/static/final-git-history-c952b3ce027c861f77578d43901d8212-38bf7.png 480w,
/static/final-git-history-c952b3ce027c861f77578d43901d8212-9e60d.png 566w&quot; sizes=&quot;(max-width: 566px) 100vw, 566px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Historique git final&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;C’est propre.&lt;/p&gt;
&lt;p&gt;Tu regardes ta montre. 15 h 45. Tu ouvres à nouveau ton éditeur en te disant que tu as encore le temps d’avancer un peu.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Une story traitée de plus. Comme les fourmis…&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[Git rebase onto]]></title><description><![CDATA[A story about this useful command.]]></description><link>https://www.nicoespeon.com/en/2018/07/git-rebase-onto/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2018/07/git-rebase-onto/</guid><pubDate>Thu, 19 Jul 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Thursday.&lt;/p&gt;
&lt;p&gt;Sprint M started this Monday, just after the usual round of applause that ends every daily standup. When you looked at the backlog, you found it a bit ambitious, too optimistic, greedy. A new mountain the team started to tear apart methodically, piece by piece, progressively stacking these pieces under the “Done” column. The mountain was now bleeding through each column of the flow. Each story shows the head of the person − usually a developer − currently working on it. The whole thing is a chain, stories flowing from left to right, carried by the members of the team…&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Just like ants carry food to the anthill.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You’d like to think about the metaphor a bit longer, but Ahmed brings you back to reality: “About the code review you asked me: is it OK if I do it at 3? I don’t really have time before…”&lt;/p&gt;
&lt;p&gt;You frown:&lt;/p&gt;
&lt;p&gt;“Well, why not but it’s inconvenient for me. The new feature I need to work on depends on these changes so… I’m blocked now.”&lt;/p&gt;
&lt;p&gt;“I get that, but I really can’t do that sooner. And I wouldn’t like to scamp it neither.”&lt;/p&gt;
&lt;p&gt;“OK, go for 3pm!”&lt;/p&gt;
&lt;p&gt;“Anyway, you are not blocked. Just start from the current branch. You’ll rebase later.”&lt;/p&gt;
&lt;p&gt;“How’s that?”&lt;/p&gt;
&lt;p&gt;“Well, just start from the current branch. You create a new branch from this one and you work on it.”&lt;/p&gt;
&lt;p&gt;“Thanks but… no. Look, if I do that, the PR diff will contain changes from both branches. It’ll be a mess!”&lt;/p&gt;
&lt;p&gt;“Trust me. Create a new branch, work on it and we’ll figure this out later together.”&lt;/p&gt;
&lt;p&gt;“If you say so… Thanks.”&lt;/p&gt;
&lt;p&gt;You turn back to your screen while Ahmed heads rapidly toward the meeting room with his laptop. You still hesitate.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Damn it. Let’s do that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;
  &lt;img src=&quot;/create-branch-command-f7174dd46e5198d9f484c77d95126208.gif&quot; alt=&quot;Creating the branch&quot;&gt;
  &lt;figcaption&gt;Creating `feat/dynamic-campaigns` branch&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;p&gt;15:30. You get the notification telling your PR has been approved. Satisfaction makes you smile. In the same time, Ahmed rolls his chair to your desk.&lt;/p&gt;
&lt;p&gt;“Legit to me. Nice job on this feature, nothing I could think of. Neat!”&lt;/p&gt;
&lt;p&gt;“It was a small PR. It helps.”&lt;/p&gt;
&lt;p&gt;“Sure. Anyway, you can merge it now.”&lt;/p&gt;
&lt;p&gt;“Yup. I was just doing it aaaaaaaand… Done!”&lt;/p&gt;
&lt;p&gt;“Great!”&lt;/p&gt;
&lt;p&gt;As he’s about to roll in the opposite direction, you add:&lt;/p&gt;
&lt;p&gt;“Wait a minute. I created a branch like you told me. I did a few commits on it. But now it’s starting from the other branch, the one I merged.”&lt;/p&gt;
&lt;p&gt;“Not a problem. You need to rebase it on &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;.”&lt;/p&gt;
&lt;p&gt;“And how am I supposed to do that?”&lt;/p&gt;
&lt;p&gt;“It’s not a big deal. Let’s see. First, show me you git log.”&lt;/p&gt;
&lt;p&gt;“There you go!”&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/git-history-46ab8f3f3d49b00cb574a72dd81aa69b-3c5ba.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 890px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 42.47191011235955%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsSAAALEgHS3X78AAABTklEQVQY05WP20vCYBjG97d12wHMG+miP6GLLjrQTRdZkFhRSHaAcBYICW6aHSxQWWA6NbULJd2cXygWm7ituYN935oRESFRP16eiwee931ejAxHXC43QYbN/4BME5omViiWFhaXVpxrWTrXajYbHAcajScAmFotRJDlcgUAwH2HrXPtdiFwCgJBDELI80KpUrmlM6Km8pIoSJIgy7zYrdYY5VXp67quab0vFEU1DIFhu49VzOqgG8Zs8MR25LEf7thw7yTuHfVuTvn3njsdq5usqxp8G1p+EEYIqYYu9ZRUlnaeExtXkfUosZ2Itdg6TsX3qaQ/fTfsb4T9cCBCEKKBWisR1I1+nskdx3zxh5tcPWNNlkmnq6kCm/+8/BvQxBMHy6H5Od/MtMfu2B1zbI1PuEbcZ6t/CH88ZWlPVKliMkqT1/mLy/sIL79Y5jvgGqTvawvpwgAAAABJRU5ErkJggg==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Git history&quot; title=&quot;&quot; src=&quot;/static/git-history-46ab8f3f3d49b00cb574a72dd81aa69b-3c5ba.png&quot; srcset=&quot;/static/git-history-46ab8f3f3d49b00cb574a72dd81aa69b-fcb28.png 240w,
/static/git-history-46ab8f3f3d49b00cb574a72dd81aa69b-0aff0.png 480w,
/static/git-history-46ab8f3f3d49b00cb574a72dd81aa69b-3c5ba.png 890w&quot; sizes=&quot;(max-width: 890px) 100vw, 890px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Git history, `feat/dynamic-campaigns` starting from `feat/create-campaigns`&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;“See the last commit on &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;? This is the branch you merged. We use the “squash and merge” strategy, so your feature became a single commit on &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;.”&lt;/p&gt;
&lt;p&gt;“I never get that part. Like, why are we doing that anyway?”&lt;/p&gt;
&lt;p&gt;“This is another debate. In short, some prefers the fact that “1 commit = 1 feature”. Technically, because our branches are quite short-lived, it works. Thus, &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; is always stable.”&lt;/p&gt;
&lt;p&gt;“Yeah… But I’ve read that it’s better to keep the actual history.”&lt;/p&gt;
&lt;p&gt;“Maybe. Anyway, this is our convention for now. If you want to change it, go ahead and propose the subject during tomorrow’s tech meeting.”&lt;/p&gt;
&lt;p&gt;“OK.”&lt;/p&gt;
&lt;p&gt;“Back to what you want to do. You want to take the green branch &lt;code class=&quot;language-text&quot;&gt;feat/dynamic-campaigns&lt;/code&gt; and move it so it starts from &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;.”&lt;/p&gt;
&lt;p&gt;“Hmmmm… yeah, that’s it.”&lt;/p&gt;
&lt;p&gt;“To do that, you need to use &lt;code class=&quot;language-text&quot;&gt;git rebase&lt;/code&gt;. There is an option called “onto” which does exactly that.”&lt;/p&gt;
&lt;p&gt;“Like rebase onto &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;?”&lt;/p&gt;
&lt;p&gt;“Kind of. Look.”&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/rebase-5645284cef21eb1f61edc3bb4845c27a.gif&quot; alt=&quot;Rebasing the branch&quot;&gt;
  &lt;figcaption&gt;Rebasing the branch from old parent onto master&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Still a bit puzzled, you’re trying to figure out what just happen:&lt;/p&gt;
&lt;p&gt;“Wait a minute. Can you explain?”&lt;/p&gt;
&lt;p&gt;“Sure. You see, &lt;code class=&quot;language-text&quot;&gt;git rebase&lt;/code&gt; can have a parameter called “onto” which is useful in such scenarios. It takes 3 arguments.”&lt;/p&gt;
&lt;p&gt;“So the first one is &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;. That’s the new branch, right?”&lt;/p&gt;
&lt;p&gt;“Right! It’s the reference of the new parent for the what you’re rebasing. Then comes the reference of the old parent: &lt;code class=&quot;language-text&quot;&gt;feat/create-campaigns&lt;/code&gt; in this case.”&lt;/p&gt;
&lt;p&gt;“But… Didn’t we merge this one before?”&lt;/p&gt;
&lt;p&gt;“On origin yes. Locally on your computer, no. Remember your git history? You still have that branch on your machine.”&lt;/p&gt;
&lt;p&gt;“OK, got it. So new parent, then old parent…”&lt;/p&gt;
&lt;p&gt;“Then the reference of the branch you want to rebase. Technically, any commit reference will do. But usually, you work with branches.”&lt;/p&gt;
&lt;p&gt;“It’s more convenient.”&lt;/p&gt;
&lt;p&gt;“Yeah. The last argument is optional. If you don’t provide it, it’ll use HEAD as a reference. But, you know me, I like when things are explicit. Less surprises.”&lt;/p&gt;
&lt;p&gt;You nod while displaying the new git history to visualize what you’ve done:&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/git-history-after-rebase-22991ff0dc27e078ba87db3cd5ca88ee-b3064.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 930px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 40.43010752688172%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsSAAALEgHS3X78AAABSUlEQVQY041QW0sCYRDdH9drUUggRPQrutBjD1I+ibZq0YXoIUu0xC4qrqhlD5VbumqYpq27La0XVtNkd7++2bb1RZGgw5lhGM6ZGYaIJ5Kkyx2lYtrfAIPjIBgmt7i0YrGsM1nmQxD4Wk2nKAiZx6dQOMJzHFcXMxdXgj/wK8d4xAwAkiTRhXwyfS/J/Xqn3ei0m70uL4ocz2MV6aLWG1u8SRk3jFxA6KGo6vKpx3ywZdpxTO2T03vkBGldDZwAQo1et97tqADlcklRFdAAAx5QrwljHCCMZVm+pdOOWGj7mrKFzy+zNFepOBNRdzxaklpKu9/7/BqIRzaP/QeGf4WQGnzwuyK2LcoezPkCGe8Z7T2+OyywOWLUBcMZGwX6Rr6UZ5dybhytzdtNc/YZs3VyYXP2mc0T2r8BilYVXkt8sfz+wjareucHHzmqSm6yK8oAAAAASUVORK5CYII=&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Git history after rebase&quot; title=&quot;&quot; src=&quot;/static/git-history-after-rebase-22991ff0dc27e078ba87db3cd5ca88ee-b3064.png&quot; srcset=&quot;/static/git-history-after-rebase-22991ff0dc27e078ba87db3cd5ca88ee-55094.png 240w,
/static/git-history-after-rebase-22991ff0dc27e078ba87db3cd5ca88ee-3e74a.png 480w,
/static/git-history-after-rebase-22991ff0dc27e078ba87db3cd5ca88ee-b3064.png 930w&quot; sizes=&quot;(max-width: 930px) 100vw, 930px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Git history after rebasing the branch&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;“Hey, it worked! It’s just like the branch started from &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;!”&lt;/p&gt;
&lt;p&gt;“That’s what you asked for.”&lt;/p&gt;
&lt;p&gt;“Thanks a lot! I’m gonna write this done somewhere.”&lt;/p&gt;
&lt;p&gt;“My pleasure.”&lt;/p&gt;
&lt;p&gt;On this final line, Ahmed pushes on his feet to roll back to his desk in a single attempt. Failed. As he tramples to finish rolling, you clean the local branch that has no more reason to be.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bye.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;
  &lt;img src=&quot;/deleting-branch-3bf003702cd2cae25738cbaf5b01a4c0.gif&quot; alt=&quot;Deleting the branch&quot;&gt;
  &lt;figcaption&gt;Deleting `feat/create-campaigns` branch&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;You smile and give another look at the git history.&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/final-git-history-c952b3ce027c861f77578d43901d8212-9e60d.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 566px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 43.109540636042404%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsSAAALEgHS3X78AAABYElEQVQoz2M4ePDQ0aPHDhw4dPbsuf/////9+xdI/vv3D4j/EwIMcfFJsfFJUTFxre0dEM3/QFr///hPGDBcvHipqKSsp7e3rr5x+YpVq1aumr9sxd55C84GRn559w5hHAYAaf79+/eyFSv37d8P1Lli5aq1a9YuWLHyxJq1uzz83jx/DvUCLpsx5SAit589P3XizJ/vf75++vbl45evH7+BGJ++fv0MIr9/+QFUxgBRDXHb7z+/gdwtxzcGTHKOnxkYNNEtbUVE7OzA9OUxGWuikheEpyyKSJwXmrwwPGVe5Mt3LxmQ7fz7DxTUp2+cbFpT2bO5tWVVTf6M9NbVtdFTA4qXZKZMj0qaEpkzNSWky6tvQ/uHT+8Z8AQm0C23rt/etm5H2rLISat7y+blVq8q7p7fXrgt+fsnUGwwYNXz5+8fCIJE9/O3z798//L+0/u3H998/f712ZunQDcCpQCctcd7N1t2ggAAAABJRU5ErkJggg==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Final git history&quot; title=&quot;&quot; src=&quot;/static/final-git-history-c952b3ce027c861f77578d43901d8212-9e60d.png&quot; srcset=&quot;/static/final-git-history-c952b3ce027c861f77578d43901d8212-9f1de.png 240w,
/static/final-git-history-c952b3ce027c861f77578d43901d8212-38bf7.png 480w,
/static/final-git-history-c952b3ce027c861f77578d43901d8212-9e60d.png 566w&quot; sizes=&quot;(max-width: 566px) 100vw, 566px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Final git history&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Clean.&lt;/p&gt;
&lt;p&gt;You look at your watch. 15:45. You open your editor thinking that you still have time to work a bit more on this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Another story processed. Just like ants…&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[TDD with Elixir]]></title><description><![CDATA[A lightning talk I gave at the Montreal Elixir meetup of May 2018.]]></description><link>https://www.nicoespeon.com/en/2018/06/tdd-with-elixir/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2018/06/tdd-with-elixir/</guid><pubDate>Thu, 07 Jun 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is a lightning talk I gave at the &lt;a href=&quot;https://www.meetup.com/fr-FR/montrealelixir/events/249752679/&quot;&gt;Montreal Elixir&lt;/a&gt; meetup of May 2018.&lt;/p&gt;
&lt;p&gt;I’m quite new to Elixir.
I love practicing Test Driven Development.
I’ll share with you my findings, successes and pitfalls of doing TDD with Elixir.&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/HlGaHZWqItU&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;p&gt;Here are the slides:&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 72.91666666666666%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://slides.com/nicoespeon/tdd-with-elixir/embed&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;</content:encoded></item><item><title><![CDATA[So I went to Montreal Elixir meetup]]></title><description><![CDATA[Here is my feedback about how this meetup was, and what you could expect from it.]]></description><link>https://www.nicoespeon.com/en/2018/03/i-went-to-montreal-elixir-meetup/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2018/03/i-went-to-montreal-elixir-meetup/</guid><pubDate>Fri, 23 Mar 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Few days ago, I went to &lt;a href=&quot;https://www.meetup.com/fr-FR/montrealelixir/events/247188552/&quot;&gt;Montréal Elixir meetup of March&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I’m French. I moved to Montréal in February. Thus, this is the beginning of a new life for me ; a Canadian-dream as a Developer at Busbud. I used to attend / talk at / organize a lot of meetups, back in Paris. I’m now looking to meet the tech community of Montréal.&lt;/p&gt;
&lt;p&gt;So here is my feedback about how this meetup was, and what you could expect from it.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/elixir-9f99004893d59f885df570921b92c9c1-c2a79.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 180px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAD4klEQVQ4y41UW2gcZRQ+/+xlZofuZgm0liSzc93d2c3uZjfZ2+S2uWy7jXYbEfogJRWikIdC6UsptFCKiH20iKI2NpUi2mIU0/pgUyrU1hQvrQ9FTMQWpOiLvviir37zzyRtrEJm2T2z/5zz/d93vjM/0b8uJZDjMcXGN9ay9Mxojqbr7n0vtVkvNWlLlxJJkRV0KBKKAGRKcNds2n0sQ63PM7R7yv2PyGirlyL67GiUg1lsyEnTxN8pGv82RWNH+RoNM5smydwqSy1U9G4OEiVpaDFJI39hg5/SNPkWpMc8li1sOgbQ4f8HUsUi7SCFzECNs9NDA2MWq/9skfNrkkZ/t6m5BPkJ91mamly2war4bTwJ1kUTPCakPI/RHXLACJZfNoLV+wB9AIZ/QvY1sOLVT2ku+zGe2y3rTwIarEY7ozbZjBtJeriUNYO1j4xQ+Z7FnPuQ/jBFI2uQP2/RYMHrb51F6A4lhTp14vMfvSv5TmeiADtoCUMrerh/xQU0hfqaRUO3wXTVYoOvUpkEr6aPSzeF2mYwHQyN0ADzelfqtwTnFNj8AsDr6OGaEazcQdEymK5g/RszUJ3ZIBLmhGGQ45tBu/DHk2pj9kyhOmMJg++g8A8zULkFhnd1sfQF5C/BsKtgej1Jw9ewwaxbk6M9lAgVKMceM8edLTcisQs9OgGQC4i/QeqqKTi3NKnwCUA/NMLlRYBewbP3If028tq8jjnCBth2OJyihuANdKOEETmD3c+i8Ed8H0DuV2ok954m9Z3VxeKCHh64aASqb2OzqwD8DIxjHqlBDzANyRgJH3B8BKOxgMR5M1S5aYbLPxhi//dqJH9OlbMnVSn/miYVF7DJB9hsCXkrAGr6gILft13uoAr+wDbwRlxC/y6YrPapGSrfBeCqLvUta5HC62B4HkZdgSkAqy8C5Ca+7U2A3qs0xfyYtKl1DkyRPHwZspYB8B2AvjbE0g0Ys2gGK5ctob4EqR+bzLkItvwAQBuYfxA86x5J5Dk2LWVp7yGwPo2ZOw+T3kXiPAy5oUvFLwG6jDfoEhieAfhxLdJ3WJMLUT4+sjc+lMf8ZGgvjqs2886+9mSGnj5m08QhODkHhi+ocu5kYpu9oMSSbyrR5BuIc4loelaVe3n/1HiKEmJ+83BnaZ8fp0WwnIV8gDZn0PznUfhcT8x6safDeAXxdE+HeUSJWS8BnDusRFObwdYl9/osM9SWwXI/QOdwHraMQGWfJuX3J+TMge4OvdUd1xrdcT3u5mIDXoNJeHyw2wBbZ9hmj8zao8MkDbOZx2xWumSzszO+TVx/vg6mRNOkBrN87R+sJcu5b5yqkgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Elixir&quot;
        title=&quot;&quot;
        src=&quot;/static/elixir-9f99004893d59f885df570921b92c9c1-c2a79.png&quot;
        srcset=&quot;/static/elixir-9f99004893d59f885df570921b92c9c1-c2a79.png 180w&quot;
        sizes=&quot;(max-width: 180px) 100vw, 180px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;By the way, if you don’t know it yet: &lt;a href=&quot;https://elixir-lang.org/&quot;&gt;Elixir is a dynamic, functional language&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is built upon Erlang shoulders, which is really fault-tolerant and built for scalability (think telecoms). To put them in a nutshell, I’d say Elixir main goals are: productivity, maintainability and reliability.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/fr-FR/montrealelixir/&quot;&gt;Montréal Elixir&lt;/a&gt; is a monthly meetup. The community is not big − we were around 20 persons at the event.&lt;/p&gt;
&lt;p&gt;They do have a website: &lt;a href=&quot;http://www.montrealelixir.ca/&quot;&gt;http://www.montrealelixir.ca&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The typical agenda of the meetup is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Networking &amp;#x26; food&lt;/strong&gt; first, which is a nice ice-breaker.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Announcements&lt;/strong&gt; from Elixir community, about books, news from the meetup organizers…&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Talks&lt;/strong&gt;, usually 20 minutes ones. But we’ll try some lightning talks (5min) in the future.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sponsor talks &amp;#x26; open mic&lt;/strong&gt; to anyone who’d have something to share to the group&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It starts at 18:30, ends at 20:00, which is great if you want to go back home early. People generally speak english there, so it’s more inclusive.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/first-talk-45d0826b76d4032f08762a77ba28595b-121ec.jpeg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAUBAgME/8QAFQEBAQAAAAAAAAAAAAAAAAAAAgP/2gAMAwEAAhADEAAAAY7UbIKpkTp//8QAGhAAAwEAAwAAAAAAAAAAAAAAAQIDABESFP/aAAgBAQABBQKQSjCSDXHDxqZP689O7f/EABcRAQEBAQAAAAAAAAAAAAAAAAEAETH/2gAIAQMBAT8BdY5f/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQARMf/aAAgBAgEBPwEwnt//xAAaEAACAgMAAAAAAAAAAAAAAAAAEQEhAjEy/9oACAEBAAY/AlMMrCCh7ZyM/8QAGxAAAwACAwAAAAAAAAAAAAAAAAERITFBgZH/2gAIAQEAAT8haZE0aZdCIpMDzOCQTPj6ajD/2gAMAwEAAgADAAAAEJ8v/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERIf/aAAgBAwEBPxC2owlP/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQARIf/aAAgBAgEBPxDLjdpL/8QAHhABAAIBBAMAAAAAAAAAAAAAAQARITFBUdFx4fD/2gAIAQEAAT8QoArVc2R74vmDgiuAqMMFEmt/U7L9TJNMKG5//9k=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;First talk&quot;
        title=&quot;&quot;
        src=&quot;/static/first-talk-45d0826b76d4032f08762a77ba28595b-d564d.jpeg&quot;
        srcset=&quot;/static/first-talk-45d0826b76d4032f08762a77ba28595b-865fd.jpeg 240w,
/static/first-talk-45d0826b76d4032f08762a77ba28595b-d40a0.jpeg 480w,
/static/first-talk-45d0826b76d4032f08762a77ba28595b-d564d.jpeg 960w,
/static/first-talk-45d0826b76d4032f08762a77ba28595b-c67c1.jpeg 1440w,
/static/first-talk-45d0826b76d4032f08762a77ba28595b-121ec.jpeg 1600w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;This meetup talk was from &lt;a href=&quot;https://twitter.com/pesnk&quot;&gt;Pedro Medeiros&lt;/a&gt; on &lt;strong&gt;“Elixir formatter internals”&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In case you wonder, a formatter is a tool that aims to maintain a consistent style for your project. Thus, you don’t loose time discussing whether there must be a space before your parenthesis, nor you waste time with the linter telling you that you forgot a trailing space somewhere.&lt;/p&gt;
&lt;p&gt;If you are familiar with JavaScript rather than Elixir, this is &lt;a href=&quot;https://prettier.io/&quot;&gt;Prettier&lt;/a&gt; goal. Handles the syntax for you so you don’t have to bother. If you do Elm, this is &lt;a href=&quot;https://github.com/avh4/elm-format&quot;&gt;elm-format&lt;/a&gt; job.&lt;/p&gt;
&lt;p&gt;So it really helps &lt;strong&gt;productivity&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Elixir formatter is built-in. You can run it with &lt;code class=&quot;language-text&quot;&gt;mix format&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The talk focused on how the formatter works to format your code − building an AST, then logically applying the standard rules to re-write your code with proper indentation/spaces…&lt;/p&gt;
&lt;p&gt;The meetup was nice and I enjoyed the community. I met and discussed with &lt;a href=&quot;http://henry.olders.ca/wordpress/&quot;&gt;Henry Olders&lt;/a&gt;, who is both a psychiatrist and engineer. We discussed machine learning, Elixir and scalability.&lt;/p&gt;
&lt;p&gt;😃👍 I really enjoyed that time and will come back to next sessions. Join us!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;To conclude, here are some books recommendation I get from the meetup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📕 &lt;a href=&quot;https://pragprog.com/book/lhelph/functional-web-development-with-elixir-otp-and-phoenix&quot;&gt;Functional Web Development with Elixir, OTP, and Phoenix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📘 &lt;a href=&quot;https://pragprog.com/book/cdc-elixir/learn-functional-programming-with-elixir&quot;&gt;Learn Functional Programming with Elixir&lt;/a&gt; (good for beginners and newcomers to Functional Programming)&lt;/li&gt;
&lt;li&gt;📄 &lt;a href=&quot;http://theerlangelist.com/article/spawn_or_not&quot;&gt;To spawn or not to spawn&lt;/a&gt; to understand how to &lt;em&gt;think&lt;/em&gt; in terms of processes, from the author of &lt;a href=&quot;https://www.manning.com/books/elixir-in-action-second-edition&quot;&gt;Elixir in action&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[À la découverte des Observables]]></title><description><![CDATA[Talk d’introduction au concept des Observables et de la programmation réactive avec Rx.js.]]></description><link>https://www.nicoespeon.com/fr/2018/03/a-la-decouverte-des-observables</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2018/03/a-la-decouverte-des-observables</guid><pubDate>Mon, 19 Mar 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Les Observables sont des flux d’événements paresseux qui peuvent émettre 0 ou N éléments et qui peuvent, ou non, se terminer.&lt;/p&gt;
&lt;h2 id=&quot;quickie-à-devoxx-france-7-avril-2017&quot;&gt;&lt;a href=&quot;#quickie-%C3%A0-devoxx-france-7-avril-2017&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Quickie à Devoxx France (7 avril 2017)&lt;/h2&gt;
&lt;h3 id=&quot;la-vidéo&quot;&gt;&lt;a href=&quot;#la-vid%C3%A9o&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;La vidéo&lt;/h3&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/ocgVSQhashY&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;h3 id=&quot;les-slides&quot;&gt;&lt;a href=&quot;#les-slides&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Les slides&lt;/h3&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 81.5126050420168%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.slideshare.net/slideshow/embed_code/key/OnbbVpH98E0z&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot; allowfullscreen&gt; &lt;/iframe&gt; &lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;https://www.slideshare.net/nicolascarlo1/a-la-decouverte-des-observables&quot; title=&quot;A&amp;#x300; la de&amp;#x301;couverte des observables&quot; target=&quot;_blank&quot;&gt;A&amp;#x300; la de&amp;#x301;couverte des observables&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;https://www.slideshare.net/nicolascarlo1&quot; target=&quot;_blank&quot;&gt;Nicolas Carlo&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;hr&gt;
&lt;h2 id=&quot;talk-à-human-talks-paris-12-décembre-2017&quot;&gt;&lt;a href=&quot;#talk-%C3%A0-human-talks-paris-12-d%C3%A9cembre-2017&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Talk à &lt;a href=&quot;https://www.meetup.com/fr-FR/HumanTalks-Paris/events/245726985/&quot;&gt;Human Talks Paris&lt;/a&gt; (12 décembre 2017)&lt;/h2&gt;
&lt;h3 id=&quot;la-vidéo-1&quot;&gt;&lt;a href=&quot;#la-vid%C3%A9o-1&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;La vidéo&lt;/h3&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/JSeOF5UiayY&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;h3 id=&quot;les-slides-1&quot;&gt;&lt;a href=&quot;#les-slides-1&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Les slides&lt;/h3&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 81.5126050420168%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.slideshare.net/slideshow/embed_code/key/zFdReMo7oIamd3&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot; allowfullscreen&gt; &lt;/iframe&gt; &lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;https://www.slideshare.net/nicolascarlo1/a-la-decouverte-des-observables-humantalks-paris-2017&quot; title=&quot;A&amp;#x300; la de&amp;#x301;couverte des Observables - HumanTalks Paris 2017&quot; target=&quot;_blank&quot;&gt;A&amp;#x300; la de&amp;#x301;couverte des Observables - HumanTalks Paris 2017&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;https://www.slideshare.net/nicolascarlo1&quot; target=&quot;_blank&quot;&gt;Nicolas Carlo&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;
          &lt;/div&gt;
          &lt;/div&gt;</content:encoded></item><item><title><![CDATA[Pair-programming makes people share]]></title><description><![CDATA[Few thoughts on pair-programming.]]></description><link>https://www.nicoespeon.com/en/2017/10/pair-programming-makes-people-share/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2017/10/pair-programming-makes-people-share/</guid><pubDate>Mon, 09 Oct 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/cover-da6478e5353d770f9258a69d101ebfc4-168cd.jpeg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 44.99999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAJABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQBA//EABYBAQEBAAAAAAAAAAAAAAAAAAMAAv/aAAwDAQACEAMQAAABp404e5QV/8QAGRAAAwADAAAAAAAAAAAAAAAAAAECEBJB/9oACAEBAAEFAqes9wxn/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFhEBAQEAAAAAAAAAAAAAAAAAAAER/9oACAECAQE/Aax//8QAGRAAAQUAAAAAAAAAAAAAAAAAIQABESBR/9oACAEBAAY/Ag0o5X//xAAaEAADAAMBAAAAAAAAAAAAAAAAAREQITGR/9oACAEBAAE/IXsdBW40nobVxwzo/9oADAMBAAIAAwAAABCk3//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPxCMf//EABcRAQADAAAAAAAAAAAAAAAAAAEQESH/2gAIAQIBAT8QFmw//8QAHBAAAgICAwAAAAAAAAAAAAAAAREAMSGhEEFR/9oACAEBAAE/EOsogPcSNSdFis48qBI4LE1OD//Z&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;cover&quot;
        title=&quot;&quot;
        src=&quot;/static/cover-da6478e5353d770f9258a69d101ebfc4-d564d.jpeg&quot;
        srcset=&quot;/static/cover-da6478e5353d770f9258a69d101ebfc4-865fd.jpeg 240w,
/static/cover-da6478e5353d770f9258a69d101ebfc4-d40a0.jpeg 480w,
/static/cover-da6478e5353d770f9258a69d101ebfc4-d564d.jpeg 960w,
/static/cover-da6478e5353d770f9258a69d101ebfc4-c67c1.jpeg 1440w,
/static/cover-da6478e5353d770f9258a69d101ebfc4-667be.jpeg 1920w,
/static/cover-da6478e5353d770f9258a69d101ebfc4-168cd.jpeg 2000w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pair-programming is two persons, coding on the same screen.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are &lt;a href=&quot;https://en.wikipedia.org/wiki/Pair_programming#Pairing_variations&quot;&gt;different ways to practice pair-programming&lt;/a&gt; and &lt;a href=&quot;https://www.wikihow.com/Pair-Program&quot;&gt;mistakes to avoid&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Why do we pair-program? I think the main reason is &lt;strong&gt;to communicate&lt;/strong&gt;between developers of the same team.&lt;/p&gt;
&lt;p&gt;Communication is a central part of our job: building software. To build a software that satisfies people’s needs, we must talk together to understand these needs. We must share this knowledge among the team to align everyone with a common goal. Thus, communication is key to ensure we are all sailing to the same objective. At the end, everyone’s code is going to be merged into the same codebase. Pair-programming helps us meet before our code does.&lt;/p&gt;
&lt;p&gt;There are orher practices with the same benefits: technical retrospectives, code reviews or &lt;a href=&quot;https://www.agilealliance.org/glossary/mob-programming/&quot;&gt;mob-programming&lt;/a&gt; for example. You can combine them.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“But we don’t need pair-programming, we do code reviews.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let’s talk about the specificities of pair-programming then.&lt;/p&gt;
&lt;p&gt;First, we get &lt;strong&gt;real-time feedback&lt;/strong&gt; during pair-programming. We do have feedback during code reviews too, but it happens later − often when the feature is considered “done”. When we pair with a co-worker, we get instant review of the code we write. Actually, we are &lt;strong&gt;thinking together.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Then, as we think together, pair-programming is a better filter against bad ideas or laziness. This can be true for code reviews done correctly − which will hardly happen &lt;a href=&quot;https://www.ibm.com/developerworks/rational/library/11-proven-practices-for-peer-review/#__RefHeading__91_174136755&quot;&gt;if the pull-request is big&lt;/a&gt;. This is even more true during mob programming.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/lenses-e87e566fc48d3b30b4fd3046ef3615e7-a3f82.jpeg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 66.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAEC/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABiw2yP//EABkQAAMBAQEAAAAAAAAAAAAAAAABAhIRIf/aAAgBAQABBQLSLrAqVLMs8R0//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQIBAT8BJ//EABsQAAIBBQAAAAAAAAAAAAAAAAARARASMUGB/9oACAEBAAY/AiN9Gh2mKf/EABsQAAMBAQADAAAAAAAAAAAAAAABESExUWGx/9oACAEBAAE/IVB6876H2iriVCl8RuOFF4FNbIf/2gAMAwEAAgADAAAAEP8AH//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABcRAQEBAQAAAAAAAAAAAAAAAAEAESH/2gAIAQIBAT8QQdS2/8QAHhABAAIBBAMAAAAAAAAAAAAAAQARITFBUWFxgaH/2gAIAQEAAT8QYyhgtvLqCqLmA5xEqLTRNnyPcRnBh9QrY2q4VAFtp//Z&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;lenses&quot;
        title=&quot;&quot;
        src=&quot;/static/lenses-e87e566fc48d3b30b4fd3046ef3615e7-d564d.jpeg&quot;
        srcset=&quot;/static/lenses-e87e566fc48d3b30b4fd3046ef3615e7-865fd.jpeg 240w,
/static/lenses-e87e566fc48d3b30b4fd3046ef3615e7-d40a0.jpeg 480w,
/static/lenses-e87e566fc48d3b30b4fd3046ef3615e7-d564d.jpeg 960w,
/static/lenses-e87e566fc48d3b30b4fd3046ef3615e7-a3f82.jpeg 1200w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;When we code alone, we put both our best and worst decisions into the codebase.&lt;/p&gt;
&lt;p&gt;When we code together, only the best decisions of the team make it through the filter of our combined point of views.&lt;/p&gt;
&lt;p&gt;Finally, I think there is something that only happens during pair-programming: &lt;strong&gt;people share how they work, tips and tricks, in real-time.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We teach each other our own productivity tips − keyboard shortcuts, techniques… We help each other grow in our day-to-day work. That’s how I learned some features of the tools I use and I didn’t know existed. That’s how I teach my teammates some habits worth trying to waste less time on daunting tasks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sharing is why we do pair-programming.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you do pair-programming, don’t forget to keep it dynamic, switching roles frequently. And do take breaks: pair-programming requires a lot of attention and can be exhausting.&lt;/p&gt;
&lt;p&gt;Now tell us, did you have had an &lt;a href=&quot;http://www.dictionary.com/browse/aha-moment&quot;&gt;“aha” moment&lt;/a&gt; doing pair-programming?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Using observables in real life]]></title><description><![CDATA[In this post, I’ll talk about a concrete use case in which Observables turn to be remarkably relevant to make our code cleaner and more maintainable.]]></description><link>https://www.nicoespeon.com/en/2017/03/using-observables-in-real-life/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2017/03/using-observables-in-real-life/</guid><pubDate>Thu, 23 Mar 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In this post, I’ll talk about a concrete use case in which Observables turn to be remarkably relevant to make our code cleaner and more maintainable.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/cover-5935b0fcde9d2ceaf5b559d1d7811bb0-168cd.jpeg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 66.64999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAECAwT/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABxwZFIg//xAAaEAADAAMBAAAAAAAAAAAAAAAAAQIDBBMU/9oACAEBAAEFAr1qOWSmsNNPauj02dqP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAHBAAAQMFAAAAAAAAAAAAAAAAAQACECIxQVFh/9oACAEBAAY/AhtMaRwRhNtTH//EABoQAAIDAQEAAAAAAAAAAAAAAAERACFxMfD/2gAIAQEAAT8hDwubEHtjw1DTQZF8GzFS40LLn//aAAwDAQACAAMAAAAQzP8A/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQMBAT8Qh//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAECAQE/EKf/xAAcEAEBAAMAAwEAAAAAAAAAAAABEQAhQTFhgdH/2gAIAQEAAT8QlqNED26MHC3uNAQcXgKxJZl0fRof3LWyJVwCO/WTfynXfuf/2Q==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;cover&quot;
        title=&quot;&quot;
        src=&quot;/static/cover-5935b0fcde9d2ceaf5b559d1d7811bb0-d564d.jpeg&quot;
        srcset=&quot;/static/cover-5935b0fcde9d2ceaf5b559d1d7811bb0-865fd.jpeg 240w,
/static/cover-5935b0fcde9d2ceaf5b559d1d7811bb0-d40a0.jpeg 480w,
/static/cover-5935b0fcde9d2ceaf5b559d1d7811bb0-d564d.jpeg 960w,
/static/cover-5935b0fcde9d2ceaf5b559d1d7811bb0-c67c1.jpeg 1440w,
/static/cover-5935b0fcde9d2ceaf5b559d1d7811bb0-667be.jpeg 1920w,
/static/cover-5935b0fcde9d2ceaf5b559d1d7811bb0-168cd.jpeg 2000w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;h2 id=&quot;how-to-spot-a-barcode-scanner&quot;&gt;&lt;a href=&quot;#how-to-spot-a-barcode-scanner&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to spot a barcode scanner?!&lt;/h2&gt;
&lt;p&gt;Yup! This is kind of a specific example. But it perfectly illustrates issues that would beg you for using Observables.&lt;/p&gt;
&lt;p&gt;A barcode scanner simply emulates the keyboard. It reproduces the scanned code, emitting keypress signals, ending with the “Enter” key − which key code is &lt;em&gt;13&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Let’s say we’re developing an app that allows users to search products from their 16-chars code reference. Rather than typing them by hand, users should be able to use a barcode scanner to trigger the search.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Just let the user focus the search input, scan and you’re done!”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sure, it’s native behavior.&lt;/p&gt;
&lt;p&gt;But the search feature is contained inside a popup that can be open with a button. And we’ve been told the app should be super-ergonomic! Whenever the user scans a barcode, we should open the popup and fill the input with the scanned code.&lt;/p&gt;
&lt;p&gt;Now, the problem is: how do we differentiate a scanned code from other keypress events? Let’s say the user hit a key before scanning the code: we don’t want that key to be part of the scanned code!&lt;/p&gt;
&lt;h2 id=&quot;solving-this-the-imperative-way&quot;&gt;&lt;a href=&quot;#solving-this-the-imperative-way&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Solving this, the imperative way&lt;/h2&gt;
&lt;p&gt;We surely need to listen to keypress events… Then we must… remember the key codes, probably using a buffer! If the key pressed is the “Enter” key, fill the input and clean the buffer. Otherwise, add the key to the buffer!&lt;/p&gt;
&lt;p&gt;Let’s try this first shot:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ENTER_KEY_CODE&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; keyCodesBuffer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;keypress&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; event &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; keyCode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;keyCode

  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCode &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ENTER_KEY_CODE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;fillInputWithKeyCodesBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;cleanBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;addToBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fillInputWithKeyCodesBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cleanBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  keyCodesBuffer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addToBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  keyCodesBuffer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Good.&lt;/p&gt;
&lt;p&gt;But this is not enough: it doesn’t differentiate scanned codes from regular keypresses!&lt;/p&gt;
&lt;p&gt;We know that, if no new keypress is emitted after ~50ms, it’s not a scanned code for sure and we can clean the buffer.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ENTER_KEY_CODE&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;MAX_INTERVAL_BETWEEN_EVENTS_IN_MS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; keyCodesBuffer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;keypress&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; event &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; keyCode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;keyCode

  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCode &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ENTER_KEY_CODE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;fillInputWithKeyCodesBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;cleanBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;addToBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;cleanBufferAfter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;MAX_INTERVAL_BETWEEN_EVENTS_IN_MS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fillInputWithKeyCodesBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cleanBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  keyCodesBuffer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addToBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  keyCodesBuffer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cleanBufferAfter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;timeout&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cleanBuffer&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; timeout&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hmmm… not bad. But there is a subtle bug here: if the code takes more than 50ms to be scanned, it will drop the beginning…&lt;/p&gt;
&lt;p&gt;In fact, if a new keypress occurs within 50ms, we should clear the timeout.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ENTER_KEY_CODE&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;MAX_INTERVAL_BETWEEN_EVENTS_IN_MS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; keyCodesBuffer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; cleanBufferTimeout

document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;keypress&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; event &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; keyCode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;keyCode

  &lt;span class=&quot;token function&quot;&gt;stopCleanBufferTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCode &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ENTER_KEY_CODE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;fillInputWithKeyCodesBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;cleanBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;addToBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;cleanBufferAfter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;MAX_INTERVAL_BETWEEN_EVENTS_IN_MS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fillInputWithKeyCodesBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cleanBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  keyCodesBuffer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addToBuffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  keyCodesBuffer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cleanBufferAfter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;timeout&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  cleanBufferTimeout &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cleanBuffer&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; timeout&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;stopCleanBufferTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;clearTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cleanBufferTimeout&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we’ve got something working.&lt;/p&gt;
&lt;p&gt;Let’s take a step back and think: what if we’ve had the full history of keypress events we could manipulate to filter out scanned codes sequences? Would the code be simpler? Let’s figure this out…&lt;/p&gt;
&lt;h2 id=&quot;solving-this-with-observables&quot;&gt;&lt;a href=&quot;#solving-this-with-observables&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Solving this, with Observables&lt;/h2&gt;
&lt;p&gt;For this kind of use cases, I find Observables to be a powerful abstraction to represent our data.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Observables are &lt;strong&gt;immutable collections of asynchronous events&lt;/strong&gt; you can manipulate through &lt;strong&gt;operators&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If we use things like &lt;code class=&quot;language-text&quot;&gt;map&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;filter&lt;/code&gt; over arrays, then we’re already familiar with that way of thinking.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If Observables are still cryptic for you so far, I’d suggest you to read &lt;a href=&quot;https://gist.github.com/staltz/868e7e9bc2a7b8c1f754&quot;&gt;this excellent introduction to Reactive Programming&lt;/a&gt; from André Staltz.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, instead of responding to each event individually, let’s collect all events into a single stream that we can transform.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; keyCode$ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Rx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Observable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fromEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;keypress&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ---(ev)--(ev)--------(ev)---&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pluck&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;keyCode&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ---(43)--(51)--------(13)---&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;strong&gt;$&lt;/strong&gt; sign at the end of the variable name means “Stream”. It’s a convention I use to know the variable I manipulate is an Observable in non-typed languages, just like I’d call &lt;strong&gt;elements&lt;/strong&gt; an array of &lt;strong&gt;element&lt;/strong&gt;, or &lt;strong&gt;$header&lt;/strong&gt; the jQuery representation of the header.&lt;/p&gt;
&lt;p&gt;Now we have a stream of key codes. Any time a keypress event occurs, a new event, which value is the corresponding key code, is emitted.&lt;/p&gt;
&lt;p&gt;At the end of the process, we’d like to have a stream we can subscribe to. Each event of the stream should represent the scanned code. So we need to make batches of key codes in a way that isolates scanned codes from parasitic keypresses.&lt;/p&gt;
&lt;p&gt;To do so, we can &lt;strong&gt;buffer&lt;/strong&gt; our stream using a &lt;strong&gt;debounce&lt;/strong&gt; strategy: when an event occurs, wait 50ms for another one. If another event is emitted within this time frame, wait another 50ms. If no other event occurs within this time frame, make a batch of the passed events.&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/buffer-operator-411ffd63484f377c930a01383efc1f68-b5a16.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 61.71875%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsSAAALEgHS3X78AAAC50lEQVQoz2OIjY1VnDdv3vaO7u4KBgYGHiAWg2LenqbutIULF+5zNDMzAvL5oeLiQCzYN6WvZf68+Wvl5OVUgXxNRkZGRyAtyQADNYEhcueLS8z37+zUOXU4Sb//+CwdiyX2eiC5iadPGYYcO6g9reuIkWfsPrXbC8/p9BtO0oHp5efjZwVSTGCOgZiICJCSXuVpM2ONmvKTVauN9m5bJn9UabnJfsW1aidArjLdvfuc+PL5O62sNp3n1Ju14qDfun2r7dYdBsrJSfNKKwJdZwXEkUCsBDY0/f9/RgOgoWoMDFralgxy+ooMKgw6DPIMCgwaYAVaWhoMmoqyQAZQiYKUFYO+ohKDsprtO0dGkLSysjKHlZUVKwMSMAVioGIGUHgIAzHIJlEgBoWdHpQvApUXgoajJRDrQ/WbQ/UxMOzatSvrBhDcvn376I0b10/fu3fv6K1bt05dv3H9+JEjR86eOHHi5NmzZ0+dO3/+GBCcvnLlytFbN28dv37t+lmgtlMvXrzYe/369ZN37969tH379nSGo0ePLviPA9y5cweMX758+f/Jkyf/gQb8f/PmDS7l/4EOmMXQ3NzsAkwazUBcCcTVQFy1CEivWLKkdMWK5ZXz5s1qXrFyRenKtSvL16xdU7Ns5cqKhYsXl8ycObt64sTJDcuXLCtdumRp+YIFC5obGhqcGPADZi4GBkYzbDLA2BDi5GYwhnJl4RKSkpJ80tLSCkAsq6epoQAUEljS1lx0u6X+/7VTm77duVH37ejdfb8TTmU8zs6N8Gq6eOXatBvX//X33vi6cOGFXy8m3/+c4JzUAtRnpyijCE7YHNAYEpQWFADFJOvEmJD0neGB7/fvnPhk//bgp3OOznllvMLiamFslKPHlq3Hq3fufhOdvPtpX8eOZwdTdz5P8U6PBerTEOQRFMft285p/MaODUALZgpnaxeKnGXYyQkS7mBgYJ+uoy7a28Ig1NhlIcKQwMCHrA0AbQFZmgEy2uYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;buffer operator&quot;
        title=&quot;&quot;
        src=&quot;/static/buffer-operator-411ffd63484f377c930a01383efc1f68-c83f1.png&quot;
        srcset=&quot;/static/buffer-operator-411ffd63484f377c930a01383efc1f68-569e3.png 240w,
/static/buffer-operator-411ffd63484f377c930a01383efc1f68-93400.png 480w,
/static/buffer-operator-411ffd63484f377c930a01383efc1f68-c83f1.png 960w,
/static/buffer-operator-411ffd63484f377c930a01383efc1f68-b5a16.png 1280w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;This is what we want to achieve with &lt;a href=&quot;http://reactivex.io/documentation/operators/buffer.html&quot;&gt;the buffer operator&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;MAX_INTERVAL_BETWEEN_EVENTS_IN_MS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; keyCode$ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Rx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Observable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fromEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;keypress&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pluck&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;keyCode&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; keyCodesBuffer$ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; keyCode$
  &lt;span class=&quot;token comment&quot;&gt;// --(43)-(64)----(32)-----(65)-(77)-(13)---&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;buffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCode$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;debounce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;MAX_INTERVAL_BETWEEN_EVENTS_IN_MS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// --([43,64])----([32])-----([65,77,13])---&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So far, so good!&lt;/p&gt;
&lt;p&gt;Now, all we have to do is to filter out batches that don’t look like scanned codes. And we know that a scanned code is a sequence that ends with the “Enter” key.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ENTER_KEY_CODE&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;MAX_INTERVAL_BETWEEN_EVENTS_IN_MS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; keyCode$ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Rx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Observable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fromEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;keypress&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pluck&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;keyCode&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; keyCodesBuffer$ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; keyCode$
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;buffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCode$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;debounce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;MAX_INTERVAL_BETWEEN_EVENTS_IN_MS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isFromScan&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isFromScan&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCodes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; keyCodes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; keyCodes&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;keyCodes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ENTER_KEY_CODE&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally, let’s subscribe to this stream we have created and execute our callback each time a new event is emitted.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nothing will happen until we subscribe to the Observable, since they are lazy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ENTER_KEY_CODE&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;MAX_INTERVAL_BETWEEN_EVENTS_IN_MS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; keyCode$ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Rx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Observable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fromEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;keypress&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pluck&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;keyCode&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; keyCodesBuffer$ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; keyCode$
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;buffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCode$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;debounce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;MAX_INTERVAL_BETWEEN_EVENTS_IN_MS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isFromScan&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isFromScan&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCodes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; keyCodes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; keyCodes&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;keyCodes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ENTER_KEY_CODE&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fillInputWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyCodes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

keyCodesBuffer$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fillInputWith&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;what-we-did-here&quot;&gt;&lt;a href=&quot;#what-we-did-here&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What we did here&lt;/h2&gt;
&lt;p&gt;This is a visual illustration of what we did to go from &lt;code class=&quot;language-text&quot;&gt;keyCode$&lt;/code&gt; − which was created from keypress events − to &lt;code class=&quot;language-text&quot;&gt;keyCodesBuffer$&lt;/code&gt; we subscribed to:&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/transforming-streams-4e3b123a0628dc94e7154641c8159656.gif&quot; alt=&quot;Transforming streams&quot;&gt;
  &lt;figcaption&gt;Transforming the stream of key codes into a stream of scanned codes&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;There are a few things to notice with our final code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;we don’t have to manage things like timeout and buffer manually&lt;/li&gt;
&lt;li&gt;hence, code is shorter, &lt;strong&gt;focused on the actual work&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;fillInputWith()&lt;/code&gt; doesn’t rely on a global buffer, which is more &lt;strong&gt;testable&lt;/strong&gt; and &lt;strong&gt;reusable&lt;/strong&gt; − actually, we are few small steps from making the whole logic purely functional&lt;/li&gt;
&lt;li&gt;we just manipulate &lt;em&gt;const&lt;/em&gt;s, nothing is reassigned, which is &lt;strong&gt;simpler to reason about&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;created Streams can be &lt;strong&gt;reused&lt;/strong&gt; to do other things ; we can &lt;strong&gt;add features without fear&lt;/strong&gt; of breaking this one&lt;/li&gt;
&lt;li&gt;we could easily fix issues in this code, injecting operators into streams creation pipes, if necessary − e.g. we’d probably filter out non-interesting key codes from &lt;code class=&quot;language-text&quot;&gt;keyCode$&lt;/code&gt; as simply as &lt;code class=&quot;language-text&quot;&gt;.filter(isValidKeyCode)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In my opinion, the one difficult thing is to reason with streams and understand how to solve our use case with given operators.&lt;/p&gt;
&lt;p&gt;But, I believe this is something that just takes practice 😉&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Des super-pouvoirs à la portée de tou(te)s avec le Feature Flipping]]></title><description><![CDATA[Le Feature Flipping consiste à activer (ou non) une fonctionnalité en fonction d’une variable, dynamiquement dans le code.]]></description><link>https://www.nicoespeon.com/fr/2017/01/feature-flipping/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2017/01/feature-flipping/</guid><pubDate>Fri, 13 Jan 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;J’ai présenté ce talk le 10 janvier 2017 au &lt;a href=&quot;https://www.meetup.com/fr-FR/HumanTalks-Paris/events/236604346/&quot;&gt;meetup HumanTalks Paris chez OCTO Technology&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 59.27083333333333%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vSNi864iyknXUCLHU0vTePNNYYySc-o1QlOmqx-NlPMwJ6N6lBNanEMdolIr8bt-TmpMXQOIoTS_kt1/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot; style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Le Feature Flipping consiste à activer (ou non) une fonctionnalité en fonction d’une variable, dynamiquement dans le code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ça donne le pouvoir de livrer en continu, même quand le code n’est pas terminé ; de faire des tests A/B ; de livrer des fonctionnalités qui ne seront actives qu’un certain temps… Mieux encore : c’est très simple à mettre en place ! Même sur un code legacy.&lt;/p&gt;
&lt;p&gt;Néanmoins, « un grand pouvoir implique » de faire gaffe à ce que l’on fait, comme d’habitude. Ce talk était un retour d’expérience sur les do’s &amp;#x26; don’ts du Feature Flipping.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Live coding Elm]]></title><description><![CDATA[Implémenter un système de filtre dans une application existante.]]></description><link>https://www.nicoespeon.com/fr/2016/11/live-coding-elm/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2016/11/live-coding-elm/</guid><pubDate>Mon, 28 Nov 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;J’ai présenté ce talk le 9 novembre 2016 au &lt;a href=&quot;https://www.meetup.com/fr-FR/Meetup-Elm-Paris/events/235017960/&quot;&gt;meetup Elm Paris #5 chez Mozilla&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/uy0gV-XGuuY&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;p&gt;Le code est disponible sur le dépôt du meetup Paris Web Components : &lt;a href=&quot;https://github.com/pariswebcomps/webapp-exercise/tree/elm&quot;&gt;https://github.com/pariswebcomps/webapp-exercise/tree/elm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sur ce dépôt d’ailleurs, il y a une branche par techno (Angular 2, Cycle.js, React, Vue.js…). Si ça vous chante de comparer…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Créer une web app avec Cycle.js]]></title><description><![CDATA[Talk présenté au meetup Paris Web Components.]]></description><link>https://www.nicoespeon.com/fr/2016/10/web-app-avec-cycle-js/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2016/10/web-app-avec-cycle-js/</guid><pubDate>Wed, 12 Oct 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Talk présenté au meetup &lt;a href=&quot;https://www.meetup.com/fr-FR/paris-webComponents/events/232438267/&quot;&gt;Paris Web Components #8&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;programme-du-meetup&quot;&gt;&lt;a href=&quot;#programme-du-meetup&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Programme du meetup&lt;/h2&gt;
&lt;p&gt;Nous allons comparer l’implémentation d’une même webapp par différents frameworks (React, Aurelia, Angular 2, Polymer, Vue.js, Cycle.js).&lt;/p&gt;
&lt;p&gt;Chaque speaker aura 20 minutes + 5 minutes de questions pour:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une présentation du framework&lt;/li&gt;
&lt;li&gt;Une présentation des listes et de la réutilisation de composant&lt;/li&gt;
&lt;li&gt;Une présentation de la navigation et validation de formulaires&lt;/li&gt;
&lt;li&gt;Une présentation de l’écosytème (tooling, build…)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;talk&quot;&gt;&lt;a href=&quot;#talk&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Talk&lt;/h2&gt;
&lt;p&gt;J’y ai donc présenté l’implémentation avec &lt;a href=&quot;https://cycle.js.org/&quot;&gt;Cycle.js&lt;/a&gt; :&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/962HNnLggQE&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;p&gt;Les slides :&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 72.91666666666666%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://slides.com/nicoespeon/meetup-pwc-webapp-cyclejs/embed&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;icon-github&quot;&gt;&lt;/span&gt; Le code est disponible &lt;a href=&quot;https://github.com/nicoespeon/webapp-exercise/tree/cyclejs&quot;&gt;sur GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Trello, Kanban & Cycle.js]]></title><description><![CDATA[Talk présenté le 29 juin 2016 au meetup Paris.js chez Algolia.]]></description><link>https://www.nicoespeon.com/fr/2016/07/trello-kanban-cyclejs/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2016/07/trello-kanban-cyclejs/</guid><pubDate>Tue, 19 Jul 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;J’ai présenté ce talk le 29 juin 2016 au &lt;a href=&quot;http://www.meetup.com/fr-FR/Paris-js/events/232103659/&quot;&gt;meetup Paris.js #57 chez Algolia&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/8fHo34Ah6B0&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;p&gt;Et voici les slides associés qui contiennent pas mal de liens si vous souhaitez approfondir le sujet :&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 72.91666666666666%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://slides.com/nicoespeon/trello-kanban-cycle-js/embed&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;p&gt;Le projet est dispo en open-source ici : &lt;a href=&quot;https://github.com/nicoespeon/trello-kanban-analysis-tool&quot;&gt;https://github.com/nicoespeon/trello-kanban-analysis-tool&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;quelques-retours-post-présentation&quot;&gt;&lt;a href=&quot;#quelques-retours-post-pr%C3%A9sentation&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Quelques retours post-présentation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pour commencer, il y a bien un exemple de TodoMVC avec Cycle.js : &lt;a href=&quot;https://github.com/cyclejs/todomvc-cycle/&quot;&gt;https://github.com/cyclejs/todomvc-cycle/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Concernant le server-side rendering avec Cycle.js : ça se fait bien, toujours avec des streams. Il y a &lt;a href=&quot;https://github.com/cyclejs/examples/tree/master/isomorphic&quot;&gt;un exemple disponible dans le dépôt de Cycle.js&lt;/a&gt;d’ailleurs.&lt;/li&gt;
&lt;li&gt;On m’a posé la question de la différence entre React et Cycle.js (et Elm). Il y a &lt;a href=&quot;https://www.reddit.com/r/javascript/comments/3zr6i0/conversation_whats_the_core_differences_between/&quot;&gt;une discussion sur le sujet sur reddit&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vincent expliquait également il y a quelques mois &lt;a href=&quot;https://medium.com/@_cmdv_/why-i-chose-to-use-cycle-js-9156173c2752#.kpb0dfkd1&quot;&gt;pourquoi il partait plutôt sur du Cycle.js&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Quant à mon opinion : ça dépend. Partez sur du React/Redux pour des projets qui partent en production parce-que c’est éprouvé et que la communauté est là. Mais si vous avez du temps libre, essayez voir Cycle.js, vous apprendrez des choses =)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Implementing a download button with Cycle.js]]></title><description><![CDATA[A concrete example of programming with Cycle.js & Rx.js.]]></description><link>https://www.nicoespeon.com/en/2016/07/implementing-download-button-cycle-js/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2016/07/implementing-download-button-cycle-js/</guid><pubDate>Tue, 19 Jul 2016 00:00:00 GMT</pubDate><content:encoded>&lt;figure&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 66.69921875%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQP/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/2gAMAwEAAhADEAAAAdkq55VEJ//EABoQAAMAAwEAAAAAAAAAAAAAAAABAhESIjH/2gAIAQEAAQUCcweGhs7nOB9P/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQMBAT8BR//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAECAQE/AYf/xAAZEAEAAwEBAAAAAAAAAAAAAAABABARAiH/2gAIAQEABj8C3sSeULWs/8QAGxABAAMBAAMAAAAAAAAAAAAAAQARITFBUYH/2gAIAQEAAT8hMAN4mXFMa3saeouz5LCyaNF8z//aAAwDAQACAAMAAAAQpB//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAwEBPxAj/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAh/9oACAECAQE/EENl/8QAGhABAQEBAQEBAAAAAAAAAAAAAREhAEExcf/aAAgBAQABPxDDtuMvx4BRrwi9XGH2u9kGbj4TkKYukDOqBVqNe//Z&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;cover&quot; title=&quot;&quot; src=&quot;/static/cover-fcecb912e5a93b39534338064ae732c9-d564d.jpeg&quot; srcset=&quot;/static/cover-fcecb912e5a93b39534338064ae732c9-865fd.jpeg 240w,
/static/cover-fcecb912e5a93b39534338064ae732c9-d40a0.jpeg 480w,
/static/cover-fcecb912e5a93b39534338064ae732c9-d564d.jpeg 960w,
/static/cover-fcecb912e5a93b39534338064ae732c9-cfd28.jpeg 1024w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;figcaption&gt;The art of merging streams &amp;#x200A;&amp;#x2014;&amp;#x200A; Photo credits &lt;a href=&quot;https://www.flickr.com/photos/31246066@N04/&quot;&gt;Ian Sane&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Programming with Cycle.js / Rx.js needs you to take another approach to the code. We have to switch your brain to think with a different paradigm − functional and reactive, instead of imperative and passive.&lt;/p&gt;
&lt;p&gt;Unfortunately, there is a lack of concrete example, from concrete features, from real-life application.&lt;/p&gt;
&lt;p&gt;Since I’m building &lt;a href=&quot;https://medium.com/@nicoespeon/introducing-a-tool-to-analyse-kanban-workflow-on-trello-built-with-cycle-js-875ea0b35391#.wxa1atz0x&quot;&gt;a tool to analyse Kanban metrics from a Trello board&lt;/a&gt; with Cycle.js, I do have concrete examples.&lt;/p&gt;
&lt;p&gt;Here’s one use case I want to share with you to illustrate how you deal with the user clicking a button to perform an action when everything is a stream.&lt;/p&gt;
&lt;h2 id=&quot;the-feature&quot;&gt;&lt;a href=&quot;#the-feature&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The feature&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://brodzinski.com/2013/07/cumulative-flow-diagram.html&quot;&gt;Cumulative Flow Diagram (CFD)&lt;/a&gt; is a cool metric to help you understand what’s going on with our Kanban flow. In &lt;a href=&quot;http://www.nicoespeon.com/trello-kanban-analysis-tool/&quot;&gt;TKAT&lt;/a&gt;, data are taken from the Trello API, consolidated then parsed to produce it.&lt;/p&gt;
&lt;p&gt;However, this metric is contained in the entrails of the web app. This is not convenient if we want to re-use or share these information in any way (e.g., to build a global report for external stakeholders).&lt;/p&gt;
&lt;p&gt;What if the data was parsed and we can download a &lt;code class=&quot;language-text&quot;&gt;.csv&lt;/code&gt;? That would be awesome.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 400px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsSAAALEgHS3X78AAAEnklEQVQ4yz2Q609aBwDFb9d/YjZri8W1ClSgWgtDBSwogvKGqzzug3u5XLiCyAUuD7G8VCwoIn1ogVq0pe1q7Xy0plm3dK5LlixLPyzZsizZh2XZl2XJ/oSZLNsvJyc5yTlfDgAAwKlTp06cxWLJ5HIulyuVSgVCIY/HazvTJpfLe3t7ORxOZ2dn39W+k8hms/+fAHqF1DoypJb0NRu1z3aftx49etxq7e/vv9h5lk0wb958/nxnZ7PRqK/f3Wo2vz4+pplob79ErhoZGFECDO5MefEZo2anuVmr1dcqlcPDw7cnvD5azs69PDjY3d3d29s7Ojho1GuH+/vNhw9tHrcnGsbDQSDmhpNel6mLvT7lPHxwq8gESrlsdTFfXcgwJL6UiucTzEphYa1ULM3nymvVRDYzSeCIn3J4vUCSRBkCWbLK30dGj2OGFqGOOSyMyx5FbWGXM+F2MC4badZjRj3tMJonTFa3G5322ykKm6aApAehceTLNPLXgun3rOVd2Fgk4Lkpd4pE5l1g2uNMUSiNwTQCx0kXRBBOyk95oSihL8z4gASBRHAk5bb9lrf+uQg+JMaTyORJr0I6flyEnoWQJIH4YbsfsoVJeNKFQz4fhCBZzLTFeIAYjjA4EiVc2wHzr3Pa10F9lkBCbnQ7AP99G3uXwu6EqSDivBlxLSRJB+m2ER5oikpPwWWvFYi4oDAKxTxYK+Tcsg9GjIqTF5I+bMmH/1FGvp8D46C94sfvFaBgyIK7MJAgi5nwd3cYctIMzMCOEOKs0uSWU1odvogqpDQO5UgsgPlm1epZtYqBjcvzxuTKqF4r/mY19lU982098nbe40JQIIKjKQy8hYpXvep5fSc13O11DC7d1DUqnsN78z+8oPc21DfKQ76wUinuPcrgPz8O72xYa0E7ZgOBAIKU3cNZ/Xm3dqARVFHKj0IT/NjSaLOCvjyqv66BLVX7jdJwyGsE1SNaqbjsn2BoBQYNQhYNMI25K86+L/LjRyuBEioidWK/QUxSmkpe1vjU8eCBLu2WIWrFlMkcw70URIB6LWw2Oi0G2GwCgqBhGeS+mlVtBpTLVjZtEMyMcUNW6WJE/357+vg2VZ2BoEGFRijViozQiM6jk7vH5B6NjNBIgVmNcFpxLq/pCKv4FQsvPdZNqy/lNJxZ7XVaKxsVcvkd586f+ZB3gYWrRTOjPVElL/yfgPy4oAp20NfZBhGPz+sRXeb7VOz0eHdqTDim4nCvtAv4F7qFbPFQL20QpUYux1X8mKqbUV2OqfhAySCsTZyNDbZNXGV/cuXagFi2Al4oGPhFo+j4FrnXcK2XLIW4qbGYKKGmxDA3rhbGR7vjan5cIwBqkz0tqP2+tiMlY7nkPQqZcpsQZDQfF3Q9v6zTTxNYxqZ+W/D/tHmzgDtpRVdyrCdnvJY3XssZ+gBC0k7J2vSCs7kgUauuhsPRu8Xs0/ra6lxkZ2PlxZPtO+XiwfbGqyfNx5uNZ5sbq+kYJOHCEg4s6QL+5YPTpwdlcrPF2t/fLxmQ2p2w/LpiQDZkBSe0Op1Gq4dRbDoY9E0FLFawi8M9z2JdvHTpH/yd3pkI7YMgAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;CSV files everywhere&quot;
        title=&quot;&quot;
        src=&quot;/static/csv-files-be1f2088705df236c839db0facc031f9-63047.png&quot;
        srcset=&quot;/static/csv-files-be1f2088705df236c839db0facc031f9-c0309.png 240w,
/static/csv-files-be1f2088705df236c839db0facc031f9-63047.png 400w&quot;
        sizes=&quot;(max-width: 400px) 100vw, 400px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;h2 id=&quot;building-awesomeness-one-stream-at-a-time&quot;&gt;&lt;a href=&quot;#building-awesomeness-one-stream-at-a-time&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Building awesomeness, one stream at a time&lt;/h2&gt;
&lt;p&gt;From a user point of view, we would like to have a “&lt;em&gt;Download&lt;/em&gt;” button somewhere close to the graph — probably just below. Clicking on this button will download the .csv of the current graph.&lt;/p&gt;
&lt;p&gt;If we change the period/selected lists range and then click on the download button, it should keep matching the displayed graph. We should be able to draw that graph again after we import our data into Excel/GSheet.&lt;/p&gt;
&lt;p&gt;In other words: each time a click on the button happens, download in CSV format the latest data.&lt;/p&gt;
&lt;p&gt;Let’s interpret this in Cycle.js terms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“each time …”&lt;/em&gt;: subscribe to the following stream&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“… a click on the button happens, …”&lt;/em&gt;: &lt;code class=&quot;language-text&quot;&gt;downloadClicks$&lt;/code&gt;, a stream representing button clicks&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“… download in CSV format …”&lt;/em&gt;: a side-effect, performed by a dedicated &lt;code class=&quot;language-text&quot;&gt;ExportToCSV&lt;/code&gt; driver&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“… the latest data.”&lt;/em&gt;: &lt;code class=&quot;language-text&quot;&gt;csvData$&lt;/code&gt;, a stream representing data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is already a stream containing CFD data since we display them already. We simply need to map them to produce a &lt;code class=&quot;language-text&quot;&gt;csvData$&lt;/code&gt; that matches the input format of &lt;code class=&quot;language-text&quot;&gt;ExportToCSV&lt;/code&gt; driver.&lt;/p&gt;
&lt;p&gt;Then, we need to combine our streams to get the latest value from &lt;code class=&quot;language-text&quot;&gt;csvData$&lt;/code&gt;whenever — and only when — an item is emitted in &lt;code class=&quot;language-text&quot;&gt;downloadClicks$&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Brace yourself, there is a Rx.js operator for that: &lt;a href=&quot;http://rxmarbles.com/#withLatestFrom&quot;&gt;withLatestFrom()&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is what we want to achieve:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;downloadClicks$:  -------x------x----------------x----------&amp;gt;
       csvData$:  ---A---------------B----C--D-------E------&amp;gt;

                     withLatestFrom((clicks, data) =&amp;gt; data)

  downloadData$:  -------A------A----------------D----------&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Combining our streams will produce another one (&lt;code class=&quot;language-text&quot;&gt;downloadData$&lt;/code&gt;) that will emit an item containing CSV-formatted data whenever a click happens on the button.&lt;/p&gt;
&lt;h2 id=&quot;what-about-the-download&quot;&gt;&lt;a href=&quot;#what-about-the-download&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What about the download?&lt;/h2&gt;
&lt;p&gt;Downloading a CSV file from formatted data, this looks like a job for a driver!&lt;/p&gt;
&lt;p&gt;Indeed, this kind of operations implies side-effects since the program needs to output something that is visible to the user. This is the part where our application unleash its added value. This is also the part where nasty bugs might lie, regarding the environment, the global state of the machine, etc.&lt;/p&gt;
&lt;p&gt;That’s why we prefer to move this part into a dedicated driver, away from our application logic.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 786px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 75.82697201017811%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsSAAALEgHS3X78AAACaklEQVQoz3VT70/aUBTlf3X/gPs4Ez74xWmYZGYYJpkxWZTEDxjJjEhkZCQIwiJuYlv5TVtaSkt/UV5f2wfbhVZMlnlCXl5fzs09595D6M8rmM/nsyXg8hontOA9/3w4joMxVhSFoiiapnu93ng8RgjB+3+KV7AxBvbm5ubHaDQSiXyIRLZ3dt5vw7GzG90Nh8O1Wg1oZEZ8OSHDtvuaxmq65jiqorxZWzs6OrI8l+O4x05rMBj0+z1ZVoB6fn6eSqUWxYQEnV1CLBBESEtWKpJcA6UUlUh/ZTm2TP3mRTFdv9c1hZea+fyPt+vr3W7XInhoyi5xQ74AaF4fjVTdeLexcXWVcVxriqZNrm8Y+j11N9bU+yb9xDAnyRMTjTWkq1PTgWJ/YD/5AfjACCUSicPDQ3gcyXKZfhBF4ZG567Lsr26rfHOTTCZNPBaMBvasYGAqsmlp5NsAk1tbW5+WOIjHY7FYPP55f3//y0ECxra3t8fQT9COVemg2MS4LknLMS62yvM8wzCtVqvRfAGMgmVZ4Mzms0UPvekSHHgG2ZbrurZdLBaPj4/L5fL19XU2m83lcv55e3t7enoKm/cFSmYPeygoVhGqcPzAMGCTUOl5niiK0ApcwCkIAnBKpVK1WiXeYk+89kRmXjAwACxcmFgcz1crFYhXu90G5XBCbBqNhmEYhULh7OxsMplo9lAy+y8J8/vb02nm8vIyk4F4ss/odDqQUGQjmmZ6bFuwmJHJBglbZXO2/B4Oh+ANlH9fIp/Pg2G4gOd0On1x8U03tFWz0D9Zh78RTBvGC0nqLOFf4AVUWJYFslfkv1aWGhjhpgCOAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;pure dataflow&quot;
        title=&quot;&quot;
        src=&quot;/static/pure-dataflow-ee7d9cb9644cbb01800651833c6d29cf-ffb10.png&quot;
        srcset=&quot;/static/pure-dataflow-ee7d9cb9644cbb01800651833c6d29cf-179f5.png 240w,
/static/pure-dataflow-ee7d9cb9644cbb01800651833c6d29cf-03a47.png 480w,
/static/pure-dataflow-ee7d9cb9644cbb01800651833c6d29cf-ffb10.png 786w&quot;
        sizes=&quot;(max-width: 786px) 100vw, 786px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Our app is pure dataflow while downloading a CSV file is part of side effects stuff.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: I didn’t find an open-sourced “downloadToCsv” driver at the time of implementing the feature, so I build my own for this project. With a very little refactoring, it can easily be open-sourced though.&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ramda&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Export a driver to be used in our Cycle.js app.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// It takes an `input$` stream that contains `data` to be download.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;exportToCSVDriver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input$&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// `data` should be formatted as an Array of Arrays (= lines of CSV).&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// -&gt; `[[&quot;name1&quot;, &quot;city1&quot;, &quot;other info&quot;], [&quot;name2&quot;, &quot;city2&quot;, &quot;more info&quot;]]`&lt;/span&gt;
  input$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Parse data to create a CSV file.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// See: http://stackoverflow.com/questions/14964035/how-to-export-javascript-array-info-to-csv-on-client-side&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; csvContent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;data:text/csv;charset=utf-8,&apos;&lt;/span&gt;
    data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;infoArray&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; index&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; dataString &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; infoArray&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;,&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      csvContent &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; index &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;dataString&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;\n`&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; dataString
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Create a link in the page to trigger the download.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;href&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;encodeURI&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;csvContent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Name the CSV file based on data attributes.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Implementation is based on TKAT specificities (https://github.com/nicoespeon/trello-kanban-analysis-tool).&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// This part can be refactor to open-source the driver.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; head &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;download&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;`cfd-from-&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;head&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;-to-&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;last&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;head&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.csv`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Required for Firefox.&lt;/span&gt;
    document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Download the data file.&lt;/span&gt;
    link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; exportToCSVDriver &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The driver subscribe to an observable (= stream) input.&lt;/p&gt;
&lt;p&gt;Anytime it emits an event containing formatted data, it will perform the side-effect: download the CSV file from these data. Thus, we would simply pass our &lt;code class=&quot;language-text&quot;&gt;downloadData$&lt;/code&gt; stream and we’re done!&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 70.32967032967034%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsSAAALEgHS3X78AAACkklEQVQoz32S208aQRTG9y9rfGv61qR9rmna9EnTWrVQLyBKAFtN1NAmtqmtWlGQi4gWLylaiilRizesd0QQFUEWdpllZ2dnpgtEwkPTb05mspv55ZzzzWEIIfRWggSAoCzACZDLC6IoymJeEAAuIJDPiyJEUhaAAs8DjGXlPgMAkCSpDPMix7Isz3FZIKYzLM/zqMDxPCcDyBY/80hMQyhm2Nxm+DSbE4owhJD+V5XqIMSh7diHUb9a74zG0wxWKpDlyrXygQnBmFTzWU7wBfZ73s836ezNnY4WgyuWyDAKiRD6Z0KFv05zK6vHI7Zf2rfTDRqrqsvR3j2lhErvPjsvwVWZixUqOolee7+H331eaje5lVRNHZOtBmebaUqt9zTqvEpo39gTlylGsbRsWLkxhLDd87tRO9mgsb3qtLcanS1Gt1o/qwCvDe7u/rGJ8d7VHy+Sh/eJtMugksqOCAIcsgReaqxtJleLwdPc9a1J59V0u8yDQ15Px976k1zsnpy6Q5N35YOnJB8vGiaVemazoP/jUn2rq7lzQaX3GPrGhi29geXnsb2Hhasakqoh8QdoSy35viLnGh5J0GvElBom0fOsrm9BZbQMDA1Oe9q3gnU3+7Uo8oge1uOQQfJ/QnMe4tig4wfUukNdfjrjomyaIVg+jVyMfrEt2MwxnxmumGlgGC860IwP2oPi5E/omqOzU3h+TFg2Z4KmkzVdaF3rC2lYEGcglI7+hMFlnPICvYH0ipJLSm7kwtmRnDuh+JyiKAVHCERSXGQzunF4c3wmXETyCRFDpjIcuLSXJ8MSThr98YFgsmcl2RdMAalqgKrEVN63jJZt71o8rp3YrnPuPrZuP7Pv5AR4+5aE3Iby5y/GI8jrlRqodgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;download result&quot;
        title=&quot;&quot;
        src=&quot;/static/download-result-46b604b367b629773d5a360ad80dc5eb-c83f1.png&quot;
        srcset=&quot;/static/download-result-46b604b367b629773d5a360ad80dc5eb-569e3.png 240w,
/static/download-result-46b604b367b629773d5a360ad80dc5eb-93400.png 480w,
/static/download-result-46b604b367b629773d5a360ad80dc5eb-c83f1.png 960w,
/static/download-result-46b604b367b629773d5a360ad80dc5eb-23e13.png 1440w,
/static/download-result-46b604b367b629773d5a360ad80dc5eb-01a65.png 1456w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;And here it is, our “Download .csv” button, waiting for users to click it!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nicoespeon/trello-kanban-analysis-tool/pull/25/files&quot;&gt;Here is the PR&lt;/a&gt; that implemented the feature, in case you want to read the concrete diff.&lt;/p&gt;
&lt;p&gt;What are your feelings about this approach? Would you have done it differently? I’d love to discuss about it!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Trello Kanban analysis tool]]></title><description><![CDATA[Introducing a tool to analyze Kanban workflow on Trello, built with Cycle.js]]></description><link>https://www.nicoespeon.com/en/2016/05/trello-kanban-analysis-tool/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2016/05/trello-kanban-analysis-tool/</guid><pubDate>Mon, 23 May 2016 00:00:00 GMT</pubDate><content:encoded>&lt;figure&gt;
  &lt;blockquote&gt;
    &lt;p&gt;&lt;a href=&quot;http://nicoespeon.com/trello-kanban-analysis-tool/&quot;&gt;nicoespeon.com/trello-kanban-analysis-tool&lt;/a&gt;&lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/figure&gt;
&lt;figure&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEDBf/EABUBAQEAAAAAAAAAAAAAAAAAAAIB/9oADAMBAAIQAxAAAAGWhlMuYiL/xAAaEAACAwEBAAAAAAAAAAAAAAABAgADERIh/9oACAEBAAEFAqU2HhwUANduTzC2T//EABYRAQEBAAAAAAAAAAAAAAAAABEAAf/aAAgBAwEBPwEZy//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwFlf//EABsQAAIBBQAAAAAAAAAAAAAAAAABERAhIjFh/9oACAEBAAY/ApeiGYuxDH2n/8QAGxABAAMAAwEAAAAAAAAAAAAAAQARITFRYaH/2gAIAQEAAT8htV+TuHA58j0TXcUmw8eSxeaqgKqn/9oADAMBAAIAAwAAABAk3//EABcRAAMBAAAAAAAAAAAAAAAAAAABESH/2gAIAQMBAT8QpiGH/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERIf/aAAgBAgEBPxCpIpp//8QAHBABAAICAwEAAAAAAAAAAAAAAQARIUExUWGh/9oACAEBAAE/ECqh0PryL1aFuwQb8iaOQcI4/CVZh5hDHq9y+k40z//Z&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;cover&quot; title=&quot;&quot; src=&quot;/static/cover-489810fa69b92c517544fca37abc2b07-d564d.jpeg&quot; srcset=&quot;/static/cover-489810fa69b92c517544fca37abc2b07-865fd.jpeg 240w,
/static/cover-489810fa69b92c517544fca37abc2b07-d40a0.jpeg 480w,
/static/cover-489810fa69b92c517544fca37abc2b07-d564d.jpeg 960w,
/static/cover-489810fa69b92c517544fca37abc2b07-cfd28.jpeg 1024w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;figcaption&gt;Drawing a CFD &amp;#x2212; Photo credits &lt;a href=&quot;https://www.flickr.com/photos/visualpunch/&quot;&gt;visualpun.ch&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;trello-♡-kanban&quot;&gt;&lt;a href=&quot;#trello-%E2%99%A1-kanban&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Trello ♡ Kanban&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://trello.com/&quot;&gt;Trello&lt;/a&gt; is a powerful tool by its simplicity. Being user-centered, it’s easily adopted. It’s flexible enough to adopt a &lt;a href=&quot;http://jpattonassociates.com/kanban_oversimplified/&quot;&gt;Kanban&lt;/a&gt; flow.&lt;/p&gt;
&lt;p&gt;Actually, &lt;a href=&quot;https://medium.com/@nicoespeon/kanban-and-game-development-with-trello-8819b33f83dc#.1y4ogdtui&quot;&gt;I do use Trello and Kanban a lot for Game Development&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When you do Kanban, there are only a few metrics that you’re interested in. First, you probably want to draw the &lt;a href=&quot;http://brodzinski.com/2013/07/cumulative-flow-diagram.html&quot;&gt;Cumulative Flow Diagram (CFD)&lt;/a&gt;. CFD is very easy to build and gives you great overview of what’s happening in the project. What you need to do is to count the number of tasks (cards) of each column (list), each day. Put this on a graph, connect dots, done:&lt;/p&gt;
&lt;figure&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 800px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsSAAALEgHS3X78AAAD+UlEQVQ4y2NgYGDgAWI5IBZhZGSU5+TiZgOyGRRUNEAUg7NnCAMy8PQLZ8AF0vIqBEE0m7iUrIyRhb09kC0AxIzIitx8w/lcvEMVnTxDpBw9giScvUIkgZgFiIWAWMLZO1TE3i1A3DckTjyjoEoFrCklv47dIyBaNTm3mtMnOE4CqEBEz9SeBWaokaUzj5NnsJh/eKKKf1giB9jlXiEiQKwAxNquPmHKfqHxikAXKoE1OLgHcAINkQexo5NzRYFYJC41nzs1t5wfpCizsForq6jGHOgCRQs7D36gITL2boEChhZOzEYWTpxRidk8OWV1omkFlcpgA7UNbVj8wxKMgJrk0wuq9IAazXJK6qSyi2sVy+o6OIB8ufT8SrPY1HwZkIvc/MLNPIKi9BtnT2drWTCbLae1iS0to0o9PaNCHWygnYsfq7tfhDrQQC6gizitHLyZLB28RG3d/MQtXD2EAiKTRNMLKlWAhhon55TqJ6eXa0RH5muGBSWbRAem6ORGZstmdxVpJy9qkGeAhgcnMMAVkCPDPSBC2MExyNTdKVIrMa1YMiOlmi29qJw/NaOev25LLn/M8jTN4L4yN/+p1S7eJ6erJh2dZ5+ye7kq3EBgoKto6FgyekZFcRryOIGTTsbKEqnstZU2WW21whnN5XwpUY2cxe2ZUtF7J9kn7FxvVLB8qnPtul6nCdtqvTdtjzf7O0NZBGwgMELYgTGl4x+RIGUs78of0pAhW3izUClzVb1e9vE6nZzdFc45u2uM0xkUmELPTNSs2DrJ+/Z6a+3/O1ml/x9j4P+fwiD4MdjW+LOzpyLYQFtnP3b3wAi1psRZ7AX3myRK7xQqRe1bJuIzfZ9F2Np11iFrVkfE7J2gm7On0mbCvsqQszN8beZHRsj/Z/jP+M/eX+K/k6vm4thUtaLcXF6wgd4xUewWht7SWfOrVAoP5qo6rn4s5LDyippv8xIZi0WXDYPmbLbMXTXFb+7sjKy3mQ42//UtpPYHhxjt9fcyf+blpKHjHSJg7B+l4ewTJgGJZbswDmd3H/nSW7XqgdM2mBkseQiOrQt79IQ/r1FRvzfB2uZMbXjwtaAA42emUWBX8HiECih7hcsCsYK7Z7Cgm5u/kJN7IDjRM6gyqLGG9+T4+m1a75Da1qV9rE/N4PpEbbMHRaau96NsLS+4uGgXGrqrOniHGZj6hal4ewbLeHqFqHh5Bct6eAYru/mEyyXmVLPDk0j9Wj6moK5qO6u4at2aOGPNkhwXvRZPP9Nqu2BDZ+dwRVWfcCUb31BTZ69gM1evYBMnrxB9YMqQA6YMeVefcFkzGxdlI3N7NxUNPT6G//9BRv5noBAwA7EUEPMCANrpO5/GivXrAAAAAElFTkSuQmCC&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;cfd cheet sheet&quot; title=&quot;&quot; src=&quot;/static/cfd-cheet-sheet-70fa4aeb65dfc9af031ba354f1fe6ad4-54aa9.png&quot; srcset=&quot;/static/cfd-cheet-sheet-70fa4aeb65dfc9af031ba354f1fe6ad4-309c7.png 240w,
/static/cfd-cheet-sheet-70fa4aeb65dfc9af031ba354f1fe6ad4-225b9.png 480w,
/static/cfd-cheet-sheet-70fa4aeb65dfc9af031ba354f1fe6ad4-54aa9.png 800w&quot; sizes=&quot;(max-width: 800px) 100vw, 800px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;figcaption&gt;CFD Cheet Sheet from &lt;a href=&quot;http://leanguru.pro/the-cumulative-flow-chart-cfd-in-a-nutshell/&quot;&gt;leanguru.pro&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;It only takes 30 seconds everyday. But, &lt;strong&gt;you have to do it everyday&lt;/strong&gt;. It’s not convenient to reverse engineer it if you missed some days.&lt;/p&gt;
&lt;p&gt;Don’t get me wrong: this is not a difficult thing to do and you usually get the team involved in the process, so you are not likely to miss.&lt;/p&gt;
&lt;p&gt;But, since you’re using Trello, you might expect to retrieve these information somehow with their API. That would mean not losing time doing this by hand. Also, it would be retroactive!&lt;/p&gt;
&lt;p&gt;Among existing tools, &lt;a href=&quot;http://ollertapp.com/&quot;&gt;Ollert&lt;/a&gt; is great at providing Agile metrics from Trello boards, including CFD. Yet, if you’re just interested in Kanban metrics, that might not fit your needs. Plus, it doesn’t give you the second metric you’ll be looking for: &lt;a href=&quot;http://leankit.com/learn/kanban/lean-flow-metrics/#lead-time-and-cycle-time&quot;&gt;Cycle Times&lt;/a&gt; over a selected period.&lt;/p&gt;
&lt;h2 id=&quot;a-great-use-case-for-a-side-project&quot;&gt;&lt;a href=&quot;#a-great-use-case-for-a-side-project&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A great use case for a side-project&lt;/h2&gt;
&lt;p&gt;That unresolved need was a good opportunity for me to get out of my comfort zone and actually practice &lt;a href=&quot;https://gist.github.com/staltz/868e7e9bc2a7b8c1f754&quot;&gt;Functional Reactive Programming (FRP)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thus, I decided to go with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ES2015 as this is a brand new JS project started in 2016&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cycle.js.org/&quot;&gt;Cycle.js&lt;/a&gt;, which is based on &lt;a href=&quot;https://github.com/Reactive-Extensions/RxJS&quot;&gt;Rx.js&lt;/a&gt;, for the FRP approach&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/substack/tape&quot;&gt;Tape&lt;/a&gt; as a test runner — challenging out &lt;a href=&quot;https://medium.com/@_ericelliott&quot;&gt;Eric Elliott&lt;/a&gt; &lt;a href=&quot;https://medium.com/javascript-scene/why-i-use-tape-instead-of-mocha-so-should-you-6aa105d8eaf4&quot;&gt;advice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://brunch.io/&quot;&gt;Brunch&lt;/a&gt; as an automation tool to ease my life with ES2015 stuff&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://nvd3.org/&quot;&gt;Nvd3&lt;/a&gt; to render graphs — that’s all about data visualization after all&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.trello.com/&quot;&gt;Trello API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://materializecss.com/about.html&quot;&gt;Materialize&lt;/a&gt; to quickly set up a decent UI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Making Trello API and Nvd3 work with Cycle.js was quite a challenge. It makes me write my first Cycle.js drivers — which may end up into their own repositories once they will be standard enough to be used independently.&lt;/p&gt;
&lt;p&gt;Developing with pure functions, composing them, thinking the application in terms of streams… that was really refreshing. I found that working with Cycle.js/Rx.js made me think differently. The approach is different.&lt;/p&gt;
&lt;figure&gt;
  &lt;blockquote&gt;
    &lt;p&gt;Leaving the app logic free from side effects allows to focus on a fraction of it without messing up something else.&lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/figure&gt;
&lt;p&gt;I found this simplifies working on small problems, building components that can be plugged to play together.&lt;/p&gt;
&lt;p&gt;Future will tell me if that helps maintainability of a growing application.&lt;/p&gt;
&lt;h2 id=&quot;i-finally-got-something-that-does-the-job&quot;&gt;&lt;a href=&quot;#i-finally-got-something-that-does-the-job&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;I finally got something that does the job&lt;/h2&gt;
&lt;p&gt;After some time working on it on my spare time, I finally reached the point of an app that does the basic job I needed. This is where I decided to open source what I’ve got so far — if it’s useful to me, it might be for someone else.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 84%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAAsSAAALEgHS3X78AAABvklEQVQ4y5WSW2/UMBCF8/8fQO0jUgVF4iL6yK8oVKVB3WxvdNXVZq9pbnY2cWwcvsQQtiX7wJFjjcczc86M4zVNk9zlZ4cj/+jm7CCIrhI8aVke+l+PgouXF19OlyGeUus3Y//V6Px14L/4djp+jHB6fCIsgg8/xif3l+/u0geBRyr18Xr06TY4DvwgbuOUMZ/vb95fX57cBm/H3x/ytE2WQiZZYhvbDMFWqhTCGDN462mtpZSqUkabdhnzs4PurFJVQkpinKdfLsxzF83/w1rrbbfbzWaj69o5nqymoa7tDPsPYPVkUTzGsQth313Io6M4jouiGE6ulMryXGltOpZnyXVdCyHKsnQJvWBA2x53aZqy6z0j7UFxJED4d9p5nmdZBgPlq6rC0Duo/8B0LYRhyG46RS0zyYvFYrlcTqfT1WrFndiDJEmiKIIcmyzIfk+bqeDCQIUdAiLRRYN9z61szpPJBHIksVNCDgFCImezmQtgp5anlEKDE0aTZj+Idg2b/g8jk4ZpBlpsarnJPYPjWK/XGByJad+ZJhHjkufzOfzbIRCNbCaKwZEuqNL+2250SOIa1753JpKcXc8v3NLRHPknFYsAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;result top&quot;
        title=&quot;&quot;
        src=&quot;/static/result-top-1986e7e0ced5b6958ad595706311a70c-c83f1.png&quot;
        srcset=&quot;/static/result-top-1986e7e0ced5b6958ad595706311a70c-569e3.png 240w,
/static/result-top-1986e7e0ced5b6958ad595706311a70c-93400.png 480w,
/static/result-top-1986e7e0ced5b6958ad595706311a70c-c83f1.png 960w,
/static/result-top-1986e7e0ced5b6958ad595706311a70c-23e13.png 1440w,
/static/result-top-1986e7e0ced5b6958ad595706311a70c-706b5.png 1600w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 51.31249999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAACKUlEQVQoz02S/08ScRjH/X9sfZ/VQdloi5yu+qHmtKY/FNu1tiLaGtrqh76oOYahKVRSrrWuseEqkTsSagjFgU44Be4Lp4ewA4lWgqyAO+66o9vqs9dne57t83qeH96fFo7jSqUS1xB+V6tcXer4Wq3GV3/V6zWuXK6kUjsbdBnHi05nbnRkXafbAEG6r2/LOiWKYgvP85VKRVSOICM0EcWC2UwBwLpWS2tOkMfa6YdDrM22DUG523fyV6/JsrRrR5LlbVXh7wBBqASDBYuFPN5OqgDyqJoEAKqrk/R5EsHAd4LAve/d0LAsN0SxzLJZEEz397ODg6zRmNXrCRVA79rNtAG0Sk0DavqwCj/dEYsg/qifyVMI5RlbtcqydDNTk0Rra+rQEWrfAZn9B9NtqlB3h224e3Si1zTea3rc8+g1GCYDnzE/XaQRCrZEzIpcMI2Re/ZinSejpzQSMa3m7c2zIHz5yleDAR24gRqvo7fuo0MYQ8RT2NaPXIRZnk3Cirz0zn53/MwAonvgunRvXkJnCOhNS5MONPHCT71cJGcWqWe+hNWbtHrxmS+MGU46wqwiQ6RT5zdOe9445pzQnANyzdo/xSa8DPgK63kevjAduWiPSMU5G3r+aUii60lwBMEVubj9c5nc9MWLH1ZYOP7NheXdK5n5aNodZRbWsvAKs7Ca+YilkRjjXcvKBbYZIrKK3Myn0QyZF8VGk2bg/8L/7xcorfRG/AOwQMCSV/E6JQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;result bottom&quot;
        title=&quot;&quot;
        src=&quot;/static/result-bottom-2ed447eda37ba3a7b71912c682c2344c-c83f1.png&quot;
        srcset=&quot;/static/result-bottom-2ed447eda37ba3a7b71912c682c2344c-569e3.png 240w,
/static/result-bottom-2ed447eda37ba3a7b71912c682c2344c-93400.png 480w,
/static/result-bottom-2ed447eda37ba3a7b71912c682c2344c-c83f1.png 960w,
/static/result-bottom-2ed447eda37ba3a7b71912c682c2344c-23e13.png 1440w,
/static/result-bottom-2ed447eda37ba3a7b71912c682c2344c-706b5.png 1600w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Naming things is hard. I went with &lt;em&gt;Trello Kanban Analysis Tool&lt;/em&gt;, which I abbreviated TKAT. I’m not really good at naming things… well, at least it stands for what it is and the acronym is easy to catch 😀&lt;/p&gt;
&lt;p&gt;So here it is: &lt;a href=&quot;https://github.com/nicoespeon/trello-kanban-analysis-tool&quot;&gt;https://github.com/nicoespeon/trello-kanban-analysis-tool&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I just spent some time to polish the README and set up few things to ease contributions.&lt;/p&gt;
&lt;p&gt;So, here I am, introducing my ‘‘&lt;em&gt;JS library to analyse Kanban metrics from a Trello board’’&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;As a user of it, I already listed stuff I planned to improve, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make it an web application, served by GitHub&lt;/li&gt;
&lt;li&gt;Skin it a bit, following Trello guidelines&lt;/li&gt;
&lt;li&gt;Deal with persistence so it would be more convenient for the user&lt;/li&gt;
&lt;li&gt;Deal with Trello API in a smarter way (e.g: not flooding the Trello API when a lot of data is missing for a selected period)&lt;/li&gt;
&lt;li&gt;Calculating throughput&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;If you are using Trello with Kanban workflow&lt;/strong&gt;, I’ll be glad you give it a try and &lt;a href=&quot;https://github.com/nicoespeon/trello-kanban-analysis-tool/issues/new&quot;&gt;give me feedback&lt;/a&gt; on what you think / is missing / isn’t working for you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you are familiar with Cycle.js or Rx.js&lt;/strong&gt;, I’m all ears to suggestions. Please go check and criticize my implementation as I certainly not had everything right. Advices on good drivers implementation would be really valuable for example!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you don’t feel concerned about this&lt;/strong&gt; but still read the whole post… well that’s cool ¯\_(ツ)_/¯&lt;/p&gt;
&lt;p&gt;Thanks, take care and have fun!&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/it-works-762ed5343cbb8c4462836f832ad68742.gif&quot; alt=&quot;&quot;&gt;
  &lt;figcaption&gt;At least, it does the trick.&lt;/figcaption&gt;
&lt;/figure&gt;</content:encoded></item><item><title><![CDATA[Point-free JavaScript avec R.converge / _.over]]></title><description><![CDATA[Mes retours sur une pratique plus fonctionnelle de JavaScript.]]></description><link>https://www.nicoespeon.com/fr/2016/04/point-free-javascript/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2016/04/point-free-javascript/</guid><pubDate>Tue, 12 Apr 2016 00:00:00 GMT</pubDate><content:encoded>&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/cover-95c660e69742bc8890aa1bd334939a35-667be.jpeg&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 56.40625%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAFW1TjUUhX/xAAaEAACAgMAAAAAAAAAAAAAAAAAAQMSESIy/9oACAEBAAEFAlqWyMl6RE3X/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQMBAT8BR//EABYRAQEBAAAAAAAAAAAAAAAAAAAREv/aAAgBAgEBPwGtP//EABUQAQEAAAAAAAAAAAAAAAAAABAB/9oACAEBAAY/Amv/xAAbEAACAwADAAAAAAAAAAAAAAAAAREhQTFhof/aAAgBAQABPyFJWofY1oJDtM9QznnSdvT/2gAMAwEAAgADAAAAEPMv/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERIf/aAAgBAwEBPxCzBKf/xAAXEQEBAQEAAAAAAAAAAAAAAAABABEh/9oACAECAQE/EAvUlDl//8QAHBABAAMAAgMAAAAAAAAAAAAAAQARIUFhEDGh/9oACAEBAAE/EC9McDSK2ovqLgL078a7a4QADodfJ//Z&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;cover&quot; title=&quot;&quot; src=&quot;/static/cover-95c660e69742bc8890aa1bd334939a35-d564d.jpeg&quot; srcset=&quot;/static/cover-95c660e69742bc8890aa1bd334939a35-865fd.jpeg 240w,
/static/cover-95c660e69742bc8890aa1bd334939a35-d40a0.jpeg 480w,
/static/cover-95c660e69742bc8890aa1bd334939a35-d564d.jpeg 960w,
/static/cover-95c660e69742bc8890aa1bd334939a35-c67c1.jpeg 1440w,
/static/cover-95c660e69742bc8890aa1bd334939a35-667be.jpeg 1920w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Faire converger les fonctions pour aller vers la simplicit&amp;#xE9;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;le-contexte&quot;&gt;&lt;a href=&quot;#le-contexte&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le contexte&lt;/h2&gt;
&lt;p&gt;Je travaille sur un side-project qui est surtout un prétexte pour moi de pratiquer une approche plus fonctionnelle de JavaScript. En l’occurrence, ici je m’amuse surtout avec ES6, &lt;a href=&quot;http://cycle.js.org/&quot;&gt;Cycle.js&lt;/a&gt; et &lt;a href=&quot;http://ramdajs.com/&quot;&gt;Ramda&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ainsi, j’en profite pour pratiquer la programmation de style &lt;em&gt;point-free&lt;/em&gt;, aka &lt;em&gt;tacit programming&lt;/em&gt;, lorsque c’est pertinent.&lt;/p&gt;
&lt;p&gt;Pour résumer l’idée : cela veut dire que &lt;a href=&quot;https://github.com/MostlyAdequate/mostly-adequate-guide/blob/master/ch5.md#pointfree&quot;&gt;qu’il n’est pas nécessaire d’expliciter nos données&lt;/a&gt;. Lorsqu’elle est utilisée avec sagesse, cette technique permet de conserver un code clair et concis en supprimant les inutiles déclarations de variables intermédiaires. Voyez plutôt :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// From https://github.com/MostlyAdequate/mostly-adequate-guide/blob/master/ch5.md#pointfree&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Not point-free because we mention the data: name&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;initials&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  name
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos; &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toUpperCase&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; head&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;. &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Point-free style&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; initials &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;. &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toUpperCase&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; head&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos; &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;initials&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;hunter stockton thompson&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &apos;H. S. T&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Mais je me suis retrouvé dans une situation qui pourra vous sembler familière si vous vous essayez, comme moi, à ce style de programmation.&lt;/p&gt;
&lt;h2 id=&quot;le-problème&quot;&gt;&lt;a href=&quot;#le-probl%C3%A8me&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le problème&lt;/h2&gt;
&lt;p&gt;J’ai une fonction &lt;code class=&quot;language-text&quot;&gt;daysSpent&lt;/code&gt; qui prend une &lt;code class=&quot;language-text&quot;&gt;Date&lt;/code&gt;, une autre &lt;code class=&quot;language-text&quot;&gt;Date&lt;/code&gt; et qui me retourne le &lt;code class=&quot;language-text&quot;&gt;Number&lt;/code&gt; de jours qui se sont écoulés entre elles.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;daysSpent : Date -&amp;gt; Date -&amp;gt; Number&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis, j’ai une list d’éléments où chacun dispose d’un attribut date :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Backlog&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2016-04-01&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Card Preparation [2]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2016-04-01&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Production [3]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2016-04-02&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Tests QA [2]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2016-04-05&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Mise en live [1]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2016-04-05&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;In Production&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2016-04-06&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Live (April 2016)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2016-04-08&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce que je souhaite consiste à calculer le nombre de jours passés entre le premier et le dernier élément de ma liste (ce qui s’appelle le &lt;em&gt;Lead Time&lt;/em&gt; dans mon contexte).&lt;/p&gt;
&lt;p&gt;Bon et bien j’y suis presque. J’ai certainement besoin de me servir de ma fonction &lt;code class=&quot;language-text&quot;&gt;daysSpent&lt;/code&gt;. Le soucis c’est que le format n’est pas tout à fait adapté. En utilisant Ramda, je suppose qu’une approche naive au problème ressemblerait à ceci :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; pipe&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; prop&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ramda&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; daysSpent &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./utils/dates&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// leadTime : [{date: Date}] -&gt; Number&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;leadTime&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; items &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;daysSpent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;date&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;last&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;date&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ça fonctionne c’est sûr… mais quelque chose ne sonne pas très juste ici.&lt;/p&gt;
&lt;p&gt;Je suis forcé de déclarer &lt;code class=&quot;language-text&quot;&gt;items&lt;/code&gt; et de le balader partout parce-que j’ai besoin de le transformer de différentes manières avant de pouvoir le traiter. Je ne peux pas faire s’écouler naturellement &lt;code class=&quot;language-text&quot;&gt;items&lt;/code&gt; le long d’une composition de fonctions car je dois le faire diverger afin de respecter l’arité de&lt;code class=&quot;language-text&quot;&gt;daysSpent&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;C’était une problématique assez récurrente… que Ramda résout !&lt;/p&gt;
&lt;h2 id=&quot;rconverge-à-la-rescousse&quot;&gt;&lt;a href=&quot;#rconverge-%C3%A0-la-rescousse&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;R.converge à la rescousse&lt;/h2&gt;
&lt;p&gt;Voilà le topo :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// What I ended up with&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getX&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; input &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parseA&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseB&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// What I was trying to achieve, some sort of:&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; getX &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;anyFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;parseA&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; parseB&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Parmi la trousse à outils de Ramda, il y a une fonction qui fait exactement ça : &lt;a href=&quot;http://ramdajs.com/0.19.1/docs/#converge&quot;&gt;R.converge&lt;/a&gt;. La syntaxe est la suivante :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; getX &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;converge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;getY&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;parseA&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; parseB&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Tadaaaaam :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; converge&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pipe&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; prop&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ramda&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; daysSpent &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./utils/dates&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// leadTime : [{date: Date}] -&gt; Number&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; leadTime &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;converge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;daysSpent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;date&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;last&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;date&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ceci va appeler &lt;code class=&quot;language-text&quot;&gt;daysSpent&lt;/code&gt; avec les arguments attendus à partir de l’input. Plus besoin de déclarer ce dernier avec une variable, je peux me concentrer sur les opérations.&lt;/p&gt;
&lt;p&gt;D’ailleurs, le refactor est encore plus simple:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; pipe&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pluck&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; converge&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ramda&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; daysSpent &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./utils/dates&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// leadTime : [{date: Date}] -&gt; Number&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; leadTime &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;pluck&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;date&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// first convert input into [Date]&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;converge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;daysSpent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// then pick proper ones for calculation&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;leadTime&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;pluck&lt;/code&gt; les &lt;code class=&quot;language-text&quot;&gt;date&lt;/code&gt;s de input, puis&lt;code class=&quot;language-text&quot;&gt;converge&lt;/code&gt; le &lt;code class=&quot;language-text&quot;&gt;head&lt;/code&gt; et &lt;code class=&quot;language-text&quot;&gt;last&lt;/code&gt; de la liste dans&lt;code class=&quot;language-text&quot;&gt;daysSpent&lt;/code&gt; pour déterminer le résultat. Je trouve qu’il y a de la beauté dans une telle simplicité.&lt;/p&gt;
&lt;p&gt;Oh et si vous êtes plutôt du genre &lt;a href=&quot;https://lodash.com/&quot;&gt;lodash&lt;/a&gt; (ce qui est mon cas, mais j’ai toujours voulu voir ce que Ramda avait dans le ventre), &lt;a href=&quot;https://github.com/lodash/lodash/wiki/FP-Guide&quot;&gt;lodash-fp&lt;/a&gt; fait également du bon boulot. &lt;a href=&quot;https://medium.com/@jdalton&quot;&gt;John-David Dalton&lt;/a&gt; suggère une approche différente :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; pipe&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pluck&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; over&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; spread &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;lodash/fp&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; daysSpent &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./utils/dates&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// leadTime : [{date: Date}] -&gt; Number&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; leadTime &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;pluck&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;date&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// first convert input into [Date]&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;over&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// then turns them to our arguments array [ FirstDate, LastDate ]&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;spread&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;daysSpent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// finally spread arguments to the function&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;Si vous souhaitez explorer le sujet en profondeur :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un article sur le &lt;a href=&quot;http://lucasmreis.github.io/blog/pointfree-javascript/&quot;&gt;point-free JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cycle.js.org/getting-started.html&quot;&gt;Get started&lt;/a&gt; avec Cycle.js&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://fr.umio.us/the-philosophy-of-ramda/&quot;&gt;The philosophy of Ramda&lt;/a&gt; − même si lodash-fp fait du bon travail en pratique aujourd’hui, Ramda se combine parfaitement avec les concepts de programmation fonctionnelle&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Point-free JavaScript with R.converge / _.over]]></title><description><![CDATA[Insights from practicing a more functional approach to JavaScript.]]></description><link>https://www.nicoespeon.com/en/2016/04/point-free-javascript/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2016/04/point-free-javascript/</guid><pubDate>Tue, 12 Apr 2016 00:00:00 GMT</pubDate><content:encoded>&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/cover-95c660e69742bc8890aa1bd334939a35-667be.jpeg&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 56.40625%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAFW1TjUUhX/xAAaEAACAgMAAAAAAAAAAAAAAAAAAQMSESIy/9oACAEBAAEFAlqWyMl6RE3X/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQMBAT8BR//EABYRAQEBAAAAAAAAAAAAAAAAAAAREv/aAAgBAgEBPwGtP//EABUQAQEAAAAAAAAAAAAAAAAAABAB/9oACAEBAAY/Amv/xAAbEAACAwADAAAAAAAAAAAAAAAAAREhQTFhof/aAAgBAQABPyFJWofY1oJDtM9QznnSdvT/2gAMAwEAAgADAAAAEPMv/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERIf/aAAgBAwEBPxCzBKf/xAAXEQEBAQEAAAAAAAAAAAAAAAABABEh/9oACAECAQE/EAvUlDl//8QAHBABAAMAAgMAAAAAAAAAAAAAAQARIUFhEDGh/9oACAEBAAE/EC9McDSK2ovqLgL078a7a4QADodfJ//Z&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;cover&quot; title=&quot;&quot; src=&quot;/static/cover-95c660e69742bc8890aa1bd334939a35-d564d.jpeg&quot; srcset=&quot;/static/cover-95c660e69742bc8890aa1bd334939a35-865fd.jpeg 240w,
/static/cover-95c660e69742bc8890aa1bd334939a35-d40a0.jpeg 480w,
/static/cover-95c660e69742bc8890aa1bd334939a35-d564d.jpeg 960w,
/static/cover-95c660e69742bc8890aa1bd334939a35-c67c1.jpeg 1440w,
/static/cover-95c660e69742bc8890aa1bd334939a35-667be.jpeg 1920w&quot; sizes=&quot;(max-width: 960px) 100vw, 960px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Get to simplicity, converging functions.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;the-context&quot;&gt;&lt;a href=&quot;#the-context&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The context&lt;/h2&gt;
&lt;p&gt;I’m working on a side-project which is mainly a playground for me to practice a more functional approach to JavaScript. There I’m mostly playing with ES6, &lt;a href=&quot;http://cycle.js.org/&quot;&gt;Cycle.js&lt;/a&gt; and &lt;a href=&quot;http://ramdajs.com/&quot;&gt;Ramda&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Along this journey, I’m doing my best to practice &lt;em&gt;point-free&lt;/em&gt; style programming, aka &lt;em&gt;tacit programming&lt;/em&gt;, when relevant.&lt;/p&gt;
&lt;p&gt;To put it in a nutshell: it means that &lt;a href=&quot;https://github.com/MostlyAdequate/mostly-adequate-guide/blob/master/ch5.md#pointfree&quot;&gt;you never have to say your data&lt;/a&gt;. When used wisely, it can help keeping your code clear and concise, avoiding unnecessary intermediate variable declarations. See for yourself:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// From https://github.com/MostlyAdequate/mostly-adequate-guide/blob/master/ch5.md#pointfree&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Not point-free because we mention the data: name&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;initials&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  name
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos; &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toUpperCase&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; head&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;. &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Point-free style&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; initials &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;. &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toUpperCase&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; head&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos; &apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;initials&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;hunter stockton thompson&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &apos;H. S. T&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, I found myself stuck in a situation that may sound familiar if you ever tried to achieve that.&lt;/p&gt;
&lt;h2 id=&quot;the-problem&quot;&gt;&lt;a href=&quot;#the-problem&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The problem&lt;/h2&gt;
&lt;p&gt;I’ve got a &lt;code class=&quot;language-text&quot;&gt;daysSpent&lt;/code&gt; function that takes a &lt;code class=&quot;language-text&quot;&gt;Date&lt;/code&gt;, another &lt;code class=&quot;language-text&quot;&gt;Date&lt;/code&gt; and then return the &lt;code class=&quot;language-text&quot;&gt;Number&lt;/code&gt; of days spent between those.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;daysSpent : Date -&amp;gt; Date -&amp;gt; Number&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, I have a list of items, each of which having a date attribute:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Backlog&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2016-04-01&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Card Preparation [2]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2016-04-01&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Production [3]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2016-04-02&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Tests QA [2]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2016-04-05&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Mise en live [1]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2016-04-05&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;In Production&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2016-04-06&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;list&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Live (April 2016)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2016-04-08&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;What I want is to calculate the number of days spent between the first item of the list and the last one − which is something that will be called &lt;em&gt;Lead Time&lt;/em&gt; in my context.&lt;/p&gt;
&lt;p&gt;Well, I’m almost there. What I need is probably to use the &lt;code class=&quot;language-text&quot;&gt;daysSpent&lt;/code&gt; function. However, the format doesn’t quite match. I guess the naive attempt to do so, using Ramda, would look like:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; pipe&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; prop&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ramda&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; daysSpent &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./utils/dates&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// leadTime : [{date: Date}] -&gt; Number&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;leadTime&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; items &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;daysSpent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;date&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;last&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;date&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It sures work, but… something feel weird here.&lt;/p&gt;
&lt;p&gt;I’m doomed to declare &lt;code class=&quot;language-text&quot;&gt;items&lt;/code&gt; and spread it around because I need to parse it into different ways before I can process it. I can’t make &lt;code class=&quot;language-text&quot;&gt;items&lt;/code&gt; flow nicely since I need to branch it to respect the arity of &lt;code class=&quot;language-text&quot;&gt;daysSpent&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This used to be a common issue… which Ramda solves!&lt;/p&gt;
&lt;h2 id=&quot;rconverge-to-the-rescue&quot;&gt;&lt;a href=&quot;#rconverge-to-the-rescue&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;R.converge to the rescue&lt;/h2&gt;
&lt;p&gt;Here is the thing:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// What I ended up with&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getX&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; input &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parseA&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseB&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// What I was trying to achieve, some sort of:&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; getX &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;anyFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;parseA&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; parseB&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Among Ramda toolset, there is a function for that: &lt;a href=&quot;http://ramdajs.com/0.19.1/docs/#converge&quot;&gt;R.converge&lt;/a&gt;. Syntax is the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; getX &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;converge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;getY&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;parseA&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; parseB&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aaaand, there we go:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; converge&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pipe&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; prop&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ramda&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; daysSpent &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./utils/dates&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// leadTime : [{date: Date}] -&gt; Number&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; leadTime &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;converge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;daysSpent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;date&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;last&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;date&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will call &lt;code class=&quot;language-text&quot;&gt;daysSpent&lt;/code&gt; with properly expected arguments from input. Needless to declare it with a variable, I focus on operations.&lt;/p&gt;
&lt;p&gt;Hence, refactoring got event easier:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; pipe&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pluck&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; converge&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ramda&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; daysSpent &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./utils/dates&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// leadTime : [{date: Date}] -&gt; Number&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; leadTime &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;pluck&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;date&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// first convert input into [Date]&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;converge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;daysSpent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// then pick proper ones for calculation&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;leadTime&lt;/code&gt; pluck input &lt;code class=&quot;language-text&quot;&gt;date&lt;/code&gt;s, then &lt;code class=&quot;language-text&quot;&gt;converge&lt;/code&gt; the &lt;code class=&quot;language-text&quot;&gt;head&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;last&lt;/code&gt; of the list into &lt;code class=&quot;language-text&quot;&gt;daysSpent&lt;/code&gt; to get the result. I found some beauty in such simplicity.&lt;/p&gt;
&lt;p&gt;Oh and if you’re much a &lt;a href=&quot;https://lodash.com/&quot;&gt;lodash&lt;/a&gt; person − I am, but I always wanted to experiment what Ramda got − &lt;a href=&quot;https://github.com/lodash/lodash/wiki/FP-Guide&quot;&gt;lodash-fp&lt;/a&gt; is doing a pretty good job too. &lt;a href=&quot;https://medium.com/@jdalton&quot;&gt;John-David Dalton&lt;/a&gt; suggested another approach to do so:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; pipe&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pluck&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; over&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; spread &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;lodash/fp&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; daysSpent &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./utils/dates&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// leadTime : [{date: Date}] -&gt; Number&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; leadTime &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;pluck&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;date&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// first convert input into [Date]&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;over&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; last&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// then turns them to our arguments array [ FirstDate, LastDate ]&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;spread&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;daysSpent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// finally spread arguments to the function&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;If you’d like to explore further:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An article about &lt;a href=&quot;http://lucasmreis.github.io/blog/pointfree-javascript/&quot;&gt;point-free JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cycle.js.org/getting-started.html&quot;&gt;Get started&lt;/a&gt; with Cycle.js&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://fr.umio.us/the-philosophy-of-ramda/&quot;&gt;The philosophy of Ramda&lt;/a&gt; − even though lodash-fp is doing a great practical job today, Ramda plays nicely with FP concepts&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Gérer ses mails avec la méthode « Inbox Zero »]]></title><description><![CDATA[Moins de mails, plus de sérénité !]]></description><link>https://www.nicoespeon.com/fr/2016/02/gerer-mails-methode-inbox-zero/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2016/02/gerer-mails-methode-inbox-zero/</guid><pubDate>Thu, 18 Feb 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;le-principe&quot;&gt;&lt;a href=&quot;#le-principe&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; Le principe&lt;/h2&gt;
&lt;p&gt;L’idée ici est de vous présenter en quoi consiste cette méthode de productivité, comment ça se met en place et ce qui fonctionne pour moi.&lt;/p&gt;
&lt;p&gt;Le constat de base est le suivant : les mails qui s’entassent peuvent nous peser sur la conscience.&lt;/p&gt;
&lt;p&gt;Au mieux, on essaie de ne pas trop accumuler de messages non-lus, on s’efforce de se souvenir constamment quels sont les mails urgents, ceux qui attendent une réponse, ceux qui sont juste du spam… Au pire, on laisse s’entasser le 2342e mail non-lu, on oublie de traiter certains e-mails plus ou moins importants, on n’est pas vraiment « joignable » par mail.&lt;/p&gt;
&lt;p&gt;Le concept de l’&lt;em&gt;inbox zero&lt;/em&gt; consiste donc à &lt;strong&gt;nettoyer notre boite mail&lt;/strong&gt; pour éviter qu’elle se transforme en TODO-list non contrôlée.&lt;/p&gt;
&lt;p&gt;Cela nous permet de garder l’esprit serein devant notre boite vide, car on sait que l’on oublie rien. C’est d’ailleurs le moyen le plus efficace que j’ai pu adopter pour FAIRE les choses jusqu’à aujourd’hui.&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/le-saint-graal-f2aa7358e3dafd7086da292a2f7c84fe-08505.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 360px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 166.66666666666669%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAhCAYAAADZPosTAAAACXBIWXMAAAsTAAALEwEAmpwYAAACwUlEQVRIx61WXU8TQRTd36IisQIK1kIBgdbSVkQjRI0J+iAY0kTqBxJfjA+++Gbig4m/wRf/g4kPxh8gbdpS2LZLKdBSSksp7R7nTnfrst1uP+wmJ/fOvdNzz8ydzq7g67sI36Xz8Fl64OvrrVrLBQU9eDs8hDXbIF4P9cN/xYJV6wA+ep14eXUQH+bP4Z2nFysD/WxswQqDEJsehvTAi/jsJESnFYk7U0jcdTBMIT5zA+LtCYieUcRmJxDzjiF2axxRNhbdI9iYGEF00sbidiTueyG6bBACDis2/YsIP5zBH/tlRB7PQVz1Ycv/FBtLj7D14hk2nsyz8VIVr5aZXURkYQ7Bm1YEHNcQnLYjuryAgGsEQpBVC3rGwK17tGq9yliFGmfqOHj+35yA287m2Lkv5DYjyEXDDMxyXzNWcSYePjtfCxYT0OVHkCsVdBOCLMvoJrq/ZKMgVVKtEbRzWiZsRKrPmxK28qNmcwSzpdKTzWZxdHTEQb4Ract7WCqVEI/HkU6nkclkkEgkeKzlPdQrI4LT09NavsLO2fb2tqHSpoS5XI6rIpJyucyJKXd4eMhzbRPSnh0cHHC/UChwqIXy+Xz7hKROkqS6eDKZ5DlTQqMzR8/JyQnfM7XLOzs7PGbWaUHfWSOltEwCdduosNavU9ju03DJ2mbs7+/XVJFCUkbdpSapPtlisdhYoRqgSerRoM6ST0XUAuRTl8k/Pj42XzKdub29Pezu7nJlRJZKpWoqyVKelFK3jQ64aVP0oIIE/b7VdbnTplQLKdd/oy63DJrPiDTs//cKIGX8RsqkkQ8FIJtdX02XqSjLR0IIsU+QoPM6pK+fOWlnhMqVFv/yCWH2FSG9f8M+Q4ZRYGo7VFjmfurnD6zfc2F9fADBteco0Xu5s/2TeRNo4cnfv7D5/RtyylUndPrflZXO6nN/AWy9lu3PEvfCAAAAAElFTkSuQmCC&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Le saint Graal&quot; title=&quot;&quot; src=&quot;/static/le-saint-graal-f2aa7358e3dafd7086da292a2f7c84fe-08505.png&quot; srcset=&quot;/static/le-saint-graal-f2aa7358e3dafd7086da292a2f7c84fe-c5b38.png 240w,
/static/le-saint-graal-f2aa7358e3dafd7086da292a2f7c84fe-08505.png 360w&quot; sizes=&quot;(max-width: 360px) 100vw, 360px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Une journ&amp;#xE9;e sereine, m&amp;#xEA;me GMail est heureux&amp;#xA0;!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;concrètement-comment-ça-se-met-en-place-&quot;&gt;&lt;a href=&quot;#concr%C3%A8tement-comment-%C3%A7a-se-met-en-place-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Concrètement, comment ça se met en place ?&lt;/h2&gt;
&lt;p&gt;C’est la partie la plus difficile. Honnêtement.&lt;/p&gt;
&lt;p&gt;Il faut voir cela comme un grand ménage de printemps, la technologie en plus !&lt;/p&gt;
&lt;h3 id=&quot;un-client-mail-pour-les-gouverner-tous&quot;&gt;&lt;a href=&quot;#un-client-mail-pour-les-gouverner-tous&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Un client mail pour les gouverner tous&lt;/h3&gt;
&lt;p&gt;La première chose à faire, selon moi, c’est de pouvoir &lt;strong&gt;gérer l’ensemble de nos boites mails au même endroit&lt;/strong&gt;. Tout est plus simple lorsque la réception et l’envoi des e-mails se font depuis un seul endroit.&lt;/p&gt;
&lt;p&gt;Pour cela, il suffit de configurer et d’utiliser un client mail (il en existe &lt;a href=&quot;https://fr.wikipedia.org/wiki/Client_de_messagerie#Liste_de_clients_de_messagerie&quot;&gt;un paquet&lt;/a&gt;). Il est aussi possible de &lt;a href=&quot;http://pourron.com/aides-tutos/la-gestion-de-plusieurs-adresses-email-sur-gmail/&quot;&gt;configurer GMail pour cela&lt;/a&gt;, par exemple. L’embarras est surtout dans le choix.&lt;/p&gt;
&lt;p&gt;Il peut être intéressant de créer des labels (ou équivalents) pour distinguer les e-mails entrants en fonction de la boite d’origine.&lt;/p&gt;
&lt;h3 id=&quot;archiver-est-un-jeu-denfant&quot;&gt;&lt;a href=&quot;#archiver-est-un-jeu-denfant&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Archiver est un jeu d’enfant&lt;/h3&gt;
&lt;p&gt;C’est l’astuce au cœur de la philosophie « Inbox Zero » : &lt;strong&gt;archivez !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Commencez votre ménage en &lt;strong&gt;archivant l’ensemble des mails de votre boite de réception&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Un client mail qui se respecte vous proposera un bouton pour archiver vos e-mails en toute simplicité. De plus, il doit être aisé de retrouver un message archivé grâce au moteur de recherche. C’est la raison pour laquelle il vaut mieux tout archiver sans trop se poser de question pour commencer.&lt;/p&gt;
&lt;p&gt;D’aucuns créent des dossiers pour &lt;em&gt;ranger&lt;/em&gt; les mails en fonction de leur nature. En ce qui me concerne, j’ai cessé de le faire, car c’est une perte de temps qui ne s’est jamais révélée utile.&lt;/p&gt;
&lt;p&gt;La philosophie qu’il faut adopter est la suivante : la boite de réception sert aux mails non-lus, non-traités, qui attendent une réponse ou une action à planifier. Si un mail a été répondu / traité / n’attend aucune réponse, &lt;strong&gt;on l’archive&lt;/strong&gt;. Si c’est un mail important que l’on souhaite retrouver rapidement plus tard, on peut éventuellement lui ajouter un label si cela nous facilite la vie.&lt;/p&gt;
&lt;p&gt;Le concept est donc assez simple, mais efficace. Il ne nécessite rien d’autre que la possibilité d’archiver, un moteur de recherche efficace et de la rigueur au quotidien.&lt;/p&gt;
&lt;h2 id=&quot;au-quotidien&quot;&gt;&lt;a href=&quot;#au-quotidien&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Au quotidien&lt;/h2&gt;
&lt;p&gt;Au quotidien l’objectif est clair : 0 mail dans la boite de réception.&lt;/p&gt;
&lt;p&gt;Avant toute chose, il va sans dire que dédier deux ou trois créneaux dans la journée pour traiter ses e-mails est &lt;strong&gt;bien plus efficace&lt;/strong&gt; que de garder sa boite mail ouverte et de les traiter en continu. Il est rare que cela ne puisse pas atteindre, et il est contre-productif de se laisser déranger par chaque mail qui arrive.&lt;/p&gt;
&lt;p&gt;Ensuite, tout est dans l’action. Il faut &lt;strong&gt;décider&lt;/strong&gt;. &lt;strong&gt;Vite&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Il faut éviter de laisser trainer les mails et les décisions. Pour cela, il y a plusieurs scénarios.&lt;/p&gt;
&lt;h3 id=&quot;le-mail-qui-donne-des-choses-à-faire&quot;&gt;&lt;a href=&quot;#le-mail-qui-donne-des-choses-%C3%A0-faire&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;L’e-mail qui donne des choses à faire&lt;/h3&gt;
&lt;p&gt;Partons du principe que nous organisons les choses que nous avons à faire dans un système externe, quel qu’il soit : une TODO-list papier, des post-its, un logiciel de gestion de tâches… Personnellement, j’utilise la technique &lt;a href=&quot;https://fr.wikipedia.org/wiki/Kanban_(d%C3%A9veloppement)&quot;&gt;Kanban&lt;/a&gt; avec &lt;a href=&quot;https://trello.com/&quot;&gt;Trello&lt;/a&gt;, mais c’est une autre histoire.&lt;/p&gt;
&lt;p&gt;Suite à cet e-mail donc, nous avons quelque chose à faire :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;qui n’est pas absolument indispensable&lt;/strong&gt; : on oublie. On peut éventuellement le noter dans le coin des « choses à faire quand j’ai du temps libre ».&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;que quelqu’un d’autre peut faire&lt;/strong&gt; : on délègue si possible (c’est bête à dire, mais il ne faut pas l’oublier).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;qui peut se faire en 2 minutes&lt;/strong&gt; : Just. Do. It. Now.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;qui doit être fait à un moment précis&lt;/strong&gt; : on se planifie un rappel (Calendrier, SMS planifié…).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;qui doit être fait plus tard&lt;/strong&gt; : on ajoute un TODO dans notre système. C’est planifié, ce ne sera pas oublié ! Il existe une extension Chrome &lt;a href=&quot;https://chrome.google.com/webstore/detail/gmail-to-trello/oceoildfbiaeclndnjknjpfaoofeekgl&quot;&gt;GMail to Trello&lt;/a&gt; pour ceux que ça intéresse.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Une fois que c’est décidé, on archive !&lt;/p&gt;
&lt;h3 id=&quot;le-mail-auquel-il-faut-répondre&quot;&gt;&lt;a href=&quot;#le-mail-auquel-il-faut-r%C3%A9pondre&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; L’e-mail auquel il faut répondre&lt;/h3&gt;
&lt;p&gt;Si répondre à ce mail prend 2 minutes, on le fait tout de suite et on archive !&lt;/p&gt;
&lt;p&gt;Si la réponse demande un peu plus de temps, on laisse l’e-mail de côté dans la boite de réception et on se prévoit un TODO pour répondre à cet e-mail en particulier. On peut ainsi prioriser cette tâche parmi les autres et on ne se stresse plus de ne pas avoir encore répondu à ce mail : c’est prévu !&lt;/p&gt;
&lt;p&gt;Ah et une fois que la réponse est envoyée… On archive !&lt;/p&gt;
&lt;h3 id=&quot;le-mail-qui-nattend-pas-de-réponse-de-notre-part&quot;&gt;&lt;a href=&quot;#le-mail-qui-nattend-pas-de-r%C3%A9ponse-de-notre-part&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;L’e-mail qui n’attend pas de réponse de notre part&lt;/h3&gt;
&lt;p&gt;On le lit, on prend note, on l’archive. Et hop !&lt;/p&gt;
&lt;h3 id=&quot;le-mail-indésirable&quot;&gt;&lt;a href=&quot;#le-mail-ind%C3%A9sirable&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; L’e-mail indésirable&lt;/h3&gt;
&lt;p&gt;Généralement, la newsletter, la publicité inutile, le mail qui vient juste polluer notre boite (et notre attention).&lt;/p&gt;
&lt;p&gt;Avant de l’archiver / supprimer, nous allons prendre 1 minute pour ouvrir ce mail, chercher le lien &lt;em&gt;« se désinscrire »&lt;/em&gt; (théoriquement situé en bas du mail) et cliquer dessus.&lt;/p&gt;
&lt;p&gt;Ces quelques secondes investies systématiquement vont réduire considérablement le nombre de mails indésirables à l’avenir. &lt;strong&gt;C’est un bon investissement !&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;bilan-personnel&quot;&gt;&lt;a href=&quot;#bilan-personnel&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Bilan personnel&lt;/h2&gt;
&lt;p&gt;Cela fait un peu plus d’un an maintenant que j’ai adopté cette manière d’aborder ma boite mail.&lt;/p&gt;
&lt;p&gt;Le plus gros changement, bénéfique, c’est d’être capable de se décider vite. Ne pas laisser s’entasser les e-mails dans une boite de réception qui devient un énième TODO-list. Ne pas perdre son temps à essayer d’organiser, de classer les e-mails plutôt que de les traiter.&lt;/p&gt;
&lt;p&gt;Je suis particulièrement réceptif à cette approche continue, au fur et à mesure, qui s’adapte parfaitement à une méthodologie Kanban. Ma boite mail est devenu fiable, sans être une source de stress. C’est plus simple, plus efficace.&lt;/p&gt;
&lt;p&gt;Il y a un paquet d’articles sur la question si vous avez besoin d’aller plus loin. En voici quelques-uns :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.journaldunet.com/management/expert/54537/parvenir-au--inbox-zero--ou-comment-venir-a-bout-de-sa-boite-mail.shtml&quot;&gt;Parvenir au “inbox zéro”&lt;/a&gt;, qui reprend ce dont je viens de parler ici avec quelques exemples concrets&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://alexbortolotti.com/inbox-zero/&quot;&gt;Le guide en 2 étapes pour ne plus se laisser dominer par sa boite mail&lt;/a&gt;, un autre article sur le même sujet pour multiplier les points de vue&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://t37.net/comment-jai-atteint-linbox-zero-et-comment-vous-allez-y-arriver.html&quot;&gt;Comment j’ai atteint l’inbox zero (et comment vous allez y arriver)&lt;/a&gt;, qui se focalise concrètement sur le quotidien&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://verekia.com/slides/todo-zero/&quot;&gt;TODO Zero&lt;/a&gt;, qui propose une alternative qui consiste à se servir de sa boite mail comme TODO-list&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Manage your e-mails with the "Inbox Zero" method]]></title><description><![CDATA[Less e-mails, more serenity!]]></description><link>https://www.nicoespeon.com/en/2016/02/manage-emails-inbox-zero/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2016/02/manage-emails-inbox-zero/</guid><pubDate>Thu, 18 Feb 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;the-main-idea&quot;&gt;&lt;a href=&quot;#the-main-idea&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; The main idea&lt;/h2&gt;
&lt;p&gt;My goal here is to present what is that productivity method about, how do we set up and what does work for me.&lt;/p&gt;
&lt;p&gt;The base picture is the following: emails that accumulate make us feel guilty.&lt;/p&gt;
&lt;p&gt;At best, we struggle not to accumulate too much unread messages, we force to constantly remember which are the urgent ones, those which need a reply, those that are just spam… At worst, we just let the 2342th unread email arrive, we forgot to handle some that might be important, people can’t really “join us” with an email.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Inbox zero&lt;/em&gt; is a concept that consists in &lt;strong&gt;cleaning up our mailbox&lt;/strong&gt; to avoid it turns into a uncontrolled TODO-list.&lt;/p&gt;
&lt;p&gt;It helps keeping a serene spirit in front of our empty inbox, because we know that nothing has been forgotten. This is surely the most efficient technique I’ve adopted to get things DONE until today.&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/the-ultimate-goal-f2aa7358e3dafd7086da292a2f7c84fe-08505.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 360px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 166.66666666666669%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAhCAYAAADZPosTAAAACXBIWXMAAAsTAAALEwEAmpwYAAACwUlEQVRIx61WXU8TQRTd36IisQIK1kIBgdbSVkQjRI0J+iAY0kTqBxJfjA+++Gbig4m/wRf/g4kPxh8gbdpS2LZLKdBSSksp7R7nTnfrst1uP+wmJ/fOvdNzz8ydzq7g67sI36Xz8Fl64OvrrVrLBQU9eDs8hDXbIF4P9cN/xYJV6wA+ep14eXUQH+bP4Z2nFysD/WxswQqDEJsehvTAi/jsJESnFYk7U0jcdTBMIT5zA+LtCYieUcRmJxDzjiF2axxRNhbdI9iYGEF00sbidiTueyG6bBACDis2/YsIP5zBH/tlRB7PQVz1Ycv/FBtLj7D14hk2nsyz8VIVr5aZXURkYQ7Bm1YEHNcQnLYjuryAgGsEQpBVC3rGwK17tGq9yliFGmfqOHj+35yA287m2Lkv5DYjyEXDDMxyXzNWcSYePjtfCxYT0OVHkCsVdBOCLMvoJrq/ZKMgVVKtEbRzWiZsRKrPmxK28qNmcwSzpdKTzWZxdHTEQb4Ract7WCqVEI/HkU6nkclkkEgkeKzlPdQrI4LT09NavsLO2fb2tqHSpoS5XI6rIpJyucyJKXd4eMhzbRPSnh0cHHC/UChwqIXy+Xz7hKROkqS6eDKZ5DlTQqMzR8/JyQnfM7XLOzs7PGbWaUHfWSOltEwCdduosNavU9ju03DJ2mbs7+/XVJFCUkbdpSapPtlisdhYoRqgSerRoM6ST0XUAuRTl8k/Pj42XzKdub29Pezu7nJlRJZKpWoqyVKelFK3jQ64aVP0oIIE/b7VdbnTplQLKdd/oy63DJrPiDTs//cKIGX8RsqkkQ8FIJtdX02XqSjLR0IIsU+QoPM6pK+fOWlnhMqVFv/yCWH2FSG9f8M+Q4ZRYGo7VFjmfurnD6zfc2F9fADBteco0Xu5s/2TeRNo4cnfv7D5/RtyylUndPrflZXO6nN/AWy9lu3PEvfCAAAAAElFTkSuQmCC&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;The Holy&amp;#xA0;Grail&quot; title=&quot;&quot; src=&quot;/static/the-ultimate-goal-f2aa7358e3dafd7086da292a2f7c84fe-08505.png&quot; srcset=&quot;/static/the-ultimate-goal-f2aa7358e3dafd7086da292a2f7c84fe-c5b38.png 240w,
/static/the-ultimate-goal-f2aa7358e3dafd7086da292a2f7c84fe-08505.png 360w&quot; sizes=&quot;(max-width: 360px) 100vw, 360px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;You don&amp;apos;t have anymore email. Have a nice day!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;how-to-set-up-concretely&quot;&gt;&lt;a href=&quot;#how-to-set-up-concretely&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to set up, concretely?&lt;/h2&gt;
&lt;p&gt;This is the most difficult part. I honestly think it.&lt;/p&gt;
&lt;p&gt;Just let’s deal with it like it’s a big numerical spring clean up!&lt;/p&gt;
&lt;h3 id=&quot;an-email-client-to-rule-them-all&quot;&gt;&lt;a href=&quot;#an-email-client-to-rule-them-all&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;An email client to rule them all&lt;/h3&gt;
&lt;p&gt;According to me, the very first thing to do is to be able to &lt;strong&gt;manage all of our mailboxes at a single place&lt;/strong&gt;. Everything becomes simpler when both receiving and sending emails can be done from a single place.&lt;/p&gt;
&lt;p&gt;We just need to configure and use &lt;a href=&quot;https://en.wikipedia.org/wiki/Comparison_of_email_clients&quot;&gt;one of the numerous email clients&lt;/a&gt; that exist. You can even &lt;a href=&quot;http://www.oxhow.com/manage-multiple-email-accounts-from-one-gmail-account/&quot;&gt;configure GMail&lt;/a&gt; to do that. The problem is choice.&lt;/p&gt;
&lt;p&gt;That could be handful to create labels − or equivalents − to distinguish incoming emails regarding their original mailbox.&lt;/p&gt;
&lt;h3 id=&quot;archive-is-easy-as-pie&quot;&gt;&lt;a href=&quot;#archive-is-easy-as-pie&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Archive is easy as pie&lt;/h3&gt;
&lt;p&gt;This is the core of “Inbox Zero” philosophy: just &lt;strong&gt;archive!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Start your cleaning up by &lt;strong&gt;archiving all emails from your mailbox&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A decent email client will give you the possibility to archive at the push of a button. Furthermore, it should be easy to search for an archived message thanks to the search bar. This is why we should first just archive all the thing and move on.&lt;/p&gt;
&lt;p&gt;Some people would create folders to &lt;em&gt;classify&lt;/em&gt; emails regarding their nature. I did stop doing this since it’s a waste of time that has never proved useful for me.&lt;/p&gt;
&lt;p&gt;The philosophy we need to have is the following: the inbox is here to handle incoming emails that are still unread, not handled, waiting for a reply or some task to plan. If an email is read / replied / handled / don’t need any reply anymore, &lt;strong&gt;archive it&lt;/strong&gt;. If that’s an important one and we want to quickly retrieve it later, we can eventually add a label if that ease our life.&lt;/p&gt;
&lt;p&gt;The concept is simple, yet efficient. It doesn’t rely on anything but the capacity of archiving, an efficient search engine and rigour in everyday life.&lt;/p&gt;
&lt;h2 id=&quot;in-everyday-life&quot;&gt;&lt;a href=&quot;#in-everyday-life&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;In everyday life&lt;/h2&gt;
&lt;p&gt;The day-to-day objective is clear: 0 email in the inbox.&lt;/p&gt;
&lt;p&gt;To dedicate 2 or 3 slots in our day to deal with emails is &lt;strong&gt;far more efficient&lt;/strong&gt; than keeping our mailbox open and treat incoming messages all day long. It usually can wait and it’s counterproductive to let every new incoming email disturb us in what we’re doing.&lt;/p&gt;
&lt;p&gt;Then, this is just action. We should &lt;strong&gt;decide&lt;/strong&gt;. &lt;strong&gt;Quick&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We should not procrastinate emails and decisions. There are a couple of scenarios for that.&lt;/p&gt;
&lt;h3 id=&quot;the-email-that-requires-us-to-do-something&quot;&gt;&lt;a href=&quot;#the-email-that-requires-us-to-do-something&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; The email that requires us to do something&lt;/h3&gt;
&lt;p&gt;Let’s assume we organize thing we have to do with an external system, whatever it is: a paper TODO-list, post-its, a task manager software… I personally use the &lt;a href=&quot;https://en.wikipedia.org/wiki/Kanban_(development)&quot;&gt;Kanban&lt;/a&gt; technique with &lt;a href=&quot;https://trello.com/&quot;&gt;Trello&lt;/a&gt;, but that’s another story.&lt;/p&gt;
&lt;p&gt;Then, this email requires us to do something:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;which is not absolutely necessary&lt;/strong&gt; : forget it. We can eventually drop it to the “things to do on spare time” list.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;that someone else can do&lt;/strong&gt; : delegate when possible − that’s sound dumb to say but still don’t forget you can delegate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;that can be done in less than 2 minutes&lt;/strong&gt; : Just. Do. It. Now.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;that should be done at a very specific moment&lt;/strong&gt; : let’s plan a reminder (Calendar, planned SMS…)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;that should be done later&lt;/strong&gt; : let’s add a TODO to our system. Here it is, planned and won’t be forgotten! For Chrome users, there is even a &lt;a href=&quot;https://chrome.google.com/webstore/detail/gmail-to-trello/oceoildfbiaeclndnjknjpfaoofeekgl&quot;&gt;GMail to Trello extension&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once decision is made, archive it!&lt;/p&gt;
&lt;h3 id=&quot;the-email-we-should-reply-to&quot;&gt;&lt;a href=&quot;#the-email-we-should-reply-to&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; The email we should reply to&lt;/h3&gt;
&lt;p&gt;If that reply takes less than 2 minutes, let’s do it now and archive this email!&lt;/p&gt;
&lt;p&gt;If it will take more time, we’ll better leave the email into the inbox and plan a TODO to reply to this specific email. Thus, we can prioritize this task with all the other things we have to do. Still we don’t stress for not having replied to this email yet: it’s all planned!&lt;/p&gt;
&lt;p&gt;And when reply has been sent, guess what… we archive this email!&lt;/p&gt;
&lt;h3 id=&quot;the-email-that-doesnt-need-a-reply-from-us&quot;&gt;&lt;a href=&quot;#the-email-that-doesnt-need-a-reply-from-us&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; The email that doesn’t need a reply from us&lt;/h3&gt;
&lt;p&gt;We read, we take note, we archive. Voila!&lt;/p&gt;
&lt;h3 id=&quot;the-undesirable-email&quot;&gt;&lt;a href=&quot;#the-undesirable-email&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; The undesirable email&lt;/h3&gt;
&lt;p&gt;This is usually the newsletter, the useless ad, that email which is just polluting our inbox − and our attention.&lt;/p&gt;
&lt;p&gt;But before we do archive / delete this one, we’ll take an extra minute to open it, search for the &lt;em&gt;unsubscribe&lt;/em&gt; link that is probably at the bottom of the email and click on it.&lt;/p&gt;
&lt;p&gt;The few seconds we systematically invest in doing this will considerably reduce the number of undesirable emails we’ll receive later. &lt;strong&gt;This is a good investment!&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;personal-feedbacks&quot;&gt;&lt;a href=&quot;#personal-feedbacks&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Personal feedbacks&lt;/h2&gt;
&lt;p&gt;It has now been a little over a year since I start using this technique to manage my mailbox.&lt;/p&gt;
&lt;p&gt;The biggest valuable change is to be able to decide quickly. Don’t let emails stack into an inbox that is just becoming a crowded TODO-list in itself. Don’t lose time trying to organize and classify emails instead of just treating them.&lt;/p&gt;
&lt;p&gt;I’m particularly receptive to this continuous approach. Doing thing little by little just fits perfectly with the Kanban methodology. My mailbox is now reliable without being a source of stress. It’s simpler and more efficient.&lt;/p&gt;
&lt;p&gt;There are a bunch of posts around there if you want to go deeper. Here are few of them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://whatis.techtarget.com/definition/inbox-zero&quot;&gt;A definition of Inbox Zero&lt;/a&gt; with Merlin Mann introducing the inbox zero approach in a Google Tech Talk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mashable.com/2013/10/10/inbox-zero/#mau36McO6Eq6&quot;&gt;5 Tricks to Finally Achieve Inbox Zero&lt;/a&gt;, which advise some concrete tools and links&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lifehack.org/articles/productivity/how-achieved-inbox-zero-4-steps.html&quot;&gt;How I Achieved Inbox Zero in 4 Steps&lt;/a&gt;, which tells the same story with another point of view&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.activeinboxhq.com/support/inbox_zero_gmail.php&quot;&gt;ActiveInbox FAQ&lt;/a&gt;, which is a service over GMail to help you achieve inbox zero and which provide a very nice FAQ with a cool flowchart to visualise the decision process&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://verekia.com/slides/todo-zero/&quot;&gt;TODO Zero&lt;/a&gt;, which is proposing an alternate solution that consists in making your mailbox be your TODO-list system&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Kanban et Game Development avec Trello]]></title><description><![CDATA[Comment Kanban nous permet d'être efficaces pour produire des jeux vidéo en tant que start-up ? Et comment utilisons-nous Trello pour cela ?]]></description><link>https://www.nicoespeon.com/fr/2016/01/kanban-game-development-trello/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2016/01/kanban-game-development-trello/</guid><pubDate>Tue, 26 Jan 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;vidéo--slides&quot;&gt;&lt;a href=&quot;#vid%C3%A9o--slides&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Vidéo &amp;#x26; Slides&lt;/h2&gt;
&lt;p&gt;J’ai présenté ce talk le 2 février 2016 au &lt;a href=&quot;http://www.meetup.com/fr-FR/Trello-France-User-Group/events/227984227/&quot;&gt;meetup Trello French UG #02&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;L’article détaille le sujet en profondeur ci-dessous.&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube.com/embed/4P-mfUew8MQ?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 72.91666666666666%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;http://slides.com/nicoespeon/kanban-game-development-trello/embed&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;h2 id=&quot;contexte&quot;&gt;&lt;a href=&quot;#contexte&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Contexte&lt;/h2&gt;
&lt;h3 id=&quot;metidia-une-start-up-qui-développe-des-jeux-vidéo&quot;&gt;&lt;a href=&quot;#metidia-une-start-up-qui-d%C3%A9veloppe-des-jeux-vid%C3%A9o&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Metidia, une start-up qui développe des jeux vidéo&lt;/h3&gt;
&lt;p&gt;Je suis associé d’une start-up parisienne qui s’appelle &lt;a href=&quot;http://metidia.com/index/&quot;&gt;Metidia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Concrètement, nous développons des jeux vidéo autour de produits de consommation car nous voulons changer l’univers de l’achat en ligne. Ainsi, nous travaillons sur &lt;a href=&quot;https://apps.facebook.com/metidia-vinoga/?utm_source=nicoespeon-kanban-game-dev&quot;&gt;Vinoga&lt;/a&gt; : un jeu Facebook de social-farming (pensez « FarmVille », « Hay Day ») sur le thème du vin. Vous êtes vigneron(e) qui redécouvrez les étapes de production de véritables bouteilles au travers de votre aventure. Entre deux vendanges, vous pouvez donc jeter un œil à votre carte des vins, personnaliser, commander puis déguster en vrai les crus que vous avez virtuellement produits.&lt;/p&gt;
&lt;p&gt;Le challenge d’une start-up est &lt;strong&gt;d’itérer d’une idée de départ à un business model qui fonctionne avant d’être à cours de ressources&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Et, entre les multiples casquettes typiques d’une start-up, j’ai celle du responsable de la partie production : faire en sorte que l’équipe concrétise les idées, teste les hypothèses et crée un jeu qui corresponde aux attentes des clients-joueurs.&lt;/p&gt;
&lt;p&gt;Notre équipe de production est composée de 1 Game Designer, 1 Graphiste et 2/3 Développeurs. Si nous avions commencé à 2 avec une organisation de type &lt;a href=&quot;http://www.la-rache.com/&quot;&gt;La Rache&lt;/a&gt;, il a vite fallu nous adapter pour ne pas répéter les déboires des premiers temps (assets produites, mais devenues obsolètes avant d’être intégrées ; faible qualité du code qui doit être retravaillé à cause des bugs…).&lt;/p&gt;
&lt;p&gt;Nous avons profité de notre flexibilité pour adopter &lt;em&gt;de facto&lt;/em&gt; les pratiques Agiles. J’ai pas mal tâtonné à ce sujet. Par exemple, nous avons beaucoup appris de &lt;a href=&quot;https://fr.wikipedia.org/wiki/Scrum_(m%C3%A9thode)&quot;&gt;Scrum&lt;/a&gt; pour nous organiser, mais il s’est avéré trop lourd, inadapté pour notre contexte.&lt;/p&gt;
&lt;p&gt;En fin de compte, je pense que &lt;strong&gt;l’Agile est un buffet dans lequel il faut se servir&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Au fur et à mesure, nous avons composé un processus qui nous est adapté, en picorant les bonnes pratiques qui fonctionnent pour nous.&lt;/p&gt;
&lt;p&gt;Finalement, Kanban s’est révélé être particulièrement efficace pour l’équipe : suffisamment flexible pour s’adapter au quotidien ; mais assez solide pour éviter que ça se disperse dans tous les sens (ce qui n’est pas toujours évident avec des esprits créatifs).&lt;/p&gt;
&lt;h3 id=&quot;kanban-kézako-&quot;&gt;&lt;a href=&quot;#kanban-k%C3%A9zako-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kanban, kézako ?&lt;/h3&gt;
&lt;p&gt;Pour résumer simplement, &lt;a href=&quot;https://fr.wikipedia.org/wiki/Kanban_(d%C3%A9veloppement)&quot;&gt;Kanban&lt;/a&gt; est « un système visuel de gestion des processus qui indique, quoi produire, quand le produire et en quelle quantité ».&lt;/p&gt;
&lt;p&gt;Le cœur de Kanban consiste à &lt;strong&gt;visualiser le processus de production&lt;/strong&gt; pour mettre en place un &lt;strong&gt;système de tirage limité des tâches en cours&lt;/strong&gt;. Ce qui veut dire qu’on limite le nombre de tâches en parallèle pour chaque étape du processus. Lorsqu’une place est libre, c’est l’étape en aval qui vient prendre une tâche en amont (système de tirage) et non l’inverse.&lt;/p&gt;
&lt;p&gt;Concrètement, voici à quoi ressemble un processus Kanban en action : &lt;a href=&quot;http://blog.crisp.se/2009/06/26/henrikkniberg/1246053060000&quot;&gt;One day in Kanban land&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Le passage à Kanban est assez simple car l’on part de l’existant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;identification des processus existants (ex : processus de production, de support au joueur…)&lt;/li&gt;
&lt;li&gt;décomposition des workflows pour chaque processus&lt;/li&gt;
&lt;li&gt;fixation des limites de tâches en cours (là encore, on commence à partir de l’existant)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Puis, l’idée est de venir améliorer le flow au fur et à mesure en impliquant l’équipe. C’est le &lt;a href=&quot;https://fr.wikipedia.org/wiki/Kaizen&quot;&gt;Kaizen&lt;/a&gt;, composante essentielle de Kanban : l’équipe fait un point régulièrement pour &lt;strong&gt;améliorer de manière incrémentale et continue son organisation&lt;/strong&gt;. Cela permet à l’équipe d’adapter son fonctionnement à son contexte, de tester des choses, de s’adapter au changement…&lt;/p&gt;
&lt;p&gt;C’est ainsi que nous avons fait évolué au fur et à mesure les limites de tâches en cours (= WIP) de chaque étape du processus jusqu’à atteindre des valeurs qui nous permettent d’être plus productifs (WIP bas = débit plus important), sans nous retrouver bloqués… ce qui est bon pour le moral !&lt;/p&gt;
&lt;h2 id=&quot;big-picture&quot;&gt;&lt;a href=&quot;#big-picture&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Big picture&lt;/h2&gt;
&lt;p&gt;Nous avons intégré &lt;a href=&quot;https://trello.com/&quot;&gt;Trello&lt;/a&gt; depuis le tout début, dès 2013. Gratuit, intuitif, simple à prendre en main, c’est notre tableau blanc virtuel et compagnon dans l’aventure qui a pu évoluer avec nous à mesure que nous nous organisions.&lt;/p&gt;
&lt;p&gt;Les boards (= tableaux) de Trello sont très flexibles, ce qui nous permet de les faire évoluer avec le temps au gré des besoins.&lt;/p&gt;
&lt;p&gt;Nous avons donc diverses boards qui se créent ou se ferment en fonction des projets. L’organisation de ces boards s’adapte au contexte : un projet temporaire planifié en mode GANTT pour des besoins business (avec l’extension &lt;a href=&quot;http://elegantt.com/trello/&quot;&gt;Elegantt&lt;/a&gt;) ; un simple Kanban &lt;em&gt;TODO &gt; Doing &gt; Done&lt;/em&gt; pour gérer un sous-projet temporaire ; etc.&lt;/p&gt;
&lt;p&gt;À côté de ça, nous avons une board pour chaque processus identifié, à savoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Production&lt;/li&gt;
&lt;li&gt;Business&lt;/li&gt;
&lt;li&gt;Support&lt;/li&gt;
&lt;li&gt;Communication&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chaque board représente une activité qui a son workflow.&lt;/p&gt;
&lt;p&gt;Dans cet article, je vais me concentrer exclusivement sur le fonctionnement de la board de production.&lt;/p&gt;
&lt;h2 id=&quot;la-board-de-production&quot;&gt;&lt;a href=&quot;#la-board-de-production&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;La board de production&lt;/h2&gt;
&lt;p&gt;La board (Kanban) de production représente notre force de production, le travail de l’équipe de production. Et ce, peu importe ce qu’il faut produire : correctif de bug, nouvelle feature sur Vinoga ou sur un autre produit, hotfix… Tout ce qui est livré.&lt;/p&gt;
&lt;p&gt;Cela permet d’être honnête sur la capacité de travail de l’équipe, de prioriser tout ce que nous faisons et d’homogénéiser le processus de production.&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/overview-9b37212a00e0158ab6eaefcd8bc46199-d2f43.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 725px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 51.44827586206897%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAAC4UlEQVQozx1SS09UBxS+SXf9A266cNWi0URwYnRCN1ZrWh8ExYVx1Wg3LKg0anxVbMVHM110hBl5jJUgqYoSg+DggEXJQCI0CvLGqjDTAWbmvh9z752Bcz6v7M5JznfO9zjCtcdnVq91nqUrnafpStdJOv+wkmo6fqJar77cVU0n/j5O5zuq6XrPGart/pmq7/5Ip+9XUaDvAv0Zr6VLHd/RLxE/XWzxU+De1yRkFZHUjAJD1JBzXMzMT8Ex8rDNPHRdw9DUJBbTNrgAGKaO+MQEZheMtd518whFduFZ2xdIPvPjTt16CKlMkjRVg2marJoqTy2Ms5XLsW7qnFWXeXB6lJNplfOuw6Iu8oelOQbAOSfPBJfPBUp5pPszxvw6/u33z1nIqhlKZ7IQJZlzroV3ybewNRfkegwcBy9nx5GWLawUVqBZEoamZxAbUdH/SsXEfAZdnafQ33cU7b1VaI/WQFiWFkkzLFi2y5ql4K8Xdbg32IKHw214MNyC5xMjyMg2VldWoJoS4pOvMTy9BEk28H8miUTiMaTsDEbeqvAcgLAopkj3JDs5hxVTRlmTD3vCG7AntBH7GjYjOtqPZDrnDeehGiIGZ2bxbnkVIMC0bSRmW0HLvZATcUD5F4IopeiVomNSz7GmZ1AR8eNAYwnKGrfiUGQb+t70470nTZdViJqMqblHMNI9yEoxpNJRNHUfQfDBDoQ7tuPGfR8EVVbIcAC7ALa9MA7f8vO+hi3sLeWDzT6OjQ/w3LzCTkphq1DgaLSKY62lHGov57YnlXzszl4urdvI34RLeGe4mIXg06t8+0UQrfEQbj7/A+XN2zyGxdjvsTwY8aFnbABzSWPtRT6F9s/YEAZGx7CQkJBMqai8W+FZswnecZQ3lUDYXV+0ujv0Fe2q/5K+DRWRx4w8ubS/sZjKm30UG+ul/xaWKCtnSbZEuhoO0tlLAfo1EKSTNbX0w+299H3D5jXMJ+xHQZpz3fB5oJEAAAAASUVORK5CYII=&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Board de production&quot; title=&quot;&quot; src=&quot;/static/overview-9b37212a00e0158ab6eaefcd8bc46199-d2f43.png&quot; srcset=&quot;/static/overview-9b37212a00e0158ab6eaefcd8bc46199-0979a.png 240w,
/static/overview-9b37212a00e0158ab6eaefcd8bc46199-521aa.png 480w,
/static/overview-9b37212a00e0158ab6eaefcd8bc46199-d2f43.png 725w&quot; sizes=&quot;(max-width: 725px) 100vw, 725px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Notre board de production&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;goals&quot;&gt;&lt;a href=&quot;#goals&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Goals&lt;/h3&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/goals-88809dc1e29b01054325e24ac593dc53-af9c0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 232px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 199.13793103448276%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAABYlAAAWJQFJUiTwAAAFkUlEQVRIx52XW1MURxTH+RT5APkcefYxnyCpsvwEooJYasVKlKgYH/LoQ8qnVCrRaAoRkKuKiKDcYZeFYe/32Z2dnb3MbM/0P+f0MLCsLJh01aG7p7vP9M75nX83Pd8/Ote8P3pdPJi40fpl8qa4OzYghl5Rf/KGGJq4Lh5O3VRtGhf3xq6Ju6MDqr43fk38/PKqGBzpJ+sTQ+M3RP/TC6Jn8J8B8WlhA1OTr/Fmdh7aXhLv3y1hfm4J795+wOSrWcxOz6lnoe09RPfTCIc0hLc1ZFI6CrkKMuki4ntZTK9NoOfHvy+3Vle3MDU7K9/Mzcmt8I78uLwip2Zm5eLHj/L1u3n5fmlJLiwuyo3tkAxFduXa5qZc29iUWjQuY8m01OJxGd1PyfHlEdnzw18XhdNwQUXyH9f1/MZBaZkVpFNp6KaFilmFlBKu58HzJFpCoNVqwWk5tBCYXBsDOewVdkPAk57kyUGRtIhLbi+C3x4MYfjhfYRWVvwx2f7Kw70EDi8Ku37kMDDvwGEkkcHSH48RefwrQmvramn7PN885fPEHbYbF6clENmNYoGCYjUd3jp46EyHss0h2nahviM5FU5LfbvOouahzeGtJ5eEZTYQjUWlpmmIxWJIJpPQdR3FYhGmaSKRSCCTyaBarYLn5PN5NYfHuHjymMNeUa82aUFa8oR0Oq0WxuNx5dy27WAr6F7agsIOa2aTnJiy0WigVquB61K5jKplKSyEwkMc1gqXwLhP2EgRfENyWNarxJgpmTOz6vNWtWrKiqUyyoaBSqWi2jxmVEzq+8btMo3VqjYmVkf9oDDYsuM3BQFJZPJ4PjWPhbUd5HXj7J/cjcMgotNv32Lg5lXcG7oNSj8/CJ53Bjbs0HNP5HAztI2x4T8x8vx3aPvaYRYdwwvHHB7P5ZPKSkzHolY4mcHOHTKHHOVsListiiqjw5wxLhyIQqEAo1xCnaKfzWZRKpX8Z4bR5rQT7Eod0ei+ZAfBAl7MdblsKC4ZH34hG2PVbDaP8r4T7IZlkyNdMoO8w5bjIJVKIUXZwOx9aTnk0GAOCWxmkNlj1iyqrVqduKwpNs2D5+0MErsHLHZwyJ2mbUubduYoa6naptrQC8hnSGBzaVgVQ6mPP35kvM5tfRblk5LVxXQkj+HVOGaWQ1jWMl8Cdu+JYPMUzxWY2whjbnkTz1aieB1KqcXe6QJ70dfDLnKSTSWwQ3DH9nboJ5c/S80umcKK0pIcUdd1VWqxcdshXBgZ23aUugTjp4JtVRqkfzElsKyDLK7MJIsqQ84o+UyWldjy2CkOWWBtAjmjMoWBDgQ2Go2qaP8nDtkh79AkDuv1OglsHVxzaqmsoIyAICZIRBuUjrYyR6GijNqEHFxHHn1Do0SiWq36YDPEB4Az3DVqj6eK+JQvw7Z88TWrvhArM5U4o245AdjEYfNzDoPOYNxA766Ob1azmDQaOE2WunLoBccnRfXrDwlcCBfw7WYe57dy6rno4NA7UWClK9uV2FWnuYdr4Sx6JiL4aiaCkaTu589ZYDsN0f2c9FzMFavYKFunHKLyODYssDrJF0sWSxhzxswxh7lcDrJRR4NuYZls7vDcZmPEeI26fXWey/l8ThbopsBO2CkLKDtW5zRhUT14FowF4+zY9USnwDq0w6I66HW9yAcW/k85FNhSUYmkVOJJXJWNCr3AoNsDHQl0BOh0wBf1wEodbToyKFVNo+5zeOvpJRHZiWJ9a0tuhsKgKy+2dyJU74H7dEWGFouTJbraXjRG37KA8ZUR9Nx+1i+0cBLrq9tyayMCbTdJcrWP3XAM3A9vaUgni8jT5byb5bJ0RSnamF2fQs93j86JO8N9uDPSJwdH+3HnZR8GXx7U1Of27RdX8NOLy6fYJdC/F7jy5Dz+BQBkfWO7YLxxAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Goals&quot;
        title=&quot;&quot;
        src=&quot;/static/goals-88809dc1e29b01054325e24ac593dc53-af9c0.png&quot;
        srcset=&quot;/static/goals-88809dc1e29b01054325e24ac593dc53-af9c0.png 232w&quot;
        sizes=&quot;(max-width: 232px) 100vw, 232px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;La première liste de la board contient nos key metrics : les 3/4 KPIs les plus importants pour nous. Ça permet à l’équipe de toujours les avoir sous les yeux et c’est motivant.&lt;/p&gt;
&lt;p&gt;Les objectifs sont revus chaque mois, ce qui nous permet de faire le point sur notre cap et nos performances.&lt;/p&gt;
&lt;p&gt;C’est aussi l’occasion de célébrer les réussites tous ensemble, parce que c’est bon pour le moral !&lt;/p&gt;
&lt;h3 id=&quot;templates&quot;&gt;&lt;a href=&quot;#templates&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Templates&lt;/h3&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/templates-fc506e51d32f482c3ac2d1bc9b60ce2d-4a16b.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 361px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 103.3240997229917%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAABYlAAAWJQFJUiTwAAADlklEQVQ4y6WU627iRhTHecn2Iaq+QaV+6XY3SS9qmm5W7Qu0j7DaDUnYTcL9DgZjfMXGNsZcbSgsnn/PDCSNlGg/tJZ+OheGv+acMzOpr/784tPvmZ+S8+sj4jh5kzkRvL46Sn69+D45S79Mzi5fCv+Xd98lp++fwvNn6VfJydtvktSbqx+SbtVA5uoOdx+KuLq4wXX6FrWyBL3voNcx0GmpMDUXY3+BkTdHcGB0IKC8pXpo97pInV68SFTFQqFcYsVymWULBZYvlVi92WKaabKuoghUw2CO5zPbdcl6ZD0Rc9+wbabpFqt0Kyx1+v5FkmwA13NZMB5jTIxGAdkQQ9eF74+EdQnP8yn2YduO8E3Lgu04iFcr8K9ryUjx3mzjBM1Wg3U6HdTrdZTLZXQ6EhqNOlRVBc83m03UajUYhgFJkkRcrVZFLoojISgLwUc7HAUBJpMJ/uvXG/TwUHI4CRkXm8/n2Gw22G63wj7lmfyWBBIq2aSh8JGvl5+wjCO2Wv8NThSvsIxiQbxai3ixjPZ5sty/z3PmiyWWixUkXfq3h9VahbXbbdHDYrEIWZaRy+VErxRFgaZpwnL4mmajIXrN1wbj4FEP6djs1sDAHjDP8zAcDsWkZ7MZptMpwjAUfhRFwi6XSywWC5HnLeJ2dZjyw1DYFnAcmwU0lIj+8L+Gwnu4oZKjVcz4eYoPfbnvo/C5PbB85EcxjyPBOt5QDzv7KU+CCHK/z3RzAIsOraobAnPAfZOsLfLcDpyh8A1rAM2wRMzzo2CKltbeD4ULZm4+srtslg54G+VKFdeZD0QGH29uUSiVUW80kc3lkcsXUCiWhH9zeyvW9/p96vsMkkE75K+J54TI5nOsUqujRGJ32RzFeSFaJLFCqSTIk1C+UBSC4+kMMzou4XRO/pTOb4y2Ju1LnoUrKllhvBTd3JfR7SnodGVRjh+M4bgeXLrXHt1z7gfhBOPJVBDQtGezCG39IDifrEnIZC5dfMu2xWKlr4o+cpHpfIHJjDMX8DikHd7zsEMuyKfMBd0gYB7txA9CuLQLbn16cXhu6I2ex99besbohZqiqbZIkF7cgemjSyXLfZUpmv5AT9VETrcGn0UzLWqXy2pKnaXOL0+Yo4Zo1jtoN3royxZkSYcim5CaisCxAvEqB/78WUYe3apgBcXQkPr6ry+3f1z/vDu7eLV7nT56yuWx+O23z8B/P08f7358++3uH78a26CZyDDjAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Templates&quot;
        title=&quot;&quot;
        src=&quot;/static/templates-fc506e51d32f482c3ac2d1bc9b60ce2d-4a16b.png&quot;
        srcset=&quot;/static/templates-fc506e51d32f482c3ac2d1bc9b60ce2d-70d39.png 240w,
/static/templates-fc506e51d32f482c3ac2d1bc9b60ce2d-4a16b.png 361w&quot;
        sizes=&quot;(max-width: 361px) 100vw, 361px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;Cette liste est plutôt utilitaire : elle contient les cartes qui font office de template pour nous simplifier la vie.&lt;/p&gt;
&lt;p&gt;En fait, il n’y a pas vraiment de &lt;em&gt;« template de carte »&lt;/em&gt;, car créer une carte quand on a une idée doit rester quelque chose de simple. Tout le monde peut créer une carte, mais tout le monde ne pense pas à dupliquer une carte pour cela : cela n’a rien d’intuitif.&lt;/p&gt;
&lt;p&gt;En revanche, cela nous est très utile pour les &lt;strong&gt;templates de checklists&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En effet, Kanban préconise de « rendre les normes de processus explicites » : chacun doit pouvoir savoir si une carte est prête pour passer à la prochaine étape du flow ou non. Pour cela, l’équipe se met d’accord sur (et fais évoluer) &lt;strong&gt;les règles de sortie&lt;/strong&gt; de chaque étape du flow de production. Et, après avoir tâtonné sur le meilleur format pour ce faire avec Trello, les checklists se sont avérées être le moyen le plus efficace !&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/template-detailed-b242371b019597e713a18dd636aa8190-b205b.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 501px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 93.81237524950099%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAABYlAAAWJQFJUiTwAAADgklEQVQ4y21UeW8aRxzlq0fqB6jSf6q0aSM1qiq3SWqCEzuxbOzGBuLGqbnv5dgTluUyYENmfn1vFqK0iqWnGdbsm3f8hsQ33z3YvHt/qfYP99XLNy9V6m0Ka8qsqbcHeJ5UR+kjdZY9VycXp+r4r2OVzpypyw8ZdXmdVdmPOfXu6kJd3XxQD598u0k8T/6plqu1tNodsTo96fZs6fUdcVxfXC+Qvu2JH4QSjWcSjsbYDyWMJrLAO4PhSJotS8bTuXxSIqfn5yqRevVazRcrsbo93en1tNXt6nanq71goEfjqY4mU7OG44kB94NRpAfhSIfRWDdbLV1vNPTdei2XmaxK7CeTynY9KZYqulprSK3RlHK1JsVyRdxgICCRQRjFGEXiD0PBgdLp9WU6v4WjvhSKRb1c3Uk2l1OJV68PFSWDSNcaLSFaVkcarbbZV+oNsWE/JhtJEAJY/QFimEzFcVyhwvVmI5ksCA+P3oBwJvliSReKJSHyhSIUl6VUqRo1JKcixGI+w6qMoJzv9W0b+bf1BiHm3n+hsFSuaNqtA1RI9HE6LQ+hbohCYkSmFO5ntwvxfF9q9YZe3a3kOJ0h4ZFawL/rBzpAPmyRVnhINJkZJShii3jPQ0b4TgDbjaaJSFPtydmFSvyy91Q5bmAs0+KuEO7xDFkNjZpdKcyP6hkB/1fB9y1Mxf3mE1qGwsd7P6jZbClVlMKMmvhys03LXfHwAgm+BpbClnsgZimCPzM2T/74CYQL+Xhzo6mMpZQqFVNKq22ZgWcUxiqyM3YB7mnTdhyOjlZao2UQ/gzC+Xwp/+TzukzLAJXSzi47ZslMScB8TSloejKbI/NA2paFUu4ll7uKCWmZGVZqdWRYlSpWqt1ltRsZgpeAh5CQh9iuawjp+fT8EIS/P1ar1Qa5WZpTTxI0Lrh6GBtPHM8HArNywI3ySaycRfVtWO739Xgyl2cHeyrx42+PYHllHtqOtx2bmbEX2/wvzLggU5JRJQ/GYXqCgk7SZyrx6Nfvle+HyLCgCywC7fJ6sUUP5K7BYIuheUYXbdjnjdlmqm+Xd3HLzHCxuJdyraZ5xaq4uwRvDT8jCgPuCY7M58a3gFq9QCkHuCRmbD63jCHlQJOAKmgtfmm8RTw2X5LtCJf3a3mRPADhM7Q8Xcjf19dmDvPFoimFmZiX/4/oK4T4faTl4/Sp+he4ImAd7XRKNgAAAABJRU5ErkJggg==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Detailed template&quot; title=&quot;&quot; src=&quot;/static/template-detailed-b242371b019597e713a18dd636aa8190-b205b.png&quot; srcset=&quot;/static/template-detailed-b242371b019597e713a18dd636aa8190-27bf9.png 240w,
/static/template-detailed-b242371b019597e713a18dd636aa8190-7da8a.png 480w,
/static/template-detailed-b242371b019597e713a18dd636aa8190-b205b.png 501w&quot; sizes=&quot;(max-width: 501px) 100vw, 501px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Exemple de template pour les conditions de sortie explicites&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Ainsi, lorsque l’on en a fini avec une carte, chacun sait qu’il faut créer la checklist de sortie. Ce qui est aisé avec les templates :&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/template-copy-3c0d1ba15d40e91199bb7798177bc782-ac47b.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 466px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 77.6824034334764%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAABYlAAAWJQFJUiTwAAADlElEQVQ4y22US2/jVBTH/T26ZsGOWSKxY8WWBR+ABYuK5SBAoEFCiA1CSCwAobIARkgIJGbaUh6DOqXNTCZNnNiT1Hk3iRPbceK3nTSJc+6fE/cxAnHln+7x0bnH5/7PkaV293zd7fWF4/kUhBGFcUxhdAXbyWxOUZzQKl1TsSTT9vY2vXX7Nr2x/Sa98uoteunlLXr+xS269cJz9PprWyTlCwXR6nQxdT3M5nOkaYoVk67XWCyX8DwPnu8jjmOEYQjHcWDbNqzxGEHgYz6fIUkSxFECZ2pC6utDrmS2SSiWq5UAkCH4Wa9TYdtjMZnYwvc94biO8HjfvNvMYrH4V3wch0Lygoj4unD9gIMDdLt9ruYCRAAXebP4xPXJm3UZI/hWIvPP+YbSRjtOliWM4gCNZhF+oHP4jBOEGcQA0Q0kApbFY1n8jFXqY00BZjPvMqHDGjleJOLERH90F7XGDkrKF2i0v0G1/jVqTOXpl1BqX6HMe3/0PVbYx1JcsmBS3EOYyJC4CbRpxtQNxOzCy5x+KHPFRbbL/KFTJBdK5pu6p5nfj4pYrlUs0mesSEGUnEPaSLHpqhuEwmUte+cDDPo6TNOCro/QZ7vb6WE4NLJ3ezx5pulVS651XVwsIPm+T5ZlYaDrot8fsIZN1DQNnW6X7QY6nTbq9TpardYVzWyUNiMUhsENfhRi7Lo8Nv0Bnff6kOWyqJ1psJwpLG+K0WSMkT2GucEawzBMjO0JeMg5IU/Ff5gyphtwUyYWpXMf3daZqCgFFNS/UdSOka8eotx8jO5YQ2/UhDnswbVHWCYeljPu7P+wYKQfcja9vUf4+CAUH+3buLNn4d37Bt7bNfDhH1N8ejLDZ8cX+Px4hU/+WuHOr0t8cHDJxr7m/f0l3tldQjqpWbSrLvBz3hA/Pmrhu1wNO8cqo2DnSMa3JwrunpzhQJ3igTbHnppgV4lxvxIxAe6VfcbDLyUXPxUmkGxrRFhFGHTqoiTnREk9EsXqocjJv4vH5T/Fo9IDoTVLoq7Jotc5E3q3LgJnJKbWuZhYLTExNTExasIeVYWlV4SkDw2xEbrRbKEkl1GuMGoFslrGwNBhcVOm3D3DMtEbDNBstaE1GlBrCuSnBRTVHIoK664c4bRyCGk4MtKEf1PtdpsURaFatZrtqqKSpmmk6zrxiJAfBGSaJvHokKJWqCDnKXd6SEdPfqOHT/bpYX6PDvO79A8uaX+LaR956QAAAABJRU5ErkJggg==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Copier un template&quot; title=&quot;&quot; src=&quot;/static/template-copy-3c0d1ba15d40e91199bb7798177bc782-ac47b.png&quot; srcset=&quot;/static/template-copy-3c0d1ba15d40e91199bb7798177bc782-ec35e.png 240w,
/static/template-copy-3c0d1ba15d40e91199bb7798177bc782-ac47b.png 466w&quot; sizes=&quot;(max-width: 466px) 100vw, 466px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Il suffit de copier un template de checklist&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Notre astuce pour retrouver rapidement nos checklists templates, c’est de nommer la carte de manière à ce qu’elle apparaisse en premier dans la liste déroulante.&lt;/p&gt;
&lt;p&gt;D’où le préfixe &lt;code&gt;(Template)&lt;/code&gt; qui fait très bien l’affaire.&lt;/p&gt;
&lt;h3 id=&quot;icebox--backlog&quot;&gt;&lt;a href=&quot;#icebox--backlog&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Icebox / Backlog&lt;/h3&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/backlog-9c5afbe3d3ab0144bcbe07d49388f17c-da4cc.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 370px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 120.27027027027026%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAYCAYAAAD6S912AAAACXBIWXMAABYlAAAWJQFJUiTwAAAFi0lEQVQ4y2WVyW8bVRzH52/hhBBwQkKoJy5IqFIrrnBBFQJBygEBByhCYuneIlJ1CUlDF1TUOG1jJyEkaZM4cRzvS1bHScZ24m3ifTwztmf8/L78ZibhAE96emPPe7/t+/m9Ea5NfW88dd9nTu8D5vQ9YqPLj5gz6GDOgIONBUbYRPAZG5i7zm5OX2Sj88Psmecemwo9Zg7PH/TeYe+l6Qo+YcMLN5jgDIyx8eUsHi/tIbRdRqvZQUvtoq0xWg3wDhDa8WEmvICn7gwcS7uYjhRRKino0D5NMaA1dRgtIJqMQpiIudj8RgVjoRQPixJX1SbXDZ2rmsIVemZGj/uTi3x2zc1nVkt8PJLiU9EMrzRkDjCa4D1ur6EdPxdm11ys02hC12TO9DZkWYaqquh0KNI2uaXh21mGL7EI9EwbbVoNtFoaDKMLxhiMrmHtCyb9EKZXXaxeaaIgFbmiKJbBcrmCNhk83uglY75tD+S6hnK1hlZHt96bTnW9A1XT0Oty+BM+CGNhJ/tzpYz+2R0+t1UyE0C3S14NwzoECsqX9CBAUdqDoct66PV60NoMUk2nwJn1JrQTsCPcz9Ug5g95/rACRWlCI4+NRgP1es0yGE75sZrxIU/+kgeqdXhdVFGodODbkHE8wqbB2XUX62kt6Gqdm6dNz5zbEXRZ19oY2F1BIu9HOGHgm8E0FqIN3Borwh1rYHKlinFvhVYFmwek8iSpvHmgwbud46Ik26m2zfroVCtTADtlP829jAzXUhqTy/uYD+XgiebhjRcwRb+D6zXEUmTQFXGyJ/4i7rp3uSdRJP5IYV230lZUBZx0iaZWMBl1Y3ipiPvLIoYWRcT2q//WFLAzWU2TQRMbvami21E479qGul0Cu92GRmiYEYZEHwIUoVJrolarEPAqmkRErd5As6lYIpkjbhscZ7pmEColzqhmZu1Mvo6Vtvja9cKztYTcoYZUsYp8VSVGO1YmVmnIuYlNZC8EwUnYPPJKGJjf5feXUshVFLCuiYy90VQ5Inrxd3wRD70lDLpF/L6YQk1pwwxAJ6fUWZbjWCpC2KxNsGxRwfZ+kWfIuwluo16n1GoolUtgOnlO+0mURcilEspSDkZbIaQqtKdqoUUtepSyaTDuZBWpAkkqcKlYxP7+Pg6lQ6iKinqjTocZwuIKdYuP2g0welbQ1vzviKbWbVEoP7plqrxZLRHYddKMWwfYUQcExSjCmxfQy36OSuIsqlt9UDOfIZ7sI7DPwkOzlvsY69u/Ug0Jm+m1BsbCWT4WyyO+eggjIkGNF6GSgpyKHRDjmH1xBpuDAp7fELDYLyBKz6d/EfDJFQEnLwvoHxLgd/dB+CvuYu5VCROBJF1LaYTCIurhDDqpOkh2u81yMfQ7LuHWtS8xdP5TDPf3YfD6Gfx47SNc/u0cLt75Gv23b2BkasROuUuRdJQqZ5oMpUliNKqQWwo1vc1XLB3C9PozTImTGFkbhSPhgDfrAetQixLTzDiqoRiGMEWiVGWGQ1njUqMFWdMtsE2+LLCZ3XphgtvQOgRyDfVaGYrc+J8om9k1u4YPFgu4PZvgt5/vYGGjYHFogX10H5rYjHtdCAa3sOyPYMkbgjcYhz+yjpVADMu+CHz+Vcz4ZyA835hgcpUu2GKel8tlFAoFQqho3cTHIyHF8cWl7/D6iffxypunaH0Pb5/6ECfe/QAvv3ESr711Gi+9+g6+unCObpvIU1Y5rBPEZV6im7pSIbhpNuiz0CQWjTZHNB3AzZEB/HRxAN/+cBXnr9yEx+PBi7kF/Hz1Dq7038Xl63cxNHoPgsP7kCWTIjaSW3wtsYmtnSTEg326qtLYSYs4yBYxtzqDF/EpZDJZ+l/EbnoPqYMMslIBOZrZYh5SqUyfiWX8A6NknmLKlmhQAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Icebox et Backlog&quot;
        title=&quot;&quot;
        src=&quot;/static/backlog-9c5afbe3d3ab0144bcbe07d49388f17c-da4cc.png&quot;
        srcset=&quot;/static/backlog-9c5afbe3d3ab0144bcbe07d49388f17c-3ad01.png 240w,
/static/backlog-9c5afbe3d3ab0144bcbe07d49388f17c-da4cc.png 370w&quot;
        sizes=&quot;(max-width: 370px) 100vw, 370px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;Le fonctionnement du « Backlog » est probablement ce qui nous a causé le plus de tâtonnement : où mettre les idées, les TODOs à venir, sans que ce soit lourd ou long à traiter.&lt;/p&gt;
&lt;p&gt;Nous avons donc testé pas mal de choses, y compris une board « Planning » &lt;a href=&quot;https://community.uservoice.com/blog/trello-google-docs-product-management/&quot;&gt;à la manière de UserVoice&lt;/a&gt;. Mais ce qui a marché pour nous fut d’intégrer une liste « Backlog » directement dans la board.&lt;/p&gt;
&lt;p&gt;Les cartes y sont priorisées, ce qui veut dire que l’équipe traitera, dès que possible, la carte qui est tout en haut. Ainsi, nous pouvons re-prioriser les cartes jusqu’au dernier moment.&lt;/p&gt;
&lt;p&gt;Décider le plus tard possible pour être plus efficaces.&lt;/p&gt;
&lt;p&gt;Pendant un temps, nous limitions la taille du backlog pour éviter que les cartes ne s’y accumulent plus vite qu’elles ne puissent être traitées. Cette limitation a finalement été abandonnée, car l’équipe est désormais capable de s’auto-gérer. Le &lt;a href=&quot;http://brodzinski.com/2013/07/cumulative-flow-diagram.html&quot;&gt;Cumulative Flow Diagram&lt;/a&gt; nous permet de visualiser rapidement la tendance et de savoir si nous ajoutons plus de cartes que raisonnable, ou non.&lt;/p&gt;
&lt;p&gt;« Backlog » contient donc les cartes que nous avons décidé de traiter prochainement, généralement parce-qu’elles impactent l’un des goals que nous nous sommes fixés.&lt;/p&gt;
&lt;p&gt;Cela étant, vous n’empêcherez pas une équipe créative d’avoir des idées ! Et pour favoriser cela, il faut faire tomber les barrières. C’est le rôle de la liste « Icebox ».&lt;/p&gt;
&lt;p&gt;Sans limite de cartes, elle permet de recueillir toutes les idées ou suggestions qui ne vont pas forcément faire partie du backlog (ex : des idées pour améliorer la monétisation du jeu tandis que le focus actuel est porté sur la rétention).&lt;/p&gt;
&lt;p&gt;Nous repassons régulièrement sur les cartes de cette liste pour les déplacer dans le backlog si elles deviennent pertinentes, les supprimer si elles ne sont plus valables ou pour y ajouter des idées, des compléments d’information…&lt;/p&gt;
&lt;p&gt;Le fait de garder cette liste dans la board simplifie les choses. Cela rend le tout plus flexible, tout en nous permettant d’avoir une vision à moyen-long terme. Mais on ne perd pas trop notre temps dessus, car, en start-up, le moyen-long terme ça peut changer très vite.&lt;/p&gt;
&lt;h3 id=&quot;workflow-de-production&quot;&gt;&lt;a href=&quot;#workflow-de-production&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Workflow de production&lt;/h3&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/production-38f780ad78e396bb134e0fd454fef46f-93619.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 738px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 39.29539295392954%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAACHUlEQVQoz42QXUiTARSGdxNddxt10YUTSifpvDUii8KRBkFBRUJI3nQvUpCYOMNCcJGbCOLXWvY3amuxZqlpkttyfq65tTl/ttq+uX3trxTDc94+BamLLjrwcG7e8/ByVMKgZtPSX0ZvHmjIYdaQc7iC7FMCTfs95A26KbgSpJmFabLaG+nZ8Hn6ONJIMfcV+jx5jlwfjOSZ85NXyc5HQzQbFkl1rW0fvX26B4nxBvgce9HeVorA4hQ21hlra+v4tQHkcjG4AyMIJoB0gbA1GTkBg/0qbtla0fWqBd3OG9A7WljV3HqAAq7doEU1p2d2cfP1/RxN+jhbYI59S7Jyy9mixFF/D0OyKVgZqzaOTHRwU/9Brukt4RP31HzMUIJag5pVvXePktN6GIKthoXHp9AzcBbRuBN5eR7jn4KIJIuQf+Rx57kOneYK6M0a6IVS3LaU4cKAFqeN1ThjquYGUzUUWLUUGSJZmoEYWeZQvIhixgfxix1yOoJlaRVLqSIyeRkXh+pwxFCO431a1N7fogo6Y6Ui3IZ3tiocMlEhPQVPOMzRVAE/s1443E6MzqUgpSR8l2V8XU2gyayDrk+jtNEqTSq3qf+XcEXsoM24FRuxJ8yJFyguGDAbGkMqmVOEGeTz6/D6RFwePIk6RVhvrNqR/M0f4c2HWup6pFX+U86dghrtwiFYJkwYE0fxTnRhcv49Xnte4tJg7X8JfwPfPsbkjjiXlQAAAABJRU5ErkJggg==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Workflow de production&quot; title=&quot;&quot; src=&quot;/static/production-38f780ad78e396bb134e0fd454fef46f-93619.png&quot; srcset=&quot;/static/production-38f780ad78e396bb134e0fd454fef46f-0da89.png 240w,
/static/production-38f780ad78e396bb134e0fd454fef46f-77f7c.png 480w,
/static/production-38f780ad78e396bb134e0fd454fef46f-93619.png 738w&quot; sizes=&quot;(max-width: 738px) 100vw, 738px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Le flux de production&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Ceci représente concrètement les différentes étapes par lesquelles chaque carte va passer.&lt;/p&gt;
&lt;p&gt;Chaque étape a une limitation du travail en cours (le WIP) indiquée dans le titre de la liste.&lt;/p&gt;
&lt;p&gt;Les cartes s’écoulent en mode par tirage (mode « pull ») : lorsque le traitement d’une carte est terminé pour une étape, elle reste à ce niveau (avec un petit label vert) jusqu’à ce que quelqu’un de l’étape d’après soit disponible pour s’en occuper. Tout cela, dans le respect des limites de WIP.&lt;/p&gt;
&lt;p&gt;Exceptionnellement, il peut y avoir des cartes qui font fi des limites de WIP. Ça peut être le cas d’une urgence (ex : hotfix critique en production) ou d’une attente externe à une carte (ex : en attente de validation de Facebook). Dans ces cas-là, les cartes ont un label rouge explicite. Et ces cas-là sont rares.&lt;/p&gt;
&lt;h4 id=&quot;card-preparation&quot;&gt;&lt;a href=&quot;#card-preparation&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Card Preparation&lt;/h4&gt;
&lt;p&gt;Les cartes y sont &lt;em&gt;préparées&lt;/em&gt; pour la suite du flow.&lt;/p&gt;
&lt;p&gt;C’est à partir de ce moment que l’on va décrire le use case de la carte, ainsi que l’&lt;a href=&quot;https://fr.wikipedia.org/wiki/Objectifs_et_indicateurs_SMART&quot;&gt;objectif SMART&lt;/a&gt; de celle-ci. Toute carte a un objectif (sinon, que ferait-elle ici ?). Que ce soit de corriger un bug en production ou d’implémenter une nouvelle fonctionnalité, il y a une raison pour laquelle nous allons traiter cette carte plutôt qu’une autre. Et, surtout, nous allons déterminer &lt;em&gt;comment&lt;/em&gt; nous saurons si l’objectif est atteint et que faire en cas de succès ou d’échec.&lt;/p&gt;
&lt;p&gt;Ainsi, nous ne perdons pas de temps à trop préparer l’ensemble des cartes qui sont dans le backlog. Seul l’objectif général importe, mais c’est dans &lt;strong&gt;Card Preparation&lt;/strong&gt; que l’on va creuser l’idée, se mettre d’accord sur la portée de la carte et, éventuellement, de son découpage en plus petites cartes (notamment dans le cadre d’une mécanique de jeu, qui se décompose souvent en petites fonctionnalités que l’on peut intégrer au fur et à mesure).&lt;/p&gt;
&lt;h4 id=&quot;production&quot;&gt;&lt;a href=&quot;#production&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Production&lt;/h4&gt;
&lt;p&gt;C’est ici que va se faire le game design / spelling / graphisme / développement d’une carte.&lt;/p&gt;
&lt;p&gt;Chacun est libre de se servir de checklists, voire même d’ouvrir une board temporaire, pour s’organiser.&lt;/p&gt;
&lt;p&gt;Pendant un temps, chaque étape de production (specs, graphisme, dév…) était représenté par une liste. Néamoins, ce n’était pas assez flexible et ne reflétait pas la réalité.&lt;/p&gt;
&lt;p&gt;Une seule liste permet plus de latitude afin par exemple que les développeurs travaillent directement avec les graphistes lors de l’intégration ; ou lorsqu’il n’y a pas de graphiste disponible pendant 1 semaine (on évite les « bulles d’air » dans le flow).&lt;/p&gt;
&lt;h4 id=&quot;tests-qa&quot;&gt;&lt;a href=&quot;#tests-qa&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tests QA&lt;/h4&gt;
&lt;p&gt;C’est ici que nous allons nous assurer que le rendu est conforme à ce qui était attendu. C’est habituellement un pair qui s’occupe de cette partie pour assurer la qualité (le game designer, quelqu’un du business, un autre développeur que celui qui a codé…).&lt;/p&gt;
&lt;p&gt;On s’assure également ici que nous sommes en mesure d’analyser l’objectif SMART défini pour cette carte.&lt;/p&gt;
&lt;p&gt;Si un souci est relevé, la carte reste ici et bloque le flow tant qu’il n’est pas corrigé. Ainsi, l’équipe se préoccupe de &lt;strong&gt;terminer les tâches en cours avant d’en attaquer de nouvelles&lt;/strong&gt;. Et chacun se préoccupe de la qualité de ce qui est produit.&lt;/p&gt;
&lt;h4 id=&quot;mise-en-live&quot;&gt;&lt;a href=&quot;#mise-en-live&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; Mise en live&lt;/h4&gt;
&lt;p&gt;Il s’agit de la procédure de livraison en production de ce qui a été produit.&lt;/p&gt;
&lt;p&gt;Tout est déployé en continu. Au besoin, nous faisons du feature flipping pour activer / désactiver des fonctionnalités.&lt;/p&gt;
&lt;h3 id=&quot;live&quot;&gt;&lt;a href=&quot;#live&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Live&lt;/h3&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/live-44047d3f19599c61eb5a5cb0a8bad1de-44e45.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 462px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 120.12987012987013%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAYCAYAAAD6S912AAAACXBIWXMAABYlAAAWJQFJUiTwAAAGMUlEQVQ4y1VVW2wbxxUlghRuAhgGmjZtij4MuB9FG/QzQNrkq/0o0J/EBpqiaNOkgRNXRgMUaOPEqVykdWUndqzIVizFsSzZki1Rj0Ry9CBlipJokTQpSqJIipQo0RQf4mPJfZBL7i6XnDmdpZOmHeBidrEzZ+4958xd00Xre/X+hZtkwH6DDNkHyIh7kJhdZjLhnSATyxNkfHmKdNkvkIvWNtJnu0KuznaSHttl0j3dQXpt3WRgsYfcdPSQMfct0m75Z900c7eHLNs70W85jf675+BxfYqQpx8LW12Y3+hGLHwVVm8fvGEfckke8Vgahd0CcrscijkJAleGUCyDKMBCwEZMFxYPk5Nj+3Bu4Pv0jdH99JXu79KWcwfoq3376Eu3TXR00kQHPzlKI7ltCqAZa9ij56s2WiFq871B68aMueAMMZ2beIG8NmnCa9b9tOvyQVzqeBonz34LL3/8KFpuPYF/X/kRLs6+BO92BIFMFdFUGb6tDfRGrNCobuCwU8jngBaW4fivyR9u7sex6YfpOy2H8MpfDuNs22FMfvYsrvT9BG8fP4j3x36PhUgQI54MbCs5wFcE8RegqhoURUG1WmkC2oNWYnpv9Ag5ajahd+wR2tZlwuvs+cTw4/BMHcH8yE9x6fyTMI+9jEAihFw2itCeG9v5KPIiBy6fZZFjgPIDwBADHJ46Tf4x+Eu8aX6Gnun6GT4cfhpdjqfQbnkKHbd/hWsd72Dws1MIpaJIyHsYS5ixW0412dQagE4AxmAT8M4643A25CJjyxI+cWWp7hNR9/DQvQJUdxE6pzU5Wt3142xfK9o/aMWlzjP48KO/o7XtT3jrX8fw11PH0PJGC7VYZjDhHiUm346L1KsVlKUC5csChIqEYolnswiO5yCLJawmA3j//HM48fxD6Gndh8DUd+C3/hihuR8iMv04Oo8/TD94/UlcG/obMd3bWiIFTkCe42hFllEulSGXjZAhSVIzw1BuA21nXsAff/FNbFgPAfwlaImPoaTGISRPY/Kjb9MXf34QF7qPEtNq3EOMTYQ0qF6vQ9VUaJrGFFRR0zWkkjnMrDnQdfl3aP3NN3Bv+BAaqS644+Noz9iRiZ+HpfsJeubVH6B/9M+s5JibNBi5FUWlulaDXtOh6zpqtVozu6nxSfTeHsLI6G9x7cRX4R38OrT1I7gVOIm3A6dQCDyPqfav0Y7j38P1YQY47XeQq0tZXF+IU20pg5o3h4beQIMQluEDUGc0BKfzOejBh6CEDqAU+Aqy3n0oeB6BtPYocu4DNLPwGMatxxiHUSfhOAm7yTQt5jgUsnkUCgXwPN8sv6nyfQ8+dY+iZ9GGofkZaHYbtHt2yCUfyuIyE9RDG8o65oNmYlredhKZF5HNpCjHF5BhZjXAKpUKy7KBYHAbQ7ZhODc98EdyCO/ksRcTkIoLiCU4JPd47KaLVBAI7gTuGBm6SF7SkS6WqCZUobDuoVXVJo+EUjjmHLg1cwOeqAuZRAabeyGMRK/DnVqCIEjgigXkiwVaLlWZsaeJaWbdQa45GYfzMao696DOJaDnZOi00VTbGEw4uDedqFZ0ZPg8NvMR5Pkss1gFpZIMXpKoWq3DFmDNwctKLvMCSpJAS1UZoixBKrEQJbaY+ZCZyh11IpRcxf+OLZ3Du/wMSg0Fn7c1OCI2wzYuolcVqJUSbdRUBiRCqSr/3bh014cbU/3wxv3wp2tY3OFRLDewrqfQKzigktr/A96NOEk4XYXvPkcDSZZpRWmaWlEMY+tY8/oxPm/GXNiDCW8ag64YgkwMZgFA1pnSJWg17UtAS8BBzN48brjidNibhCCroMyDhg8NYYyxnl6Bb9vF2ovO1Ocwfn8AU1tmiD4X+HkLlGK+CbgYZiqvGCXL7L+Q36OyUGBXLQGRlf3F2AgZthlBMLUGUjdulAJRZRxLeVTDQahFzvArNbie35glJjdrDhVZQ1EUqcgaQ4k1hUqlCpmFxjK0WxfQP9mH9cQqNEVn38uoqmyOxZDrfBdiJISKzjzBql4wAG0rVrK9tYvN6A4NR6LYju0imcoikcognkiDL8pgh2Ju5Q6iW3FjHULhTezEE0jmig/WsVuWy4iY9U+T/wC5zUyL071uAwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Live&quot;
        title=&quot;&quot;
        src=&quot;/static/live-44047d3f19599c61eb5a5cb0a8bad1de-44e45.png&quot;
        srcset=&quot;/static/live-44047d3f19599c61eb5a5cb0a8bad1de-32842.png 240w,
/static/live-44047d3f19599c61eb5a5cb0a8bad1de-44e45.png 462w&quot;
        sizes=&quot;(max-width: 462px) 100vw, 462px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;Une fois en production, les cartes ne sont pas oubliées.&lt;/p&gt;
&lt;p&gt;En effet, à chaque carte a été associé un objectif SMART, validé par l’équipe. Une fois en production, nous analysons ce dernier.&lt;/p&gt;
&lt;p&gt;Cela peut être fait une fois la carte en production (dans le cas des correctifs par exemple), ou bien plus tard si l’analyse doit collecter des données auparavant (c’est par exemple le cas des tests A/B). Dans cette situation, une date d’analyse est planifiée sur la carte et une personne assignée.&lt;/p&gt;
&lt;p&gt;Une fois l’analyse faite, la carte est considérée comme terminée. Elle est déplacée dans le &lt;strong&gt;Live&lt;/strong&gt; du mois en cours. Nous appliquons également le scénario prévu en cas de succès ou d’échec de l’objectif, qui était finalement notre hypothèse au sens du &lt;a href=&quot;https://fr.wikipedia.org/wiki/Lean_Startup&quot;&gt;Lean Startup&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ainsi, que ce soit un succès ou un échec, &lt;strong&gt;nous avons appris quelque chose&lt;/strong&gt; une fois qu’une carte passe en Live. Nous avons validé ou invalidé une hypothèse, ce qui nous éclaire sur la suite.&lt;/p&gt;
&lt;p&gt;Nous faisons un bilan mensuel sur les cartes mises en live = ce que nous avons appris.&lt;/p&gt;
&lt;h2 id=&quot;lessons-learned--anecdotes&quot;&gt;&lt;a href=&quot;#lessons-learned--anecdotes&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Lessons learned &amp;#x26; Anecdotes&lt;/h2&gt;
&lt;p&gt;En vrac, voici quelques trucs que nous avons appris ou mis en place et qui nous servent beaucoup.&lt;/p&gt;
&lt;h3 id=&quot;rester-simple&quot;&gt;&lt;a href=&quot;#rester-simple&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Rester simple&lt;/h3&gt;
&lt;p&gt;Je ne vais pas rabâcher le &lt;a href=&quot;https://fr.wikipedia.org/wiki/Principe_KISS&quot;&gt;principe KISS&lt;/a&gt;, mais c’est vraiment essentiel à garder en tête.&lt;/p&gt;
&lt;p&gt;Dans notre cas par exemple, je me suis rendu compte que plus je créais de boards pour séparer le travail avec des workflows particuliers à chaque board (&lt;a href=&quot;https://community.uservoice.com/blog/trello-google-docs-product-management/&quot;&gt;à la manière de UserVoice&lt;/a&gt; par exemple), moins c’était efficace. Il faut que l’essentiel soit à portée de main, sous les yeux, pour rester focus.&lt;/p&gt;
&lt;p&gt;Sinon ? Ce ne sera pas adopté, pas utilisé dans la pratique par l’équipe… parce que ce n’est pas pratique pour l’équipe.&lt;/p&gt;
&lt;h3 id=&quot;concernant-les-estimations-des-cartes&quot;&gt;&lt;a href=&quot;#concernant-les-estimations-des-cartes&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; Concernant les estimations des cartes…&lt;/h3&gt;
&lt;p&gt;… pour nous c’est une perte de temps.&lt;/p&gt;
&lt;p&gt;Il y a moult débats sur la question et je n’entrerai pas ici dans le détail.&lt;/p&gt;
&lt;p&gt;Mais &lt;strong&gt;en ce qui nous concerne&lt;/strong&gt;, Kanban nous a permis d’arriver aujourd’hui avec une « ligne de production » efficace et rapide. Avec nos indicateurs, nous sommes capables de connaître notre vitesse moyenne de production. En homogénéisant au mieux la taille des cartes qui arrivent, et en nous concentrant sur l’essentiel, nous intégrons en continu les changements dans le jeu.&lt;/p&gt;
&lt;p&gt;Si une carte est urgente, il suffit de la placer en haut du backlog et elle sera naturellement intégrée en production dans un délai approximativement connu, fiable et raisonnable (8 jours calendaires actuellement, en moyenne).&lt;/p&gt;
&lt;p&gt;Si cela est plus urgent encore et que cela ne peut pas attendre, alors un label rouge fera passer cette carte en priorité avant le reste (c’est la fast-line). Mais ce genre d’urgence est rare une fois que l’on a une équipe de production capable d’intégrer au mieux, le plus vite possible.&lt;/p&gt;
&lt;h3 id=&quot;management-visuel&quot;&gt;&lt;a href=&quot;#management-visuel&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Management visuel&lt;/h3&gt;
&lt;p&gt;« Visualiser » est l’un des piliers centraux de Kanban en particulier et d’une manière générale au sein des pratiques Agiles.&lt;/p&gt;
&lt;p&gt;Trello s’intègre parfaitement pour cela avec des &lt;a href=&quot;http://blog.trello.com/github-and-trello-integrate-your-commits/&quot;&gt;power-ups tels que GitHub&lt;/a&gt;, ou avec son API.&lt;/p&gt;
&lt;p&gt;En ce qui nous concerne par exemple, nous changeons la couleur du background en fonction de l’état de notre système d’intégration continue.&lt;/p&gt;
&lt;p&gt;Quand c’est vert, tout va pour le mieux dans le meilleur des mondes !&lt;/p&gt;
&lt;p&gt;Quand c’est orange, c’est qu’un déploiement est en cours :&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/overview-deployment-6ced5c10e77133873b9942aa21ad93f5-d2f43.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 725px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 48.82758620689655%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAACyUlEQVQozx2QS2gTURSGx6VrwY2mimitoEs3LlyKCLp1ISqoe7eibsQXVWOTqCiK1YoKig8IVsVXa1KrNa3GmcyjzbRJmz6SJp1XJjOZGe/5vebCz+Vezjmc7xO0/DdWFH+wWmmcabk3rCjnWEXPs2pJZBPZVyz7fZTV5lS2PCsx8Xuavf0yzGam8sysVZgydIE9T8XYyMBONvxoBw3d32EIruujabcQ+DaW56fgB4SW14bneSjrIqaXLHh+gHbbx9KsgobjIQhD/D/Zz7eQTK0CtF0QP6zHsZObTaFWb6BuWBS4DVoqF8gwbbJtmzzXoaKaI22uTm3fJ6/lUL0iU3UloEqtRYYLGv10k25fW01yLkbv0utx6FSPKTQME6btUNAyMF+SsVBdQcOw4DhN6No49EUDId+o7TVRmRbxOjOHzz8rGFct6BMvMCM9oK+5NI3+/obSTN4UViyHD2xSyJGV5ycgPTwA5clBqAP7oY0+hV7liEGAsN3ClDqBj790lBcWeY+N6mQanjlG+mKNFqy//y1wZLsJk4uL/Cbke7sh9q6FGN8IqXcNtOE7kCsODNuC2zQ5gQJ9mXGHHYVYmXyJWu4M1fOXyRAvwZF7TeGX1cK44RI8C3L/HojXN0FKbUfh+gZMZe/hT8lAo1xF4IaoyE8xP3IYI5mjeJY9Bm3wCNRkF6k3eFLrICfXmYJpe3DckAzDJKV/D4nxDSQlt1EhHiPt610SZ22ql6tE7ZAmpTQNvjtLQ9k+GlMGSXl7msSrG0lMbCMp0QMeU5D690J+sI9nLwo3+GaJLZCSPZDjMajZfuTKPsyW30GU8mN4nM7g/RfuMjONsVfnofR1deoLyW4+sNsSpHhXJF2LhZ27b0vEPyNeEIn8Xfx0NZqbUaN5PR/ZtWKUGXwYXTx/Lhq4fyu6cPlK9P728UhLbYrExNaw05fobvwDpquKzdyBzFIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;En déploiement&quot;
        title=&quot;&quot;
        src=&quot;/static/overview-deployment-6ced5c10e77133873b9942aa21ad93f5-d2f43.png&quot;
        srcset=&quot;/static/overview-deployment-6ced5c10e77133873b9942aa21ad93f5-0979a.png 240w,
/static/overview-deployment-6ced5c10e77133873b9942aa21ad93f5-521aa.png 480w,
/static/overview-deployment-6ced5c10e77133873b9942aa21ad93f5-d2f43.png 725w&quot;
        sizes=&quot;(max-width: 725px) 100vw, 725px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;Une fois le déploiement terminé, ça redevient vert. Mais si le déploiement échoue, le background devient rouge et tout le monde le voit :&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/overview-failure-b7cf47da014c7421658e1d05dd858d46-7fb75.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 723px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 48.962655601659755%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAAC6klEQVQozx1Q+2sUZxQdf/RvUAJiHgiuSgsiFtLQmPiIVNAWighpobG0UPxVLMWK/uALxFYFH0VqQyPqZh+p2ayJ6ErWuC833c1uVpNsnk42mdnZmdnZ3dn5/O7pl1w4XLicc+89R8pE3/BcPMaX0uM8NTLEc+NJPpfN8KVclof9fh56FeXyzBSXcxkeGXzKB4JhPj0xwdXFZZ54cp73Xmrgobu7+cgdF43c2rUqVapVWJaFmmlAnp6C/ZGjatuoivlUKo18QUetXketWsHCZBalSg0Oq2Othn3XcfPGBmDqM4w/24TjP21VpBVVhVrSqaoVaXEyQyXDIEOgYpqUjSUot6CQbdtUMXSSc1kqFBktLFukWaAX/b/T7asbKRNroEH/Zhw+1axIqqahJMS1koZ58YGsFFEs6TDLZUzG3yIva3AcB7WygXw6Dc/oB4QSMv6bsfB+1I2Z1H16GR2gseRrLM2nFEnTTbGwTLaw/OL0jwie/ArPfz6BkZPHEHc/woxaRb3uwLbEgbdJhCc/oKjrwjBhJT2Iihah6eVVKpgf11JQpFWjjJJdJ0cIAt+0w72nAZ62FvTv3oTIgz+RlQ1oho6yrmF2Iou8CnFgPUIsxx5DDv9KhdglUhMXoY9fUaSEXkFcs4hMHUPdXfB+sQ3+g5/A19aMeN9fSC9qKM6vwDbryEd7IY91Y/TVd3BHvkf0j28R6Gqi4FGBI1sQ+HKLIulWFWXboaKmUbC7i8R35D+wi7ytjRTtvU+pJZ2UuQLxSp1SY176N3CGnr+8SpF3PgpfO0PuvS3k3Sf47TshoEjBnmMY/uFrPOs5ioFDn8K3bzv8+3fC19qI2MNepFZsmCLDtcySr9+gLxDGcCiJUGwWw5cvwN/WtM4f6HTB1+lSJW9rE/O0Njoe0cUy5utwMV/nDub5vInF711ns+/fsbmJNNPm82zo7wfst18usHs3brGz5y6zf071sKft25i3Y4ezrutwFf4HQXF12BPO3IYAAAAASUVORK5CYII=&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;&amp;#xC9;chec de d&amp;#xE9;ploiement&quot; title=&quot;&quot; src=&quot;/static/overview-failure-b7cf47da014c7421658e1d05dd858d46-7fb75.png&quot; srcset=&quot;/static/overview-failure-b7cf47da014c7421658e1d05dd858d46-13d89.png 240w,
/static/overview-failure-b7cf47da014c7421658e1d05dd858d46-00d1c.png 480w,
/static/overview-failure-b7cf47da014c7421658e1d05dd858d46-7fb75.png 723w&quot; sizes=&quot;(max-width: 723px) 100vw, 723px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Un d&amp;#xE9;ploiement a rat&amp;#xE9;, il va falloir regard&amp;#xE9; &amp;#xE7;a.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;visualisation-kanban--trello&quot;&gt;&lt;a href=&quot;#visualisation-kanban--trello&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Visualisation Kanban &amp;#x26; Trello&lt;/h3&gt;
&lt;p&gt;Pour connaître le nombre de cartes de chaque liste en permanence, j’applique un filtre sur &lt;code class=&quot;language-text&quot;&gt;*&lt;/code&gt; afin de ne masquer aucune carte.&lt;/p&gt;
&lt;p&gt;Soit dit en passant, je ne sais pas pourquoi le nombre de cartes d’une liste ne s’affiche &lt;strong&gt;que&lt;/strong&gt; lorsqu’un filtre est activé.&lt;/p&gt;
&lt;p&gt;J’utilise également &lt;a href=&quot;https://chrome.google.com/webstore/detail/kanban-wip-for-trello/oekefjibcnongmmmmkdiofgeppfkmdii&quot;&gt;une extension Chrome&lt;/a&gt; pour coloriser le background des listes en fonction du nombre de cartes. Si la limite de WIP est atteinte, c’est jaune. Si on dépasse, c’est rouge. Ce n’est pas indispensable, mais c’est pas mal pour comprendre l’état du flow de visu.&lt;/p&gt;
&lt;p&gt;Existe également une extension Chrome qui semble faire tout cela : &lt;a href=&quot;https://chrome.google.com/webstore/detail/cardcounter-for-trello/miejdnaildjcmahbhmfngfdoficmkdhi&quot;&gt;CardCounter for Trello&lt;/a&gt;, mais je ne l’ai pas encore testé donc je ne sais pas ce que ça vaut.&lt;/p&gt;
&lt;p&gt;Une autre extension assez pratique : &lt;a href=&quot;https://chrome.google.com/webstore/detail/card-color-titles-for-tre/hpmobkglehhleflhaefmfajhbdnjmgim&quot;&gt;Card color titles&lt;/a&gt; qui affiche les titres des labels directement sur les cartes.&lt;/p&gt;
&lt;p&gt;Enfin, &lt;a href=&quot;https://ollertapp.com/boards&quot;&gt;Ollert&lt;/a&gt; est un outil de visualisation assez complet qui vous permettra, notamment, de tracer le Cumulative Flow Diagram de votre tableau sur une période donnée.&lt;/p&gt;
&lt;h3 id=&quot;board-«-calendar-»&quot;&gt;&lt;a href=&quot;#board-%C2%AB-calendar-%C2%BB&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Board « Calendar »&lt;/h3&gt;
&lt;p&gt;Pour finir, une petite anecdote sur une board que nous avions appelé « Calendar ».&lt;/p&gt;
&lt;p&gt;Elle répondait à la problématique suivante : que faire quand une tâche doit être réalisée à un moment donné, pas avant, pas après. Autrement dit, &lt;strong&gt;une tâche qui ne passe pas dans un flow&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Nous avions alors mis en place une board &lt;em&gt;TODO &gt; Doing &gt; Done&lt;/em&gt; avec le power-up calendar activé. Chaque carte était attribuée à quelqu’un et était planifiée à une date précise. Ce qui répondait parfaitement au besoin.&lt;/p&gt;
&lt;p&gt;Finalement, il y a eu de moins en moins de cartes de ce genre à mesure que l’équipe s’est rôdée avec Kanban et que l’organisation a évolué jusqu’à son état actuel. Chaque cas &lt;em&gt;« unique, qui ne peut pas fonctionner avec un système Kanban »&lt;/em&gt; (souvent, des tâches marketing / business d’ailleurs) a finalement trouvé sa place dans le flow à mesure que la philosophie Kanban a été intégrée.&lt;/p&gt;
&lt;p&gt;Et finalement, j’ai pu fermer cette board devenue inutile… À la demande de l’équipe !&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Kanban and Game Development with Trello]]></title><description><![CDATA[How Kanban makes us efficient to build video games as a start-up? How do we use Trello to achieve that?]]></description><link>https://www.nicoespeon.com/en/2016/01/kanban-game-development-trello/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2016/01/kanban-game-development-trello/</guid><pubDate>Tue, 26 Jan 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;context&quot;&gt;&lt;a href=&quot;#context&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Context&lt;/h2&gt;
&lt;h3 id=&quot;metidia-a-start-up-developing-video-games&quot;&gt;&lt;a href=&quot;#metidia-a-start-up-developing-video-games&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Metidia, a start-up developing video games&lt;/h3&gt;
&lt;p&gt;I’m associate in a parisian start-up called &lt;a href=&quot;http://metidia.com/index/&quot;&gt;Metidia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Concretely, we build video games about consumer goods because we want to change the online selling world. Thus, we work on &lt;a href=&quot;https://apps.facebook.com/metidia-vinoga/?utm_source=nicoespeon-kanban-game-dev&quot;&gt;Vinoga&lt;/a&gt;: a Facebook social-farming game − think “FarmVille”, “Hay Day” − which is about wine. You are a winemaker, discovering the steps that will make you produce actual bottles across your journey. While your vines are growing you can even take a look at your wine list, customize, order and then enjoy for real the great vintages you have virtually produced.&lt;/p&gt;
&lt;p&gt;Our challenge, as a start-up, is to &lt;strong&gt;iterate from an initial idea to a business model that works, before we get out of resources&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;And there, among every roles you typically accumulate within a start-up, I’m the one responsible of the production part: ensure the team makes stuff happen, tests hypothesis and builds the game that will meet clients-players needs.&lt;/p&gt;
&lt;p&gt;Our production team is composed from 1 Game Designer, 1 Game Artist and 2/3 Developers. Although we were 2 at the beginning, without much organization, we quickly had to adapt not to repeat mistakes of the early days − produced assets that become obsolete before being integrated ; poor code quality that should be reworked because of bugs…&lt;/p&gt;
&lt;p&gt;We took advantage of our flexibility to adopt &lt;em&gt;de facto&lt;/em&gt; the Agile principles. At the beginning, it was all trial and error. We learned a lot from &lt;a href=&quot;https://en.wikipedia.org/wiki/Scrum_(software_development)&quot;&gt;Scrum&lt;/a&gt; to organize ourselves, but it reveals to be too heavy, not suited to our early needs and context.&lt;/p&gt;
&lt;p&gt;At the end, I think that &lt;strong&gt;Agile is a buffet from which you should take the best&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We progressively composed a process that is adapted to us, pecking best practices that worked for us.&lt;/p&gt;
&lt;p&gt;Finally, Kanban appeared to be particularly efficient for the team: flexible enough to continuously adapt ; still robust enough to avoid people disperse their energy around − which is not quite easy when you deal with creative minds.&lt;/p&gt;
&lt;h3 id=&quot;kanban-what-is-that&quot;&gt;&lt;a href=&quot;#kanban-what-is-that&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kanban, what is that?&lt;/h3&gt;
&lt;p&gt;To put it simply, &lt;a href=&quot;https://en.wikipedia.org/wiki/Kanban_(development)&quot;&gt;Kanban&lt;/a&gt; is a “visual process-management system that tells what to produce, when to produce it, and how much to produce”.&lt;/p&gt;
&lt;p&gt;The heart of Kanban is to &lt;strong&gt;visualise the production process&lt;/strong&gt; to set up a &lt;strong&gt;limited pull system of work in progress&lt;/strong&gt;. That means you limit the number of parallel tasks for each step of your process. Whenever there is a free space, the downstream step will take an upstream task - that’s the pull system - to make the work flow, not the other way.&lt;/p&gt;
&lt;p&gt;Concretely, here’s how would look a typical Kanban process: &lt;a href=&quot;http://blog.crisp.se/2009/06/26/henrikkniberg/1246053060000&quot;&gt;One day in Kanban land&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Moving to Kanban is dead easy since you start with what you’ve got:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;identify existing processes (eg: the production process, the player support process…)&lt;/li&gt;
&lt;li&gt;decompose workflows of every identified process&lt;/li&gt;
&lt;li&gt;setting limits to work in progress − simply start with what you’ve got&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then, the key is to progressively improve your flow with the team. This is &lt;a href=&quot;https://en.wikipedia.org/wiki/Kaizen&quot;&gt;Kaizen&lt;/a&gt;, an essential part of Kanban: the team regularly has a retrospective look to &lt;strong&gt;continuously and incrementally improve the way they work&lt;/strong&gt;. This way, they can adapt themselves to the context, try new ideas, adapt to changes…&lt;/p&gt;
&lt;p&gt;That’s the way we made Work In Progress (WIP) limits evolve for each process step, until we reach values that make us really productive - low WIP = high throughput − without being stuck… which is good for morale!&lt;/p&gt;
&lt;h2 id=&quot;big-picture&quot;&gt;&lt;a href=&quot;#big-picture&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Big picture&lt;/h2&gt;
&lt;p&gt;We adopted &lt;a href=&quot;https://trello.com/&quot;&gt;Trello&lt;/a&gt; since the very beginning in 2013. Free, intuitive, easy onboarding, it is our virtual whiteboard and partner in crime which evolves along with our organization.&lt;/p&gt;
&lt;p&gt;Trello boards are very flexible, which allows us to make changes through time regarding our needs.&lt;/p&gt;
&lt;p&gt;Trello can also be &lt;a href=&quot;https://www.timedoctor.com/blog/how-to-use-trello/&quot;&gt;used for remote teams&lt;/a&gt;, and it is much more than that. It’s whatever you need it to be, based on the projects you’re working on whether they are for different clients.&lt;/p&gt;
&lt;p&gt;And so we may create and close diverse boards regarding projects we work on. These boards structure may vary regarding what’s needed: a temporary project managed with some GANTT because business needs it - thanks to the &lt;a href=&quot;http://elegantt.com/trello/&quot;&gt;Elegantt extension&lt;/a&gt; ; a simple &lt;em&gt;TODO &gt; Doing &gt; Done&lt;/em&gt; Kanban to handle a subproject ; etc.&lt;/p&gt;
&lt;p&gt;All that aside, we have set up a board for each identified process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Production&lt;/li&gt;
&lt;li&gt;Business&lt;/li&gt;
&lt;li&gt;Support&lt;/li&gt;
&lt;li&gt;Communication&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each board represents a single activity that has its workflow.&lt;/p&gt;
&lt;p&gt;In this post, I’ll just focus on the production board cogs.&lt;/p&gt;
&lt;h2 id=&quot;the-production-board&quot;&gt;&lt;a href=&quot;#the-production-board&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The production board&lt;/h2&gt;
&lt;p&gt;The − Kanban − production board represents our production force, the work of the production team. This is valid, whatever should be produced: bug correction, new feature on Vinoga or another product, hotfix… Whatever should be delivered by the team.&lt;/p&gt;
&lt;p&gt;This is an honest point of view of the work capacity of the team. That way we can prioritize everything we do and standardize the production process.&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/overview-9b37212a00e0158ab6eaefcd8bc46199-d2f43.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 725px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 51.44827586206897%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAAC4UlEQVQozx1SS09UBxS+SXf9A266cNWi0URwYnRCN1ZrWh8ExYVx1Wg3LKg0anxVbMVHM110hBl5jJUgqYoSg+DggEXJQCI0CvLGqjDTAWbmvh9z752Bcz6v7M5JznfO9zjCtcdnVq91nqUrnafpStdJOv+wkmo6fqJar77cVU0n/j5O5zuq6XrPGart/pmq7/5Ip+9XUaDvAv0Zr6VLHd/RLxE/XWzxU+De1yRkFZHUjAJD1JBzXMzMT8Ex8rDNPHRdw9DUJBbTNrgAGKaO+MQEZheMtd518whFduFZ2xdIPvPjTt16CKlMkjRVg2marJoqTy2Ms5XLsW7qnFWXeXB6lJNplfOuw6Iu8oelOQbAOSfPBJfPBUp5pPszxvw6/u33z1nIqhlKZ7IQJZlzroV3ybewNRfkegwcBy9nx5GWLawUVqBZEoamZxAbUdH/SsXEfAZdnafQ33cU7b1VaI/WQFiWFkkzLFi2y5ql4K8Xdbg32IKHw214MNyC5xMjyMg2VldWoJoS4pOvMTy9BEk28H8miUTiMaTsDEbeqvAcgLAopkj3JDs5hxVTRlmTD3vCG7AntBH7GjYjOtqPZDrnDeehGiIGZ2bxbnkVIMC0bSRmW0HLvZATcUD5F4IopeiVomNSz7GmZ1AR8eNAYwnKGrfiUGQb+t70470nTZdViJqMqblHMNI9yEoxpNJRNHUfQfDBDoQ7tuPGfR8EVVbIcAC7ALa9MA7f8vO+hi3sLeWDzT6OjQ/w3LzCTkphq1DgaLSKY62lHGov57YnlXzszl4urdvI34RLeGe4mIXg06t8+0UQrfEQbj7/A+XN2zyGxdjvsTwY8aFnbABzSWPtRT6F9s/YEAZGx7CQkJBMqai8W+FZswnecZQ3lUDYXV+0ujv0Fe2q/5K+DRWRx4w8ubS/sZjKm30UG+ul/xaWKCtnSbZEuhoO0tlLAfo1EKSTNbX0w+299H3D5jXMJ+xHQZpz3fB5oJEAAAAASUVORK5CYII=&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;The production board&quot; title=&quot;&quot; src=&quot;/static/overview-9b37212a00e0158ab6eaefcd8bc46199-d2f43.png&quot; srcset=&quot;/static/overview-9b37212a00e0158ab6eaefcd8bc46199-0979a.png 240w,
/static/overview-9b37212a00e0158ab6eaefcd8bc46199-521aa.png 480w,
/static/overview-9b37212a00e0158ab6eaefcd8bc46199-d2f43.png 725w&quot; sizes=&quot;(max-width: 725px) 100vw, 725px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Our production board&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;goals&quot;&gt;&lt;a href=&quot;#goals&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Goals&lt;/h3&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/goals-88809dc1e29b01054325e24ac593dc53-af9c0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 232px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 199.13793103448276%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAABYlAAAWJQFJUiTwAAAFkUlEQVRIx52XW1MURxTH+RT5APkcefYxnyCpsvwEooJYasVKlKgYH/LoQ8qnVCrRaAoRkKuKiKDcYZeFYe/32Z2dnb3MbM/0P+f0MLCsLJh01aG7p7vP9M75nX83Pd8/Ote8P3pdPJi40fpl8qa4OzYghl5Rf/KGGJq4Lh5O3VRtGhf3xq6Ju6MDqr43fk38/PKqGBzpJ+sTQ+M3RP/TC6Jn8J8B8WlhA1OTr/Fmdh7aXhLv3y1hfm4J795+wOSrWcxOz6lnoe09RPfTCIc0hLc1ZFI6CrkKMuki4ntZTK9NoOfHvy+3Vle3MDU7K9/Mzcmt8I78uLwip2Zm5eLHj/L1u3n5fmlJLiwuyo3tkAxFduXa5qZc29iUWjQuY8m01OJxGd1PyfHlEdnzw18XhdNwQUXyH9f1/MZBaZkVpFNp6KaFilmFlBKu58HzJFpCoNVqwWk5tBCYXBsDOewVdkPAk57kyUGRtIhLbi+C3x4MYfjhfYRWVvwx2f7Kw70EDi8Ku37kMDDvwGEkkcHSH48RefwrQmvramn7PN885fPEHbYbF6clENmNYoGCYjUd3jp46EyHss0h2nahviM5FU5LfbvOouahzeGtJ5eEZTYQjUWlpmmIxWJIJpPQdR3FYhGmaSKRSCCTyaBarYLn5PN5NYfHuHjymMNeUa82aUFa8oR0Oq0WxuNx5dy27WAr6F7agsIOa2aTnJiy0WigVquB61K5jKplKSyEwkMc1gqXwLhP2EgRfENyWNarxJgpmTOz6vNWtWrKiqUyyoaBSqWi2jxmVEzq+8btMo3VqjYmVkf9oDDYsuM3BQFJZPJ4PjWPhbUd5HXj7J/cjcMgotNv32Lg5lXcG7oNSj8/CJ53Bjbs0HNP5HAztI2x4T8x8vx3aPvaYRYdwwvHHB7P5ZPKSkzHolY4mcHOHTKHHOVsListiiqjw5wxLhyIQqEAo1xCnaKfzWZRKpX8Z4bR5rQT7Eod0ei+ZAfBAl7MdblsKC4ZH34hG2PVbDaP8r4T7IZlkyNdMoO8w5bjIJVKIUXZwOx9aTnk0GAOCWxmkNlj1iyqrVqduKwpNs2D5+0MErsHLHZwyJ2mbUubduYoa6naptrQC8hnSGBzaVgVQ6mPP35kvM5tfRblk5LVxXQkj+HVOGaWQ1jWMl8Cdu+JYPMUzxWY2whjbnkTz1aieB1KqcXe6QJ70dfDLnKSTSWwQ3DH9nboJ5c/S80umcKK0pIcUdd1VWqxcdshXBgZ23aUugTjp4JtVRqkfzElsKyDLK7MJIsqQ84o+UyWldjy2CkOWWBtAjmjMoWBDgQ2Go2qaP8nDtkh79AkDuv1OglsHVxzaqmsoIyAICZIRBuUjrYyR6GijNqEHFxHHn1Do0SiWq36YDPEB4Az3DVqj6eK+JQvw7Z88TWrvhArM5U4o245AdjEYfNzDoPOYNxA766Ob1azmDQaOE2WunLoBccnRfXrDwlcCBfw7WYe57dy6rno4NA7UWClK9uV2FWnuYdr4Sx6JiL4aiaCkaTu589ZYDsN0f2c9FzMFavYKFunHKLyODYssDrJF0sWSxhzxswxh7lcDrJRR4NuYZls7vDcZmPEeI26fXWey/l8ThbopsBO2CkLKDtW5zRhUT14FowF4+zY9USnwDq0w6I66HW9yAcW/k85FNhSUYmkVOJJXJWNCr3AoNsDHQl0BOh0wBf1wEodbToyKFVNo+5zeOvpJRHZiWJ9a0tuhsKgKy+2dyJU74H7dEWGFouTJbraXjRG37KA8ZUR9Nx+1i+0cBLrq9tyayMCbTdJcrWP3XAM3A9vaUgni8jT5byb5bJ0RSnamF2fQs93j86JO8N9uDPSJwdH+3HnZR8GXx7U1Of27RdX8NOLy6fYJdC/F7jy5Dz+BQBkfWO7YLxxAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Goals&quot;
        title=&quot;&quot;
        src=&quot;/static/goals-88809dc1e29b01054325e24ac593dc53-af9c0.png&quot;
        srcset=&quot;/static/goals-88809dc1e29b01054325e24ac593dc53-af9c0.png 232w&quot;
        sizes=&quot;(max-width: 232px) 100vw, 232px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;The very first list of the board contains our key metrics: the 3/4 KPIs that really matter for us. This is for the team to always keep an eye on them. That’s a source of motivation!&lt;/p&gt;
&lt;p&gt;We review these every month to understand where we are and decide where do we go.&lt;/p&gt;
&lt;p&gt;This is also an opportunity to celebrate successes together, because that’s good for morale!&lt;/p&gt;
&lt;h3 id=&quot;templates&quot;&gt;&lt;a href=&quot;#templates&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Templates&lt;/h3&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/templates-fc506e51d32f482c3ac2d1bc9b60ce2d-4a16b.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 361px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 103.3240997229917%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAABYlAAAWJQFJUiTwAAADlklEQVQ4y6WU627iRhTHecn2Iaq+QaV+6XY3SS9qmm5W7Qu0j7DaDUnYTcL9DgZjfMXGNsZcbSgsnn/PDCSNlGg/tJZ+OheGv+acMzOpr/784tPvmZ+S8+sj4jh5kzkRvL46Sn69+D45S79Mzi5fCv+Xd98lp++fwvNn6VfJydtvktSbqx+SbtVA5uoOdx+KuLq4wXX6FrWyBL3voNcx0GmpMDUXY3+BkTdHcGB0IKC8pXpo97pInV68SFTFQqFcYsVymWULBZYvlVi92WKaabKuoghUw2CO5zPbdcl6ZD0Rc9+wbabpFqt0Kyx1+v5FkmwA13NZMB5jTIxGAdkQQ9eF74+EdQnP8yn2YduO8E3Lgu04iFcr8K9ryUjx3mzjBM1Wg3U6HdTrdZTLZXQ6EhqNOlRVBc83m03UajUYhgFJkkRcrVZFLoojISgLwUc7HAUBJpMJ/uvXG/TwUHI4CRkXm8/n2Gw22G63wj7lmfyWBBIq2aSh8JGvl5+wjCO2Wv8NThSvsIxiQbxai3ixjPZ5sty/z3PmiyWWixUkXfq3h9VahbXbbdHDYrEIWZaRy+VErxRFgaZpwnL4mmajIXrN1wbj4FEP6djs1sDAHjDP8zAcDsWkZ7MZptMpwjAUfhRFwi6XSywWC5HnLeJ2dZjyw1DYFnAcmwU0lIj+8L+Gwnu4oZKjVcz4eYoPfbnvo/C5PbB85EcxjyPBOt5QDzv7KU+CCHK/z3RzAIsOraobAnPAfZOsLfLcDpyh8A1rAM2wRMzzo2CKltbeD4ULZm4+srtslg54G+VKFdeZD0QGH29uUSiVUW80kc3lkcsXUCiWhH9zeyvW9/p96vsMkkE75K+J54TI5nOsUqujRGJ32RzFeSFaJLFCqSTIk1C+UBSC4+kMMzou4XRO/pTOb4y2Ju1LnoUrKllhvBTd3JfR7SnodGVRjh+M4bgeXLrXHt1z7gfhBOPJVBDQtGezCG39IDifrEnIZC5dfMu2xWKlr4o+cpHpfIHJjDMX8DikHd7zsEMuyKfMBd0gYB7txA9CuLQLbn16cXhu6I2ex99besbohZqiqbZIkF7cgemjSyXLfZUpmv5AT9VETrcGn0UzLWqXy2pKnaXOL0+Yo4Zo1jtoN3royxZkSYcim5CaisCxAvEqB/78WUYe3apgBcXQkPr6ry+3f1z/vDu7eLV7nT56yuWx+O23z8B/P08f7358++3uH78a26CZyDDjAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Templates&quot;
        title=&quot;&quot;
        src=&quot;/static/templates-fc506e51d32f482c3ac2d1bc9b60ce2d-4a16b.png&quot;
        srcset=&quot;/static/templates-fc506e51d32f482c3ac2d1bc9b60ce2d-70d39.png 240w,
/static/templates-fc506e51d32f482c3ac2d1bc9b60ce2d-4a16b.png 361w&quot;
        sizes=&quot;(max-width: 361px) 100vw, 361px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;This list is mostly an utility: it contains cards that are templates which save our time.&lt;/p&gt;
&lt;p&gt;Actually, we don’t really use &lt;em&gt;“card templates”&lt;/em&gt; as we want to keep the card creation process simple to anyone that may have an idea. As anyone can create a card, it’d be utopian to imagine they’d duplicate the appropriate card whenever it happens, because it’s not intuitive at all.&lt;/p&gt;
&lt;p&gt;However, we use these cards to hold &lt;strong&gt;checklists templates&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Indeed, Kanban advocates to “make process policies explicit”: anyone should be able to know whether or not a card is ready to move to the next step of the flow. This is why the team has agreed on − and make evolve − &lt;strong&gt;exit policies&lt;/strong&gt; for each step of the production flow. And the best way we found to make it work with Trello is using checklists!&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/template-detailed-b242371b019597e713a18dd636aa8190-b205b.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 501px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 93.81237524950099%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAABYlAAAWJQFJUiTwAAADgklEQVQ4y21UeW8aRxzlq0fqB6jSf6q0aSM1qiq3SWqCEzuxbOzGBuLGqbnv5dgTluUyYENmfn1vFqK0iqWnGdbsm3f8hsQ33z3YvHt/qfYP99XLNy9V6m0Ka8qsqbcHeJ5UR+kjdZY9VycXp+r4r2OVzpypyw8ZdXmdVdmPOfXu6kJd3XxQD598u0k8T/6plqu1tNodsTo96fZs6fUdcVxfXC+Qvu2JH4QSjWcSjsbYDyWMJrLAO4PhSJotS8bTuXxSIqfn5yqRevVazRcrsbo93en1tNXt6nanq71goEfjqY4mU7OG44kB94NRpAfhSIfRWDdbLV1vNPTdei2XmaxK7CeTynY9KZYqulprSK3RlHK1JsVyRdxgICCRQRjFGEXiD0PBgdLp9WU6v4WjvhSKRb1c3Uk2l1OJV68PFSWDSNcaLSFaVkcarbbZV+oNsWE/JhtJEAJY/QFimEzFcVyhwvVmI5ksCA+P3oBwJvliSReKJSHyhSIUl6VUqRo1JKcixGI+w6qMoJzv9W0b+bf1BiHm3n+hsFSuaNqtA1RI9HE6LQ+hbohCYkSmFO5ntwvxfF9q9YZe3a3kOJ0h4ZFawL/rBzpAPmyRVnhINJkZJShii3jPQ0b4TgDbjaaJSFPtydmFSvyy91Q5bmAs0+KuEO7xDFkNjZpdKcyP6hkB/1fB9y1Mxf3mE1qGwsd7P6jZbClVlMKMmvhys03LXfHwAgm+BpbClnsgZimCPzM2T/74CYQL+Xhzo6mMpZQqFVNKq22ZgWcUxiqyM3YB7mnTdhyOjlZao2UQ/gzC+Xwp/+TzukzLAJXSzi47ZslMScB8TSloejKbI/NA2paFUu4ll7uKCWmZGVZqdWRYlSpWqt1ltRsZgpeAh5CQh9iuawjp+fT8EIS/P1ar1Qa5WZpTTxI0Lrh6GBtPHM8HArNywI3ySaycRfVtWO739Xgyl2cHeyrx42+PYHllHtqOtx2bmbEX2/wvzLggU5JRJQ/GYXqCgk7SZyrx6Nfvle+HyLCgCywC7fJ6sUUP5K7BYIuheUYXbdjnjdlmqm+Xd3HLzHCxuJdyraZ5xaq4uwRvDT8jCgPuCY7M58a3gFq9QCkHuCRmbD63jCHlQJOAKmgtfmm8RTw2X5LtCJf3a3mRPADhM7Q8Xcjf19dmDvPFoimFmZiX/4/oK4T4faTl4/Sp+he4ImAd7XRKNgAAAABJRU5ErkJggg==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Detailed template&quot; title=&quot;&quot; src=&quot;/static/template-detailed-b242371b019597e713a18dd636aa8190-b205b.png&quot; srcset=&quot;/static/template-detailed-b242371b019597e713a18dd636aa8190-27bf9.png 240w,
/static/template-detailed-b242371b019597e713a18dd636aa8190-7da8a.png 480w,
/static/template-detailed-b242371b019597e713a18dd636aa8190-b205b.png 501w&quot; sizes=&quot;(max-width: 501px) 100vw, 501px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Example of a template for explicit exit policies&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Thus, when we’re done with some card, we know that we have to create the exit checklist. Which is made easy with templates:&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/template-copy-3c0d1ba15d40e91199bb7798177bc782-ac47b.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 466px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 77.6824034334764%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAABYlAAAWJQFJUiTwAAADlElEQVQ4y22US2/jVBTH/T26ZsGOWSKxY8WWBR+ABYuK5SBAoEFCiA1CSCwAobIARkgIJGbaUh6DOqXNTCZNnNiT1Hk3iRPbceK3nTSJc+6fE/cxAnHln+7x0bnH5/7PkaV293zd7fWF4/kUhBGFcUxhdAXbyWxOUZzQKl1TsSTT9vY2vXX7Nr2x/Sa98uoteunlLXr+xS269cJz9PprWyTlCwXR6nQxdT3M5nOkaYoVk67XWCyX8DwPnu8jjmOEYQjHcWDbNqzxGEHgYz6fIUkSxFECZ2pC6utDrmS2SSiWq5UAkCH4Wa9TYdtjMZnYwvc94biO8HjfvNvMYrH4V3wch0Lygoj4unD9gIMDdLt9ruYCRAAXebP4xPXJm3UZI/hWIvPP+YbSRjtOliWM4gCNZhF+oHP4jBOEGcQA0Q0kApbFY1n8jFXqY00BZjPvMqHDGjleJOLERH90F7XGDkrKF2i0v0G1/jVqTOXpl1BqX6HMe3/0PVbYx1JcsmBS3EOYyJC4CbRpxtQNxOzCy5x+KHPFRbbL/KFTJBdK5pu6p5nfj4pYrlUs0mesSEGUnEPaSLHpqhuEwmUte+cDDPo6TNOCro/QZ7vb6WE4NLJ3ezx5pulVS651XVwsIPm+T5ZlYaDrot8fsIZN1DQNnW6X7QY6nTbq9TpardYVzWyUNiMUhsENfhRi7Lo8Nv0Bnff6kOWyqJ1psJwpLG+K0WSMkT2GucEawzBMjO0JeMg5IU/Ff5gyphtwUyYWpXMf3daZqCgFFNS/UdSOka8eotx8jO5YQ2/UhDnswbVHWCYeljPu7P+wYKQfcja9vUf4+CAUH+3buLNn4d37Bt7bNfDhH1N8ejLDZ8cX+Px4hU/+WuHOr0t8cHDJxr7m/f0l3tldQjqpWbSrLvBz3hA/Pmrhu1wNO8cqo2DnSMa3JwrunpzhQJ3igTbHnppgV4lxvxIxAe6VfcbDLyUXPxUmkGxrRFhFGHTqoiTnREk9EsXqocjJv4vH5T/Fo9IDoTVLoq7Jotc5E3q3LgJnJKbWuZhYLTExNTExasIeVYWlV4SkDw2xEbrRbKEkl1GuMGoFslrGwNBhcVOm3D3DMtEbDNBstaE1GlBrCuSnBRTVHIoK664c4bRyCGk4MtKEf1PtdpsURaFatZrtqqKSpmmk6zrxiJAfBGSaJvHokKJWqCDnKXd6SEdPfqOHT/bpYX6PDvO79A8uaX+LaR956QAAAABJRU5ErkJggg==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Copy a template&quot; title=&quot;&quot; src=&quot;/static/template-copy-3c0d1ba15d40e91199bb7798177bc782-ac47b.png&quot; srcset=&quot;/static/template-copy-3c0d1ba15d40e91199bb7798177bc782-ec35e.png 240w,
/static/template-copy-3c0d1ba15d40e91199bb7798177bc782-ac47b.png 466w&quot; sizes=&quot;(max-width: 466px) 100vw, 466px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Simply copy a checklist template&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Our trick to quickly retrieve your checklists templates is to name your card to have it appear at the top of the list.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;(Template)&lt;/code&gt; prefix is perfect for that.&lt;/p&gt;
&lt;h3 id=&quot;icebox--backlog&quot;&gt;&lt;a href=&quot;#icebox--backlog&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Icebox / Backlog&lt;/h3&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/backlog-9c5afbe3d3ab0144bcbe07d49388f17c-da4cc.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 370px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 120.27027027027026%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAYCAYAAAD6S912AAAACXBIWXMAABYlAAAWJQFJUiTwAAAFi0lEQVQ4y2WVyW8bVRzH52/hhBBwQkKoJy5IqFIrrnBBFQJBygEBByhCYuneIlJ1CUlDF1TUOG1jJyEkaZM4cRzvS1bHScZ24m3ifTwztmf8/L78ZibhAE96emPPe7/t+/m9Ea5NfW88dd9nTu8D5vQ9YqPLj5gz6GDOgIONBUbYRPAZG5i7zm5OX2Sj88Psmecemwo9Zg7PH/TeYe+l6Qo+YcMLN5jgDIyx8eUsHi/tIbRdRqvZQUvtoq0xWg3wDhDa8WEmvICn7gwcS7uYjhRRKino0D5NMaA1dRgtIJqMQpiIudj8RgVjoRQPixJX1SbXDZ2rmsIVemZGj/uTi3x2zc1nVkt8PJLiU9EMrzRkDjCa4D1ur6EdPxdm11ys02hC12TO9DZkWYaqquh0KNI2uaXh21mGL7EI9EwbbVoNtFoaDKMLxhiMrmHtCyb9EKZXXaxeaaIgFbmiKJbBcrmCNhk83uglY75tD+S6hnK1hlZHt96bTnW9A1XT0Oty+BM+CGNhJ/tzpYz+2R0+t1UyE0C3S14NwzoECsqX9CBAUdqDoct66PV60NoMUk2nwJn1JrQTsCPcz9Ug5g95/rACRWlCI4+NRgP1es0yGE75sZrxIU/+kgeqdXhdVFGodODbkHE8wqbB2XUX62kt6Gqdm6dNz5zbEXRZ19oY2F1BIu9HOGHgm8E0FqIN3Borwh1rYHKlinFvhVYFmwek8iSpvHmgwbud46Ik26m2zfroVCtTADtlP829jAzXUhqTy/uYD+XgiebhjRcwRb+D6zXEUmTQFXGyJ/4i7rp3uSdRJP5IYV230lZUBZx0iaZWMBl1Y3ipiPvLIoYWRcT2q//WFLAzWU2TQRMbvami21E479qGul0Cu92GRmiYEYZEHwIUoVJrolarEPAqmkRErd5As6lYIpkjbhscZ7pmEColzqhmZu1Mvo6Vtvja9cKztYTcoYZUsYp8VSVGO1YmVmnIuYlNZC8EwUnYPPJKGJjf5feXUshVFLCuiYy90VQ5Inrxd3wRD70lDLpF/L6YQk1pwwxAJ6fUWZbjWCpC2KxNsGxRwfZ+kWfIuwluo16n1GoolUtgOnlO+0mURcilEspSDkZbIaQqtKdqoUUtepSyaTDuZBWpAkkqcKlYxP7+Pg6lQ6iKinqjTocZwuIKdYuP2g0welbQ1vzviKbWbVEoP7plqrxZLRHYddKMWwfYUQcExSjCmxfQy36OSuIsqlt9UDOfIZ7sI7DPwkOzlvsY69u/Ug0Jm+m1BsbCWT4WyyO+eggjIkGNF6GSgpyKHRDjmH1xBpuDAp7fELDYLyBKz6d/EfDJFQEnLwvoHxLgd/dB+CvuYu5VCROBJF1LaYTCIurhDDqpOkh2u81yMfQ7LuHWtS8xdP5TDPf3YfD6Gfx47SNc/u0cLt75Gv23b2BkasROuUuRdJQqZ5oMpUliNKqQWwo1vc1XLB3C9PozTImTGFkbhSPhgDfrAetQixLTzDiqoRiGMEWiVGWGQ1njUqMFWdMtsE2+LLCZ3XphgtvQOgRyDfVaGYrc+J8om9k1u4YPFgu4PZvgt5/vYGGjYHFogX10H5rYjHtdCAa3sOyPYMkbgjcYhz+yjpVADMu+CHz+Vcz4ZyA835hgcpUu2GKel8tlFAoFQqho3cTHIyHF8cWl7/D6iffxypunaH0Pb5/6ECfe/QAvv3ESr711Gi+9+g6+unCObpvIU1Y5rBPEZV6im7pSIbhpNuiz0CQWjTZHNB3AzZEB/HRxAN/+cBXnr9yEx+PBi7kF/Hz1Dq7038Xl63cxNHoPgsP7kCWTIjaSW3wtsYmtnSTEg326qtLYSYs4yBYxtzqDF/EpZDJZ+l/EbnoPqYMMslIBOZrZYh5SqUyfiWX8A6NknmLKlmhQAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Icebox and Backlog&quot;
        title=&quot;&quot;
        src=&quot;/static/backlog-9c5afbe3d3ab0144bcbe07d49388f17c-da4cc.png&quot;
        srcset=&quot;/static/backlog-9c5afbe3d3ab0144bcbe07d49388f17c-3ad01.png 240w,
/static/backlog-9c5afbe3d3ab0144bcbe07d49388f17c-da4cc.png 370w&quot;
        sizes=&quot;(max-width: 370px) 100vw, 370px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;How to handle the “Backlog” is certainly what took us the most time to figure out: where should we put ideas, incoming TODOs, without it becomes a heavy mess to deal with?&lt;/p&gt;
&lt;p&gt;We tested a lot of alternatives, including using a “Planning” board &lt;a href=&quot;https://community.uservoice.com/blog/trello-google-docs-product-management/&quot;&gt;just like UserVoice did&lt;/a&gt;. But what really worked for us was to include a “Backlog” list, directly in the production board.&lt;/p&gt;
&lt;p&gt;Cards in this list are prioritized, which means the team will treat the card which is on the top as soon as possible. That way we can re-prioritize cards until the very last moment.&lt;/p&gt;
&lt;p&gt;That’s deferring decisions as late as possible to be more efficient.&lt;/p&gt;
&lt;p&gt;We used to limit the size of the backlog to avoid cards to pile up faster than we would be able to treat them. But we finally drop that limitation since the team has become able to self-manage. &lt;a href=&quot;http://brodzinski.com/2013/07/cumulative-flow-diagram.html&quot;&gt;Cumulative Flow Diagram&lt;/a&gt; is enough to make us visualize the current tendency at a glance and understand if we’re adding more cards than reasonable.&lt;/p&gt;
&lt;p&gt;Therefore, “Backlog” contains cards we decided to handle soon. They generally are related to one of the main goals we are focusing on.&lt;/p&gt;
&lt;p&gt;However, I dare you to make a creative team stop having ideas! And to support this creativity, you should break down barriers. This is why “Icebox” exists!&lt;/p&gt;
&lt;p&gt;Without any card limitation, it holds any idea or suggestion that wouldn’t necessarily be part of the backlog (eg: ideas to improve game monetization while current focus is on retention).&lt;/p&gt;
&lt;p&gt;We regularly check these cards to move to the backlog those which become relevant, delete those which are not applicable anymore or even add some info and ideas to others.&lt;/p&gt;
&lt;p&gt;Keeping this list into the board makes things easy and flexible. It gives us a mid-long term vision. Still, we don’t spend that much time on it because you know, as a start-up, the mid-long term may rapidly change.&lt;/p&gt;
&lt;h3 id=&quot;production-workflow&quot;&gt;&lt;a href=&quot;#production-workflow&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Production workflow&lt;/h3&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/production-38f780ad78e396bb134e0fd454fef46f-93619.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 738px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 39.29539295392954%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAACHUlEQVQoz42QXUiTARSGdxNddxt10YUTSifpvDUii8KRBkFBRUJI3nQvUpCYOMNCcJGbCOLXWvY3amuxZqlpkttyfq65tTl/ttq+uX3trxTDc94+BamLLjrwcG7e8/ByVMKgZtPSX0ZvHmjIYdaQc7iC7FMCTfs95A26KbgSpJmFabLaG+nZ8Hn6ONJIMfcV+jx5jlwfjOSZ85NXyc5HQzQbFkl1rW0fvX26B4nxBvgce9HeVorA4hQ21hlra+v4tQHkcjG4AyMIJoB0gbA1GTkBg/0qbtla0fWqBd3OG9A7WljV3HqAAq7doEU1p2d2cfP1/RxN+jhbYI59S7Jyy9mixFF/D0OyKVgZqzaOTHRwU/9Brukt4RP31HzMUIJag5pVvXePktN6GIKthoXHp9AzcBbRuBN5eR7jn4KIJIuQf+Rx57kOneYK6M0a6IVS3LaU4cKAFqeN1ThjquYGUzUUWLUUGSJZmoEYWeZQvIhixgfxix1yOoJlaRVLqSIyeRkXh+pwxFCO431a1N7fogo6Y6Ui3IZ3tiocMlEhPQVPOMzRVAE/s1443E6MzqUgpSR8l2V8XU2gyayDrk+jtNEqTSq3qf+XcEXsoM24FRuxJ8yJFyguGDAbGkMqmVOEGeTz6/D6RFwePIk6RVhvrNqR/M0f4c2HWup6pFX+U86dghrtwiFYJkwYE0fxTnRhcv49Xnte4tJg7X8JfwPfPsbkjjiXlQAAAABJRU5ErkJggg==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Production workflow&quot; title=&quot;&quot; src=&quot;/static/production-38f780ad78e396bb134e0fd454fef46f-93619.png&quot; srcset=&quot;/static/production-38f780ad78e396bb134e0fd454fef46f-0da89.png 240w,
/static/production-38f780ad78e396bb134e0fd454fef46f-77f7c.png 480w,
/static/production-38f780ad78e396bb134e0fd454fef46f-93619.png 738w&quot; sizes=&quot;(max-width: 738px) 100vw, 738px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Our production workflow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This concretely represents the different steps each card will pass through.&lt;/p&gt;
&lt;p&gt;Each step has a WIP limit which is indicated in the list title.&lt;/p&gt;
&lt;p&gt;Cards flow being “pulled”: whenever a step is completed, the card still there − with a little green label − until someone from the downstream step can take charge of it. All that, respecting WIP limits.&lt;/p&gt;
&lt;p&gt;Exceptionally, some cards may not respect WIP limits. That may happen for an urgent one (eg: critical hotfix required in production) or a card waiting for some external dependency (eg: waiting for Facebook validation). In these cases, cards have an explicit red label. But these cases are rare.&lt;/p&gt;
&lt;h4 id=&quot;card-preparation&quot;&gt;&lt;a href=&quot;#card-preparation&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Card Preparation&lt;/h4&gt;
&lt;p&gt;Cards are &lt;em&gt;prepared&lt;/em&gt; for the rest of the flow.&lt;/p&gt;
&lt;p&gt;That’s here we detail the card use case along with its &lt;a href=&quot;https://en.wikipedia.org/wiki/SMART_criteria&quot;&gt;SMART objective&lt;/a&gt;. Any card has an objective − why would it be there otherwise? Whether its a bug correction or a whole new feature, there should be a reason for us to deal with this card instead of another one. Furthermore, we determinate &lt;em&gt;how&lt;/em&gt; we would be able to know if the objective is reached and what to do on success or failure.&lt;/p&gt;
&lt;p&gt;Thus, we don’t lose that much time preparing cards that lie in the backlog. Only the main goal matters at that point. Then, we dig the idea into &lt;strong&gt;Card Preparation&lt;/strong&gt;. We agree on the scope of the card or the way we split it into smaller ones − a game mechanics can generally be decomposed into smaller features we can implement one after the other.&lt;/p&gt;
&lt;h4 id=&quot;production&quot;&gt;&lt;a href=&quot;#production&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Production&lt;/h4&gt;
&lt;p&gt;Here will happen the game design / spelling / arts / development of a card.&lt;/p&gt;
&lt;p&gt;Anyone is free to use checklists to organize its work. Even to create a temporary board if needed.&lt;/p&gt;
&lt;p&gt;For a while, we use to detail every production step − specs, arts, dev… − with a list. However, that was not flexible enough, nor realistic.&lt;/p&gt;
&lt;p&gt;A single “Production” list gives us more latitude so developers can directly work hand-to-hand with game artists during integration for instance ; or whenever no game artist is available for a week, preventing “air bubbles” into the flow.&lt;/p&gt;
&lt;h4 id=&quot;qa-tests&quot;&gt;&lt;a href=&quot;#qa-tests&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;QA Tests&lt;/h4&gt;
&lt;p&gt;There, we will ensure that what we produced matches what was expected. A pair usually deals with this part to ensure the quality − the game designer, someone from the business team, another developer that didn’t code…&lt;/p&gt;
&lt;p&gt;We also make sure that we are able to answer the SMART objective we defined.&lt;/p&gt;
&lt;p&gt;If anything goes wrong, the card lies there and block the rest of the flow until it’s fixed. Thus, the team will better &lt;strong&gt;getting things done before starting new stuff&lt;/strong&gt;. That makes everyone cares about the quality.&lt;/p&gt;
&lt;h4 id=&quot;mise-en-live--release&quot;&gt;&lt;a href=&quot;#mise-en-live--release&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; Mise en live (= release)&lt;/h4&gt;
&lt;p&gt;This is the release part, where what has been produced goes to production.&lt;/p&gt;
&lt;p&gt;We continuously deploy everything. If needed, we use feature flipping to activate / deactivate any feature.&lt;/p&gt;
&lt;h3 id=&quot;live&quot;&gt;&lt;a href=&quot;#live&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Live&lt;/h3&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/live-44047d3f19599c61eb5a5cb0a8bad1de-44e45.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 462px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 120.12987012987013%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAYCAYAAAD6S912AAAACXBIWXMAABYlAAAWJQFJUiTwAAAGMUlEQVQ4y1VVW2wbxxUlghRuAhgGmjZtij4MuB9FG/QzQNrkq/0o0J/EBpqiaNOkgRNXRgMUaOPEqVykdWUndqzIVizFsSzZki1Rj0Ry9CBlipJokTQpSqJIipQo0RQf4mPJfZBL7i6XnDmdpZOmHeBidrEzZ+4958xd00Xre/X+hZtkwH6DDNkHyIh7kJhdZjLhnSATyxNkfHmKdNkvkIvWNtJnu0KuznaSHttl0j3dQXpt3WRgsYfcdPSQMfct0m75Z900c7eHLNs70W85jf675+BxfYqQpx8LW12Y3+hGLHwVVm8fvGEfckke8Vgahd0CcrscijkJAleGUCyDKMBCwEZMFxYPk5Nj+3Bu4Pv0jdH99JXu79KWcwfoq3376Eu3TXR00kQHPzlKI7ltCqAZa9ij56s2WiFq871B68aMueAMMZ2beIG8NmnCa9b9tOvyQVzqeBonz34LL3/8KFpuPYF/X/kRLs6+BO92BIFMFdFUGb6tDfRGrNCobuCwU8jngBaW4fivyR9u7sex6YfpOy2H8MpfDuNs22FMfvYsrvT9BG8fP4j3x36PhUgQI54MbCs5wFcE8RegqhoURUG1WmkC2oNWYnpv9Ag5ajahd+wR2tZlwuvs+cTw4/BMHcH8yE9x6fyTMI+9jEAihFw2itCeG9v5KPIiBy6fZZFjgPIDwBADHJ46Tf4x+Eu8aX6Gnun6GT4cfhpdjqfQbnkKHbd/hWsd72Dws1MIpaJIyHsYS5ixW0412dQagE4AxmAT8M4643A25CJjyxI+cWWp7hNR9/DQvQJUdxE6pzU5Wt3142xfK9o/aMWlzjP48KO/o7XtT3jrX8fw11PH0PJGC7VYZjDhHiUm346L1KsVlKUC5csChIqEYolnswiO5yCLJawmA3j//HM48fxD6Gndh8DUd+C3/hihuR8iMv04Oo8/TD94/UlcG/obMd3bWiIFTkCe42hFllEulSGXjZAhSVIzw1BuA21nXsAff/FNbFgPAfwlaImPoaTGISRPY/Kjb9MXf34QF7qPEtNq3EOMTYQ0qF6vQ9VUaJrGFFRR0zWkkjnMrDnQdfl3aP3NN3Bv+BAaqS644+Noz9iRiZ+HpfsJeubVH6B/9M+s5JibNBi5FUWlulaDXtOh6zpqtVozu6nxSfTeHsLI6G9x7cRX4R38OrT1I7gVOIm3A6dQCDyPqfav0Y7j38P1YQY47XeQq0tZXF+IU20pg5o3h4beQIMQluEDUGc0BKfzOejBh6CEDqAU+Aqy3n0oeB6BtPYocu4DNLPwGMatxxiHUSfhOAm7yTQt5jgUsnkUCgXwPN8sv6nyfQ8+dY+iZ9GGofkZaHYbtHt2yCUfyuIyE9RDG8o65oNmYlredhKZF5HNpCjHF5BhZjXAKpUKy7KBYHAbQ7ZhODc98EdyCO/ksRcTkIoLiCU4JPd47KaLVBAI7gTuGBm6SF7SkS6WqCZUobDuoVXVJo+EUjjmHLg1cwOeqAuZRAabeyGMRK/DnVqCIEjgigXkiwVaLlWZsaeJaWbdQa45GYfzMao696DOJaDnZOi00VTbGEw4uDedqFZ0ZPg8NvMR5Pkss1gFpZIMXpKoWq3DFmDNwctKLvMCSpJAS1UZoixBKrEQJbaY+ZCZyh11IpRcxf+OLZ3Du/wMSg0Fn7c1OCI2wzYuolcVqJUSbdRUBiRCqSr/3bh014cbU/3wxv3wp2tY3OFRLDewrqfQKzigktr/A96NOEk4XYXvPkcDSZZpRWmaWlEMY+tY8/oxPm/GXNiDCW8ag64YgkwMZgFA1pnSJWg17UtAS8BBzN48brjidNibhCCroMyDhg8NYYyxnl6Bb9vF2ovO1Ocwfn8AU1tmiD4X+HkLlGK+CbgYZiqvGCXL7L+Q36OyUGBXLQGRlf3F2AgZthlBMLUGUjdulAJRZRxLeVTDQahFzvArNbie35glJjdrDhVZQ1EUqcgaQ4k1hUqlCpmFxjK0WxfQP9mH9cQqNEVn38uoqmyOxZDrfBdiJISKzjzBql4wAG0rVrK9tYvN6A4NR6LYju0imcoikcognkiDL8pgh2Ju5Q6iW3FjHULhTezEE0jmig/WsVuWy4iY9U+T/wC5zUyL071uAwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Live&quot;
        title=&quot;&quot;
        src=&quot;/static/live-44047d3f19599c61eb5a5cb0a8bad1de-44e45.png&quot;
        srcset=&quot;/static/live-44047d3f19599c61eb5a5cb0a8bad1de-32842.png 240w,
/static/live-44047d3f19599c61eb5a5cb0a8bad1de-44e45.png 462w&quot;
        sizes=&quot;(max-width: 462px) 100vw, 462px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;Once released into production, cards are not done yet.&lt;/p&gt;
&lt;p&gt;Remember that any card has an associated SMART objective the team agreed on? Well, once in production, we do analyse it.&lt;/p&gt;
&lt;p&gt;That can be done when the card is released − that’s the case with most of bug fixes − or later if we need to collect some data − A/B tests, for instance. In the latter case, we set a due date and a responsible to the card.&lt;/p&gt;
&lt;p&gt;When the analysis is done, the card is considered completed. We move it into the &lt;strong&gt;Live&lt;/strong&gt; of the current month. Then we follow the scenario we forecasted regarding if the objective was reached or not. Objectives can be considered as our “assumptions” within the meaning of &lt;a href=&quot;https://en.wikipedia.org/wiki/Lean_startup&quot;&gt;Lean Startup&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We do a monthly review of cards that were put to live = what we learned.&lt;/p&gt;
&lt;h2 id=&quot;lessons-learned--anecdotes&quot;&gt;&lt;a href=&quot;#lessons-learned--anecdotes&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Lessons learned &amp;#x26; Anecdotes&lt;/h2&gt;
&lt;p&gt;Here is a loose couple of stuff we learned or set up and that revealed useful to us.&lt;/p&gt;
&lt;h3 id=&quot;keep-it-simple&quot;&gt;&lt;a href=&quot;#keep-it-simple&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Keep it simple&lt;/h3&gt;
&lt;p&gt;Well, that’s all about &lt;a href=&quot;https://en.wikipedia.org/wiki/KISS_principle&quot;&gt;the KISS principle&lt;/a&gt;. Keep it in mind, really.&lt;/p&gt;
&lt;p&gt;For example, I realized that the more I created boards to distinguish works, having specific workflow for every board just like &lt;a href=&quot;https://community.uservoice.com/blog/trello-google-docs-product-management/&quot;&gt;UserVoice did&lt;/a&gt;, the less it was efficient for the team. The truth is that what is essential should be kept under your eyes to keep focus.&lt;/p&gt;
&lt;p&gt;Otherwise? It wouldn’t be easily adopted, nor actually used by the team… because that’s not practical for them. Don’t overengineer things more than absolutely needed.&lt;/p&gt;
&lt;h3 id=&quot;concerning-cards-estimations&quot;&gt;&lt;a href=&quot;#concerning-cards-estimations&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; Concerning cards estimations…&lt;/h3&gt;
&lt;p&gt;… that’s a waste of time for us.&lt;/p&gt;
&lt;p&gt;There are plenty of debates on the subject, which I won’t detail here.&lt;/p&gt;
&lt;p&gt;But, &lt;strong&gt;in our case&lt;/strong&gt;, we now have an efficient and fast “production line”, thanks to Kanban. We know our average speed to produce something, thanks to indicators. We do our best to homogenize the size of incoming cards and continuously ship changes to our game, focusing on what matters.&lt;/p&gt;
&lt;p&gt;If a card is really urgent, you just need to put it at the top of the backlog and it will naturally be shipped to production within a known, reliable and reasonable delay − 8 calendar days so far, in average.&lt;/p&gt;
&lt;p&gt;If that’s even more urgent and that couldn’t wait, then a red label will make it skip the line and be handled in priority − that’s the fast-line. Still, this kind of emergency is quite rare once you’ve got a production team that can introduce change as best and quick as possible.&lt;/p&gt;
&lt;h3 id=&quot;visual-management&quot;&gt;&lt;a href=&quot;#visual-management&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Visual management&lt;/h3&gt;
&lt;p&gt;“Visualize” is one of the central pillars of Kanban specifically, and among other Agile practices in general.&lt;/p&gt;
&lt;p&gt;Trello perfectly fulfill that need with &lt;a href=&quot;http://blog.trello.com/github-and-trello-integrate-your-commits/&quot;&gt;power-ups such as GitHub&lt;/a&gt;, or through its API.&lt;/p&gt;
&lt;p&gt;For instance, we do change the background color of the board regarding the state of our continuous integration system.&lt;/p&gt;
&lt;p&gt;When it’s green, everything goes fine!&lt;/p&gt;
&lt;p&gt;When it’s orange, then a deployment is occurring:&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/overview-deployment-6ced5c10e77133873b9942aa21ad93f5-d2f43.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 725px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 48.82758620689655%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAACyUlEQVQozx2QS2gTURSGx6VrwY2mimitoEs3LlyKCLp1ISqoe7eibsQXVWOTqCiK1YoKig8IVsVXa1KrNa3GmcyjzbRJmz6SJp1XJjOZGe/5vebCz+Vezjmc7xO0/DdWFH+wWmmcabk3rCjnWEXPs2pJZBPZVyz7fZTV5lS2PCsx8Xuavf0yzGam8sysVZgydIE9T8XYyMBONvxoBw3d32EIruujabcQ+DaW56fgB4SW14bneSjrIqaXLHh+gHbbx9KsgobjIQhD/D/Zz7eQTK0CtF0QP6zHsZObTaFWb6BuWBS4DVoqF8gwbbJtmzzXoaKaI22uTm3fJ6/lUL0iU3UloEqtRYYLGv10k25fW01yLkbv0utx6FSPKTQME6btUNAyMF+SsVBdQcOw4DhN6No49EUDId+o7TVRmRbxOjOHzz8rGFct6BMvMCM9oK+5NI3+/obSTN4UViyHD2xSyJGV5ycgPTwA5clBqAP7oY0+hV7liEGAsN3ClDqBj790lBcWeY+N6mQanjlG+mKNFqy//y1wZLsJk4uL/Cbke7sh9q6FGN8IqXcNtOE7kCsODNuC2zQ5gQJ9mXGHHYVYmXyJWu4M1fOXyRAvwZF7TeGX1cK44RI8C3L/HojXN0FKbUfh+gZMZe/hT8lAo1xF4IaoyE8xP3IYI5mjeJY9Bm3wCNRkF6k3eFLrICfXmYJpe3DckAzDJKV/D4nxDSQlt1EhHiPt610SZ22ql6tE7ZAmpTQNvjtLQ9k+GlMGSXl7msSrG0lMbCMp0QMeU5D690J+sI9nLwo3+GaJLZCSPZDjMajZfuTKPsyW30GU8mN4nM7g/RfuMjONsVfnofR1deoLyW4+sNsSpHhXJF2LhZ27b0vEPyNeEIn8Xfx0NZqbUaN5PR/ZtWKUGXwYXTx/Lhq4fyu6cPlK9P728UhLbYrExNaw05fobvwDpquKzdyBzFIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;In deployment&quot;
        title=&quot;&quot;
        src=&quot;/static/overview-deployment-6ced5c10e77133873b9942aa21ad93f5-d2f43.png&quot;
        srcset=&quot;/static/overview-deployment-6ced5c10e77133873b9942aa21ad93f5-0979a.png 240w,
/static/overview-deployment-6ced5c10e77133873b9942aa21ad93f5-521aa.png 480w,
/static/overview-deployment-6ced5c10e77133873b9942aa21ad93f5-d2f43.png 725w&quot;
        sizes=&quot;(max-width: 725px) 100vw, 725px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;Once deploy is completed, it turns back to green. But if it has failed to deploy, background turns to red so everyone knows:&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/overview-failure-b7cf47da014c7421658e1d05dd858d46-7fb75.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 723px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 48.962655601659755%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAAC6klEQVQozx1Q+2sUZxQdf/RvUAJiHgiuSgsiFtLQmPiIVNAWighpobG0UPxVLMWK/uALxFYFH0VqQyPqZh+p2ayJ6ErWuC833c1uVpNsnk42mdnZmdnZ3dn5/O7pl1w4XLicc+89R8pE3/BcPMaX0uM8NTLEc+NJPpfN8KVclof9fh56FeXyzBSXcxkeGXzKB4JhPj0xwdXFZZ54cp73Xmrgobu7+cgdF43c2rUqVapVWJaFmmlAnp6C/ZGjatuoivlUKo18QUetXketWsHCZBalSg0Oq2Othn3XcfPGBmDqM4w/24TjP21VpBVVhVrSqaoVaXEyQyXDIEOgYpqUjSUot6CQbdtUMXSSc1kqFBktLFukWaAX/b/T7asbKRNroEH/Zhw+1axIqqahJMS1koZ58YGsFFEs6TDLZUzG3yIva3AcB7WygXw6Dc/oB4QSMv6bsfB+1I2Z1H16GR2gseRrLM2nFEnTTbGwTLaw/OL0jwie/ArPfz6BkZPHEHc/woxaRb3uwLbEgbdJhCc/oKjrwjBhJT2Iihah6eVVKpgf11JQpFWjjJJdJ0cIAt+0w72nAZ62FvTv3oTIgz+RlQ1oho6yrmF2Iou8CnFgPUIsxx5DDv9KhdglUhMXoY9fUaSEXkFcs4hMHUPdXfB+sQ3+g5/A19aMeN9fSC9qKM6vwDbryEd7IY91Y/TVd3BHvkf0j28R6Gqi4FGBI1sQ+HKLIulWFWXboaKmUbC7i8R35D+wi7ytjRTtvU+pJZ2UuQLxSp1SY176N3CGnr+8SpF3PgpfO0PuvS3k3Sf47TshoEjBnmMY/uFrPOs5ioFDn8K3bzv8+3fC19qI2MNepFZsmCLDtcySr9+gLxDGcCiJUGwWw5cvwN/WtM4f6HTB1+lSJW9rE/O0Njoe0cUy5utwMV/nDub5vInF711ns+/fsbmJNNPm82zo7wfst18usHs3brGz5y6zf071sKft25i3Y4ezrutwFf4HQXF12BPO3IYAAAAASUVORK5CYII=&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Deployment failed&quot; title=&quot;&quot; src=&quot;/static/overview-failure-b7cf47da014c7421658e1d05dd858d46-7fb75.png&quot; srcset=&quot;/static/overview-failure-b7cf47da014c7421658e1d05dd858d46-13d89.png 240w,
/static/overview-failure-b7cf47da014c7421658e1d05dd858d46-00d1c.png 480w,
/static/overview-failure-b7cf47da014c7421658e1d05dd858d46-7fb75.png 723w&quot; sizes=&quot;(max-width: 723px) 100vw, 723px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;A deploy failed, we need to give it a look&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;kanban--trello-visualisation&quot;&gt;&lt;a href=&quot;#kanban--trello-visualisation&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kanban &amp;#x26; Trello visualisation&lt;/h3&gt;
&lt;p&gt;In order to know how much cards each list has, I do filter the board over &lt;code class=&quot;language-text&quot;&gt;*&lt;/code&gt; so I don’t actually hide any card.&lt;/p&gt;
&lt;p&gt;With that said, I actually don’t know why the number of cards in a list &lt;strong&gt;only&lt;/strong&gt; shows up when you’re filtering.&lt;/p&gt;
&lt;p&gt;I also use &lt;a href=&quot;https://chrome.google.com/webstore/detail/kanban-wip-for-trello/oekefjibcnongmmmmkdiofgeppfkmdii&quot;&gt;a Chrome extension&lt;/a&gt; to give some color to lists background regarding the number of cards in it. If the WIP limit you set is reached, it becomes yellow. If the limit is exceeded, it turns red. This is not truly a must-have, but that’s really helpful to understand the state of the flow at a glance.&lt;/p&gt;
&lt;p&gt;There seems to have a Chrome extension that does all of this: &lt;a href=&quot;https://chrome.google.com/webstore/detail/cardcounter-for-trello/miejdnaildjcmahbhmfngfdoficmkdhi&quot;&gt;CardCounter for Trello&lt;/a&gt;, but since I didn’t tested it, I can’t recommend it.&lt;/p&gt;
&lt;p&gt;Another very useful extension: &lt;a href=&quot;https://chrome.google.com/webstore/detail/card-color-titles-for-tre/hpmobkglehhleflhaefmfajhbdnjmgim&quot;&gt;Card color titles&lt;/a&gt; which displays labels titles right on the cards.&lt;/p&gt;
&lt;p&gt;And then, &lt;a href=&quot;https://ollertapp.com/boards&quot;&gt;Ollert&lt;/a&gt; which is a nice exhaustive visualisation tool. It can draw the Cumulative Flow Diagram for a defined period of your board, among other stuff.&lt;/p&gt;
&lt;h3 id=&quot;board-calendar&quot;&gt;&lt;a href=&quot;#board-calendar&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Board “Calendar”&lt;/h3&gt;
&lt;p&gt;Let’s end this post with a story about a board we named “Calendar”.&lt;/p&gt;
&lt;p&gt;It was here for a purpose: what do we do for a task that should be done at a specific date, not before, nor after? In other words, &lt;strong&gt;a task that simply can’t be put into the flow&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;So we set up this basic &lt;em&gt;TODO &gt; Doing &gt; Done&lt;/em&gt; board with the calendar power-up enabled. Each card was assigned to someone and a due date was set. Which was all we needed.&lt;/p&gt;
&lt;p&gt;At the end, there were less and less cards of this kind as the team get trained with the Kanban mindset and the organization evolved to what it is today. Every use case that used to be &lt;em&gt;“unique, which can’t work in a Kanban system”&lt;/em&gt; − there were often marketing / business tasks by the way − finally found its way into the flow as the Kanban philosophy was understood.&lt;/p&gt;
&lt;p&gt;And, at last, I deleted this board that became useless… upon the team request!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Plop — un micro-générateur pour se simplifier la vie au quotidien]]></title><description><![CDATA[Découvrez plop, un petit paquet node qui permet de bootstrap rapidement de nouveaux fichiers.]]></description><link>https://www.nicoespeon.com/fr/2015/11/plop-micro-generateur-boilerplate-alternative-yeoman/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2015/11/plop-micro-generateur-boilerplate-alternative-yeoman/</guid><pubDate>Thu, 26 Nov 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;vidéo--slides&quot;&gt;&lt;a href=&quot;#vid%C3%A9o--slides&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Vidéo &amp;#x26; Slides&lt;/h2&gt;
&lt;p&gt;J’ai présenté ce talk le 21 décembre 2015 au &lt;a href=&quot;http://www.meetup.com/fr-FR/Nodejs-Paris/events/227335326/&quot;&gt;meetup Node.js Paris Chapitre 3 / Conférence 2&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube.com/embed/1GyoY6V-0ss?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 72.91666666666666%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;http://slides.com/nicoespeon/plop-alternative-yeoman/embed&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;h2 id=&quot;kezako-plop-&quot;&gt;&lt;a href=&quot;#kezako-plop-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kezako plop ?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/amwmedia/plop&quot;&gt;Plop&lt;/a&gt; c’est un petit paquet node qui permet de se simplifier la vie quand on veut créer un nouveau controller / router / helper / …&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bah créer un nouveau controller c’est facile : je copie-colle le code d’un autre controller et je supprime les lignes dont je ne me sers pas. Tadaaa !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Certes, mais viennent un certain nombre de questions légitimes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quel “autre” controller ? Le plus récent ? Le “mieux” codé ? Y a-t-il un controller de référence ?&lt;/li&gt;
&lt;li&gt;Si je ne suis pas (encore) un expert du projet en question, comment répondre au point précédent ?&lt;/li&gt;
&lt;li&gt;Comment m’assurer que je ne me trompe pas en nommant le nouveau fichier ? En supprimant les lignes qui sont “inutiles”, selon moi ?&lt;/li&gt;
&lt;li&gt;Est-ce-que je dois déclarer ce nouveau controller quelque part dans un fichier existant ? Lequel ? Comment ?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Trouver un bon fichier, l’ouvrir, copier son contenu, créer un nouveau fichier, coller le contenu, supprimer les lignes inutiles… C’est répétitif, propice aux erreurs et ça n’a pas beaucoup de valeur ajoutée. En plus, ça peut prendre un peu de temps. Surtout, c’est fréquent !&lt;/p&gt;
&lt;p&gt;Ce serait vachement mieux à la place d’écrire &lt;code class=&quot;language-text&quot;&gt;plop&lt;/code&gt; dans son terminal, répondre à 2 questions et BIM, c’est fait !&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/plop-behavior-62658fd875867f5e906af0d0cae2be0a.gif&quot; alt=&quot;Comportement de Plop&quot;&gt;
  &lt;figcaption&gt;Simple et efficace. Toujours tent&amp;#xE9;(e) par l&amp;apos;option copier-coller&amp;#xA0;?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;C’est exactement ce que nous allons voir ici.&lt;/p&gt;
&lt;h2 id=&quot;setup&quot;&gt;&lt;a href=&quot;#setup&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setup&lt;/h2&gt;
&lt;h3 id=&quot;installation&quot;&gt;&lt;a href=&quot;#installation&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Installation&lt;/h3&gt;
&lt;p&gt;Plop étant un paquet node, &lt;code class=&quot;language-text&quot;&gt;npm install -g plop&lt;/code&gt; et vous pouvez commencer à jouer.&lt;/p&gt;
&lt;p&gt;On peut aussi l’installer localement sur le projet en le rajoutant aux dépendances : &lt;code class=&quot;language-text&quot;&gt;npm install --save-dev plop&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Puis ajoutez-le aux scripts de votre &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt; pour pouvoir le lancer avec &lt;code class=&quot;language-text&quot;&gt;npm run plop&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;your-awesome-project&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;This is an awesome project, isn&apos;t it?&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;&quot;dependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;devDependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;plop&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1.0.1&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;plop&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;plop&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Voilà !&lt;/p&gt;
&lt;h3 id=&quot;configuration&quot;&gt;&lt;a href=&quot;#configuration&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Plop se base sur un &lt;code class=&quot;language-text&quot;&gt;plopfile.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;C’est le fichier de configuration standard, que je vous suggère de placer à la racine du projet :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; plop &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// C&apos;est ici qu&apos;on va configurer nos générateurs&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Plop va également se baser sur des templates qui peuvent soit être inlined dans le fichier de configuration, soit placés dans des fichiers séparés. Je vous suggère de les placer dans un dossier &lt;code class=&quot;language-text&quot;&gt;plop-templates/&lt;/code&gt;, à la racine du projet également.&lt;/p&gt;
&lt;h3 id=&quot;all-inclusive-ftw&quot;&gt;&lt;a href=&quot;#all-inclusive-ftw&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;All inclusive FTW&lt;/h3&gt;
&lt;p&gt;Comme vous l’aurez compris : le générateur et les templates sont embarqués dans le projet, à l’instar des tests ou du task runner (brunch, gulp, grunt…).&lt;/p&gt;
&lt;p&gt;Cela a &lt;strong&gt;des avantages considérables&lt;/strong&gt; sur un &lt;a href=&quot;http://yeoman.io/authoring/&quot;&gt;générateur Yeoman personnalisé&lt;/a&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un seul dépôt à maintenir&lt;/li&gt;
&lt;li&gt;tout est déjà embarqué dans le projet, nul besoin d’installer yeoman et ledit générateur pour pouvoir s’en servir&lt;/li&gt;
&lt;li&gt;mettre à jour un template est trivial, pas besoin de publier une nouvelle version du générateur et s’assurer que tout est à jour avant de l’utiliser&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finalement, là où un développer un générateur Yeoman spécifique au projet est overkill, plop est parfaitement adapté. Léger, près du code source, il sera &lt;strong&gt;plus facilement adopté&lt;/strong&gt;, maintenu et, en fin de compte, &lt;strong&gt;utilisé&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;notre-premier-générateur&quot;&gt;&lt;a href=&quot;#notre-premier-g%C3%A9n%C3%A9rateur&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Notre premier générateur&lt;/h2&gt;
&lt;p&gt;Pour déclarer un générateur, &lt;code class=&quot;language-text&quot;&gt;plop&lt;/code&gt; nous fournit la méthode &lt;code class=&quot;language-text&quot;&gt;setGenerator&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; plop &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// On déclare un nouveau générateur appelé &quot;module&quot;&lt;/span&gt;
  plop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setGenerator&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;module&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Décrit succintement ce que fait le générateur&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// pour s&apos;y retrouver.&lt;/span&gt;
    description&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Create a new module&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Récupère les inputs de l&apos;utilisateur.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// C&apos;est Inquirer.js qui fait le job ici.&lt;/span&gt;
    prompts&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;input&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;What is your module name?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Liste des actions à faire.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Ici, on &quot;add&quot; de nouveaux fichiers à partir&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// de nos templates.&lt;/span&gt;
    actions&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/modules/{{camelCase name}}.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/module.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/tests/{{camelCase name}}.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/module.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;prompts&quot;&gt;&lt;a href=&quot;#prompts&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Prompts&lt;/h3&gt;
&lt;p&gt;La partie &lt;code class=&quot;language-text&quot;&gt;prompts&lt;/code&gt; est directement déléguée à &lt;a href=&quot;https://github.com/SBoudrias/Inquirer.js/&quot;&gt;Inquirer.js&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Vous pouvez donc vous référez à &lt;a href=&quot;https://github.com/SBoudrias/Inquirer.js/#objects&quot;&gt;leur documentation&lt;/a&gt; pour découvrir tout ce que vous pouvez faire (type des questions, filtre d’output, validation d’input…).&lt;/p&gt;
&lt;p&gt;On peut ainsi imaginer des choses un peu plus complexes :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; trimRight&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; isEmpty &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;lodash&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;ensurePlural&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; text &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;trimRight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;s&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;s&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;isNotEmptyFor&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; value &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isEmpty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos; is required&apos;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; plop &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  plop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setGenerator&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;module&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;

    prompts&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;input&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;What is your module name?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        validate&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isNotEmptyFor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        filter&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ensurePlural&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;validate&lt;/code&gt; va s’assurer que le nom donné pour le module n’est pas vide.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;filter&lt;/code&gt; me permet de formaliser l’output : tous les noms des modules doivent se terminer par un &lt;code class=&quot;language-text&quot;&gt;s&lt;/code&gt;. Ainsi, si par inadvertance je nomme mon module &lt;code class=&quot;language-text&quot;&gt;calendar&lt;/code&gt;, je suis assuré que la variable &lt;code class=&quot;language-text&quot;&gt;name&lt;/code&gt; vaudra &lt;code class=&quot;language-text&quot;&gt;calendars&lt;/code&gt; pour la suite.&lt;/p&gt;
&lt;h3 id=&quot;actions&quot;&gt;&lt;a href=&quot;#actions&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Actions&lt;/h3&gt;
&lt;p&gt;Une fois qu’il sait tout, plop va réaliser l’ensemble des &lt;code class=&quot;language-text&quot;&gt;actions&lt;/code&gt; qu’on lui demande. Il dispose à ce moment là des variables que lui fournit inquirer.&lt;/p&gt;
&lt;p&gt;Les actions, comme les templates, sont parsées avec &lt;a href=&quot;https://github.com/wycats/handlebars.js/&quot;&gt;Handlebars&lt;/a&gt;. Si vous avez compris son fonctionnement, vous savez déjà utiliser plop.&lt;/p&gt;
&lt;p&gt;Ainsi &lt;code class=&quot;language-text&quot;&gt;{{name}}&lt;/code&gt; correspond à la réponse donnée au prompt, validée et filtrée au préalable. Il me suffit de la placer où bon me semble, dans le chemin du fichier créé et/ou son template.&lt;/p&gt;
&lt;p&gt;Il faut savoir qu’il y a 2 types d’actions supportés pour le moment :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;quot;add&amp;quot;&lt;/code&gt; qui va créer un nouveau fichier au niveau du &lt;code class=&quot;language-text&quot;&gt;path&lt;/code&gt; indiqué (relatif à &lt;code class=&quot;language-text&quot;&gt;plopfile.js&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;quot;modify&amp;quot;&lt;/code&gt; qui va modifier le fichier situé au niveau du &lt;code class=&quot;language-text&quot;&gt;path&lt;/code&gt;. Il va remplacer la RegExp définie dans &lt;code class=&quot;language-text&quot;&gt;pattern&lt;/code&gt; par le template&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour les 2 actions on peut soit utiliser un template inline via &lt;code class=&quot;language-text&quot;&gt;template&lt;/code&gt;, soit spécifier le chemin du template à utiliser via &lt;code class=&quot;language-text&quot;&gt;templateFile&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;un-exemple-concret&quot;&gt;&lt;a href=&quot;#un-exemple-concret&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Un exemple concret&lt;/h4&gt;
&lt;p&gt;Ça peut donner quelque chose du genre :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; modulePath &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/modules/{{camelCase name}}.js&apos;&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; plop &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  plop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setGenerator&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;model&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;

    actions&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// Ajoute un nouveau model + boilerplate de tests.&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/modules/{{camelCase name}}.model.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/model.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/tests/{{camelCase name}}.model.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/model.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// Modifie le module pour y injecter le model créé.&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// Tout fonctionne avec un replace de RegExp.&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;modify&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; modulePath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        pattern&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;/(\/\/ IMPORT MODULE FILES)/g&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        template&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;$1\nimport Model from &quot;./{{camelCase name}}.model&quot;;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;modify&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; modulePath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        pattern&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;/(const namespace = &quot;\w+&quot;;)/g&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        template&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;$1\n\nModel = Model.extend( { namespace: namespace } );&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;À partir du template &lt;code class=&quot;language-text&quot;&gt;plop-templates/model.js&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * TODO - Describe what your model does.
 *
 * @class {{pascalCase name}}.Model
 * @module {{pascalCase name}}
 * @constructor
 */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Model &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;backbone&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Executed on model initialization&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si &lt;code class=&quot;language-text&quot;&gt;{{name}}&lt;/code&gt; vaut &lt;code class=&quot;language-text&quot;&gt;calendars&lt;/code&gt;, alors plop va créer le fichier &lt;code class=&quot;language-text&quot;&gt;app/modules/calendars.model.js&lt;/code&gt; suivant :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * TODO - Describe what your model does.
 *
 * @class Calendars.Model
 * @module Calendars
 * @constructor
 */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Model &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;backbone&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Executed on model initialization&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et va transformer notre &lt;code class=&quot;language-text&quot;&gt;app/modules/calendars.js&lt;/code&gt; actuel :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Module &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;core/module&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; _ &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;lodash&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// IMPORT MODULE FILES&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; namespace &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;calendars&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; Module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;defaults&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; isDisplayed&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;onStart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ready&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;onReady&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Do something when module is considered as ready&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour y insérer le model créé :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Module &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;core/module&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; _ &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;lodash&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// IMPORT MODULE FILES&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Model &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./calendars.model&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; namespace &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;calendars&apos;&lt;/span&gt;

Model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; namespace&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; namespace &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; Module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;defaults&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; isDisplayed&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;onStart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ready&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;onReady&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Do something when module is considered as ready&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Avec &lt;code class=&quot;language-text&quot;&gt;&amp;quot;add&amp;quot;&lt;/code&gt; et &lt;code class=&quot;language-text&quot;&gt;&amp;quot;modify&amp;quot;&lt;/code&gt; il est possible de faire un paquet de petites choses répétitives plus simplement.&lt;/p&gt;
&lt;h4 id=&quot;adapter-les-actions-en-fonction-des-réponses-données&quot;&gt;&lt;a href=&quot;#adapter-les-actions-en-fonction-des-r%C3%A9ponses-donn%C3%A9es&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Adapter les actions en fonction des réponses données&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/amwmedia/plop/pull/1&quot;&gt;Vous pouvez également passer une fonction à &lt;code class=&quot;language-text&quot;&gt;actions&lt;/code&gt;&lt;/a&gt;. Cette fonction prend en paramètre les réponses de l’utilisateur et doit retourner le tableau des actions à effectuer.&lt;/p&gt;
&lt;p&gt;L’intérêt c’est de pouvoir &lt;strong&gt;adapter les actions en fonction des réponses données&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Prenons l’exemple de la création d’un nouveau module :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; plop &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  plop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setGenerator&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;module&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    prompts&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;input&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;What is the name of your module?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        validate&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isNotEmptyFor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        filter&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ensurePlural&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;list&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;dataConfig&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Tell me about the data, what do you need?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;none&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        choices&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Nothing&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;none&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;A Model&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;model&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    actions&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// Ajoute un nouveau module quoiqu&apos;il en soit.&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; actions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/modules/{{camelCase name}}/{{camelCase name}}.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/module.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&apos;app/modules/{{camelCase name}}/tests/{{camelCase name}}.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/module.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// Si l&apos;on souhaite un modèle, alors on en ajoute un&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// dans la foulée.&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataConfig &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;model&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        actions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; actions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/modules/{{camelCase name}}.model.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/model.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/tests/{{camelCase name}}.model.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/model.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// Retourne le tableau des actions à réaliser.&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; actions
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le générateur peut donc s’adapter aux réponses que l’on donne et prendre en compte un certain nombre de scénarios (un module avec un Model, une Collection + Model, avec une CollectionView ou bien une CompositeView…).&lt;/p&gt;
&lt;h3 id=&quot;helpers&quot;&gt;&lt;a href=&quot;#helpers&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Helpers&lt;/h3&gt;
&lt;p&gt;Un petit point sur les helpers de templating de plop : ce sont &lt;a href=&quot;http://handlebarsjs.com/expressions.html#helpers&quot;&gt;ceux de Handlebars&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il y a déjà un certain nombre de &lt;a href=&quot;https://github.com/amwmedia/plop#baked-in-helpers&quot;&gt;helpers fournis par plop&lt;/a&gt;. &lt;code class=&quot;language-text&quot;&gt;camelCase&lt;/code&gt;, par exemple, fonctionne ainsi : &lt;code class=&quot;language-text&quot;&gt;{{camelCase name}}&lt;/code&gt; avec &lt;code class=&quot;language-text&quot;&gt;name = &amp;quot;my awesome module&amp;quot;&lt;/code&gt; donne &lt;code class=&quot;language-text&quot;&gt;&amp;quot;myAwesomeModule&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Vous pouvez définir vos propres helpers dans le &lt;code class=&quot;language-text&quot;&gt;plopfile.js&lt;/code&gt; avec &lt;code class=&quot;language-text&quot;&gt;addHelper&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; plop &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  plop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addHelper&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;upperCase&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; text &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toUpperCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On vient de créer un helper &lt;code class=&quot;language-text&quot;&gt;upperCase&lt;/code&gt; que l’on pourra utiliser dans les &lt;code class=&quot;language-text&quot;&gt;actions&lt;/code&gt; et les templates : &lt;code class=&quot;language-text&quot;&gt;{{upperCase name}}&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;just-use-it&quot;&gt;&lt;a href=&quot;#just-use-it&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Just use it&lt;/h3&gt;
&lt;p&gt;Et c’est tout, il ne reste plus qu’à lancer &lt;code class=&quot;language-text&quot;&gt;npm run plop&lt;/code&gt; (ou &lt;code class=&quot;language-text&quot;&gt;plop&lt;/code&gt;, si vous l’avez installé globalement) et se laisser guider.&lt;/p&gt;
&lt;p&gt;On peut aussi directement appeler un générateur avec &lt;code class=&quot;language-text&quot;&gt;npm run plop [generatorName]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;À l’usage plop est rapide et efficace tout comme Yeoman. Par contre, il est bien plus léger et simple à maintenir.&lt;/p&gt;
&lt;h2 id=&quot;retour-dexpérience-en-production&quot;&gt;&lt;a href=&quot;#retour-dexp%C3%A9rience-en-production&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Retour d’expérience en production&lt;/h2&gt;
&lt;p&gt;À l’heure actuelle, j’utilise plop avec mon équipe sur le projet &lt;a href=&quot;http://vinoga.com&quot;&gt;Vinoga&lt;/a&gt;. Ses fonctionnalités conviennent parfaitement à nos use cases.&lt;/p&gt;
&lt;p&gt;J’avais développé un générateur Yeoman auparavant, largement inutilisé par l’équipe en pratique.&lt;/p&gt;
&lt;p&gt;Vraiment, plop est le genre d’outil qui nous fait gagner 10 minutes par-ci par-là au quotidien. Et lancer &lt;code class=&quot;language-text&quot;&gt;plop module&lt;/code&gt; dans sa console, c’est plutôt cool \o/&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Plop — a micro-generator to ease your daily life]]></title><description><![CDATA[Meet plop, a little node package which quickly bootstraps new files.]]></description><link>https://www.nicoespeon.com/en/2015/11/plop-micro-generator-boilerplate-yeoman-alternative/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2015/11/plop-micro-generator-boilerplate-yeoman-alternative/</guid><pubDate>Thu, 26 Nov 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;whats-plop&quot;&gt;&lt;a href=&quot;#whats-plop&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What’s plop?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/amwmedia/plop&quot;&gt;Plop&lt;/a&gt; is a little node package that will ease your life whenever you need to create a new controller / router / helper / …&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hey, that’s damn easy to create a new controller: copy-paste another controller code, delete specific lines you won’t use. Tadaaa!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Well, now pop a bunch of legitimate questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which “other” controller do you speak about? The more recent? The “best” coded? Is there any reference controller around there?&lt;/li&gt;
&lt;li&gt;How can I get the previous point if I’m not — yet — an expert of the project codebase?&lt;/li&gt;
&lt;li&gt;How can I ensure I’m correct when I name the new file? When I delete lines I consider “useless”?&lt;/li&gt;
&lt;li&gt;Do I need to declare this new controller in some existing file? Which one? How?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Find a good file, open it, copy its content, create a new file, paste the content, delete useless lines… It’s repetitive, error prone and doesn’t have a lot of added value. And that could take some time. Most of all, that’s frequent!&lt;/p&gt;
&lt;p&gt;It would just be awesome to write &lt;code class=&quot;language-text&quot;&gt;plop&lt;/code&gt; in your terminal, answer 2 questions and BIM, you’re all set!&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/plop-behavior-62658fd875867f5e906af0d0cae2be0a.gif&quot; alt=&quot;Plop behavior&quot;&gt;
  &lt;figcaption&gt;Quick, neat. Still tempted with the copy-paste option?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;That’s exactly what I’m talking about here.&lt;/p&gt;
&lt;h2 id=&quot;setup&quot;&gt;&lt;a href=&quot;#setup&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setup&lt;/h2&gt;
&lt;h3 id=&quot;installation&quot;&gt;&lt;a href=&quot;#installation&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Installation&lt;/h3&gt;
&lt;p&gt;As a node package, &lt;code class=&quot;language-text&quot;&gt;npm install -g plop&lt;/code&gt; and you’re ready to play with plop.&lt;/p&gt;
&lt;p&gt;You also can install it locally to the project, adding it to dependencies: &lt;code class=&quot;language-text&quot;&gt;npm install --save-dev plop&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Then add it to your &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt; scripts so you can run it with &lt;code class=&quot;language-text&quot;&gt;npm run plop&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;your-awesome-project&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;This is an awesome project, isn&apos;t it?&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;&quot;dependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;devDependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;plop&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1.0.1&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;plop&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;plop&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Voilà!&lt;/p&gt;
&lt;h3 id=&quot;configuration&quot;&gt;&lt;a href=&quot;#configuration&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Plop uses a simple &lt;code class=&quot;language-text&quot;&gt;plopfile.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here’s the standard configuration file I’d suggest you to put at the root of the project:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; plop &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Here we&apos;ll define our generators&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Plop will also use templates that can either be inlined within the configuration file, or put in separate files. My suggestion is to put them into a &lt;code class=&quot;language-text&quot;&gt;plop-templates/&lt;/code&gt; folder, at the root of the project too.&lt;/p&gt;
&lt;h3 id=&quot;all-inclusive-ftw&quot;&gt;&lt;a href=&quot;#all-inclusive-ftw&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;All inclusive FTW&lt;/h3&gt;
&lt;p&gt;As you’d guess: both generator and templates are embedded in the project, just like your tests or task runner (brunch, gulp, grunt…).&lt;/p&gt;
&lt;p&gt;This has &lt;strong&gt;tremendous advantages&lt;/strong&gt; over a &lt;a href=&quot;http://yeoman.io/authoring/&quot;&gt;customized Yeoman generator&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a single repo to maintain them all&lt;/li&gt;
&lt;li&gt;everything is embedded, no need for installing yeoman and a generator to use it&lt;/li&gt;
&lt;li&gt;update a template is dead easy, you don’t a to publish a new version of your generator and make sure everyone is up-to-date before using it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In a nutshell, when a project-specific Yeoman generator may sound overkill, plop fits perfectly. Lightweight, close to source code, it will be &lt;strong&gt;easier to adopt&lt;/strong&gt;, maintain and, at the end, &lt;strong&gt;it will be used&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;our-first-generator&quot;&gt;&lt;a href=&quot;#our-first-generator&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Our first generator&lt;/h2&gt;
&lt;p&gt;To declare a new generator, &lt;code class=&quot;language-text&quot;&gt;plop&lt;/code&gt; provides you &lt;code class=&quot;language-text&quot;&gt;setGenerator&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; plop &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// We declare a new generator called &quot;module&quot;&lt;/span&gt;
  plop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setGenerator&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;module&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Succintly describes what generator does.&lt;/span&gt;
    description&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Create a new module&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Get inputs from the user.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// That&apos;s Inquirer.js doing the job behind the hood.&lt;/span&gt;
    prompts&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;input&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;What is your module name?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// List of actions to take.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Here we &quot;add&quot; new files from our templates.&lt;/span&gt;
    actions&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/modules/{{camelCase name}}.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/module.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/tests/{{camelCase name}}.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/module.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;prompts&quot;&gt;&lt;a href=&quot;#prompts&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Prompts&lt;/h3&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;prompts&lt;/code&gt; part is delegated to &lt;a href=&quot;https://github.com/SBoudrias/Inquirer.js/&quot;&gt;Inquirer.js&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can just refer to &lt;a href=&quot;https://github.com/SBoudrias/Inquirer.js/#objects&quot;&gt;their documentation&lt;/a&gt; to learn whatever you can do — questions types, output filter, input validation…&lt;/p&gt;
&lt;p&gt;You can imagine doing some not trivial stuff:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; trimRight&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; isEmpty &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;lodash&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;ensurePlural&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; text &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;trimRight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;s&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;s&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;isNotEmptyFor&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; value &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isEmpty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos; is required&apos;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; plop &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  plop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setGenerator&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;module&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;

    prompts&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;input&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;What is your module name?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        validate&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isNotEmptyFor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        filter&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ensurePlural&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;validate&lt;/code&gt; will ensure the given module name is not empty.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;filter&lt;/code&gt; allow you to standardize the output: here module names should end with an &lt;code class=&quot;language-text&quot;&gt;s&lt;/code&gt; by convention. Even if I do it wrong and give &lt;code class=&quot;language-text&quot;&gt;calendar&lt;/code&gt; as the module name, I can be sure the &lt;code class=&quot;language-text&quot;&gt;name&lt;/code&gt; variable will be &lt;code class=&quot;language-text&quot;&gt;calendars&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;actions&quot;&gt;&lt;a href=&quot;#actions&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Actions&lt;/h3&gt;
&lt;p&gt;Now it knows everything it needs, plop will run every &lt;code class=&quot;language-text&quot;&gt;actions&lt;/code&gt; you configured. It can use every variables that inquirer did transmit.&lt;/p&gt;
&lt;p&gt;Actions, just like templates, are parsed with &lt;a href=&quot;https://github.com/wycats/handlebars.js/&quot;&gt;Handlebars&lt;/a&gt;. If you understand how it works, you know how to use plop.&lt;/p&gt;
&lt;p&gt;Therefore &lt;code class=&quot;language-text&quot;&gt;{{name}}&lt;/code&gt; is the answer given to the prompt, validated and filtered previously. You can drop it wherever needed, in the created file path and/or its template.&lt;/p&gt;
&lt;p&gt;There are 2 types of actions that are supported yet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;quot;add&amp;quot;&lt;/code&gt; that will create a new file into the given &lt;code class=&quot;language-text&quot;&gt;path&lt;/code&gt; — which is relative to &lt;code class=&quot;language-text&quot;&gt;plopfile.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;quot;modify&amp;quot;&lt;/code&gt; that will modify the file located at given &lt;code class=&quot;language-text&quot;&gt;path&lt;/code&gt;. It will replace the RegExp you provided in &lt;code class=&quot;language-text&quot;&gt;pattern&lt;/code&gt; with the template you provide&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both actions can either use an inlined template via &lt;code class=&quot;language-text&quot;&gt;template&lt;/code&gt;, or retrieve it from the path you set via &lt;code class=&quot;language-text&quot;&gt;templateFile&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;a-concrete-example&quot;&gt;&lt;a href=&quot;#a-concrete-example&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A concrete example&lt;/h4&gt;
&lt;p&gt;Let’s imagine that kind of implementation:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; modulePath &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/modules/{{camelCase name}}.js&apos;&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; plop &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  plop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setGenerator&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;model&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;

    actions&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// Add a new model + tests boilerplate.&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/modules/{{camelCase name}}.model.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/model.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/tests/{{camelCase name}}.model.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/model.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// Modify the module file to inject created model.&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// This is basically RegExp replacement.&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;modify&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; modulePath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        pattern&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;/(\/\/ IMPORT MODULE FILES)/g&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        template&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;$1\nimport Model from &quot;./{{camelCase name}}.model&quot;;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;modify&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; modulePath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        pattern&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;/(const namespace = &quot;\w+&quot;;)/g&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        template&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;$1\n\nModel = Model.extend( { namespace: namespace } );&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, let’s say you have the &lt;code class=&quot;language-text&quot;&gt;plop-templates/model.js&lt;/code&gt; template:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * TODO - Describe what your model does.
 *
 * @class {{pascalCase name}}.Model
 * @module {{pascalCase name}}
 * @constructor
 */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Model &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;backbone&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Executed on model initialization&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Considering &lt;code class=&quot;language-text&quot;&gt;{{name}}&lt;/code&gt; is &lt;code class=&quot;language-text&quot;&gt;calendars&lt;/code&gt;, then plop will create the following &lt;code class=&quot;language-text&quot;&gt;app/modules/calendars.model.js&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * TODO - Describe what your model does.
 *
 * @class Calendars.Model
 * @module Calendars
 * @constructor
 */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Model &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;backbone&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Executed on model initialization&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And will also transform your current &lt;code class=&quot;language-text&quot;&gt;app/modules/calendars.js&lt;/code&gt; module file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Module &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;core/module&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; _ &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;lodash&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// IMPORT MODULE FILES&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; namespace &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;calendars&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; Module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;defaults&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; isDisplayed&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;onStart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ready&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;onReady&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Do something when module is considered as ready&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To insert the reference to the created model:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Module &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;core/module&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; _ &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;lodash&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// IMPORT MODULE FILES&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Model &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./calendars.model&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; namespace &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;calendars&apos;&lt;/span&gt;

Model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; namespace&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; namespace &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; Module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;defaults&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; isDisplayed&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;onStart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ready&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;onReady&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Do something when module is considered as ready&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With &lt;code class=&quot;language-text&quot;&gt;&amp;quot;add&amp;quot;&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;&amp;quot;modify&amp;quot;&lt;/code&gt; you can ease a lot of small repetitive things.&lt;/p&gt;
&lt;h4 id=&quot;adapt-actions-to-given-answers&quot;&gt;&lt;a href=&quot;#adapt-actions-to-given-answers&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Adapt actions to given answers&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/amwmedia/plop/pull/1&quot;&gt;You can pass a function to &lt;code class=&quot;language-text&quot;&gt;actions&lt;/code&gt;&lt;/a&gt;. This function will take user’s answers as a parameter and should return the array of actions to take.&lt;/p&gt;
&lt;p&gt;This way you can &lt;strong&gt;adapt actions to given answers&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Let’s consider this example of new module creation:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; plop &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  plop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setGenerator&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;module&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    prompts&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;input&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;What is the name of your module?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        validate&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isNotEmptyFor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        filter&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ensurePlural&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;list&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;dataConfig&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Tell me about the data, what do you need?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;none&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        choices&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Nothing&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;none&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;A Model&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;model&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    actions&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// Add a new module, whatever happens.&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; actions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/modules/{{camelCase name}}/{{camelCase name}}.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/module.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&apos;app/modules/{{camelCase name}}/tests/{{camelCase name}}.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/module.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// If you wish a Model, then we add a Model.&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataConfig &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;model&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        actions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; actions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/modules/{{camelCase name}}.model.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/model.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            type&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            path&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;app/tests/{{camelCase name}}.model.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            templateFile&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop-templates/model.tests.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// Return the array of actions to take.&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; actions
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Your generator can adapt to many different scenarios (e.g: a module with a Model, a Collection + Model, with a CollectionView or a CompositeView…).&lt;/p&gt;
&lt;h3 id=&quot;helpers&quot;&gt;&lt;a href=&quot;#helpers&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Helpers&lt;/h3&gt;
&lt;p&gt;A little note about templating helpers of plop: these are &lt;a href=&quot;http://handlebarsjs.com/expressions.html#helpers&quot;&gt;those from Handlebars&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You starts with a bunch of &lt;a href=&quot;https://github.com/amwmedia/plop#baked-in-helpers&quot;&gt;helpers plop gives you&lt;/a&gt;. &lt;code class=&quot;language-text&quot;&gt;camelCase&lt;/code&gt;, for instance, just works this way: &lt;code class=&quot;language-text&quot;&gt;{{camelCase name}}&lt;/code&gt; with &lt;code class=&quot;language-text&quot;&gt;name = &amp;quot;my awesome module&amp;quot;&lt;/code&gt; gives &lt;code class=&quot;language-text&quot;&gt;&amp;quot;myAwesomeModule&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can define your own helpers within &lt;code class=&quot;language-text&quot;&gt;plopfile.js&lt;/code&gt; with &lt;code class=&quot;language-text&quot;&gt;addHelper&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; plop &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  plop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addHelper&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;upperCase&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; text &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toUpperCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We just created an &lt;code class=&quot;language-text&quot;&gt;upperCase&lt;/code&gt; helper we could use later in the &lt;code class=&quot;language-text&quot;&gt;actions&lt;/code&gt; and templates: &lt;code class=&quot;language-text&quot;&gt;{{upperCase name}}&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;just-use-it&quot;&gt;&lt;a href=&quot;#just-use-it&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Just use it&lt;/h3&gt;
&lt;p&gt;There you go, just type &lt;code class=&quot;language-text&quot;&gt;npm run plop&lt;/code&gt; — or simply &lt;code class=&quot;language-text&quot;&gt;plop&lt;/code&gt;, if you made it global — then follow the guide.&lt;/p&gt;
&lt;p&gt;You can also directly call a specific generator with &lt;code class=&quot;language-text&quot;&gt;npm run plop [generatorName]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Plop is fast and efficient to use, just like Yeoman. However, it’s far more lightweight and easier to maintain.&lt;/p&gt;
&lt;h2 id=&quot;my-experience-feedback-in-production&quot;&gt;&lt;a href=&quot;#my-experience-feedback-in-production&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;My experience feedback in production&lt;/h2&gt;
&lt;p&gt;As of the time of writing, I use plop with my team on the &lt;a href=&quot;http://vinoga.com&quot;&gt;Vinoga&lt;/a&gt; project. Its features perfectly match our use cases.&lt;/p&gt;
&lt;p&gt;I did wrote a Yeoman generator for the project before. It was concretely unused by the team.&lt;/p&gt;
&lt;p&gt;Definitely, plop is the kind of tool that saves you 10 minutes here and there, every single day. And running &lt;code class=&quot;language-text&quot;&gt;plop module&lt;/code&gt; in your console, how cool is that \o/&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Tester ses Behaviors Marionette.js]]></title><description><![CDATA[Comment tester unitairement, et simplement, ses Behaviors Marionette.js.]]></description><link>https://www.nicoespeon.com/fr/2015/11/tester-behaviors-marionette/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2015/11/tester-behaviors-marionette/</guid><pubDate>Mon, 23 Nov 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;contexte&quot;&gt;&lt;a href=&quot;#contexte&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Contexte&lt;/h2&gt;
&lt;p&gt;Ceci est un talk que j’ai présenté le 10 novembre 2015 au &lt;a href=&quot;http://www.meetup.com/fr/backbone-paris/events/226050848/&quot;&gt;meetup Backbone.js Paris S02E01&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;vidéo&quot;&gt;&lt;a href=&quot;#vid%C3%A9o&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Vidéo&lt;/h2&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube.com/embed/0VHW_7PyjBw?rel=0&amp;amp;t=28m20s&quot; frameborder=&quot;0&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;h2 id=&quot;slides&quot;&gt;&lt;a href=&quot;#slides&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Slides&lt;/h2&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 72.91666666666666%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://slides.com/nicoespeon/tester-behaviors-marionette/embed&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;h2 id=&quot;concrètement&quot;&gt;&lt;a href=&quot;#concr%C3%A8tement&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Concrètement&lt;/h2&gt;
&lt;h3 id=&quot;les-problématiques&quot;&gt;&lt;a href=&quot;#les-probl%C3%A9matiques&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Les problématiques&lt;/h3&gt;
&lt;p&gt;Lorsqu’on se dit qu’on va tester notre Behavior, la première problématique que l’on rencontre est généralement la suivante :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mince, comment je fais pour instancier ma Behavior pour pouvoir tester son API ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En fait, &lt;em&gt;l’API d’une Behavior&lt;/em&gt; ce ne sont pas particulièrement les méthodes publiques qu’on y déclare. Celles-ci ne seront jamais appellées directement :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Alert &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Marionette&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Behavior&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  defaults&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    title&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Alert!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Not really urgent&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  events&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    click&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;emitAlert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;emitAlert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;should emit an alert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// =&gt; This won&apos;t work&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Behavior&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;emitAlert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toEmitAnAlert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une Behavior &lt;a href=&quot;http://slides.com/stephanebachelier/marionettebehaviors#/10&quot;&gt;réagit à des événements&lt;/a&gt; (interactions DOM, trigger de la vue, etc.).&lt;/p&gt;
&lt;p&gt;Pour tester une Behavior, il faut donc &lt;strong&gt;déclencher ces événements&lt;/strong&gt; puis &lt;strong&gt;observer l’impact de la Behavior sur le système&lt;/strong&gt; pour voir si celle-ci a réagit correctement. Les Behaviors fonctionnant par effets de bord, c’est bel et bien ce qu’il faut tester.&lt;/p&gt;
&lt;p&gt;Une Behavior est déclarée et instanciée dans le contexte d’une vue :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; ShareView &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Marionette&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ItemView&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  template&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#card&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  behaviors&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    AlertOnShare&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      behaviorClass&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; AlertBehavior&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      title&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Shared&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Your message has been shared!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour tester une Behavior, il faut donc commencer par &lt;strong&gt;instancier une vue&lt;/strong&gt; dans laquelle celle-ci est déclarée.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OK ! Donc je vais mock une vue en y déclarant ma Behavior pour pouvoir la tester.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Alert Behavior&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; view

  &lt;span class=&quot;token function&quot;&gt;beforeEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    view &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Marionette&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ItemView&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      template&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

      behaviors&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        Alert&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          behaviorClass&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; AlertBehavior&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          title&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Title&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;My message.&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;C’est une possibilité.&lt;/p&gt;
&lt;p&gt;Cependant, je n’ai pas vraiment le comportement de la Behavior dans le &lt;strong&gt;contexte&lt;/strong&gt; des vues de mon application. Ce n’est pas nécessairement grave puisque nous parlons de tests unitaires. Simplement, cela demande beaucoup de cérémonie pour mock tout ce qu’il faut :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mock une vue avec les paramètres par défaut&lt;/li&gt;
&lt;li&gt;mock une vue avec des paramètres configurés&lt;/li&gt;
&lt;li&gt;mock tout ce qui doit être testé (template, events, triggers…)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Une autre solution consiste à &lt;strong&gt;tester la Behavior instanciée dans chacunes des vues de notre application&lt;/strong&gt;, directement dans les tests de celles-ci en fait.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OK ! Je vais tester la Behavior dans chacune de mes vues… Mais, mais… Et la duplication ?!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Effectivement, si on commence par tester le comportement de nos Behaviors dans le contexte de chacune de nos vues, on se retrouve à dupliquer les tests. Sachant que le principe de la Behavior c’est d’isoler un ensemble de comportements de vue pour ne pas avoir à le dupliquer, c’est un peu dommage de perdre ça côté tests.&lt;/p&gt;
&lt;h3 id=&quot;comment-on-sen-sort-&quot;&gt;&lt;a href=&quot;#comment-on-sen-sort-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Comment on s’en sort ?&lt;/h3&gt;
&lt;p&gt;&lt;i class=&quot;icon-github&quot;&gt;&lt;/i&gt; &lt;a href=&quot;https://github.com/nicoespeon/testing-marionette-behaviors&quot;&gt;Dépôt GitHub pour illustrer la solution proposée&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;L’idée consiste à refactor les tests d’une Behavior dans une fonction qui prend un &lt;code class=&quot;language-text&quot;&gt;context&lt;/code&gt; en paramètre.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addOnClickTests&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; view

  &lt;span class=&quot;token function&quot;&gt;beforeEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ModelClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    view &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ViewClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; model &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;should increase the model size by 1 when we click on the view&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;size&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    view&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;size&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette &lt;em&gt;factory&lt;/em&gt; embarque les tests de la Behavior et les déroule dans un contexte particulier.&lt;/p&gt;
&lt;p&gt;Ceci nous permet de l’instancier dans le contexte de notre vue, avec les paramètres qui vont bien :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Like View&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; View &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; LikeView&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; template&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;AddOnClick Behavior&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;addOnClickTests&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; ViewClass&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; View&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ModelClass&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; LikeModel &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Oui, mais ici tu testes les paramètres par défaut de la Behavior : « increase the model size by 1 ». Comment tester des paramètres en particulier ? On les passe dans le contexte ? Du coup, on fait à nouveau de la duplication, autant mock la vue complètement.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C’est effectivement la raison pour laquelle Marionette expose publiquement un tableau des Behaviors instanciées d’une vue dans son attribut &lt;code class=&quot;language-text&quot;&gt;_behaviors&lt;/code&gt; &lt;a href=&quot;https://github.com/marionettejs/backbone.marionette/blob/2f3fcebc26aa6f0b1310ed077278c17f3b22aac0/src/marionette.view.js#L17&quot;&gt;depuis la v2.2.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;L’astuce consiste donc à retrouver l’instance de la Behavior dans le contexte de la vue afin de pouvoir variabiliser les tests en fonction des paramètres avec lesquels la Behavior a été instanciée.&lt;/p&gt;
&lt;p&gt;Pour cela, je déclare un &lt;code class=&quot;language-text&quot;&gt;id&lt;/code&gt; à mes Behaviors afin de pouvoir les retrouver facilement :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; OnClick &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Marionette&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Behavior&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;addOnClick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  defaults&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    propertyToIncrease&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;size&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    increaseStep&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  events&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    click&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// increase `propertyToIncrease` by `increaseStep`&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addOnClickTests&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; view&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; behavior&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; options

  &lt;span class=&quot;token function&quot;&gt;beforeEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ModelClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    view &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ViewClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; model &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Retrieve instantiated behavior and its actual options under this context.&lt;/span&gt;
    behavior &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findWhere&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;view&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_behaviors&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;addOnClick&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    options &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; behavior&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;options

    model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;propertyToIncrease&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;should be instantiated&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;behavior&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;not&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toBeUndefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;should increase the model value when we click on the view&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; expectedValue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
      model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;propertyToIncrease&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;increaseStep

    view&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;propertyToIncrease&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;expectedValue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;pour-résumer&quot;&gt;&lt;a href=&quot;#pour-r%C3%A9sumer&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pour résumer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;on teste l’API de la Behavior = son impact sur le système en réaction à des événements&lt;/li&gt;
&lt;li&gt;on décrit nos tests de Behavior dans une factory qui prend un contexte en paramètre&lt;/li&gt;
&lt;li&gt;on embarque nos tests dans chacune de nos vues en y passant le bon contexte&lt;/li&gt;
&lt;li&gt;on utilise &lt;code class=&quot;language-text&quot;&gt;this.view._behaviors&lt;/code&gt; pour retrouver la Behavior (avec un &lt;code class=&quot;language-text&quot;&gt;id&lt;/code&gt; par exemple) et ses paramètres d’instanciation dans le contexte de la vue&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Testing Marionette.js Behaviors]]></title><description><![CDATA[How to unit test your Marionette.js Behaviors with ease.]]></description><link>https://www.nicoespeon.com/en/2015/11/testing-marionette-behaviors/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2015/11/testing-marionette-behaviors/</guid><pubDate>Mon, 23 Nov 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;context&quot;&gt;&lt;a href=&quot;#context&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Context&lt;/h2&gt;
&lt;p&gt;This is a talk I gave on November 10th, 2015 at &lt;a href=&quot;http://www.meetup.com/fr/backbone-paris/events/226050848/&quot;&gt;meetup Backbone.js Paris S02E01&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;video-fr&quot;&gt;&lt;a href=&quot;#video-fr&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Video (FR)&lt;/h2&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube.com/embed/0VHW_7PyjBw?rel=0&amp;amp;t=28m20s&quot; frameborder=&quot;0&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;h2 id=&quot;slides&quot;&gt;&lt;a href=&quot;#slides&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Slides&lt;/h2&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 72.91666666666666%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://slides.com/nicoespeon/testing-marionette-behaviors/embed&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;
&lt;h2 id=&quot;concretely&quot;&gt;&lt;a href=&quot;#concretely&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Concretely&lt;/h2&gt;
&lt;h3 id=&quot;problems&quot;&gt;&lt;a href=&quot;#problems&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Problems&lt;/h3&gt;
&lt;p&gt;When you want to test your Behavior, the first problem that generally comes up is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Damn, how to I instantiate my Behavior so I can test its API?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In fact, &lt;em&gt;the Behavior API&lt;/em&gt; are not that much public methods you declared inside. These never are directly called:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Alert &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Marionette&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Behavior&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  defaults&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    title&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Alert!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Not really urgent&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  events&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    click&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;emitAlert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;emitAlert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;should emit an alert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// =&gt; This won&apos;t work&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Behavior&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;emitAlert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toEmitAnAlert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A Behavior &lt;a href=&quot;http://slides.com/stephanebachelier/marionettebehaviors#/10&quot;&gt;reacts to events&lt;/a&gt; — DOM interactions, trigger from the view, etc.&lt;/p&gt;
&lt;p&gt;If you want to test a Behavior you then have to &lt;strong&gt;trigger these events&lt;/strong&gt; then &lt;strong&gt;observe the Behavior’s impacts on the system&lt;/strong&gt; to check if it reacted appropriately. Behaviors work with side effects, this is what you need to test.&lt;/p&gt;
&lt;p&gt;A Behavior is declared and instantiated within the context of a view:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; ShareView &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Marionette&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ItemView&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  template&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#card&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  behaviors&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    AlertOnShare&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      behaviorClass&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; AlertBehavior&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      title&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Shared&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Your message has been shared!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To test a Behavior, you then need to &lt;strong&gt;instantiate a view&lt;/strong&gt; in which the Behavior is declared.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OK! Then I’ll mock a view with my Behavior declared so I can test it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Alert Behavior&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; view

  &lt;span class=&quot;token function&quot;&gt;beforeEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    view &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Marionette&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ItemView&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      template&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

      behaviors&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        Alert&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          behaviorClass&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; AlertBehavior&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          title&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Title&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;My message.&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is an option.&lt;/p&gt;
&lt;p&gt;However, you won’t have the Behavior actually behave within the &lt;strong&gt;context&lt;/strong&gt; of your application’s views. This is not necessarily wrong since we’re talking about unit tests here. But that requires a lot of ceremony to mock whatever should be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mock a view with default parameters&lt;/li&gt;
&lt;li&gt;mock a view with configured parameters&lt;/li&gt;
&lt;li&gt;mock whatever should be tested — template, events, triggers…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another solution would be to &lt;strong&gt;test the instantiated Behavior within each view of our applicaation&lt;/strong&gt;, directly in these views tests actually.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OK! So I’ll test the Behavior within each of my views… But well… what about duplication?!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yep, if you go testing how your Behaviors behave for every view’s context, you will duplicate tests. That would be a pitty for something which is supposed to isolate views behaviors so you don’t duplicate code.&lt;/p&gt;
&lt;h3 id=&quot;what-can-we-do-then&quot;&gt;&lt;a href=&quot;#what-can-we-do-then&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What can we do then?&lt;/h3&gt;
&lt;p&gt;&lt;i class=&quot;icon-github&quot;&gt;&lt;/i&gt; &lt;a href=&quot;https://github.com/nicoespeon/testing-marionette-behaviors&quot;&gt;GitHub repo to illustrate the proposed solution&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The idea is to refactor Behavior’s tests into a function that will take &lt;code class=&quot;language-text&quot;&gt;context&lt;/code&gt; as a param.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addOnClickTests&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; view

  &lt;span class=&quot;token function&quot;&gt;beforeEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ModelClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    view &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ViewClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; model &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;should increase the model size by 1 when we click on the view&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;size&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    view&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;size&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This &lt;em&gt;factory&lt;/em&gt; embeds tests of your Behavior and run them within a specific context.&lt;/p&gt;
&lt;p&gt;This allows you to instantiate tests with the context of your view, providing correct parameters:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Like View&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; View &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; LikeView&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; template&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;AddOnClick Behavior&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;addOnClickTests&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; ViewClass&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; View&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ModelClass&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; LikeModel &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Sure, but what you’re doing here is testing default parameters of the Behavior: « increase the model size by 1 ». How to test specific parameters? Should we pass them through the context? If so, that’s just duplication again. We’d better completely mock the view at the end.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That’s exactly why Marionette is publicly exposing the array of instantiated Behaviors of a view in its &lt;code class=&quot;language-text&quot;&gt;_behaviors&lt;/code&gt; attribute &lt;a href=&quot;https://github.com/marionettejs/backbone.marionette/blob/2f3fcebc26aa6f0b1310ed077278c17f3b22aac0/src/marionette.view.js#L17&quot;&gt;since v2.2.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The trick is to be able to retrieve your Behavior instance in the view context so you can adapt tests regarding parameters that it actually uses.&lt;/p&gt;
&lt;p&gt;I specify an &lt;code class=&quot;language-text&quot;&gt;id&lt;/code&gt; to my Behaviors for that, so I can retrieve them easily:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; OnClick &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Marionette&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Behavior&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;addOnClick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  defaults&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    propertyToIncrease&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;size&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    increaseStep&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  events&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    click&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;add&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// increase `propertyToIncrease` by `increaseStep`&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addOnClickTests&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; view&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; behavior&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; options

  &lt;span class=&quot;token function&quot;&gt;beforeEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ModelClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    view &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ViewClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; model &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Retrieve instantiated behavior and its actual options under this context.&lt;/span&gt;
    behavior &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findWhere&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;view&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_behaviors&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;addOnClick&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    options &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; behavior&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;options

    model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;propertyToIncrease&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;should be instantiated&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;behavior&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;not&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toBeUndefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;should increase the model value when we click on the view&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; expectedValue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
      model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;propertyToIncrease&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;increaseStep

    view&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;propertyToIncrease&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;expectedValue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;to-sum-it-up&quot;&gt;&lt;a href=&quot;#to-sum-it-up&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;To sum it up&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;test the API of your Behavior = its impact on the system, reacting to some events&lt;/li&gt;
&lt;li&gt;describe your Behavior tests in a factory that takes a context as a parameter&lt;/li&gt;
&lt;li&gt;embed your tests in each of your views tests, using the according context&lt;/li&gt;
&lt;li&gt;use &lt;code class=&quot;language-text&quot;&gt;this.view._behaviors&lt;/code&gt; to retrieve your Behavior — you can use an &lt;code class=&quot;language-text&quot;&gt;id&lt;/code&gt; for that — and its actual paremeters within the context of the view&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Chaining et composition de fonctions avec lodash / underscore]]></title><description><![CDATA[Techniques de chaining et composition de fonctions pour créer des pipelines efficaces, le pourquoi du comment.]]></description><link>https://www.nicoespeon.com/fr/2015/06/chaining-composition-fonctions-lodash-underscore/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2015/06/chaining-composition-fonctions-lodash-underscore/</guid><pubDate>Thu, 25 Jun 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;contexte&quot;&gt;&lt;a href=&quot;#contexte&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Contexte&lt;/h2&gt;
&lt;p&gt;Ceci est un talk que j’ai présenté le 23 juin 2015 au &lt;a href=&quot;http://www.meetup.com/fr/backbone-paris/events/223147435/&quot;&gt;meetup Backbone.js Paris S01E07&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;slides&quot;&gt;&lt;a href=&quot;#slides&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Slides&lt;/h2&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 72.91666666666666%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://slides.com/nicoespeon/composition-chaining-lodash/embed&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;</content:encoded></item><item><title><![CDATA[Functions chaining and composition with lodash / underscore]]></title><description><![CDATA[Function chaining and composition techniques to build efficient pipelines, why and how-to.]]></description><link>https://www.nicoespeon.com/en/2015/06/functions-chaining-composition-lodash-underscore/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2015/06/functions-chaining-composition-lodash-underscore/</guid><pubDate>Thu, 25 Jun 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;context&quot;&gt;&lt;a href=&quot;#context&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Context&lt;/h2&gt;
&lt;p&gt;This is a talk I gave last June 23rd, 2015 at &lt;a href=&quot;http://www.meetup.com/fr/backbone-paris/events/223147435/&quot;&gt;meetup Backbone.js Paris S01E07&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;slides&quot;&gt;&lt;a href=&quot;#slides&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Slides&lt;/h2&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 72.91666666666666%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://slides.com/nicoespeon/composition-chaining-lodash-en/embed&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;</content:encoded></item><item><title><![CDATA[Héritage, composition et Backbone.js]]></title><description><![CDATA[Pourquoi la composition d'objets est préférable à l'héritage en JavaScript ? Et surtout, comment applique-t-on cette idée avec Backbone ?]]></description><link>https://www.nicoespeon.com/fr/2015/06/composition-objets-backbone/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2015/06/composition-objets-backbone/</guid><pubDate>Fri, 19 Jun 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;favor-objects-composition-over-inheritance&quot;&gt;&lt;a href=&quot;#favor-objects-composition-over-inheritance&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;“Favor objects composition over inheritance”&lt;/h2&gt;
&lt;p&gt;Dans la Programmation Orientée Objet (POO), on crée un certain nombre d’objets avec leur structure de données et les méthodes qui composent leur interface. Pour décider de comment découper nos objets, on suit le &lt;em&gt;Single Responsibility Principle&lt;/em&gt; (SRP) : &lt;strong&gt;chaque objet doit avoir une seule et unique raison de changer&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pour faire des choses intéressantes, il faut combiner ces objets.&lt;/p&gt;
&lt;p&gt;Or, en gros, il existe 2 types de relations dans le modèle objets : l’héritage et la composition.&lt;/p&gt;
&lt;p&gt;On peut faire l’analogie avec un arbre généalogique :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;l’héritage&lt;/strong&gt;, c’est comme une naissance : quand ça arrive, c’est pour la vie.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;la composition&lt;/strong&gt; c’est comme un mariage : ça arrive au cours de l’existence des objets et ça peut changer. Les objets peuvent se séparer et trouver de nouveaux partenaires avec qui s’associer. On notera néanmoins que les objets ne sont pas monogames.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Source: &lt;a href=&quot;http://www.amazon.com/Object-Design-Roles-Responsibilities-Collaborations/dp/0201379430&quot;&gt;Object Design - Roles, Responsibilities and Collaborations&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;heritage-all-the-things&quot;&gt;&lt;a href=&quot;#heritage-all-the-things&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;“Heritage” all the things!&lt;/h3&gt;
&lt;p&gt;Le premier réflexe des développeurs JavaScript consiste souvent à tenter de reproduire les règles d’héritage pseudo-classique.&lt;/p&gt;
&lt;p&gt;On se retrouve alors vite avec des &lt;code class=&quot;language-text&quot;&gt;new&lt;/code&gt; un peu partout et des chaînes d’héritage longues comme le bras. Ça produit souvent quelque chose &lt;strong&gt;très difficile à maintenir&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Il est vrai qu’en Java on dispose de tout ce qu’il faut pour faire de l’héritage avec des classes, des interfaces, etc.&lt;/p&gt;
&lt;p&gt;Ce n’est pas le cas en JavaScript.&lt;/p&gt;
&lt;h3 id=&quot;keep-it-simple-seriously&quot;&gt;&lt;a href=&quot;#keep-it-simple-seriously&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Keep It Simple, Seriously&lt;/h3&gt;
&lt;p&gt;En JavaScript, la base, c’est &lt;strong&gt;l’héritage de prototype&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Si on oublie le jargon technique, disons qu’on a tout simplement &lt;strong&gt;des objets qui peuvent se lier à d’autres objets&lt;/strong&gt; (OLOO).&lt;/p&gt;
&lt;p&gt;Du coup, il est vachement plus simple d’encapsuler les méthodes d’une même logique dans un objet, puis de simplement &lt;strong&gt;retourner cet objet&lt;/strong&gt;. Au besoin, on peut aussi créer une fonction qui va retourner un objet (ce qu’on appelle une &lt;em&gt;factory&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Cet objet on va le prendre, éventuellement le composer avec d’autres, pour former le prototype avec lequel on va instancier notre classe. Tout simplement.&lt;/p&gt;
&lt;p&gt;Pour résumer : plutôt que de créer des chaînes d’héritage plus ou moins bancales à grands coups de constructeurs, créez simplement vos objets et composez les pour former un prototype avec lequel vous allez instancier votre classe.&lt;/p&gt;
&lt;h3 id=&quot;concatenative-inheritance&quot;&gt;&lt;a href=&quot;#concatenative-inheritance&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; Concatenative inheritance&lt;/h3&gt;
&lt;p&gt;Quelqu’un m’a fait très justement remarqué que ce dont je vous parle ici s’appelle &lt;strong&gt;l’héritage multiple&lt;/strong&gt;, plutôt que d’&lt;strong&gt;object composition&lt;/strong&gt; au sens propre du terme.&lt;/p&gt;
&lt;p&gt;Object composition fait référence au fait de faire pointer les attributs de notre objet vers des instances d’autres classes.&lt;/p&gt;
&lt;p&gt;Il n’y a pas d’héritage multiple à proprement parler en JavaScript. Mais le fait de composer différents prototypes pour en former un nouveau est la notion qui s’en rapproche, ce qui peut générer de la confusion. On parle de “composer des prototypes”, ce qui est le cas, mais pas dans le sens de la composition d’objets…&lt;/p&gt;
&lt;p&gt;Voici pour une explication plus concrète : &lt;a href=&quot;http://stackoverflow.com/questions/8696695/composition-inheritance-and-aggregation-in-javascript&quot;&gt;Composition, Inheritance, and Aggregation in JavaScript&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Du coup, nous appellerons ça la &lt;strong&gt;concatenative inheritance&lt;/strong&gt;, &lt;a href=&quot;https://medium.com/javascript-scene/3-different-kinds-of-prototypal-inheritance-es6-edition-32d777fa16c9#.d084tr4c8&quot;&gt;à la manière d’Eric Eliott&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;sur-un-exemple-concret&quot;&gt;&lt;a href=&quot;#sur-un-exemple-concret&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sur un exemple concret&lt;/h2&gt;
&lt;h3 id=&quot;contexte&quot;&gt;&lt;a href=&quot;#contexte&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Contexte&lt;/h3&gt;
&lt;p&gt;Depuis quelques temps déjà, je travaille à temps plein sur &lt;a href=&quot;https://beta.vinoga.com&quot;&gt;Vinoga&lt;/a&gt;, un jeu de social farming sur le vin, développé en HTML5.&lt;/p&gt;
&lt;p&gt;Entre autres bibliothèques, nous utilisons &lt;em&gt;Backbone.js&lt;/em&gt; pour découpler simplement nos vues de nos données.&lt;/p&gt;
&lt;p&gt;Prenons donc un cas concret : les éléments sur la carte.&lt;/p&gt;
&lt;p&gt;En posant les choses, on se rend vite compte qu’il y a 2 types d’éléments :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;les &lt;code class=&quot;language-text&quot;&gt;Props&lt;/code&gt; qui sont les éléments de décor (arbres, rochers, chemins…)&lt;/li&gt;
&lt;li&gt;les &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt; qui sont les bâtiments du jeu (cuverie, château…)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Une différence parmi d’autres, mais notable à ce stade : les &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt; sont constructibles (depuis le menu de construction), les &lt;code class=&quot;language-text&quot;&gt;Props&lt;/code&gt; ne le sont pas (ils sont déjà sur la carte).&lt;/p&gt;
&lt;p&gt;Quoiqu’il en soit, tous les éléments partagent un comportement commun : ils sont sur la carte. Du coup, &lt;code class=&quot;language-text&quot;&gt;Props&lt;/code&gt; et &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt; dérivent tous deux de &lt;code class=&quot;language-text&quot;&gt;Objects&lt;/code&gt;, qui décrit le comportement d’un “objet” sur la carte.&lt;/p&gt;
&lt;p&gt;Mais il y a aussi différents types de &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt;, notamment :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les &lt;code class=&quot;language-text&quot;&gt;Markets&lt;/code&gt; qui sont les bâtiments qui vont refléter l’état de la boutique du joueur&lt;/li&gt;
&lt;li&gt;les &lt;code class=&quot;language-text&quot;&gt;Productions&lt;/code&gt; qui sont les bâtiments qui vont permettre de transformer une ressource (raisin, jus) en produit (jus, bouteille)&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/inheritance-c5d1c32d0d373e9764a9d6e00036a163-34743.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 454px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 72.90748898678414%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsSAAALEgHS3X78AAABlklEQVQoz4WSW6/BUBCF+/v9DW/ePIsnilDSuEQQxK1VpaclHNWq86UT1Qo566HZnb3XzJo1ozxSCMNwu90ej8efGLvd7nK5PL5DSf9cr9fZbFav1weDQb/f5wyfeBRF/5Nvt5tpmpqmwVyv15ZlHQ4H4vf7PXoiQ5YQ1/xAKJfLvu/DcV2XFgqFgij/WPxVGX6pVEKqSAD7/T6fz/d6PQ4oMgzDtu0MmfSEPM9bLBbdbvd0OiV1IOCCGCnSNpsNul5kXszn81arBZMKqE3I/Oq63ul0sLDdbg+Hw+l0iqIXmWSO4yyXy/F4vFqtkJCQsZog0siIC9xCzlSWfmSw2Cv2oJPvZDLJ5XLn87nRaBSLRa54Kfo/jCqBVB6NRnTEgeLNZjPZhd8YHJQoBbJS3IyBt5VKJbGAzmlNrmiHdBzeN4xRy2uRBwG1xMkl40xvVIbMO0qhtlarsWSqqjI/LCSXjINItVrFAoQw/wyZTtATBIEdAy9lC4jLevgxsJOybITy5pMRAxqvGQ9kkc3mcTae4MyM/wDE3kzAR/vqLQAAAABJRU5ErkJggg==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;H&amp;#xE9;ritage, niveau 1&quot; title=&quot;&quot; src=&quot;/static/inheritance-c5d1c32d0d373e9764a9d6e00036a163-34743.png&quot; srcset=&quot;/static/inheritance-c5d1c32d0d373e9764a9d6e00036a163-5e482.png 240w,
/static/inheritance-c5d1c32d0d373e9764a9d6e00036a163-34743.png 454w&quot; sizes=&quot;(max-width: 454px) 100vw, 454px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Notre cha&amp;#xEE;ne d&amp;#x2019;h&amp;#xE9;ritage initiale&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;À-propos-de-la-constructibilité&quot;&gt;&lt;a href=&quot;#%C3%80-propos-de-la-constructibilit%C3%A9&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;À propos de la constructibilité&lt;/h3&gt;
&lt;p&gt;Après avoir discuté avec le Game Designer, on se rend finalement compte que les &lt;code class=&quot;language-text&quot;&gt;Markets&lt;/code&gt; ne sont pas constructibles : il sont déjà sur la carte de base.&lt;/p&gt;
&lt;p&gt;La constructibilité est un comportement qui faisait partie intégrante de &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt; à ce stade. Mais soit, on peut se dire qu’on va s’en sortir facilement en changeant la chaîne d’héritage ainsi :&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/longer-inheritance-chain-5e2522e4c1e65d6347fd1c5e0b7a33bb-44e45.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 462px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 107.79220779220779%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAIAAABPIytRAAAACXBIWXMAAAsSAAALEgHS3X78AAAB/klEQVQ4y42Tx67CQAxF5/+/AgmJDSs2rNjRQhdFCFFEDbxHh9BL4CgWUSYIgRfJjGeufX09Vg+PXS6XyWRiWdZyuVytVtPp9Hq9Pj6bkp9t23z3+3273U4kEvV6vVar9Xq97Xbrnn4Ei51Op8FgkMvlms3mn2OwwH+/3+2XaWBxccyGhKlU6na7zefz3W7HNhKJfMksZ9yORqOLxUKKJ1yn0wmHw6PRiOLRgsVms/HGUqZpckCqbrcLW0K4xxyxQLPz+SwR8WhgCqPObDZbrVZJ6wUTNJ/PFwqFZDJZLpe5gEejPRwOZ7MZIdG23+97wa1WCwCCE5Qc3IS5lpkzumo5tl6vpbGiXywWCwaDLEKhUKlUohcivttd5VPSbQl4qKI8ThKi/HvPlHdDbLihLYUgRKVSQd7j8YgnnU5TGuT/HeMCGmsvDFa4YA4AhXlwAEgLhgs4RfnD4cARcbUXBhgJSIjCFMlTEy3RnG2xWMxkMoZhxONxiCCwBkZqGLJAOQaDQOPxmEveFninSPleHLQhCUxYoAJfkkuRKMLA0DlycE09fjCSUCeZQQYCATSnfjx+8PvoiFM6j0hULuH8I/nJoE17oEr/Go0G/FlA/juYnHTLfR7ihPavNZONao2XwVyG5DuYFyqzifIy53zpBXR+ykyFpmMsmDxg9B8VngeF4jVmbixsAAAAAElFTkSuQmCC&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;H&amp;#xE9;ritage, niveau 2&quot; title=&quot;&quot; src=&quot;/static/longer-inheritance-chain-5e2522e4c1e65d6347fd1c5e0b7a33bb-44e45.png&quot; srcset=&quot;/static/longer-inheritance-chain-5e2522e4c1e65d6347fd1c5e0b7a33bb-32842.png 240w,
/static/longer-inheritance-chain-5e2522e4c1e65d6347fd1c5e0b7a33bb-44e45.png 462w&quot; sizes=&quot;(max-width: 462px) 100vw, 462px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Notre cha&amp;#xEE;ne d&amp;#x2019;h&amp;#xE9;ritage modifi&amp;#xE9;e pour s&amp;#x2019;adapter&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;et-là-cest-le-drame&quot;&gt;&lt;a href=&quot;#et-l%C3%A0-cest-le-drame&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Et là, c’est le drame&lt;/h3&gt;
&lt;p&gt;Puis le temps passe, les specs évoluent et les features avec : brace yourself, &lt;code class=&quot;language-text&quot;&gt;Decorations&lt;/code&gt; are coming!&lt;/p&gt;
&lt;p&gt;Les &lt;code class=&quot;language-text&quot;&gt;Decorations&lt;/code&gt;, ce sont des éléments de décor (des &lt;code class=&quot;language-text&quot;&gt;Props&lt;/code&gt;), sauf qu’ils sont constructibles eux aussi !&lt;/p&gt;
&lt;p&gt;Bon, à ce stade on est un peu coincés parce-que &lt;code class=&quot;language-text&quot;&gt;Constructables&lt;/code&gt; ça hérite de &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt;. On aimerait éviter de dupliquer &lt;code class=&quot;language-text&quot;&gt;Constructables&lt;/code&gt; pour recoder quasiment la même chose côté &lt;code class=&quot;language-text&quot;&gt;Props&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Dans le meilleur des scénarios, on se retrouve donc avec des classes qui héritent de propriétés inutiles.&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/inheritance-issue-a1fde710e3c6d0b04926b28258acb720-9446b.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 94.60000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAIAAAAf7rriAAAACXBIWXMAAAsSAAALEgHS3X78AAACPklEQVQ4y42US5OiQBCE+f9/w4MT4d3zeNYj8hhFRFFA3qDyUOj9gNGZ2XUjpqJD2+7OzsqsaiXxT5zPZ8/zkiSJ4zgIgqqqxH9CegleLBbz+Xy5XG42mzzPWWwf8QI8bDRNw/x0Oum6bts2zGEYrtfr4cCvmGezmeM4ZAsnyNFodOmDjIqieAFmNU3TPMs0TZOXyyeV7/uu66Z9AD4cDvf7/Qs8HMIh5MmqujYMaJ/yyBzlpmkqimL2MUj7AUabH4aupm11fW/b4gG2LAvnIOfq/X5vGMbtdvs77VtdJ+dz+fZ2MYy8r83AgO3T6ZRUJ5MJxUPdd+cehg1Lui442DRZlg11lmW5rmt2VqsVOUMbRRHi+1ON9ES2ed4aBpM0SbCA7ev16vWBTzhHCcuy5C7WuZ31LzC6W9PsmiTPEUmpt9sthPhnbjZKbxuVQzxaVFX9CY6idrfjO0tTNvwgAMxR53CwPS9IU2SkWUbxyZzKoUvqkA+w6MF1VZEhzVUWBUmiL1ksUJ8VBS5gODDS5kzPPJTOccTHx9fPIPichKF4f78ZBs0RR9F4PMZznKMFJXE8ijTtxukkXLf7TBIyaZmQiKoKjLjfK0ZZFmVJC5I5zlEzSchyx+n7dBmwDg+Ax7Badet9neiCnWWBQSrtBLLTFceSUJTuHEPTurS5i4Rpo2/NQEkhpNt2Oy6xjscjXiJbon3F5cIjFrxbJth2vX6W4IGHiuJhMu+UCbS0as/8iwBs9A+GgBY8zPzJ/AFvSzOni26t7gAAAABJRU5ErkJggg==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;H&amp;#xE9;ritage, le probl&amp;#xE8;me&quot; title=&quot;&quot; src=&quot;/static/inheritance-issue-a1fde710e3c6d0b04926b28258acb720-9446b.png&quot; srcset=&quot;/static/inheritance-issue-a1fde710e3c6d0b04926b28258acb720-e8980.png 240w,
/static/inheritance-issue-a1fde710e3c6d0b04926b28258acb720-e7e4f.png 480w,
/static/inheritance-issue-a1fde710e3c6d0b04926b28258acb720-9446b.png 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;On n&amp;apos;a pas &amp;#xE9;t&amp;#xE9; tr&amp;#xE8;s malins et on est coinc&amp;#xE9;s&amp;#xA0;!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;why-so-pseudo-classical&quot;&gt;&lt;a href=&quot;#why-so-pseudo-classical&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why so pseudo-classical?&lt;/h3&gt;
&lt;p&gt;Alors comment en sommes-nous arrivés là ? Comment s’en sortir ?&lt;/p&gt;
&lt;p&gt;En fait, nous nous sommes un peu précipités quand la problématique de la constructibilité est apparue. Sans plus y réfléchir nous avons tenu la logique ”&lt;code class=&quot;language-text&quot;&gt;Productions&lt;/code&gt; EST un &lt;code class=&quot;language-text&quot;&gt;Constructables&lt;/code&gt; qui EST un &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt; qui EST un &lt;code class=&quot;language-text&quot;&gt;Objects&lt;/code&gt;”. Et PAF l’héritage !&lt;/p&gt;
&lt;p&gt;Si on y regarde mieux, la constructibilité c’est un &lt;strong&gt;comportement&lt;/strong&gt;. On ne peut pas dire que sans &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt; il n’y a pas d’élément &lt;code class=&quot;language-text&quot;&gt;Constructables&lt;/code&gt;. C’est une subtilité et une erreur assez fréquente en JavaScript parce-que l’héritage pseudo-classique c’est la seule chose que l’on retient : c’est le premier (mauvais) réflexe.&lt;/p&gt;
&lt;p&gt;Dans notre cas, la seule chaîne d’héritage vraiment légitime est peut-être celle qui lie &lt;code class=&quot;language-text&quot;&gt;Decorations&lt;/code&gt; à &lt;code class=&quot;language-text&quot;&gt;Props&lt;/code&gt;. Et encore, je dis que l’on peut s’en passer.&lt;/p&gt;
&lt;p&gt;En réalité, ce que l’on fourre dans &lt;code class=&quot;language-text&quot;&gt;Objects&lt;/code&gt;, c’est un ensemble de comportements qui sont communs à &lt;code class=&quot;language-text&quot;&gt;Props&lt;/code&gt; et &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt;. Mais en pratique, &lt;code class=&quot;language-text&quot;&gt;Objects&lt;/code&gt; ne représente rien de concret : ce serait une &lt;em&gt;classe abstraite&lt;/em&gt; si nous faisions du Java. Idem pour &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt; ici d’ailleurs.&lt;/p&gt;
&lt;h3 id=&quot;embrace-composition&quot;&gt;&lt;a href=&quot;#embrace-composition&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Embrace composition&lt;/h3&gt;
&lt;p&gt;En JavaScript, je vous suggère de le prendre autrement : décrivons chaque comportement dans un objet qui lui est propre. Laissons tomber les constructeurs et la chaîne d’héritage.&lt;/p&gt;
&lt;p&gt;Puis, combinons ces objets pour former le prototype des objets qui nous intéresse. Pas de &lt;em&gt;classe&lt;/em&gt; à l’horizon, simplement des objets qui &lt;strong&gt;se composent&lt;/strong&gt; d’autres objets. Éventuellement des &lt;em&gt;factories&lt;/em&gt; pour construire le bon objet au besoin.&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/composition-resolution-0c2f8090902cbae946591a1c5e15a6c2-9446b.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 60.8%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsSAAALEgHS3X78AAABjElEQVQoz31Sf4+bMAzl+3+qadL9MU07adV1bdGNI1BCWppykN+ExDNQrp1O25OIjO0XO35OAEEIbLfgHJpq7IlJC/vqop1CEGGF95Dn8PYGux1UFYQAyeSmFNIUrEFzCA7JuTnASo0rHQ0kIL8sQanJMZM5nxxaLym1JSd3vKU/VF/+6hqKIlyvZiWjG3taEWDEGostPBABPsA9iuERn+iMMQn8B4MbK0outtb35j/Qtu0/yEtu3/mcVGdJJLjxMThFGWPJnDfPZSHgGedveap1QtpzZ/66dD6x86ly0/CSlErpeTYRLgA4L4q63Sii7xD4cK9ZFEUUObhWKp1A24mOnWVNa2pRaqUdb9q+OdHQo5jnGMPUlDJGcu4oY8IfL0AryxhP4GV/oj/27c+vT18a1Iwc2+w505vn/VB8B/8Nx3ZrVLNabn6V3B6mnYrXKy6Jsd4p7aWUYgxh1KZ8TbeHDWU8S4/5Ln9v3+/j0NoMo7Sg1ceGParjfUXr7HcmhHCDM9ZYaxdy/CTXHztdtjp3i1n6AAAAAElFTkSuQmCC&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Composition, la solution&quot; title=&quot;&quot; src=&quot;/static/composition-resolution-0c2f8090902cbae946591a1c5e15a6c2-9446b.png&quot; srcset=&quot;/static/composition-resolution-0c2f8090902cbae946591a1c5e15a6c2-e8980.png 240w,
/static/composition-resolution-0c2f8090902cbae946591a1c5e15a6c2-e7e4f.png 480w,
/static/composition-resolution-0c2f8090902cbae946591a1c5e15a6c2-9446b.png 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Il est bien plus simple de jouer aux Legos&amp;#xA0;!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Dans le cas de où l’on vient augmenter notre prototype avec d’autres objets, qui décrivent des comportements, on parle alors de &lt;strong&gt;mixin&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Si notre objet hérite d’un autre objet, on préfèrera utiliser &lt;strong&gt;l’héritage de prototype&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;et-avec-backbone-&quot;&gt;&lt;a href=&quot;#et-avec-backbone-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Et avec Backbone ?&lt;/h2&gt;
&lt;h3 id=&quot;backboneextend&quot;&gt;&lt;a href=&quot;#backboneextend&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Backbone.extend&lt;/h3&gt;
&lt;p&gt;Quand on utilise Backbone, on se sert de &lt;code class=&quot;language-text&quot;&gt;.extend()&lt;/code&gt; pour surcharger &lt;code class=&quot;language-text&quot;&gt;Backbone.[Model|Collection|View|…]&lt;/code&gt;. Puis on l’instancie avec &lt;code class=&quot;language-text&quot;&gt;new&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Du coup, il est assez fréquent de suivre le réflexe de l’héritage pseudo-classique et de se retrouver avec :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; ObjectsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Backbone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; BuildingsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ObjectsModel&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MarketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; BuildingsModel&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui revient d’ailleurs à écrire :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MarketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Backbone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;…&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;…&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;…&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Et on instancie au besoin&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; marketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MarketsModel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Backbone est ainsi fait et &lt;code class=&quot;language-text&quot;&gt;.extend()&lt;/code&gt; nous emmène très facilement sur cette pente glissante où les Models dépendent les uns des autres de manière plus ou moins subtile.&lt;/p&gt;
&lt;h3 id=&quot;composer-son-prototype-puis-étendre&quot;&gt;&lt;a href=&quot;#composer-son-prototype-puis-%C3%A9tendre&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Composer son prototype PUIS étendre&lt;/h3&gt;
&lt;p&gt;Quitte à devoir hériter de Backbone, autant limiter les dégâts. Ce n’est pas parce-que &lt;code class=&quot;language-text&quot;&gt;.extend()&lt;/code&gt; existe que nous sommes contraints de l’utiliser pour chaque objet que nous créons. Le seul objet que nous ayons à &lt;code class=&quot;language-text&quot;&gt;.extend()&lt;/code&gt; véritablement ici, c’est &lt;code class=&quot;language-text&quot;&gt;Backbone.Model&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;L’idée, c’est de composer des objets pour former le prototype que nous allons &lt;strong&gt;ensuite&lt;/strong&gt; utiliser dans le &lt;code class=&quot;language-text&quot;&gt;.extend()&lt;/code&gt; de notre Model / Collection / Vue…&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; objectsModelProto &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; buildingsModelProto &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; constructablesModelProto &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// On compose pour former un nouveau prototype.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; marketsModelProto &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// -&gt; interface spécifique à markets&lt;/span&gt;
  objectsModelProto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
  buildingsModelProto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; nos mixins&lt;/span&gt;
  constructablesModelProto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// -&gt; pour surcharger nos mixins, si besoin&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Une fois le prototype créé, on hérite de Backbone.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MarketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Backbone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;marketsModelProto&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Puis on instancie.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; marketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MarketsModel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici &lt;code class=&quot;language-text&quot;&gt;objectsModelProto&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;buildingsModelProto&lt;/code&gt; et &lt;code class=&quot;language-text&quot;&gt;constructablesModelProto&lt;/code&gt; viennent surcharger le prototype de base de &lt;code class=&quot;language-text&quot;&gt;marketsModelProto&lt;/code&gt; pour rajouter des comportements spécifiques.&lt;/p&gt;
&lt;h4 id=&quot;merge-ou-assign&quot;&gt;&lt;a href=&quot;#merge-ou-assign&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; Merge ou assign&lt;/h4&gt;
&lt;p&gt;À noter qu’il peut être intéressant d’utiliser &lt;code class=&quot;language-text&quot;&gt;_.merge&lt;/code&gt; plutôt que &lt;code class=&quot;language-text&quot;&gt;_.assign&lt;/code&gt; si l’on souhaite pouvoir fusionner les attributs. Ça peut être pratique avec Backbone pour fusionner certains attributs tels que &lt;code class=&quot;language-text&quot;&gt;events&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; objectsViewProto &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  events&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;click .store&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;store&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;click .turn&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;turn&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  store&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;store&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  turn&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;turn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    displayModal&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;displayModal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    select&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  objectsViewProto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    events&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      click&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;select&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&apos;click .turn&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;displayModal&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// -&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// {&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   events: {&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//     &quot;click&quot;: &quot;select&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//     &quot;click .turn&quot;: &quot;displayModal&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   displayModal: function displayModal () { /* … */ },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   select: function select () { /* … */ },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   store: function store () { /* … */ },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   turn: function turn () { /* … */ }&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// }&lt;/span&gt;

_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    displayModal&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;displayModal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    select&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  objectsViewProto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    events&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      click&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;select&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&apos;click .turn&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;displayModal&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// -&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// {&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   events: {&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//     &quot;click&quot;: &quot;select&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//     &quot;click .store&quot;: &quot;store&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//     &quot;click .turn&quot;: &quot;displayModal&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   displayModal: function displayModal () { /* … */ },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   select: function select () { /* … */ },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   store: function store () { /* … */ },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   turn: function turn () { /* … */ }&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// }&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;pour-conclure&quot;&gt;&lt;a href=&quot;#pour-conclure&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Préférez la &lt;strong&gt;composition d’objets&lt;/strong&gt; plutôt que &lt;strong&gt;l’héritage&lt;/strong&gt;. N’utilisez l’héritage que si cela fait vraiment sens, ou si c’est nécessaire. Gare aux longues chaînes d’héritage : c’est fragile.&lt;/p&gt;
&lt;p&gt;Ce qu’il est préférable d’éviter :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// markets.model.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MarketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ConstructablesModel&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// main.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; marketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MarketsModel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Plus flexible, plus simple :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// markets.model.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; marketsModelProto &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// -&gt; interface spécifique à markets&lt;/span&gt;
  objectsModelProto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  buildingsModelProto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  constructablesModelProto
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// main.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MarketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Backbone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;marketsModelProto&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; marketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MarketsModel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour finir, voici quelques articles que je vous recommande pour aller plus loin sur le sujet de la composition et de l’héritage en JavaScript :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.datchley.name/understanding-prototypes-delegation-composition/&quot;&gt;Understanding Prototypes, Delegation &amp;#x26; Composition&lt;/a&gt; &gt; une explication de A à Z simple, claire et illustrée&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/javascript-scene/common-misconceptions-about-inheritance-in-javascript-d5d9bab29b0a&quot;&gt;Common Misconceptions about Inheritance in Javascript&lt;/a&gt; &gt; FAQ détaillée qui va au fond de la question&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Inheritance, composition and Backbone.js]]></title><description><![CDATA[Why objects composition is preferable to inheritance in JavaScript? Most of all, how do you apply this technique with Backbone.js?]]></description><link>https://www.nicoespeon.com/en/2015/06/objects-composition-backbone/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2015/06/objects-composition-backbone/</guid><pubDate>Fri, 19 Jun 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;favor-objects-composition-over-inheritance&quot;&gt;&lt;a href=&quot;#favor-objects-composition-over-inheritance&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;“Favor objects composition over inheritance”&lt;/h2&gt;
&lt;p&gt;When you’re doing Object Oriented Programmation (OOP), you create a bunch of objects with their data structure and methods that compose their interface. You decide how to split your objects based on the &lt;em&gt;Single Responsibility Principle&lt;/em&gt; (SRP): &lt;strong&gt;each object should have one and only one reason to change&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;To make interesting stuff happen, you need to combine those objects.&lt;/p&gt;
&lt;p&gt;Roughly, there are 2 types of relationships in an object model: inheritance and composition.&lt;/p&gt;
&lt;p&gt;You can do the analogy with a family tree:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;inheritance&lt;/strong&gt; is like a birth: when it happens, this is for life.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;composition&lt;/strong&gt; is like a marriage: it happens during the participating objects’ lifetimes, and it can change. Objects can discard partners and get new partners to collaborate with. Please note that objects are surely not monogams.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Source: &lt;a href=&quot;http://www.amazon.com/Object-Design-Roles-Responsibilities-Collaborations/dp/0201379430&quot;&gt;Object Design - Roles, Responsibilities and Collaborations&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;inheritance-all-the-things&quot;&gt;&lt;a href=&quot;#inheritance-all-the-things&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;“Inheritance” all the things!&lt;/h3&gt;
&lt;p&gt;The very first thing JavaScript developers do is trying to mimic rules of pseudo-classical inheritance.&lt;/p&gt;
&lt;p&gt;They usually quickly come up with a lot of &lt;code class=&quot;language-text&quot;&gt;new&lt;/code&gt; everywhere and inheritance chains awfully long. That generally produce something &lt;strong&gt;very hard to maintain&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That’s true you’ve got everything you need to do inheritance with classes, interfaces, … in Java.&lt;/p&gt;
&lt;p&gt;This is not JavaScript.&lt;/p&gt;
&lt;h3 id=&quot;keep-it-simple-seriously&quot;&gt;&lt;a href=&quot;#keep-it-simple-seriously&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Keep It Simple, Seriously&lt;/h3&gt;
&lt;p&gt;The base rule in JavaScript is &lt;strong&gt;prototypal inheritance&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Forget about the technical jargon, just remember you have &lt;strong&gt;objects that can link to other objects&lt;/strong&gt; (OLOO).&lt;/p&gt;
&lt;p&gt;Thus, it’s way simpler to encapsulate methods from a same logic into an object, then simply &lt;strong&gt;return this object&lt;/strong&gt;. If you need to, you can also create a function that will return an object — which is what we call a &lt;em&gt;factory&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Then you’ll take this object, eventually compose it with others, to build the prototype which you’ll use to instantiate your class. That simple.&lt;/p&gt;
&lt;p&gt;To sum it up: instead of creating huge, poorly built, inheritance chains from constructors, simply create your objects and compose them to create a prototype you will instantiate your class with.&lt;/p&gt;
&lt;h3 id=&quot;concatenative-inheritance&quot;&gt;&lt;a href=&quot;#concatenative-inheritance&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; Concatenative inheritance&lt;/h3&gt;
&lt;p&gt;Someone notified me that what I’m talking about here is called &lt;strong&gt;multiple inheritance&lt;/strong&gt;, not actual &lt;strong&gt;object composition&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;When you do object composition, you make attributes point to instances of other classes.&lt;/p&gt;
&lt;p&gt;There is no multiple inheritance in JavaScript. Still, composing different prototypes to produce a totally new one is a very close notion, which can be confusing. Here we are talking about “composing prototypes”, but not in the terms of objects composition…&lt;/p&gt;
&lt;p&gt;There you’ll find a more concrete explanation: &lt;a href=&quot;http://stackoverflow.com/questions/8696695/composition-inheritance-and-aggregation-in-javascript&quot;&gt;Composition, Inheritance, and Aggregation in JavaScript&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, let’s call that &lt;strong&gt;concatenative inheritance&lt;/strong&gt;, &lt;a href=&quot;https://medium.com/javascript-scene/3-different-kinds-of-prototypal-inheritance-es6-edition-32d777fa16c9#.d084tr4c8&quot;&gt;as detailed by Eric Eliott&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;with-a-concrete-example&quot;&gt;&lt;a href=&quot;#with-a-concrete-example&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;With a concrete example&lt;/h2&gt;
&lt;h3 id=&quot;context&quot;&gt;&lt;a href=&quot;#context&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Context&lt;/h3&gt;
&lt;p&gt;For quite some time I’ve been working full-time on &lt;a href=&quot;https://beta.vinoga.com&quot;&gt;Vinoga&lt;/a&gt;, a social-farming game about wine, developed in HTML5.&lt;/p&gt;
&lt;p&gt;Among few libraries, we use &lt;em&gt;Backbone.js&lt;/em&gt; to decouple our views from our data with ease.&lt;/p&gt;
&lt;p&gt;Let’s take a concrete use case: elements on the map.&lt;/p&gt;
&lt;p&gt;If we take a few time to think about it, there are actually 2 types of elements:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Props&lt;/code&gt; that are decorations elements — trees, rocks, paths…&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt; that are buildings of the game — winery, castle…&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There is, among others, one difference we can notice from now: &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt; can be constructed — from the build menu —, not &lt;code class=&quot;language-text&quot;&gt;Props&lt;/code&gt; since they already are on the map.&lt;/p&gt;
&lt;p&gt;Whatever, all these elements share a common behavior: they are on the map. Hence, &lt;code class=&quot;language-text&quot;&gt;Props&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt; both inherit from &lt;code class=&quot;language-text&quot;&gt;Objects&lt;/code&gt;, which describes the behavior of an “object” on the map.&lt;/p&gt;
&lt;p&gt;But there also are different types of &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt;, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Markets&lt;/code&gt; that are buildings that will reflect the state of the player’s store&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Productions&lt;/code&gt; buildings, that will transform resources — grape, juice — into another product — juice, bottle.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/inheritance-c5d1c32d0d373e9764a9d6e00036a163-34743.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 454px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 72.90748898678414%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsSAAALEgHS3X78AAABlklEQVQoz4WSW6/BUBCF+/v9DW/ePIsnilDSuEQQxK1VpaclHNWq86UT1Qo566HZnb3XzJo1ozxSCMNwu90ej8efGLvd7nK5PL5DSf9cr9fZbFav1weDQb/f5wyfeBRF/5Nvt5tpmpqmwVyv15ZlHQ4H4vf7PXoiQ5YQ1/xAKJfLvu/DcV2XFgqFgij/WPxVGX6pVEKqSAD7/T6fz/d6PQ4oMgzDtu0MmfSEPM9bLBbdbvd0OiV1IOCCGCnSNpsNul5kXszn81arBZMKqE3I/Oq63ul0sLDdbg+Hw+l0iqIXmWSO4yyXy/F4vFqtkJCQsZog0siIC9xCzlSWfmSw2Cv2oJPvZDLJ5XLn87nRaBSLRa54Kfo/jCqBVB6NRnTEgeLNZjPZhd8YHJQoBbJS3IyBt5VKJbGAzmlNrmiHdBzeN4xRy2uRBwG1xMkl40xvVIbMO0qhtlarsWSqqjI/LCSXjINItVrFAoQw/wyZTtATBIEdAy9lC4jLevgxsJOybITy5pMRAxqvGQ9kkc3mcTae4MyM/wDE3kzAR/vqLQAAAABJRU5ErkJggg==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Inheritance, level 1&quot; title=&quot;&quot; src=&quot;/static/inheritance-c5d1c32d0d373e9764a9d6e00036a163-34743.png&quot; srcset=&quot;/static/inheritance-c5d1c32d0d373e9764a9d6e00036a163-5e482.png 240w,
/static/inheritance-c5d1c32d0d373e9764a9d6e00036a163-34743.png 454w&quot; sizes=&quot;(max-width: 454px) 100vw, 454px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Our initial inheritance chain&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;about-constructability&quot;&gt;&lt;a href=&quot;#about-constructability&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;About constructability&lt;/h3&gt;
&lt;p&gt;After we discussed with the Game Designer, we realized that &lt;code class=&quot;language-text&quot;&gt;Markets&lt;/code&gt; are not constructable: they already are on the map.&lt;/p&gt;
&lt;p&gt;Constructability is a behavior that were part of the &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt; one until now. But yep, let’s handle that with a little modification of the inheritance chain:&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/longer-inheritance-chain-5e2522e4c1e65d6347fd1c5e0b7a33bb-44e45.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 462px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 107.79220779220779%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAIAAABPIytRAAAACXBIWXMAAAsSAAALEgHS3X78AAAB/klEQVQ4y42Tx67CQAxF5/+/AgmJDSs2rNjRQhdFCFFEDbxHh9BL4CgWUSYIgRfJjGeufX09Vg+PXS6XyWRiWdZyuVytVtPp9Hq9Pj6bkp9t23z3+3273U4kEvV6vVar9Xq97Xbrnn4Ei51Op8FgkMvlms3mn2OwwH+/3+2XaWBxccyGhKlU6na7zefz3W7HNhKJfMksZ9yORqOLxUKKJ1yn0wmHw6PRiOLRgsVms/HGUqZpckCqbrcLW0K4xxyxQLPz+SwR8WhgCqPObDZbrVZJ6wUTNJ/PFwqFZDJZLpe5gEejPRwOZ7MZIdG23+97wa1WCwCCE5Qc3IS5lpkzumo5tl6vpbGiXywWCwaDLEKhUKlUohcivttd5VPSbQl4qKI8ThKi/HvPlHdDbLihLYUgRKVSQd7j8YgnnU5TGuT/HeMCGmsvDFa4YA4AhXlwAEgLhgs4RfnD4cARcbUXBhgJSIjCFMlTEy3RnG2xWMxkMoZhxONxiCCwBkZqGLJAOQaDQOPxmEveFninSPleHLQhCUxYoAJfkkuRKMLA0DlycE09fjCSUCeZQQYCATSnfjx+8PvoiFM6j0hULuH8I/nJoE17oEr/Go0G/FlA/juYnHTLfR7ihPavNZONao2XwVyG5DuYFyqzifIy53zpBXR+ykyFpmMsmDxg9B8VngeF4jVmbixsAAAAAElFTkSuQmCC&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Inheritance, level 2&quot; title=&quot;&quot; src=&quot;/static/longer-inheritance-chain-5e2522e4c1e65d6347fd1c5e0b7a33bb-44e45.png&quot; srcset=&quot;/static/longer-inheritance-chain-5e2522e4c1e65d6347fd1c5e0b7a33bb-32842.png 240w,
/static/longer-inheritance-chain-5e2522e4c1e65d6347fd1c5e0b7a33bb-44e45.png 462w&quot; sizes=&quot;(max-width: 462px) 100vw, 462px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Our updated inheritance chain to adapt&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;here-comes-the-drama&quot;&gt;&lt;a href=&quot;#here-comes-the-drama&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Here comes the drama&lt;/h3&gt;
&lt;p&gt;As time goes, specs evolve and features too: brace yourself, &lt;code class=&quot;language-text&quot;&gt;Decorations&lt;/code&gt; are coming!&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Decorations&lt;/code&gt; are decorations elements — actually, &lt;code class=&quot;language-text&quot;&gt;Props&lt;/code&gt; — except that they are constructables too!&lt;/p&gt;
&lt;p&gt;Well, now we’re a bit stucked since &lt;code class=&quot;language-text&quot;&gt;ConstructableBuildings&lt;/code&gt; inherits from &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt;. We’d like not to duplicate &lt;code class=&quot;language-text&quot;&gt;ConstructableBuildings&lt;/code&gt; to recode roughly the same thing into &lt;code class=&quot;language-text&quot;&gt;Props&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Looks like we’ll end up with classes that inherit of useless properties at the very best.&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/inheritance-issue-a1fde710e3c6d0b04926b28258acb720-9446b.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 94.60000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAIAAAAf7rriAAAACXBIWXMAAAsSAAALEgHS3X78AAACPklEQVQ4y42US5OiQBCE+f9/w4MT4d3zeNYj8hhFRFFA3qDyUOj9gNGZ2XUjpqJD2+7OzsqsaiXxT5zPZ8/zkiSJ4zgIgqqqxH9CegleLBbz+Xy5XG42mzzPWWwf8QI8bDRNw/x0Oum6bts2zGEYrtfr4cCvmGezmeM4ZAsnyNFodOmDjIqieAFmNU3TPMs0TZOXyyeV7/uu66Z9AD4cDvf7/Qs8HMIh5MmqujYMaJ/yyBzlpmkqimL2MUj7AUabH4aupm11fW/b4gG2LAvnIOfq/X5vGMbtdvs77VtdJ+dz+fZ2MYy8r83AgO3T6ZRUJ5MJxUPdd+cehg1Lui442DRZlg11lmW5rmt2VqsVOUMbRRHi+1ON9ES2ed4aBpM0SbCA7ev16vWBTzhHCcuy5C7WuZ31LzC6W9PsmiTPEUmpt9sthPhnbjZKbxuVQzxaVFX9CY6idrfjO0tTNvwgAMxR53CwPS9IU2SkWUbxyZzKoUvqkA+w6MF1VZEhzVUWBUmiL1ksUJ8VBS5gODDS5kzPPJTOccTHx9fPIPichKF4f78ZBs0RR9F4PMZznKMFJXE8ijTtxukkXLf7TBIyaZmQiKoKjLjfK0ZZFmVJC5I5zlEzSchyx+n7dBmwDg+Ax7Badet9neiCnWWBQSrtBLLTFceSUJTuHEPTurS5i4Rpo2/NQEkhpNt2Oy6xjscjXiJbon3F5cIjFrxbJth2vX6W4IGHiuJhMu+UCbS0as/8iwBs9A+GgBY8zPzJ/AFvSzOni26t7gAAAABJRU5ErkJggg==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Inheritance, the problem&quot; title=&quot;&quot; src=&quot;/static/inheritance-issue-a1fde710e3c6d0b04926b28258acb720-9446b.png&quot; srcset=&quot;/static/inheritance-issue-a1fde710e3c6d0b04926b28258acb720-e8980.png 240w,
/static/inheritance-issue-a1fde710e3c6d0b04926b28258acb720-e7e4f.png 480w,
/static/inheritance-issue-a1fde710e3c6d0b04926b28258acb720-9446b.png 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;We weren&amp;apos;t very smart on this one, now we&amp;apos;re stuck!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;why-so-pseudo-classical&quot;&gt;&lt;a href=&quot;#why-so-pseudo-classical&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why so pseudo-classical?&lt;/h3&gt;
&lt;p&gt;Well, how did we get there? How to get out of here?&lt;/p&gt;
&lt;p&gt;Actually, we were a bit in the hurry when the constructability question appears. Without any more reflexion we came with the logic that ”&lt;code class=&quot;language-text&quot;&gt;Productions&lt;/code&gt; IS a &lt;code class=&quot;language-text&quot;&gt;ConstructableBuildings&lt;/code&gt; that IS a &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt; that IS an &lt;code class=&quot;language-text&quot;&gt;Objects&lt;/code&gt;”. Kaboom, inheritance!&lt;/p&gt;
&lt;p&gt;In fact, if we look closer, we could infer that constructability is a &lt;strong&gt;behavior&lt;/strong&gt;. You can not say that there is no &lt;code class=&quot;language-text&quot;&gt;Constructable&lt;/code&gt; element without &lt;code class=&quot;language-text&quot;&gt;Building&lt;/code&gt;. This is a subtle error that is so frequent in JavaScript because of pseudo-classical inheritance since this is the only thing you remember: this is the very first — bad — instinct.&lt;/p&gt;
&lt;p&gt;In our case, the only legitimate inheritance chain may be the one that bounds &lt;code class=&quot;language-text&quot;&gt;Decorations&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;Props&lt;/code&gt;. Anyway, I still think that you can get rid of it too.&lt;/p&gt;
&lt;p&gt;What you actually put into &lt;code class=&quot;language-text&quot;&gt;Objects&lt;/code&gt; is a bunch of behaviors that are shared between &lt;code class=&quot;language-text&quot;&gt;Props&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt;. But technically, &lt;code class=&quot;language-text&quot;&gt;Objects&lt;/code&gt; doesn’t represent anything concrete: this would be an &lt;em&gt;abstract class&lt;/em&gt; if we were coding in Java. Just like &lt;code class=&quot;language-text&quot;&gt;Buildings&lt;/code&gt; by the way.&lt;/p&gt;
&lt;h3 id=&quot;embrace-composition&quot;&gt;&lt;a href=&quot;#embrace-composition&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Embrace composition&lt;/h3&gt;
&lt;p&gt;In JavaScript, may I suggest another way: let’s describe each behavior into its own object. Let’s get rid of constructors and inheritance chains.&lt;/p&gt;
&lt;p&gt;Then, combine these objects to make the prototype of objects we want to build. No &lt;em&gt;class&lt;/em&gt; around, simply objects that &lt;strong&gt;are composed from&lt;/strong&gt; other objects. Eventually &lt;em&gt;factories&lt;/em&gt; to construct the correct object regarding your needs.&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/composition-resolution-0c2f8090902cbae946591a1c5e15a6c2-9446b.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 60.8%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsSAAALEgHS3X78AAABjElEQVQoz31Sf4+bMAzl+3+qadL9MU07adV1bdGNI1BCWppykN+ExDNQrp1O25OIjO0XO35OAEEIbLfgHJpq7IlJC/vqop1CEGGF95Dn8PYGux1UFYQAyeSmFNIUrEFzCA7JuTnASo0rHQ0kIL8sQanJMZM5nxxaLym1JSd3vKU/VF/+6hqKIlyvZiWjG3taEWDEGostPBABPsA9iuERn+iMMQn8B4MbK0outtb35j/Qtu0/yEtu3/mcVGdJJLjxMThFGWPJnDfPZSHgGedveap1QtpzZ/66dD6x86ly0/CSlErpeTYRLgA4L4q63Sii7xD4cK9ZFEUUObhWKp1A24mOnWVNa2pRaqUdb9q+OdHQo5jnGMPUlDJGcu4oY8IfL0AryxhP4GV/oj/27c+vT18a1Iwc2+w505vn/VB8B/8Nx3ZrVLNabn6V3B6mnYrXKy6Jsd4p7aWUYgxh1KZ8TbeHDWU8S4/5Ln9v3+/j0NoMo7Sg1ceGParjfUXr7HcmhHCDM9ZYaxdy/CTXHztdtjp3i1n6AAAAAElFTkSuQmCC&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Composition, the solution&quot; title=&quot;&quot; src=&quot;/static/composition-resolution-0c2f8090902cbae946591a1c5e15a6c2-9446b.png&quot; srcset=&quot;/static/composition-resolution-0c2f8090902cbae946591a1c5e15a6c2-e8980.png 240w,
/static/composition-resolution-0c2f8090902cbae946591a1c5e15a6c2-e7e4f.png 480w,
/static/composition-resolution-0c2f8090902cbae946591a1c5e15a6c2-9446b.png 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;It&amp;apos;s way simpler to play Legos!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Here we just augment our prototype with other objects that describe behaviors. That’s what &lt;strong&gt;mixin&lt;/strong&gt; is about.&lt;/p&gt;
&lt;p&gt;If your object inherits from another, then prefer to use &lt;strong&gt;prototypal inheritance&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-about-backbone&quot;&gt;&lt;a href=&quot;#what-about-backbone&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What about Backbone?&lt;/h2&gt;
&lt;h3 id=&quot;backboneextend&quot;&gt;&lt;a href=&quot;#backboneextend&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Backbone.extend&lt;/h3&gt;
&lt;p&gt;When you use Backbone, you use &lt;code class=&quot;language-text&quot;&gt;.extend()&lt;/code&gt; to override &lt;code class=&quot;language-text&quot;&gt;Backbone.[Model|Collection|View|…]&lt;/code&gt;. Then you instantiate it with &lt;code class=&quot;language-text&quot;&gt;new&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Thus, it’s very frequent to follow the pseudo-classical inheritance reflex and to end up with:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; ObjectsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Backbone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; BuildingsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ObjectsModel&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MarketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; BuildingsModel&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which, by the way, would be the same than:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MarketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Backbone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;…&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;…&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;…&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Then you instantiate when needed&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; marketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MarketsModel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Backbone is built like that. &lt;code class=&quot;language-text&quot;&gt;.extend()&lt;/code&gt; easily lead us to that slippery slope where Models depend on the others in many not-that-subtle ways.&lt;/p&gt;
&lt;h3 id=&quot;compose-your-prototype-then-extend&quot;&gt;&lt;a href=&quot;#compose-your-prototype-then-extend&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Compose your prototype THEN extend&lt;/h3&gt;
&lt;p&gt;Even though you need to inherit from Backbone, you can at least limit the damages. Even though &lt;code class=&quot;language-text&quot;&gt;.extend()&lt;/code&gt; exists, you don’t have to use it for every single object you create. The only object we really need to &lt;code class=&quot;language-text&quot;&gt;.extend()&lt;/code&gt; here is &lt;code class=&quot;language-text&quot;&gt;Backbone.Model&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The main idea is to compose objects to make to prototype you will &lt;strong&gt;then&lt;/strong&gt; use into the &lt;code class=&quot;language-text&quot;&gt;.extend()&lt;/code&gt; of your Model / Collection / View…&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; objectsModelProto &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; buildingsModelProto &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; constructablesModelProto &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// We compose to make a new prototype.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; marketsModelProto &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// -&gt; specific interface for markets&lt;/span&gt;
  objectsModelProto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
  buildingsModelProto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; our mixins&lt;/span&gt;
  constructablesModelProto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// -&gt; to override mixins, if needed&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Once prototype is created, inherit from Backbone.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MarketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Backbone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;marketsModelProto&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Then you instantiate.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; marketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MarketsModel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can see how &lt;code class=&quot;language-text&quot;&gt;objectsModelProto&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;buildingsModelProto&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;constructablesModelProto&lt;/code&gt; override the base prototype of &lt;code class=&quot;language-text&quot;&gt;marketsModelProto&lt;/code&gt; to add specific behaviors.&lt;/p&gt;
&lt;h4 id=&quot;merge-or-assign&quot;&gt;&lt;a href=&quot;#merge-or-assign&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Merge or assign&lt;/h4&gt;
&lt;p&gt;Please note that might be useful to use &lt;code class=&quot;language-text&quot;&gt;_.merge&lt;/code&gt; instead of &lt;code class=&quot;language-text&quot;&gt;_.assign&lt;/code&gt; if you need to merge attributes deeply. This may be handy with Backbone when you need to merge things like &lt;code class=&quot;language-text&quot;&gt;events&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; objectsViewProto &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  events&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;click .store&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;store&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;click .turn&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;turn&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  store&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;store&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  turn&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;turn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    displayModal&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;displayModal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    select&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  objectsViewProto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    events&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      click&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;select&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&apos;click .turn&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;displayModal&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// -&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// {&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   events: {&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//     &quot;click&quot;: &quot;select&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//     &quot;click .turn&quot;: &quot;displayModal&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   displayModal: function displayModal () { /* … */ },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   select: function select () { /* … */ },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   store: function store () { /* … */ },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   turn: function turn () { /* … */ }&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// }&lt;/span&gt;

_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    displayModal&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;displayModal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    select&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  objectsViewProto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    events&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      click&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;select&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&apos;click .turn&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;displayModal&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// -&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// {&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   events: {&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//     &quot;click&quot;: &quot;select&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//     &quot;click .store&quot;: &quot;store&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//     &quot;click .turn&quot;: &quot;displayModal&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   displayModal: function displayModal () { /* … */ },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   select: function select () { /* … */ },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   store: function store () { /* … */ },&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   turn: function turn () { /* … */ }&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// }&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;in-conclusion&quot;&gt;&lt;a href=&quot;#in-conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;In conclusion&lt;/h2&gt;
&lt;p&gt;Favor &lt;strong&gt;objects composition&lt;/strong&gt; over &lt;strong&gt;inheritance&lt;/strong&gt;. Don’t use inheritance if it doesn’t really make sense, or is required. Beware overlong inheritance chains: that’s damn fragile.&lt;/p&gt;
&lt;p&gt;What is preferable to avoid:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// markets.model.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MarketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ConstructablesModel&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// main.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; marketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MarketsModel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Far more flexible, simpler:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// markets.model.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; marketsModelProto &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// -&gt; specific interface of markets&lt;/span&gt;
  objectsModelProto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  buildingsModelProto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  constructablesModelProto
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// main.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MarketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Backbone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;marketsModelProto&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; marketsModel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MarketsModel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let’s end up this post with few post I recommend you to read if you need to know more about composition and inheritance with JavaScript:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.datchley.name/understanding-prototypes-delegation-composition/&quot;&gt;Understanding Prototypes, Delegation &amp;#x26; Composition&lt;/a&gt; &gt; an explanation from A to Z which is simple, clear and illustrated&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/javascript-scene/common-misconceptions-about-inheritance-in-javascript-d5d9bab29b0a&quot;&gt;Common Misconceptions about Inheritance in Javascript&lt;/a&gt; &gt; detailed FAQ that goes deep on this subject&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Fonctions pures en JavaScript]]></title><description><![CDATA[Qu'est-ce-qu'une fonction pure et pourquoi s'y intéresser en JavaScript ?]]></description><link>https://www.nicoespeon.com/fr/2015/01/fonctions-pures-javascript/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2015/01/fonctions-pures-javascript/</guid><pubDate>Sun, 25 Jan 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;cest-quoi-ça-une-fonction-pure-&quot;&gt;&lt;a href=&quot;#cest-quoi-%C3%A7a-une-fonction-pure-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;C’est quoi ça une fonction “pure” ?&lt;/h2&gt;
&lt;p&gt;Une fonction pure &lt;strong&gt;ne dépend pas&lt;/strong&gt; et &lt;strong&gt;ne modifie pas l’état de variables hors de sa portée&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En pratique, cela signifie qu’&lt;strong&gt;une fonction pure retourne toujours le même résultat avec des paramètres identiques&lt;/strong&gt;. Son exécution ne dépend pas de l’état du système.&lt;/p&gt;
&lt;p&gt;Les fonctions pures sont d’ailleurs un pilier de la &lt;a href=&quot;http://fr.wikipedia.org/wiki/Programmation_fonctionnelle&quot;&gt;programmation fonctionnelle&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;quelques-exemples&quot;&gt;&lt;a href=&quot;#quelques-exemples&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Quelques exemples&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; values &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;impureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

  items&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; items&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;a &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;impureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Désormais `values.a` vaut 3 car la fonction impure l&apos;a modifié.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici, on modifie les attributs de l’objet passé en paramètre, donc on modifie l’objet en dehors de la portée de notre fonction également : elle est impure dans ce cas.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; values &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

  a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// `values.a` n&apos;a pas été modifié, c&apos;est toujours 1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici, on modifie simplement le paramètre dans la portée de la fonction, on ne touche à rien d’autre en dehors !&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; values &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;impureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;impureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// En fait la valeur de `c` dépend de celle de `b`.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Dans une base de code plus grande vous risquez d&apos;oublier ce&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// détail et le résultat peut vous surprendre car il peut varier&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// de manière implicite.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La variable &lt;code class=&quot;language-text&quot;&gt;b&lt;/code&gt; n’est pas dans la portée de la fonction. Le résultat dépendra du contexte : surprises garanties !&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; values &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Ici il est clair que la valeur de `c` dépend de celle de `b`.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Pas de surprise en douce.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;et-en-pratique-ça-donne-quoi-&quot;&gt;&lt;a href=&quot;#et-en-pratique-%C3%A7a-donne-quoi-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Et en pratique ça donne quoi ?&lt;/h2&gt;
&lt;p&gt;Considérons que ce code existe :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getMinQuantity&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMinQuantity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Une fonction pure qui retourne une valeur numérique&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// en fonction du name.&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et prenons donc l’exemple du code suivant que l’on pourrait retrouver dans un projet lambda :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; popover &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Un tas de code…&lt;/span&gt;

  addQuantityText&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantityTextOptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      namespace&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      initialChildIndex&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      quantity&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;formatQuantityText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantityTextOptions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Couldn&apos;t add quantity text!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  formatQuantityText&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$$boxContainer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;$$boxContainer is not configured&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; namespace &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;namespace &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quantity &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; initialChildIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;initialChildIndex &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $$quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Canvas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// implementation details hidden&lt;/span&gt;
    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; namespace
    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setQuantityTextColor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$$boxContainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; initialChildIndex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; $$quantity
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  setQuantityTextColor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; minQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMinQuantity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; minQuantity
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; minQuantity

    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;color &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;green&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;red&apos;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Un tas de code…&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici nous avons &lt;code class=&quot;language-text&quot;&gt;addQuantityText()&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;formatQuantityText()&lt;/code&gt; et &lt;code class=&quot;language-text&quot;&gt;setQuantityTextColor()&lt;/code&gt; qui sont toutes impures.&lt;/p&gt;
&lt;p&gt;Dans notre contexte, c’est &lt;code class=&quot;language-text&quot;&gt;addQuantityText()&lt;/code&gt; qui est utilisée lorsque l’on souhaite “afficher la quantité” dans notre &lt;code class=&quot;language-text&quot;&gt;$$boxContainer&lt;/code&gt;. C’est le point d’entrée qui se charge de tous les détails. C’est dans cette fonction qu’on va aller jeter un œil si un soucis se présente avec notre &lt;code class=&quot;language-text&quot;&gt;$$quantity&lt;/code&gt;. Ça risque de devenir un vrai jeu de piste.&lt;/p&gt;
&lt;p&gt;La manière dont il a été écrit peut être propice à certaines erreurs sur le long terme.&lt;/p&gt;
&lt;h3 id=&quot;quand-ça-devient-compliqué&quot;&gt;&lt;a href=&quot;#quand-%C3%A7a-devient-compliqu%C3%A9&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Quand ça devient compliqué&lt;/h3&gt;
&lt;p&gt;Dans l’exemple, l’ordre d’exécution des fonctions est garant du bon fonctionnement du code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Il suffit d’échanger l’ordre de 2 lignes pour tout casser&lt;/strong&gt;. Ça peut paraître évident, mais ça l’est beaucoup moins à repérer :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; popover &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Un tas de code…&lt;/span&gt;

  addQuantityText&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantityTextOptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      namespace&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      initialChildIndex&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      quantity&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;formatQuantityText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantityTextOptions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Couldn&apos;t add quantity text!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  formatQuantityText&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$$boxContainer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;$$boxContainer is not configured&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; namespace &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;namespace &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quantity &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; initialChildIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;initialChildIndex &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $$quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Canvas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// implementation details hidden&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setQuantityTextColor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; namespace
    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; $$quantity
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  setQuantityTextColor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; minQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMinQuantity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; minQuantity
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; minQuantity

    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;color &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;green&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;red&apos;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Un tas de code…&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il y a désormais une erreur dans le code. Le problème, c’est que ça ne saute pas aux yeux !&lt;/p&gt;
&lt;p&gt;Ici, &lt;code class=&quot;language-text&quot;&gt;setQuantityTextColor()&lt;/code&gt; est responsable de la couleur de &lt;code class=&quot;language-text&quot;&gt;$$quantity&lt;/code&gt;. Du coup, il faut naviguer de méthodes en méthodes pour trouver celle qui modifie l’objet en dernier et reconstituer le flow pour comprendre ce qui pourrait mal se passer.&lt;/p&gt;
&lt;p&gt;À ce moment là, on pourrait presque s’en mordre les doigts d’avoir découpé &lt;code class=&quot;language-text&quot;&gt;formatQuantityText()&lt;/code&gt; en petites méthodes pour simplifier les détails de son implémentation.&lt;/p&gt;
&lt;p&gt;D’une manière générale d’ailleurs, ça fait pas mal de code à considérer en cas de debug. Et si on commence à estimer que décomposer une grosse méthode en petites complique la tâche de debug, alors le concept de &lt;strong&gt;fonction pure&lt;/strong&gt; prend de l’intérêt.&lt;/p&gt;
&lt;h3 id=&quot;avec-des-fonctions-pures&quot;&gt;&lt;a href=&quot;#avec-des-fonctions-pures&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Avec des fonctions pures&lt;/h3&gt;
&lt;p&gt;Reprenons notre code en utilisant cette fois un maximum de fonctions pures :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; popover &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Un tas de code…&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// L&apos;ensemble des modifications de l&apos;état du système sont&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// concentrées ici.&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Seule cette méthode est responsable de l&apos;insertion&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// d&apos;un élément, ce qui simplifie le debug et limite les&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// effets de bord.&lt;/span&gt;
  addQuantityText&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$$boxContainer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;$$boxContainer is not configured&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantityTextOptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      namespace&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      quantity&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $$quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;formatQuantityText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantityTextOptions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$$boxContainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Cette fonction n&apos;a pas d&apos;effet de bord.&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Elle n&apos;appelle que des fonctions pures. Elle crée et&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// retourne l&apos;objet canvas désiré, correctement configuré !&lt;/span&gt;
  formatQuantityText&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; namespace &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;namespace &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quantity &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $$quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Canvas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// implementation details hidden&lt;/span&gt;
    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; namespace
    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity
    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;color &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getQuantityTextColor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; namespace&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; $$quantity
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Cette méthode n&apos;a plus d&apos;effet de bord non plus,&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// elle se charge de renvoyer la bonne couleur en fonction&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// de la quantité en paramètre.&lt;/span&gt;
  getQuantityTextColor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; namespace&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; minQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMinQuantity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;namespace&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; minQuantity

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;green&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;red&apos;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Un tas de code…&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il n’y a pas de changement fondamental dans cette nouvelle version du code. Et pourtant, les bénéfices ne sont pas négligeables.&lt;/p&gt;
&lt;p&gt;Ce qu’on a fait :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;getQuantityTextColor()&lt;/code&gt; plutôt que &lt;code class=&quot;language-text&quot;&gt;setQuantityTextColor()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;la méthode nous retourne une couleur en fonction de la quantité passée en paramètre au lieu de modifier l’objet qu’on lui passait en paramètre auparavant&lt;/li&gt;
&lt;li&gt;les méthodes ne dépendent plus de variables en dehors de leur portée&lt;/li&gt;
&lt;li&gt;les méthodes appellent uniquement des méthodes pures&lt;/li&gt;
&lt;li&gt;on isole la création / modification de l’objet &lt;code class=&quot;language-text&quot;&gt;$$quantity&lt;/code&gt; dans &lt;code class=&quot;language-text&quot;&gt;formatQuantityText()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;on isole les modifications de l’état du système dans la seule méthode &lt;code class=&quot;language-text&quot;&gt;addQuantityText()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ainsi, nous avons supprimé les méthodes qui avaient des effets de bords. Nous avons donc &lt;strong&gt;simplifié la maintenance du code&lt;/strong&gt;. Si jamais il y a un soucis avec &lt;code class=&quot;language-text&quot;&gt;$$quantity&lt;/code&gt;, il n’y a qu’une méthode à regarder.&lt;/p&gt;
&lt;h3 id=&quot;simplification-de-linterface&quot;&gt;&lt;a href=&quot;#simplification-de-linterface&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Simplification de l’interface&lt;/h3&gt;
&lt;p&gt;Nous utilisons ici des méthodes publiques. Il serait tout à fait envisageable, voire carrément pertinent, de les rendre privées.&lt;/p&gt;
&lt;p&gt;En effet, elles n’ont pas grand chose à faire dans notre API car &lt;strong&gt;leur rôle est de simplifier l’interface&lt;/strong&gt;. Allez jeter un œil à mon article sur &lt;a href=&quot;/fr/2014/12/fonctions-privees-backbonejs&quot;&gt;les fonctions privées avec Backbone.js&lt;/a&gt; si ça vous laisse perplexe.&lt;/p&gt;
&lt;p&gt;Comme elles sont pures, les extraire est un jeu d’enfant puisqu’elles ne dépendent d’aucun contexte mais simplement des paramètres !&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getQuantityTextColor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; namespace&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; minQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMinQuantity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;namespace&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; minQuantity

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;green&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;red&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;formatQuantityText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; namespace &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;namespace &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quantity &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $$quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Canvas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// implementation details hidden&lt;/span&gt;
  $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; namespace
  $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity
  $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;color &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getQuantityTextColor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; namespace&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; $$quantity
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et du coup, plus loin dans le code :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; popover &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Un tas de code…&lt;/span&gt;

  addQuantityText&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$$boxContainer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;$$boxContainer is not configured&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantityTextOptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      namespace&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      quantity&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $$quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;formatQuantityText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantityTextOptions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$$boxContainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Un tas de code…&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;lintérêt-des-fonctions-pures&quot;&gt;&lt;a href=&quot;#lint%C3%A9r%C3%AAt-des-fonctions-pures&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;L’intérêt des fonctions pures&lt;/h2&gt;
&lt;p&gt;L’avantage d’une fonction pure, c’est qu’&lt;strong&gt;elle n’a pas d’effets de bord&lt;/strong&gt;. Elles ne modifient pas l’état du système en dehors de leur portée. Ainsi, elles simplifient et clarifient le code : quand on appelle une fonction pure, on peut se concentrer sur la valeur qu’elle retourne puisqu’on sait qu’elle ne va pas impacter le système en passant.&lt;/p&gt;
&lt;p&gt;Une fonction pure est également robuste. &lt;strong&gt;Son ordre d’exécution n’a pas d’impact sur le système&lt;/strong&gt;. Les opérations sur des fonctions pures sont donc parallélisables.&lt;/p&gt;
&lt;p&gt;De même, &lt;strong&gt;il est très simple de tester une fonction pure&lt;/strong&gt; puisqu’il n’y a pas de contexte considérer. Il suffit de se concentrer sur les entrées / sorties.&lt;/p&gt;
&lt;p&gt;Enfin, maximiser le nombre de fonctions pures &lt;strong&gt;rend le code plus simple, plus flexible&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;une-question-de-design&quot;&gt;&lt;a href=&quot;#une-question-de-design&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Une question de design&lt;/h2&gt;
&lt;p&gt;En pratique quand on fait de l’orienté-objet, on se dit que les concepts de la programmation fonctionnelle paraissent inadaptés. C’est une erreur car &lt;a href=&quot;http://blog.cleancoder.com/uncle-bob/2014/11/24/FPvsOO.html&quot;&gt;POO et FP sont parfaitement compatibles&lt;/a&gt; !&lt;/p&gt;
&lt;p&gt;En effet, l’idée ici est toute simple : &lt;strong&gt;simplifier le code en limitant le nombre de fonctions qui ont un impact sur l’état du système&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En s’efforçant à écrire un maximum de fonctions pures, en limitant le nombre de fonctions qui ne le sont pas, on se simplifie la vie !&lt;/p&gt;
&lt;p&gt;En tout cas, c’est l’idée. Et souvent, en pratique, c’est surtout une question de design, de choix entre un &lt;code class=&quot;language-text&quot;&gt;get&lt;/code&gt; et un &lt;code class=&quot;language-text&quot;&gt;set&lt;/code&gt; par exemple.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Pure functions in JavaScript]]></title><description><![CDATA[What is a pure function and why should you consider it in JavaScript?]]></description><link>https://www.nicoespeon.com/en/2015/01/pure-functions-javascript/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2015/01/pure-functions-javascript/</guid><pubDate>Sun, 25 Jan 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;whats-that-a-pure-function&quot;&gt;&lt;a href=&quot;#whats-that-a-pure-function&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What’s that a “pure” function?&lt;/h2&gt;
&lt;p&gt;A pure function &lt;strong&gt;doesn’t depend on&lt;/strong&gt; and &lt;strong&gt;doesn’t modify the states of variables out of its scope&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Concretely, that means &lt;strong&gt;a pure function always returns the same result given same parameters&lt;/strong&gt;. Its execution doesn’t depend on the state of the system.&lt;/p&gt;
&lt;p&gt;Pure functions are a pillar of &lt;a href=&quot;http://en.wikipedia.org/wiki/Functional_programming&quot;&gt;functional programming&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;give-me-examples&quot;&gt;&lt;a href=&quot;#give-me-examples&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Give me examples&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; values &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;impureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

  items&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; items&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;a &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; items&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;a
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;impureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Now `values.a` is 3, the impure function modifies it.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here we modify the attributes of the given object. Hence we modify the object which lies outside of the scope of our function: the function is impure.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; values &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

  a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// `values.a` has not been modified, it&apos;s still 1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we simply modify the parameter which is in the scope of the function, nothing is modified outside!&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; values &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;impureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;impureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Actually, the value of `c` will depend on the value of `b`.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// In a bigger codebase, you may forget about that, which may&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// surprise you because the result can vary implicitly.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here, &lt;code class=&quot;language-text&quot;&gt;b&lt;/code&gt; is not in the scope of the function. The result will depend on the context: surprises expected!&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; values &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pureFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Here it&apos;s made clear that the value of `c` will depend on&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// the value of `b`. No sneaky surprise behind your back.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;what-does-it-look-like-concretely&quot;&gt;&lt;a href=&quot;#what-does-it-look-like-concretely&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What does it look like, concretely?&lt;/h2&gt;
&lt;p&gt;Considering this code exists:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getMinQuantity&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMinQuantity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// A pure fonction which returns a number, regarding&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// the given name.&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let’s take the following code example that may exist in a lambda project:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; popover &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// A bunch of code…&lt;/span&gt;

  addQuantityText&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantityTextOptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      namespace&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      initialChildIndex&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      quantity&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;formatQuantityText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantityTextOptions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Couldn&apos;t add quantity text!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  formatQuantityText&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$$boxContainer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;$$boxContainer is not configured&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; namespace &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;namespace &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quantity &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; initialChildIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;initialChildIndex &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $$quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Canvas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// implementation details hidden&lt;/span&gt;
    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; namespace
    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setQuantityTextColor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$$boxContainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; initialChildIndex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; $$quantity
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  setQuantityTextColor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; minQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMinQuantity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; minQuantity
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; minQuantity

    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;color &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;green&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;red&apos;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// A bunch of code…&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We’ve got &lt;code class=&quot;language-text&quot;&gt;addQuantityText()&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;formatQuantityText()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;setQuantityTextColor()&lt;/code&gt; which are all impure.&lt;/p&gt;
&lt;p&gt;In our context, &lt;code class=&quot;language-text&quot;&gt;addQuantityText()&lt;/code&gt; is the method actually used when you want to “display the quantity” in our &lt;code class=&quot;language-text&quot;&gt;$$boxContainer&lt;/code&gt;. This is the entry point, dealing with implementation details. You’ll look at this method when something goes wrong with &lt;code class=&quot;language-text&quot;&gt;$$quantity&lt;/code&gt;. Which is likely to be the start of a treasure hunt — but not a funny one.&lt;/p&gt;
&lt;p&gt;The way it was written could be error-prone on the long term.&lt;/p&gt;
&lt;h3 id=&quot;when-it-gets-complicated&quot;&gt;&lt;a href=&quot;#when-it-gets-complicated&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;When it gets complicated&lt;/h3&gt;
&lt;p&gt;In this example, the execution order of functions is critical.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Just swap 2 lines and you’ll break everything&lt;/strong&gt;. It may sound obvious, but it’s much more difficult to debug:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; popover &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// A bunch of code…&lt;/span&gt;

  addQuantityText&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantityTextOptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      namespace&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      initialChildIndex&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      quantity&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;formatQuantityText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantityTextOptions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Couldn&apos;t add quantity text!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  formatQuantityText&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$$boxContainer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;$$boxContainer is not configured&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; namespace &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;namespace &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quantity &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; initialChildIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;initialChildIndex &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $$quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Canvas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// implementation details hidden&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setQuantityTextColor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; namespace
    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; $$quantity
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  setQuantityTextColor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; minQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMinQuantity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; minQuantity
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; minQuantity

    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;color &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;green&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;red&apos;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// A bunch of code…&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now there is an error in the code. Problem is: that’s hard stuff to detect!&lt;/p&gt;
&lt;p&gt;Here, &lt;code class=&quot;language-text&quot;&gt;setQuantityTextColor()&lt;/code&gt; is responsible of the color of &lt;code class=&quot;language-text&quot;&gt;$$quantity&lt;/code&gt;. And so you need to navigate through methods to catch the one which is the last which modifies the object, then reconstitute the whole flow to understand what’s going wrong.&lt;/p&gt;
&lt;p&gt;At this point you could even regret having decomposed &lt;code class=&quot;language-text&quot;&gt;formatQuantityText()&lt;/code&gt; into smaller methods to simplify implementation details.&lt;/p&gt;
&lt;p&gt;Generally speaking, that’s a lot of code that needs to be considered when you are debugging. And if you get thinking that splitting a big method into smaller ones just make the debug difficult, then the concept of &lt;strong&gt;pure function&lt;/strong&gt; is gaining interest.&lt;/p&gt;
&lt;h3 id=&quot;lets-do-that-with-pure-functions&quot;&gt;&lt;a href=&quot;#lets-do-that-with-pure-functions&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Let’s do that with pure functions&lt;/h3&gt;
&lt;p&gt;We’ll use a maximum of pure functions to rewrite our code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; popover &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// A bunch of code…&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// All the modifications of system state are grouped here.&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// This only method is responsible for the insertion of&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// an element, which makes debug simpler and limit&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// side effects.&lt;/span&gt;
  addQuantityText&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$$boxContainer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;$$boxContainer is not configured&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantityTextOptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      namespace&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      quantity&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $$quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;formatQuantityText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantityTextOptions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$$boxContainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// This method doesn&apos;t have side effects.&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// It just call other pure functions. It creates and return the&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// canvas object desired, correctly configured!&lt;/span&gt;
  formatQuantityText&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; namespace &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;namespace &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quantity &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $$quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Canvas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// implementation details hidden&lt;/span&gt;
    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; namespace
    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity
    $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;color &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getQuantityTextColor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; namespace&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; $$quantity
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// This method doesn&apos;t have side effects neither.&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// It returns the correct color, regarding the given quantity.&lt;/span&gt;
  getQuantityTextColor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; namespace&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; minQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMinQuantity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;namespace&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; minQuantity

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;green&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;red&apos;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// A bunch of code…&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There is no fundamental change in this new version. However, there are non-negligible benefits.&lt;/p&gt;
&lt;p&gt;What we did here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;getQuantityTextColor()&lt;/code&gt; instead of &lt;code class=&quot;language-text&quot;&gt;setQuantityTextColor()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;the method returns a color regarding the quantity we give to it instead of modifying the object directly, as we did before&lt;/li&gt;
&lt;li&gt;methods don’t consider variables out of their scope&lt;/li&gt;
&lt;li&gt;methods only call pure methods&lt;/li&gt;
&lt;li&gt;we isolated the creation / modification of the &lt;code class=&quot;language-text&quot;&gt;$$quantity&lt;/code&gt; object in &lt;code class=&quot;language-text&quot;&gt;formatQuantityText()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;we isolated modifications of the system state in &lt;code class=&quot;language-text&quot;&gt;addQuantityText()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Doing so, we removed methods with side effects. We just &lt;strong&gt;simplified the code maintenance&lt;/strong&gt;. If there is an issue with &lt;code class=&quot;language-text&quot;&gt;$$quantity&lt;/code&gt; to occur, there is only one method to look for.&lt;/p&gt;
&lt;h3 id=&quot;simplify-the-interface&quot;&gt;&lt;a href=&quot;#simplify-the-interface&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Simplify the interface&lt;/h3&gt;
&lt;p&gt;We used here public methods. It’d be perfectly acceptable — completely relevant — to make them private.&lt;/p&gt;
&lt;p&gt;Indeed, there don’t have much to do with our API since &lt;strong&gt;their role is to simplify the interface&lt;/strong&gt;. Have a look to my post on &lt;a href=&quot;/en/2014/12/private-methods-backbonejs&quot;&gt;private methods with Backbone.js&lt;/a&gt; if you get scratching your head with that.&lt;/p&gt;
&lt;p&gt;As they are pures, to extract them is dead easy since they don’t rely on a specific context, just parameters!&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getQuantityTextColor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; namespace&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; minQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMinQuantity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;namespace&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; minQuantity

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; hasEnoughQuantity &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;green&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;red&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;formatQuantityText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; namespace &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;namespace &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;quantity &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $$quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Canvas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// implementation details hidden&lt;/span&gt;
  $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; namespace
  $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; quantity
  $$quantity&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;color &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getQuantityTextColor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; namespace&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; $$quantity
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And then, later in the code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; popover &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// A bunch of code…&lt;/span&gt;

  addQuantityText&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$$boxContainer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;$$boxContainer is not configured&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quantityTextOptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      namespace&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;quantity&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      quantity&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $$quantity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;formatQuantityText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quantityTextOptions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$$boxContainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$$quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// A bunch of code…&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;advantages-of-pure-functions&quot;&gt;&lt;a href=&quot;#advantages-of-pure-functions&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Advantages of pure functions&lt;/h2&gt;
&lt;p&gt;The main advantage of a pure function is that &lt;strong&gt;it doesn’t have any side effect&lt;/strong&gt;. It doesn’t modify the state of the system outside of their scope. Then, they just simplify and clarify the code: when you call a pure function, you just need to focus on the return value as you know you didn’t broke anything elsewhere doing so.&lt;/p&gt;
&lt;p&gt;A pure function is also robust. &lt;strong&gt;Its order of execution doesn’t have any impact on the system&lt;/strong&gt;. Operations with pure functions could be parallelized.&lt;/p&gt;
&lt;p&gt;Also, &lt;strong&gt;it’s very easy to unit test a pure function&lt;/strong&gt; since there is no context to consider. Just focus on inputs / outputs.&lt;/p&gt;
&lt;p&gt;Finally, maximizing the use of pure functions &lt;strong&gt;makes your code simpler, more flexible&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;a-matter-of-design&quot;&gt;&lt;a href=&quot;#a-matter-of-design&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A matter of design&lt;/h2&gt;
&lt;p&gt;In practice, when you are doing object-oriented code you may think that functional programming concepts couldn’t fit in. This is simply wrong as &lt;a href=&quot;http://blog.cleancoder.com/uncle-bob/2014/11/24/FPvsOO.html&quot;&gt;OOP and FP are absolutely compatibles&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Indeed, the idea here is simple: &lt;strong&gt;simplify your code by limiting the number of functions that has an impact on the system&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you force yourself to think twice to maximize the number of pure functions in your code, you’ll probably make your maintenance / life / debug easier!&lt;/p&gt;
&lt;p&gt;Well, you’ve got the idea. Which is often, in practice, a matter of design, the choice between a &lt;code class=&quot;language-text&quot;&gt;get&lt;/code&gt; and a &lt;code class=&quot;language-text&quot;&gt;set&lt;/code&gt; for instance.&lt;/p&gt;
&lt;h2 id=&quot;further-reading&quot;&gt;&lt;a href=&quot;#further-reading&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.kompulsa.com/javascript-basics-introduction-to-functions/&quot;&gt;Introduction To Functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[POO - le switch revisité en JavaScript]]></title><description><![CDATA[En JavaScript, nous disposons d'une alternative plus orientée-objet, moins procédurale et propice aux erreurs que le bon vieux switch … case.]]></description><link>https://www.nicoespeon.com/fr/2015/01/oop-switch-revisite-en-js/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2015/01/oop-switch-revisite-en-js/</guid><pubDate>Wed, 14 Jan 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Supposons que les méthodes suivantes existent :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Hello, how are you?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;giveSomeNews&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Roses are red. Did you know that?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sayBye&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Ok bye!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;quelques-rappels-sur-le-switch&quot;&gt;&lt;a href=&quot;#quelques-rappels-sur-le-switch&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Quelques rappels sur le &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;if / else&lt;/code&gt; permet d’introduire de la logique dans notre code en créant des branches : en fonction d’une condition, nous exécuterons telle ou telle opération. Mais parfois, il y a plus de 2 branches possibles.&lt;/p&gt;
&lt;p&gt;Le réflexe initial consiste donc à ajouter des branches avec &lt;code class=&quot;language-text&quot;&gt;else if&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;patrick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;jane&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;giveSomeNews&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;sayBye&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// don&apos;t talk to strangers!&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Comme c’est un petit peu verbeux, peu lisible et encore moins élégant, on utilise alors le &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;patrick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;jane&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;giveSomeNews&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayBye&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// don&apos;t talk to strangers!&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt; est une alternative classique à un enchaînement de &lt;code class=&quot;language-text&quot;&gt;else if&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;À moins qu’il s’agisse d’opérations très petites (quelques lignes, claires et explicites), je préfère les encapsuler dans des fonctions &lt;strong&gt;explicitement nommées&lt;/strong&gt; pour décomposer la logique de l’implémentation. Le &lt;code&gt;switch&lt;/code&gt;, c’est la logique. J’utilise la même technique pour les &lt;code&gt;if / else&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La syntaxe est plus claire, mais on introduit certaines subtilités.&lt;/p&gt;
&lt;p&gt;Notamment, il faut prendre garde au concept du &lt;code class=&quot;language-text&quot;&gt;break&lt;/code&gt; introduit ici : il permet de sortir du &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt; et éviter de passer au &lt;code class=&quot;language-text&quot;&gt;case&lt;/code&gt; suivant.&lt;/p&gt;
&lt;h3 id=&quot;rappel-des-erreurs-à-éviter-&quot;&gt;&lt;a href=&quot;#rappel-des-erreurs-%C3%A0-%C3%A9viter-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Rappel des erreurs à éviter !&lt;/h3&gt;
&lt;p&gt;Lorsque l’on arrive sur un &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt;, on s’attend rarement (jamais ?) à passer à travers 2 cas différents.&lt;/p&gt;
&lt;p&gt;À l’instar du &lt;code class=&quot;language-text&quot;&gt;else if&lt;/code&gt;, on s’attend à exécuter un cas et un seul. Pour cette raison, on veille à &lt;strong&gt;ne pas oublier le &lt;code class=&quot;language-text&quot;&gt;break&lt;/code&gt;&lt;/strong&gt; !&lt;/p&gt;
&lt;p&gt;Par exemple, ce code est-il intentionnel ? Est-ce un oubli ? En tout cas, c’est une source de confusion et de bugs !&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;patrick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;jane&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;giveSomeNews&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayBye&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// don&apos;t talk to strangers!&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il existe un cas de figure où, à la limite, l’intention reste claire et qui est acceptable (et utilisée).&lt;/p&gt;
&lt;p&gt;Il s’agit de regrouper différents inputs dans un même &lt;code class=&quot;language-text&quot;&gt;case&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;patrick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;jane&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;john&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;giveSomeNews&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayBye&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// don&apos;t talk to strangers!&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bref, ne pas mettre un &lt;code class=&quot;language-text&quot;&gt;break&lt;/code&gt; à chaque &lt;code class=&quot;language-text&quot;&gt;case&lt;/code&gt; est très souvent propice aux erreurs car le code écrit comporte “une subtilité”, il a donc des chances d’être mal lu / interprété.&lt;/p&gt;
&lt;p&gt;Le jeu n’en vaut pas la chandelle, aussi je vous conseille plutôt de ne pas le faire. Après, c’est vous qui voyez mais y’en a qu’on essayé…&lt;/p&gt;
&lt;h2 id=&quot;une-alternative-orientée-objet--method-lookup&quot;&gt;&lt;a href=&quot;#une-alternative-orient%C3%A9e-objet--method-lookup&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Une alternative orientée objet : method lookup&lt;/h2&gt;
&lt;p&gt;Reprenons à présent notre exemple avec un esprit moins procédural, plus orienté-objet :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; greetings &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  patrick&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; sayHello&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  john&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; giveSomeNews&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  jane&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; giveSomeNews&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; greetings&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;function&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; greetings&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sayBye&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On peut appeler cela le &lt;strong&gt;method lookup&lt;/strong&gt; qui traduit finalement l’idée du &lt;a href=&quot;http://addyosmani.com/resources/essentialjsdesignpatterns/book/#commandpatternjavascript&quot;&gt;Command Pattern&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On utilise ici la syntaxe objet naturelle de JavaScript et la puissance de ses fonctions. Pas de &lt;code class=&quot;language-text&quot;&gt;break&lt;/code&gt; dont on doit se préoccuper. On dispose également de tous les avantages de l’objet, notamment le fait de pouvoir le surcharger facilement et ainsi dépendre d’un contexte particulier.&lt;/p&gt;
&lt;p&gt;En pratique, le method lookup est pertinent par rapport au switch si vous vous trouvez dans l’un des cas suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aurez-vous besoin d’ajouter plus de cas ? &lt;em&gt;Par exemple dans le cas de plugins&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;est-il utile de pouvoir modifier les cas en cours d’exécution ? &lt;em&gt;Par exemple pour changer d’options en fonction du contexte.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;est-il utile de log les cas qui ont été exécutés ? &lt;em&gt;Par exemple pour mettre en place un stack de undo / redo, ou un système de log.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;êtes-vous en train d’utiliser des nombres pour lister vos cas, de manière itérative ? &lt;em&gt;Par exemple &lt;code class=&quot;language-text&quot;&gt;case 1:&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;case 2:&lt;/code&gt;, etc.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;êtes-vous en train d’essayer de regrouper des cas ensembles en omettant de manière intentionnelle des &lt;code class=&quot;language-text&quot;&gt;break&lt;/code&gt; ? &lt;em&gt;Fall through = danger, le method lookup est bien plus clair.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;remarques-sur-une-version-du-switch-avancé&quot;&gt;&lt;a href=&quot;#remarques-sur-une-version-du-switch-avanc%C3%A9&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Remarques sur une version du &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt; “avancé”&lt;/h2&gt;
&lt;p&gt;Avec &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt; il est possible de tester directement une condition dans le &lt;code class=&quot;language-text&quot;&gt;case&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ainsi, en considérant que ceci existe :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isPatrick&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;patrick&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isJane&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;jane&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le code suivant fonctionne parfaitement :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isPatrick&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isJane&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;giveSomeNews&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayBye&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// don&apos;t talk to strangers!&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour plus de lisibilité, j’ai effectivement exporté les &lt;code&gt;case&lt;/code&gt; dans des fonctions qui expriment clairement l’intention afin de produire un code clair avec cette syntaxe.&lt;/p&gt;
&lt;p&gt;Vous conviendrez que la logique est à présent un poil plus complexe. Dans ce cas, il est donc judicieux de travailler à &lt;strong&gt;rendre le code plus clair&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ceci fonctionne, peut se révéler utile et n’a pas d’équivalent avec la method lookup (que je sache).&lt;/p&gt;
&lt;p&gt;Cela étant, &lt;strong&gt;prenez garde aux abus de logique&lt;/strong&gt;. Ce n’est pas parce-qu’on peut le faire, qu’on doit le faire. Veillez à garder un esprit critique sur ce que vous faîtes : est-ce vraiment nécessaire ou existe-t-il un moyen plus simple ? Peut-on trouver design plus clair pour exprimer cette logique ?&lt;/p&gt;
&lt;p&gt;Parfois on s’emporte dans des trucs “sexy”, mais un bon &lt;strong&gt;KISS&lt;/strong&gt; ne fait jamais de mal !&lt;/p&gt;
&lt;h2 id=&quot;release-the-object-oriented-kraken&quot;&gt;&lt;a href=&quot;#release-the-object-oriented-kraken&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Release the (object-oriented) Kraken!&lt;/h2&gt;
&lt;p&gt;Le &lt;em&gt;method lookup / command pattern&lt;/em&gt; est l’équivalent du &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt; dans un esprit objet. &lt;strong&gt;Il tend à encourager l’écriture d’un code flexible, bien organisé, orienté-objet&lt;/strong&gt; (et ça, c’est bien !).&lt;/p&gt;
&lt;p&gt;Si &lt;code class=&quot;language-text&quot;&gt;switch … case&lt;/code&gt; n’est pas mauvais en soi, il peut s’avérer propice aux erreurs et encourage en soi le &lt;em&gt;spaghetti code&lt;/em&gt;. Par sa nature procédurale, il peut conduire à une logique de branche complexe qui résulte souvent dans un mauvais design et donc un code peu difficile à maintenir.&lt;/p&gt;
&lt;p&gt;En fait, il n’y a pas vraiment de raison d’utiliser &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt; plutôt que son alternative quand on veut profiter de ce que JavaScript offre. Le principal, c’est de produire un code clair pour votre future-vous et les autres !&lt;/p&gt;</content:encoded></item><item><title><![CDATA[OOP - switch revisited in JavaScript]]></title><description><![CDATA[With JavaScript you get a more object-oriented, less procedural and error-prone alternative to the good 'ol switch … case.]]></description><link>https://www.nicoespeon.com/en/2015/01/oop-revisited-switch-in-js/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2015/01/oop-revisited-switch-in-js/</guid><pubDate>Wed, 14 Jan 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Suppose following methods for the rest of the post:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Hello, how are you?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;giveSomeNews&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Roses are red. Did you know that?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sayBye&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Ok bye!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;few-reminders-about-switch&quot;&gt;&lt;a href=&quot;#few-reminders-about-switch&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Few reminders about &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;if / else&lt;/code&gt; allow us to add some branching logic in our code: regarding a condition we’ll do this or that operation. But there are sometimes more than 2 possibles branches.&lt;/p&gt;
&lt;p&gt;As a beginner developer, you might be starting using &lt;code class=&quot;language-text&quot;&gt;else if&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;patrick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;jane&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;giveSomeNews&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;sayBye&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// don&apos;t talk to strangers!&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Well, that’s a bit verbose, difficult to read and not that pretty. Here comes &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;patrick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;jane&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;giveSomeNews&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayBye&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// don&apos;t talk to strangers!&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt; is the classical alternative to a long chain of &lt;code class=&quot;language-text&quot;&gt;else if&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Excepted for very short operations — few lines with clear intent — I prefer to encapsulate them in &lt;strong&gt;explicitly named&lt;/strong&gt; functions to decompose the logic from the implementation details. The logic lies in the &lt;code&gt;switch&lt;/code&gt;. I use the same technique for &lt;code&gt;if / else&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Syntax is clearer, but you’re introducing few subtleties.&lt;/p&gt;
&lt;p&gt;Most of all, you should be aware of the &lt;code class=&quot;language-text&quot;&gt;break&lt;/code&gt; concept here: it allows you to get out of the &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt; and prevent falling through the next &lt;code class=&quot;language-text&quot;&gt;case&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;remember-errors-to-avoid&quot;&gt;&lt;a href=&quot;#remember-errors-to-avoid&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Remember errors to avoid!&lt;/h3&gt;
&lt;p&gt;When you deal with a &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt;, you’re not likely to expect falling through 2 different cases.&lt;/p&gt;
&lt;p&gt;Just like &lt;code class=&quot;language-text&quot;&gt;else if&lt;/code&gt;, you probably expect to execute one and only one case. That’s why you must take care &lt;strong&gt;not to forget the &lt;code class=&quot;language-text&quot;&gt;break&lt;/code&gt;&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;Have a look at this code, is it intentional? Is it a mistake? Whatever, that’s a source of bugs and confusion!&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;patrick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;jane&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;giveSomeNews&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayBye&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// don&apos;t talk to strangers!&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There might exists a use case however, where the intent is clear and which is acceptable — and used.&lt;/p&gt;
&lt;p&gt;That’s when you want to regroup multiple inputs into the same &lt;code class=&quot;language-text&quot;&gt;case&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;patrick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;jane&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;john&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;giveSomeNews&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayBye&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// don&apos;t talk to strangers!&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To keep it short: to omit a &lt;code class=&quot;language-text&quot;&gt;break&lt;/code&gt; for each &lt;code class=&quot;language-text&quot;&gt;case&lt;/code&gt; is error-prone because you’re introducing obscure subtleties in your code. And your code is likely to get future developers into troubles.&lt;/p&gt;
&lt;p&gt;That’s why the wise advice is: avoid doing that, do remember the &lt;code class=&quot;language-text&quot;&gt;break&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;an-object-oriented-alternative-method-lookup&quot;&gt;&lt;a href=&quot;#an-object-oriented-alternative-method-lookup&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;An object-oriented alternative: method lookup&lt;/h2&gt;
&lt;p&gt;Let’s go back to our example with a less procedural spirit. Let’s get object-oriented:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; greetings &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  patrick&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; sayHello&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  john&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; giveSomeNews&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  jane&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; giveSomeNews&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; greetings&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;function&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; greetings&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sayBye&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can call that the &lt;strong&gt;method lookup&lt;/strong&gt;, which reflect the idea behind the &lt;a href=&quot;http://addyosmani.com/resources/essentialjsdesignpatterns/book/#commandpatternjavascript&quot;&gt;Command Pattern&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We use the natural object syntax of JavaScript and the power of its first-class functions. No &lt;code class=&quot;language-text&quot;&gt;break&lt;/code&gt; to deal with. We already get all the advantages of the object, as the capability to extend it with ease, allowing context-relative options.&lt;/p&gt;
&lt;p&gt;The method lookup is much more relevant than the switch if you’re in one of the following cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;will you need to add more cases later? &lt;em&gt;Dealing with plugins for instance.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;is it useful to change cases during run-time? &lt;em&gt;Like changing options regarding the context.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;is it useful to log executed cases? &lt;em&gt;To set up an undo / redo stack, a log system, etc.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;are you using incremental numbers to list your cases iteratively? &lt;em&gt;If you use &lt;code class=&quot;language-text&quot;&gt;case 1:&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;case 2:&lt;/code&gt;, etc.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;are you trying to fall through different cases by intentionally omitting some &lt;code class=&quot;language-text&quot;&gt;break&lt;/code&gt;? &lt;em&gt;Fall through = danger, method lookup is a much better alternative.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;few-remarks-on-an-advanced-version-of-switch&quot;&gt;&lt;a href=&quot;#few-remarks-on-an-advanced-version-of-switch&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Few remarks on an “advanced” version of &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Using &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt;, you can directly test a condition in your &lt;code class=&quot;language-text&quot;&gt;case&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Doing so, and considering this code exist:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isPatrick&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;patrick&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isJane&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;jane&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, the following code will perfectly work:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isPatrick&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isJane&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;giveSomeNews&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sayBye&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// don&apos;t talk to strangers!&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Again, for more readability I exported conditions into functions that make the intent clear and produce a better code.&lt;/p&gt;
&lt;p&gt;You’ll agree that the logic is now a bit more complex. In such a context, it might be relevant to polish your work &lt;strong&gt;to make your code clear&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This works and could be very useful. Plus, it doesn’t have any equivalent with the method lookup as far as I know.&lt;/p&gt;
&lt;p&gt;However, &lt;strong&gt;beware overlogic abuse in your code&lt;/strong&gt;. The fact you can do it doesn’t imply that you should. Keep a critical mind over what you’re doing: is it really necessary or is there another simpler way? Can I work on a clearer design to express the logic intent?&lt;/p&gt;
&lt;p&gt;Sometimes you might go crazy into “sexy” stuff, but nothing values most than &lt;strong&gt;KISS&lt;/strong&gt;!&lt;/p&gt;
&lt;h2 id=&quot;release-the-object-oriented-kraken&quot;&gt;&lt;a href=&quot;#release-the-object-oriented-kraken&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Release the (object-oriented) Kraken!&lt;/h2&gt;
&lt;p&gt;The &lt;em&gt;method lookup / command pattern&lt;/em&gt; is a &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt; equivalent, with an object-oriented spirit. &lt;strong&gt;It tends to encourage you to write a flexible, well-organized, object-oriented code&lt;/strong&gt; — which is good.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;switch … case&lt;/code&gt; is not a bad thing in itself. But it can be lead to &lt;em&gt;spaghetti code&lt;/em&gt; and be error-prone. Because its procedural, you may end up with a complex branching logic which finally traduce a bad code design which is difficult to maintain.&lt;/p&gt;
&lt;p&gt;Finally, there is no reason to actually use &lt;code class=&quot;language-text&quot;&gt;switch&lt;/code&gt; instead of its alternative if you want to benefit what JavaScript has to offer. But must of all, the most important is you to write a code the future-you and others won’t hate!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Fonctions privées avec Backbone.js]]></title><description><![CDATA[Pourquoi et comment faire des fonctions privées. Et concrètement, comment implémenter ça tout en utilisant Backbone.js.]]></description><link>https://www.nicoespeon.com/fr/2014/12/fonctions-privees-backbonejs/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2014/12/fonctions-privees-backbonejs/</guid><pubDate>Sun, 07 Dec 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;fonctions-privées-cest-à-dire-&quot;&gt;&lt;a href=&quot;#fonctions-priv%C3%A9es-cest-%C3%A0-dire-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Fonctions privées, c’est-à-dire ?&lt;/h2&gt;
&lt;p&gt;Pour faire simple et concis : une fonction / méthode privée est une méthode qui n’est pas exposée et ne peut donc pas être appelée “de l’extérieur”.&lt;/p&gt;
&lt;p&gt;Il s’agit donc d’une notion de &lt;strong&gt;portée&lt;/strong&gt;, ni plus ni moins.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;yolo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;privateMethod&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;can&apos;t be accessed outside of `yolo()`&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; privateVar &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// ici, on peut appeler `privateMethod` si ça nous chante.&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ici, `privateVar` vaut `true`.&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;that&apos;s all you&apos;ve got from me!&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// ici, `privateMethod` n&apos;existe pas.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ici, `privateVar` n&apos;est pas défini.&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;yolo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// affiche &quot;that&apos;s all you&apos;ve got from me!&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette notion prend tout son sens lorsqu’on utilise le &lt;em&gt;module pattern&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Pour en savoir plus sur ce point, je vous recommande cet article parmi tous les autres : &lt;a href=&quot;http://toddmotto.com/mastering-the-module-pattern&quot;&gt;Mastering the module pattern&lt;/a&gt;, simple et efficace.&lt;/p&gt;
&lt;p&gt;Et donc concrètement, ça donne ce genre de code :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MyModule &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// tout un tas de trucs encapsulés -&gt; privés si pas exposés.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;_cantTouchThis&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;I just met you!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; _nbOfCats &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// ce que l&apos;on retourne lorsque la fonction est exécutée&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// -&gt; ce qu&apos;on expose (= public).&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    nbOfRainbows&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    sayHi&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Hi!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    logNumberOfRainbows&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nbOfRainbows&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    logNumberOfCats&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_nbOfCats&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    touchThis&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Hey!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;_cantTouchThis&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ceci nous permet donc de toucher à la partie publique, &lt;strong&gt;l’interface&lt;/strong&gt;, sans pour autant avoir accès à la partie privée :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;MyModule&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nbOfRainbows &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;42&lt;/span&gt;
MyModule&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;logNumberOfRainbows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// affiche &quot;42&quot;&lt;/span&gt;
MyModule&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;logNumberOfCats&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// affiche &quot;3&quot;&lt;/span&gt;
MyModule&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;touchThis&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// affiche &quot;Hey!&quot; &quot;I just met you!&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;fonctions-privées-et-pour-quoi-faire-&quot;&gt;&lt;a href=&quot;#fonctions-priv%C3%A9es-et-pour-quoi-faire-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Fonctions privées… Et pour quoi faire ?&lt;/h2&gt;
&lt;p&gt;Question légitime. Personnellement, je vois l’intérêt d’une fonction privée ainsi :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;elle &lt;strong&gt;simplifie l’interface publique&lt;/strong&gt; en s’occupant des détails techniques d’implémentation&lt;/li&gt;
&lt;li&gt;elle &lt;strong&gt;n’a pas à être testée unitairement&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le premier point coule généralement de source. Le second point découle du premier, mais rend souvent perplexe. Je m’explique…&lt;/p&gt;
&lt;h2 id=&quot;tests-unitaires-et-fonctions-privées&quot;&gt;&lt;a href=&quot;#tests-unitaires-et-fonctions-priv%C3%A9es&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tests unitaires et fonctions privées&lt;/h2&gt;
&lt;p&gt;Pour tester notre module, on l’instancie, puis on va prendre chacune de ses méthodes et vérifier leur sortie à partir d’une entrée (variables + contexte). On teste &lt;em&gt;unitairement&lt;/em&gt; les méthodes exposées en prenant garde de faire varier l’entrée pour tester tous les cas de figure et obtenir une bonne couverture de tests.&lt;/p&gt;
&lt;p&gt;On peut d’ailleurs résumer la pratique du &lt;strong&gt;Test Driven Development&lt;/strong&gt; (TDD) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;écrire d’abord le test avec les cas de figures requis pour une fonctionnalité&lt;/li&gt;
&lt;li&gt;coder la méthode afin de passer ces tests&lt;/li&gt;
&lt;li&gt;retravailler le code à la fin pour le nettoyer. Tant que les tests passent on sait qu’on n’a rien cassé.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L’étape de &lt;em&gt;refactor&lt;/em&gt; vient en dernier car l’objectif est de produire un code qui fonctionne, puis de faire des optimisations.&lt;/p&gt;
&lt;p&gt;Pour revenir à la question des méthodes privées : elles ne sont pas exposées, donc &lt;em&gt;techniquement&lt;/em&gt; elles ne sont pas testées unitairement. Pas directement en fait.&lt;/p&gt;
&lt;h2 id=&quot;quelques-considérations-sur-les-fonctions-privées&quot;&gt;&lt;a href=&quot;#quelques-consid%C3%A9rations-sur-les-fonctions-priv%C3%A9es&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Quelques considérations sur les fonctions privées&lt;/h2&gt;
&lt;p&gt;Le point sur les tests unitaires peut laisser perplexe selon la manière dont on considère et utilise la notion de fonction privée. Je dirais qu’il y a 2 façons de voir les choses :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;je code tout en privé et j’expose que ce qui doit l’être &lt;em&gt;in fine&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;les fonctions privées sont le fruit du refactor de mes fonctions publiques&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;comment-choisir-entre-privé-et-public-&quot;&gt;&lt;a href=&quot;#comment-choisir-entre-priv%C3%A9-et-public-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Comment choisir entre privé et public ?&lt;/h3&gt;
&lt;p&gt;Si on considère que l’on fait du TDD… on développe l’interface publique &lt;strong&gt;avant&lt;/strong&gt; (puisque c’est ce que testent les tests).&lt;/p&gt;
&lt;p&gt;Personnellement, je code mes tests (qui ne passent pas), puis mon interface publique : les méthodes publiques ou les &lt;em&gt;event handlers&lt;/em&gt; (petit point là-dessus plus bas, pour ceux qui s’interrogent). Rien de privé chez moi à ce stade.&lt;/p&gt;
&lt;p&gt;Les fonctions privées proviennent de l’étape de refactor, finalement. Et puis si je n’ai pas le temps de nettoyer, au moins ça marche.&lt;/p&gt;
&lt;p&gt;Finalement, &lt;strong&gt;les tests unitaires testent l’interface publique&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Les méthodes privées sont testées à travers les méthodes publiques. On peut se dire que tester le détail de l’implémentation technique serait judicieux pour mieux debugguer, mais c’est un coût d’implémentation et de maintenance conséquent. À l’inverse, je peux ici modifier / refactor mes méthodes privées autant que je veux tant que mon module fonctionne.&lt;/p&gt;
&lt;p&gt;À choisir : autant tester plus de scénarios sur l’interface publique. La coverage indiquera si oui ou non on teste les méthodes privées en passant.&lt;/p&gt;
&lt;h3 id=&quot;le-cas-des-events-handlers&quot;&gt;&lt;a href=&quot;#le-cas-des-events-handlers&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le cas des events handlers&lt;/h3&gt;
&lt;p&gt;L’interface publique, c’est donc ce qui compte.&lt;/p&gt;
&lt;p&gt;Qu’en est-il des événements qui font réagir notre module ? Les events handlers (= &lt;code class=&quot;language-text&quot;&gt;onClick()&lt;/code&gt; &amp;#x26; co) doivent-elles être publiques pour pouvoir être testées ?&lt;/p&gt;
&lt;p&gt;En fait, non.&lt;/p&gt;
&lt;p&gt;On parle d’événements. Notre module écoute des événements et réagit en fonction. Les tests doivent donc déclencher le comportement en émettant les événements, puis en observant le résultat attendu (impact sur le système, etc.). La méthode liée peut bien être publique ou privée, ce n’est pas ce qui compte au moment où l’on teste la manière dont le module répond à l’événement.&lt;/p&gt;
&lt;h3 id=&quot;préfixer-avec-_&quot;&gt;&lt;a href=&quot;#pr%C3%A9fixer-avec-_&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Préfixer avec ”_”&lt;/h3&gt;
&lt;p&gt;Par convention (assez répandue), on préfixe les noms des méthodes / variables privées avec un &lt;code class=&quot;language-text&quot;&gt;_&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;C’est également ce que je fais pour 2 raisons :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;c’est une convention qui présente l’avantage de se démarquer. On n’a pas de &lt;code class=&quot;language-text&quot;&gt;private&lt;/code&gt; en JS, mais la plupart comprendront qu’on parle là d’une fonction “supposée” privée…&lt;/li&gt;
&lt;li&gt;cela facilite le travail de documentation automatique. Souvent, par convention, l’autocompletion considérera cette fonction comme privée et n’oubliera pas de mettre &lt;code class=&quot;language-text&quot;&gt;@private&lt;/code&gt;. Ça vaut ce que ça vaut, en tout cas ça ne coûte rien \o/&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;C’est donc personnellement une considération de &lt;strong&gt;clarté&lt;/strong&gt;. La nature &lt;em&gt;privée&lt;/em&gt; de la méthode &lt;code class=&quot;language-text&quot;&gt;_joke()&lt;/code&gt; saute plus facilement aux yeux.&lt;/p&gt;
&lt;p&gt;En revanche, il est assez commun que cette convention soit utilisée pour tenter de &lt;strong&gt;définir&lt;/strong&gt; la nature privée d’une méthode au lieu de la mettre en valeur. C’est-à-dire que l’interface publique exposée est composée de méthodes dont certaines sont préfixées avec &lt;code class=&quot;language-text&quot;&gt;_&lt;/code&gt; pour indiquer que celles-ci doivent être &lt;em&gt;considérées comme privées&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;C’est un point qui génère de nombreux débats. D’après mon expérience personnelle, c’est généralement quelque chose qui est mis en place quand on ne sait pas trop comment on fait pour véritablement mettre en place des méthodes privées. Du coup tout est public, mais on indique que certaines sont &lt;em&gt;privées par intention&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;En pratique, il est assez simple de mettre en place des méthodes privées avec le &lt;em&gt;module pattern&lt;/em&gt;. Tant qu’à faire, je conseille donc de partir du principe que tout ce qui est exposé est public. Si on souhaite qu’une fonction soit privée, alors autant l’écrire comme telle et utiliser le préfixe &lt;code class=&quot;language-text&quot;&gt;_&lt;/code&gt; simplement pour la lisibilité du code.&lt;/p&gt;
&lt;p&gt;Cela étant, à chaque projet de définir et suivre ses conventions selon ses besoins.&lt;/p&gt;
&lt;h3 id=&quot;cest-pas-dans-le-prototype-du-coup-pour-lhéritage-et-la-performance-&quot;&gt;&lt;a href=&quot;#cest-pas-dans-le-prototype-du-coup-pour-lh%C3%A9ritage-et-la-performance-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;C’est pas dans le prototype… du coup pour l’héritage et la performance ?&lt;/h3&gt;
&lt;p&gt;Effectivement, étant donné qu’elle n’est pas accessible, &lt;strong&gt;une méthode privée ne peut pas être surchargée&lt;/strong&gt;. C’est la raison pour laquelle je considère les méthodes privées comme un moyen de simplifier l’interface exposée de mon module. Si j’ai besoin du détail de l’implémentation, que je dois pouvoir y accéder en héritant ma classe, alors j’ai besoin que ce détail soit public.&lt;/p&gt;
&lt;p&gt;Là encore, le scepticisme n’est pas tellement causé la nature des méthodes privées en soi, mais plutôt à une interprétation / implémentation maladroite de celles-ci.&lt;/p&gt;
&lt;p&gt;On notera également le point sur la performance : il y aura autant de fonctions privées que d’instances de mon module, ce qui est techniquement &lt;em&gt;moins performant&lt;/em&gt;. Mais en &lt;a href=&quot;http://jsperf.com/public-vs-private-methods&quot;&gt;analysant effectivement l’impact&lt;/a&gt;, cette remarque relève de l’ordre de l’optimisation précoce dans mon utilisation des méthodes privées, pour le moment.&lt;/p&gt;
&lt;h3 id=&quot;et-comment-jaccède-à-mes-méthodes-publiques-depuis-mes-méthodes-privées-&quot;&gt;&lt;a href=&quot;#et-comment-jacc%C3%A8de-%C3%A0-mes-m%C3%A9thodes-publiques-depuis-mes-m%C3%A9thodes-priv%C3%A9es-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Et comment j’accède à mes méthodes publiques depuis mes méthodes privées ?&lt;/h3&gt;
&lt;p&gt;Ceci peut être un point de blocage.&lt;/p&gt;
&lt;p&gt;En fait, si ma fonction privée provient d’un refactor de ma méthode publique, ce n’en est plus un. Tout simplement parce-que ma méthode privée a pour rôle de simplifier l’interface publique, c’est-à-dire de &lt;strong&gt;rendre plus lisible&lt;/strong&gt; ma méthode publique.&lt;/p&gt;
&lt;p&gt;J’envisage donc la méthode privée comme un “helper” personnel du module, dont il se sert pour faire son travail. Toutes les variables dont la méthode a besoin lui son donc passées en paramètre.&lt;/p&gt;
&lt;p&gt;Ainsi, on peut simplement envisager de passer le contexte de l’interface publique à la méthode privée :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MyModule &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;_addSomeCats&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cats&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;
    context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;logNumberOfCats&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    cats&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    addSomeCats&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// En soi cela n&apos;a pas grand intérêt ici de tout envoyer&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// dans une méthode privée, mais c&apos;est pour illustrer la&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// manière dont on passe le contexte.&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;_addSomeCats&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    logNumberOfCats&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cats&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui donnera :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;MyModule&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addSomeCats&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// affiche &quot;2&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans cet exemple, le contexte est passé en paramètre.&lt;/p&gt;
&lt;p&gt;En pratique, il est possible d’utiliser &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; dans la méthode &lt;code class=&quot;language-text&quot;&gt;_addSomeCats&lt;/code&gt; et de l’appeller en lui passant le contexte avec &lt;code class=&quot;language-text&quot;&gt;.call()&lt;/code&gt; ainsi : &lt;code class=&quot;language-text&quot;&gt;_addSomeCats.call(this)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;L’exemple précédent ne présente pas un grand intérêt, mais concrètement cela peut se présenter de la manière suivante dans un projet :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MyModule &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// syntaxe alternative de `var _createViewInstance = function() { … }`.&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// on a refactor ici quelques tâches répétitives du module.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;_createViewInstance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;View&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; $parent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;View&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;No View constructor provided&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;$parent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;No $parent provided&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; view &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;View&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    view&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$parent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    view&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; view
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    onRender&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ordersView &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;_createViewInstance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;OrdersView&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#orders&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// -&gt; notre façon de log les erreurs qui peuvent subvenir&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ordersView &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// un tas d&apos;autres trucs…&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui nous amène effectivement à &lt;strong&gt;Backbone.js&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;implémentation-avec-backbonejs&quot;&gt;&lt;a href=&quot;#impl%C3%A9mentation-avec-backbonejs&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Implémentation avec Backbone.js&lt;/h2&gt;
&lt;p&gt;C’est le point qui fut pour moi la cause de cet article. En effet, après avoir assimilé le concept et bien visualisé sa mise en place avec un module, on peut rester perplexe sur la manière de l’implémenter quand on à l’habitude de ceci :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MyModule &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; Books &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  Books&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Backbone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// un peu de configuration…&lt;/span&gt;

    isPrivate&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;certainly not…&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    _intendedToBePrivate&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// le genre de méthode qui apparaît dans ce genre de situation.&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; Books
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finalement, le principe est simple : &lt;code class=&quot;language-text&quot;&gt;.extend()&lt;/code&gt; prend un objet en paramètre. Qu’à cela ne tienne, on peut lui envoyer une &lt;a href=&quot;/fr/2013/05/bien-isoler-ses-variables-en-javascript/&quot;&gt;IIFE&lt;/a&gt; qui lui retourne un objet (son API).&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MyModule &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; Books &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; ModelConfiguration &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;_actuallyPrivate&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;look &apos;ma, I&apos;m private!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// on expose la configuration.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      defaults&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        isCompleted&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

      urlRoot&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;/order&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

      isCompleted&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;_actuallyPrivate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;isCompleted&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  Books&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Backbone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ModelConfiguration&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; Books
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;pour-conclure&quot;&gt;&lt;a href=&quot;#pour-conclure&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;La question des fonctions privées et de leur intérêt fait toujours débat et peut laisser sceptique. Parfois (souvent ?), ça complique plus le schmilblick qu’autre chose. Aussi, chaque projet doit trouver midi à sa porte et adopter la position qui lui convient.&lt;/p&gt;
&lt;p&gt;En ce qui me concerne, &lt;strong&gt;je crée des méthodes privées lors de mes opérations de refactor&lt;/strong&gt;. Si la méthode est publique par nature, je la traite comme telle : pas de préfixe &lt;code class=&quot;language-text&quot;&gt;_&lt;/code&gt;, des tests unitaires. Le plus important pour moi, c’est de ne pas me leurrer avec une convention.&lt;/p&gt;
&lt;p&gt;Quoiqu’il en soit, je me suis questionné un bon moment pour comprendre comment cela pouvait se traduire en utilisant &lt;em&gt;Backbone.js&lt;/em&gt;. Et comme j’ai eu du mal à faire le déclic, je me suis fendu de cet article pour aider les prochains qui entreront dans les mêmes réflexions que j’ai pu avoir.&lt;/p&gt;
&lt;p&gt;Cela étant, c’est un point à débats et à réflexions. N’hésitez donc pas, je suis preneur de suggestions et remarques à ce sujet !&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Private methods with Backbone.js]]></title><description><![CDATA[Why and how to create private methods. How to concretely implement that while using Backbone.js.]]></description><link>https://www.nicoespeon.com/en/2014/12/private-methods-backbonejs/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2014/12/private-methods-backbonejs/</guid><pubDate>Sun, 07 Dec 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;private-method-what-is-that&quot;&gt;&lt;a href=&quot;#private-method-what-is-that&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Private method, what is that?&lt;/h2&gt;
&lt;p&gt;To keep it short: a private method is a method which is not exposed and can’t be called “from the outside”.&lt;/p&gt;
&lt;p&gt;It’s just a matter of &lt;strong&gt;scope&lt;/strong&gt; after all.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;yolo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;privateMethod&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;can&apos;t be accessed outside of `yolo()`&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; privateVar &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// here, you can call `privateMethod` if you wish to.&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// here, `privateVar` returns `true`.&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;that&apos;s all you&apos;ve got from me!&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// here, `privateMethod` doesn&apos;t even exist.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// here, `privateVar` is undefined.&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;yolo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// returns &quot;that&apos;s all you&apos;ve got from me!&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This notion makes sense with the &lt;em&gt;module pattern&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;To learn more on that subject, I’d strongly recommend this post among others: &lt;a href=&quot;http://toddmotto.com/mastering-the-module-pattern&quot;&gt;Mastering the module pattern&lt;/a&gt;, simple and efficient.&lt;/p&gt;
&lt;p&gt;Well, concretely, here’s what you’ve got:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MyModule &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// a bunch of encapsulated stuff -&gt; private if not exposed&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;_cantTouchThis&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;I just met you!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; _nbOfCats &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// what you return when the method is executed&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// -&gt; what you expose (= public).&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    nbOfRainbows&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    sayHi&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Hi!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    logNumberOfRainbows&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nbOfRainbows&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    logNumberOfCats&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_nbOfCats&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    touchThis&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Hey!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;_cantTouchThis&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This allow you to manipulate the public part — &lt;strong&gt;the interface&lt;/strong&gt; — without having access to the private part:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;MyModule&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nbOfRainbows &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;42&lt;/span&gt;
MyModule&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;logNumberOfRainbows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// returns &quot;42&quot;&lt;/span&gt;
MyModule&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;logNumberOfCats&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// returns &quot;3&quot;&lt;/span&gt;
MyModule&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;touchThis&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// returns &quot;Hey!&quot; &quot;I just met you!&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;private-methods-for-what&quot;&gt;&lt;a href=&quot;#private-methods-for-what&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Private methods… for what?&lt;/h2&gt;
&lt;p&gt;That’s a legitimate question. I personally found 2 advantages of a private method:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;it &lt;strong&gt;simplifies the public interface&lt;/strong&gt; hiding technical details of the implementation&lt;/li&gt;
&lt;li&gt;it &lt;strong&gt;doesn’t have to be unit tested&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first point is generally obvious. The second one arises from the first point, but may turn you suspicious. Let me explain…&lt;/p&gt;
&lt;h2 id=&quot;unit-tests-and-private-methods&quot;&gt;&lt;a href=&quot;#unit-tests-and-private-methods&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Unit tests and private methods&lt;/h2&gt;
&lt;p&gt;To test our module, we instantiate it, then take every single method and check the output for a given input (variable + context). We &lt;em&gt;unitly&lt;/em&gt; test the exposed method, taking care to make the input vary to test every use case and get a good test coverage.&lt;/p&gt;
&lt;p&gt;We can remind the &lt;strong&gt;Test Driven Development&lt;/strong&gt; (TDD) process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;first write the test with required use cases for our functionality&lt;/li&gt;
&lt;li&gt;then code the method, pass tests&lt;/li&gt;
&lt;li&gt;refactor code to clean the whole thing. As long as tests pass, you didn’t break anything.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;em&gt;refactor&lt;/em&gt; step is the last one because we first want to produce something that works, then focus on optimizations.&lt;/p&gt;
&lt;p&gt;Let’s get back to private methods: since they are not exposed, they are not &lt;em&gt;technically&lt;/em&gt; unit tested. In fact, not directly.&lt;/p&gt;
&lt;h2 id=&quot;some-considerations-about-private-methods&quot;&gt;&lt;a href=&quot;#some-considerations-about-private-methods&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Some considerations about private methods&lt;/h2&gt;
&lt;p&gt;The TDD point can leave you suspicious depending on the manner you consider and use the privacy notion. I think there is two ways of doing things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;first code everything as private, then expose what needs to be&lt;/li&gt;
&lt;li&gt;private methods came from public methods refactor step&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;how-to-choose-between-private-and-public&quot;&gt;&lt;a href=&quot;#how-to-choose-between-private-and-public&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to choose between private and public?&lt;/h3&gt;
&lt;p&gt;Considering you’re doing TDD… you develop the public interface &lt;strong&gt;first&lt;/strong&gt; — that’s what you’re testing after all.&lt;/p&gt;
&lt;p&gt;Personally, I code my (failing) tests, then my public interface: public methods or &lt;em&gt;event handlers&lt;/em&gt; — we’ll talk about that few lines below. Nothing private with my code at this point.&lt;/p&gt;
&lt;p&gt;Private methods appears during refactor step, at last. And if I don’t have time for that the code is working, at least.&lt;/p&gt;
&lt;p&gt;Finally, &lt;strong&gt;unit tests test the public interface&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Private methods are tested through public ones. You may think that testing the detail of technical implementation would be a great idea to ease the debug part, but this would be also a cost to implement and maintain. On the contrary, I can update / refactor private methods as long as my module is still working as expected.&lt;/p&gt;
&lt;p&gt;If I have to choose, I’d prefer to invest in testing more use case. The coverage will tell me if I actually test private methods, passing by.&lt;/p&gt;
&lt;h3 id=&quot;about-events-handlers&quot;&gt;&lt;a href=&quot;#about-events-handlers&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;About events handlers&lt;/h3&gt;
&lt;p&gt;Public interface matters.&lt;/p&gt;
&lt;p&gt;What about events that make our module react? Should event handlers (e.g. &lt;code class=&quot;language-text&quot;&gt;onClick()&lt;/code&gt; &amp;#x26; cie.) be public to be tested?&lt;/p&gt;
&lt;p&gt;Well, no.&lt;/p&gt;
&lt;p&gt;We’re talking about events. Our module is listening and reacting upon events. Tests should triggers these events and observe the expected behavior. The binded method could either be public or private, it doesn’t really matter here as we’re testing the event.&lt;/p&gt;
&lt;h3 id=&quot;prefix-with-_&quot;&gt;&lt;a href=&quot;#prefix-with-_&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Prefix with ”_”&lt;/h3&gt;
&lt;p&gt;That’s a largely adopted convention: prefix private methods / variables names with &lt;code class=&quot;language-text&quot;&gt;_&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This is also what I do for 2 reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;this is a convention which makes things clear. There is no such a thing than &lt;code class=&quot;language-text&quot;&gt;private&lt;/code&gt; in JS, but most of developers will understand the prefixed method is “supposed” private…&lt;/li&gt;
&lt;li&gt;this can ease automated documentation plugins work. If you’re lucky, the doc autocompletion will understand the method is private and won’t forget about the &lt;code class=&quot;language-text&quot;&gt;@private&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Finally, it’s about &lt;strong&gt;readability&lt;/strong&gt;. The &lt;em&gt;private&lt;/em&gt; nature of the &lt;code class=&quot;language-text&quot;&gt;_joke()&lt;/code&gt; method is explicit.&lt;/p&gt;
&lt;p&gt;However, it’s a common practice that this convention is used to try to &lt;strong&gt;define&lt;/strong&gt; the private nature of a method, instead of just make it explicit. That means the public interface is composed with methods prefixed with &lt;code class=&quot;language-text&quot;&gt;_&lt;/code&gt; to tell those should be &lt;em&gt;considered as private&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is a hot point, with a lot of debates. On my own experience, this is generally something which appears when you don’t really know how to really set up privacy. Everything is public then, but you tell some methods are &lt;em&gt;private by intention&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It’s relatively easy to introduce privacy with the &lt;em&gt;module pattern&lt;/em&gt; in fact. Then, my advice would be to consider everything that is exposed as public. If you actually want a method to be private, let’s make it actually private and use the &lt;code class=&quot;language-text&quot;&gt;_&lt;/code&gt; prefix for code readability.&lt;/p&gt;
&lt;p&gt;That said, projects should define and follow convention that fit their need.&lt;/p&gt;
&lt;h3 id=&quot;its-not-part-of-the-prototype-what-about-inheritance-and-performance&quot;&gt;&lt;a href=&quot;#its-not-part-of-the-prototype-what-about-inheritance-and-performance&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It’s not part of the prototype… what about inheritance and performance?&lt;/h3&gt;
&lt;p&gt;That’s true. As long as it is not reachable, &lt;strong&gt;a private method can’t be inherited&lt;/strong&gt;. This is basically why I consider private method as a way to simplify the exposed interface of my module. If I need the implementation detail, if I need to access it by inheritance, then I need this detail to be public.&lt;/p&gt;
&lt;p&gt;Here again, scepticism is not really caused because of the nature of private methods, but because of a clumsy interpretation / implementation of these.&lt;/p&gt;
&lt;p&gt;A note on performance: there will be as much private methods as instances of the module, which is technically &lt;em&gt;less performant&lt;/em&gt;. But, &lt;a href=&quot;http://jsperf.com/public-vs-private-methods&quot;&gt;having look the actual impact&lt;/a&gt;, I think this remark belongs to premature optimization for my current use of privacy.&lt;/p&gt;
&lt;h3 id=&quot;how-do-i-access-public-methods-from-private-ones&quot;&gt;&lt;a href=&quot;#how-do-i-access-public-methods-from-private-ones&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How do I access public methods from private ones?&lt;/h3&gt;
&lt;p&gt;That could be blocking.&lt;/p&gt;
&lt;p&gt;In fact, if my private method came from a public method refactor, this is not blocking at all. Just because my private method is meant to simplify the public interface, to make the public method &lt;strong&gt;more readable&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;From my point of view, the private method is kind of a own helper for the module, which helps him to perform its job. Every variable the method needs should be passed as parameters.&lt;/p&gt;
&lt;p&gt;Doing so, you can even pass the public interface context to the private method:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MyModule &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;_addSomeCats&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cats&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;
    context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;logNumberOfCats&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    cats&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    addSomeCats&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// This is not really useful to wrap the whole thing in&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// a private method, but that&apos;s a way to illustrate how&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// you can pass it the context.&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;_addSomeCats&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    logNumberOfCats&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cats&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Will give you:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;MyModule&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addSomeCats&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// returns &quot;2&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this example, I’m passing the context as a parameter.&lt;/p&gt;
&lt;p&gt;Actually, it’s possible to use &lt;code class=&quot;language-text&quot;&gt;this&lt;/code&gt; in the &lt;code class=&quot;language-text&quot;&gt;_addSomeCats&lt;/code&gt; method and then call it with the context bound, thanks to &lt;code class=&quot;language-text&quot;&gt;.call()&lt;/code&gt; this way: &lt;code class=&quot;language-text&quot;&gt;_addSomeCats.call( this );&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Previous example is not a such a big deal, but here’s what it could looks like in an actual project:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MyModule &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// alt. syntax for `var _createViewInstance = function() { … }`.&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// we refactor here some repetitive tasks of the module.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;_createViewInstance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;View&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; $parent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;View&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;No View constructor provided&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;$parent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;No $parent provided&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; view &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;View&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    view&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$parent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    view&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; view
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    onRender&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ordersView &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;_createViewInstance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;OrdersView&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#orders&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// -&gt; our way to log errors that would occur&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ordersView &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// a bunch of other stuff…&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which leads you directly to &lt;strong&gt;Backbone.js&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;implementation-with-backbonejs&quot;&gt;&lt;a href=&quot;#implementation-with-backbonejs&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Implementation with Backbone.js&lt;/h2&gt;
&lt;p&gt;This is the main reason for this post. After you understood the concept and mastered the way you set up actual privacy with a module, you could end up puzzled on how to implement that when you usually deal with this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MyModule &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; Books &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  Books&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Backbone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// a bit of configuration…&lt;/span&gt;

    isPrivate&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;certainly not…&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    _intendedToBePrivate&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// kind of method that would pop with this implementation.&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; Books
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally, it’s that simple: &lt;code class=&quot;language-text&quot;&gt;.extend()&lt;/code&gt; will accept an object. Alright, let’s give him an &lt;a href=&quot;/en/2013/05/properly-isolate-variables-in-javascript/&quot;&gt;IIFE&lt;/a&gt; that will return this object — its API.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; MyModule &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; Books &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; ModelConfiguration &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;_actuallyPrivate&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;look &apos;ma, I&apos;m private!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// expose the configuration.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      defaults&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        isCompleted&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

      urlRoot&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;/order&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

      isCompleted&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;_actuallyPrivate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;isCompleted&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  Books&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Backbone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ModelConfiguration&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; Books
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;last-words&quot;&gt;&lt;a href=&quot;#last-words&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Last words&lt;/h2&gt;
&lt;p&gt;Private methods in JavaScript is a subject that can feeds a lot of debates and one can remain skeptical about that. Sometimes — often? — it makes the whole thing more complex. That’s why I think every project should adopt the position that correspond the best to their needs.&lt;/p&gt;
&lt;p&gt;For my part, &lt;strong&gt;I create private methods during refactor step&lt;/strong&gt;. If the method is public by nature, I’ll treat it as such: no &lt;code class=&quot;language-text&quot;&gt;_&lt;/code&gt; prefix, unit tests. The most important thing for me is not fooling myself with a convention.&lt;/p&gt;
&lt;p&gt;However, I struggled for some time to imagine how it could work using &lt;em&gt;Backbone.js&lt;/em&gt;. As it takes me some time to work the whole thing out, here is my contribution post to help those who may enter the same reflexion I’ve had.&lt;/p&gt;
&lt;p&gt;That said, this is a subject full of debates and interesting reflexions. Don’t hesitate to share suggestions and remarks if you’re passing by!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Nettoyer son dépôt git, like a boss]]></title><description><![CDATA[Ou comment rebase proprement son dépôt pour retirer ce qui n'aurait jamais du y être commit, tout en conservant l'historique (si si, c'est possible).]]></description><link>https://www.nicoespeon.com/fr/2014/04/nettoyer-son-depot-git-like-a-boss/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2014/04/nettoyer-son-depot-git-like-a-boss/</guid><pubDate>Wed, 23 Apr 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;le-contexte&quot;&gt;&lt;a href=&quot;#le-contexte&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le contexte&lt;/h2&gt;
&lt;p&gt;Un dépôt git, à l’image du projet qu’il contient, peut avoir une vie longue et tumultueuse au cours de laquelle les conventions évoluent avec nos connaissances et notre maîtrise du schmilblick.&lt;/p&gt;
&lt;p&gt;Aussi, il se peut que ce jour arrive où vous contempliez votre projet et réalisiez qu’en fait non, ce n’était pas une si bonne idée que de versionner ces &lt;em&gt;librairies externes / fichiers compilés / vidéos et autres assets / &amp;#x3C;votre boulette ici&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Pour ma part, j’ai pas mal enchaîné les boulettes avec le temps :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;une fois, j’ai réalisé un peu tard que versionner un paquet de fichiers audio dans un projet l’alourdissait de manière indécente. 5 minutes pour faire un &lt;code class=&quot;language-text&quot;&gt;git clone&lt;/code&gt;, c’est un peu &lt;em&gt;ouate-ze-foque&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;il n’y a pas si longtemps encore, j’ai même réussit à versionner l’ensemble du dossier &lt;code class=&quot;language-text&quot;&gt;vendor/&lt;/code&gt; d’un projet s’en m’en rendre compte. Et vlan les jolies stats GitHub du projet ; difficile de suivre son activité quand on a un pic de 20.000 modifications la première semaine.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or c’est dans ce genre de cas qu’on réalise que :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;il est inutile de revert le(s) commit(s) fautif(s), ça ne supprimera pas les modifications indexées dans l’historique&lt;/li&gt;
&lt;li&gt;le projet n’est plus tout jeune, ça nous ferait mal de rebase les commits des 3 derniers mois et perdre l’auteur / la date de ceux-ci en les ré-écrivant&lt;/li&gt;
&lt;li&gt;et même que parfois on a commit ses fichiers fautifs par-ci par-là au milieu d’autres modifications d’un beau commit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un dernier cas de figure ? Suffit d’imaginer Bernard qui, s’en trop le vouloir, a commit par erreur des informations un peu confidentielles dans un fichier de conf d’environnement qui n’aurait jamais du être versionné (sisi, ça arrive).&lt;/p&gt;
&lt;p&gt;Bref, c’est dans ce genre de situation qu’on se résigne ou que l’on retourne l’Internet en quête de la commande git magique. Et ça tombe plutôt bien, parce-que c’est celle-là même que je vais vous proposer (enfin celle que je connais).&lt;/p&gt;
&lt;h2 id=&quot;magic-happens-here&quot;&gt;&lt;a href=&quot;#magic-happens-here&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Magic happens here&lt;/h2&gt;
&lt;p&gt;Admettons par exemple que je souhaite &lt;strong&gt;supprimer tous les MP3s versionnés par erreur&lt;/strong&gt; dans l’ensemble de mon projet.
Et ce, &lt;strong&gt;sans changer les auteurs des commits&lt;/strong&gt;, &lt;strong&gt;ni même les dates&lt;/strong&gt;, mais en supprimant tout de même toute trace de ces fichiers (histoire de réduire considérablement la taille de mon dépôt, par exemple).&lt;/p&gt;
&lt;p&gt;Et donc pour cela, j’ouvre mon terminal et je lance l’incantation suivante :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git filter-branch -f --tree-filter &amp;quot;rm -rf \*.mp3&amp;quot; --prune-empty -- --all&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui me permet donc, en partant de ce genre d’historique :&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-f7e1d.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 86.06965174129354%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAABYlAAAWJQFJUiTwAAACfUlEQVQ4y2VUXU/UQBTt/3/20V9gfFACApKQgEGJuyCaiLsua8AXcD/bbmem03bmeD/a3aJNTu7HTG/PnXumyWA4w2rlwI+xQGEIBZBvAOc0tlbRX2c/NFHei2rkSY7ffMCfx4UEddmgthVqVwuacmc7dOuNb9pCkWzcFk3GL18ge/ilUUG0llQ8TxWbDEjXZHMgozgjf7Wk3Irom5Zd3FJkP9nfG2I+yyRRlhGuhIBbstRy6Z/Dec3zcXi/azW2RZPzszFubm6FelVFKhqkcAfOebLeK/5di72WhaGldg4/7mEw+aSDaTYoo4GLBYFsMPDRwYZC8mW0kjchF7hgO45acLVY4+rHZ1yPB5J2tUUVPHwot+C4g29KlI0TP0QeTJAzjC2S9TLF5egSV9OhzoWYEAdi4UCvwjIjspQR3wi4gxJxy60nmwW1PNk/xMPRiWbmNMUVT5QmnhdqGWmuMdusFeo6RVzQfkJMM8QmIFlmOUbnZ5heXEi9wAukXgGpOdK4//M3hVoec10jVpVYbj1Z5EvcvT/G79NT1dNirrpLWYebnQbl+mTqr1diuVBsW+6QvH51jen9HKaiA6cPFe0VM041J3osVXemvYq8x/U02H+Syc9HfB/d4u5+LAnraRT0ZV9XKGtPvldbtzmO2/UqdPCoY61TdkWGk8EBhtNL1WHIRIOsORs3W3DOiwY7PapWec0E0i7pMZCEkr23X/Dt60TZmYiCjszQcTnbglr0fAXJLx3vUctr7Bs6Zkv7q/YIkncHV5jNUgnkmvkduphtH/1cTb+whhCCjiU5Ohzh6Ul/Ds5FGGJpbZSvc6w59W3LSv6Hhgk8HwiL5C+RuiU02PAD0AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Dépôt git sale&quot;
        title=&quot;&quot;
        src=&quot;/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-c83f1.png&quot;
        srcset=&quot;/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-569e3.png 240w,
/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-93400.png 480w,
/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-c83f1.png 960w,
/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-f7e1d.png 1206w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;De me retrouver avec un dépôt propre comme un sous neuf :&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-f7e1d.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 86.06965174129354%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAABYlAAAWJQFJUiTwAAACfUlEQVQ4y2VUXU/UQBTt/3/20V9gfFACApKQgEGJuyCaiLsua8AXcD/bbmem03bmeD/a3aJNTu7HTG/PnXumyWA4w2rlwI+xQGEIBZBvAOc0tlbRX2c/NFHei2rkSY7ffMCfx4UEddmgthVqVwuacmc7dOuNb9pCkWzcFk3GL18ge/ilUUG0llQ8TxWbDEjXZHMgozgjf7Wk3Irom5Zd3FJkP9nfG2I+yyRRlhGuhIBbstRy6Z/Dec3zcXi/azW2RZPzszFubm6FelVFKhqkcAfOebLeK/5di72WhaGldg4/7mEw+aSDaTYoo4GLBYFsMPDRwYZC8mW0kjchF7hgO45acLVY4+rHZ1yPB5J2tUUVPHwot+C4g29KlI0TP0QeTJAzjC2S9TLF5egSV9OhzoWYEAdi4UCvwjIjspQR3wi4gxJxy60nmwW1PNk/xMPRiWbmNMUVT5QmnhdqGWmuMdusFeo6RVzQfkJMM8QmIFlmOUbnZ5heXEi9wAukXgGpOdK4//M3hVoec10jVpVYbj1Z5EvcvT/G79NT1dNirrpLWYebnQbl+mTqr1diuVBsW+6QvH51jen9HKaiA6cPFe0VM041J3osVXemvYq8x/U02H+Syc9HfB/d4u5+LAnraRT0ZV9XKGtPvldbtzmO2/UqdPCoY61TdkWGk8EBhtNL1WHIRIOsORs3W3DOiwY7PapWec0E0i7pMZCEkr23X/Dt60TZmYiCjszQcTnbglr0fAXJLx3vUctr7Bs6Zkv7q/YIkncHV5jNUgnkmvkduphtH/1cTb+whhCCjiU5Ohzh6Ul/Ds5FGGJpbZSvc6w59W3LSv6Hhgk8HwiL5C+RuiU02PAD0AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Dépôt git propre&quot;
        title=&quot;&quot;
        src=&quot;/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-c83f1.png&quot;
        srcset=&quot;/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-569e3.png 240w,
/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-93400.png 480w,
/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-c83f1.png 960w,
/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-f7e1d.png 1206w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;Les dates de commit sont conservées, les auteurs aussi, ce qui ne serait pas le cas avec un rebase classique. Toutefois, l’historique est &lt;strong&gt;bel et bien ré-écrit&lt;/strong&gt; : les SHA1 des commits qui ont été modifiés sont différents.&lt;/p&gt;
&lt;h2 id=&quot;cest-sorcellerie-&quot;&gt;&lt;a href=&quot;#cest-sorcellerie-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;C’est sorcellerie !?&lt;/h2&gt;
&lt;p&gt;Voyons un peu ce que ce que cache cette loooongue commande magico-magique.&lt;/p&gt;
&lt;h3 id=&quot;git-filter-branch&quot;&gt;&lt;a href=&quot;#git-filter-branch&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;git filter-branch&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;La commande &lt;code class=&quot;language-text&quot;&gt;filter-branch&lt;/code&gt; de git permet de ré-écrire un grand nombre de commits de manière scriptable. Autrement
dit, c’est ce qui va permettre de ré-écrire complètement l’historique en fonction des paramètres que nous allons
passer ensuite.&lt;/p&gt;
&lt;h3 id=&quot;-f&quot;&gt;&lt;a href=&quot;#-f&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;-f&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;L’option &lt;code class=&quot;language-text&quot;&gt;-f&lt;/code&gt; permet de forcer le démarrage de &lt;code class=&quot;language-text&quot;&gt;git filter-branch&lt;/code&gt; si jamais il y a déjà un dossier temporaire &lt;code class=&quot;language-text&quot;&gt;refs/original/&lt;/code&gt; pré-existant. Git s’en sert pour faire une sauvegarde de l’historique avant de partir à l’aventure.&lt;/p&gt;
&lt;p&gt;Le &lt;code class=&quot;language-text&quot;&gt;-f&lt;/code&gt; n’est donc pas obligatoire mais si le backup ne peut pas être créé, git vous dira de relancer la commande avec cette option.&lt;/p&gt;
&lt;h3 id=&quot;--tree-filter-shell-command&quot;&gt;&lt;a href=&quot;#--tree-filter-shell-command&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;--tree-filter &amp;quot;&amp;lt;shell command&amp;gt;&amp;quot;&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Cette option va vous permettre de passer en revue chacun de vos commits et d’y exécuter la commande que vous aurez passé en paramètre.&lt;/p&gt;
&lt;p&gt;Pour ma part, j’ai utilisé &lt;code class=&quot;language-text&quot;&gt;rm -rf *.mp3&lt;/code&gt; pour m’assurer de bien supprimer l’ensemble des fichiers MP3s qui pouvaient être versionnés. Dans un tel cas, il faut s’assurer de forcer la commande (d’où le &lt;code class=&quot;language-text&quot;&gt;-rf&lt;/code&gt;) car le nettoyage s’arrête s’il y a une erreur à base de &lt;em&gt;fichier-mp3-non-trouvé-dans-ce-commit&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - Au cas où vous ne voudriez pas vraiment supprimer les fichiers mais juste les retirer de l’historique git, préférez l’utilisation de la commande &lt;code&gt;—index-filter “git rm -rf —cached —ignore-unmatch *.mp3”&lt;/code&gt; à la place.&lt;/p&gt;
&lt;h3 id=&quot;--prune-empty&quot;&gt;&lt;a href=&quot;#--prune-empty&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;--prune-empty&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;On s’assure de bien supprimer les commits qui seraient éventuellement vides, une fois l’historique nettoyé.&lt;/p&gt;
&lt;h3 id=&quot;-----all&quot;&gt;&lt;a href=&quot;#-----all&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;-- --all&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Le premier &lt;code class=&quot;language-text&quot;&gt;--&lt;/code&gt; permet de distinguer &lt;code class=&quot;language-text&quot;&gt;--all&lt;/code&gt; comme une options supplémentaire, et non pas un paramètre de &lt;code class=&quot;language-text&quot;&gt;--prune-empty&lt;/code&gt;. Et donc cela permet de dire à git de réaliser son opération sur toutes les branches de l’historique.&lt;/p&gt;
&lt;h2 id=&quot;le-mot-de-la-fin&quot;&gt;&lt;a href=&quot;#le-mot-de-la-fin&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le mot de la fin&lt;/h2&gt;
&lt;p&gt;Si vous travaillez à plusieurs sur le projet, n’oubliez pas que &lt;strong&gt;ré-écrire l’historique, c’est pas anodin&lt;/strong&gt; (et ce,
peu importe la méthode). Du coup, si vous êtes amené à faire ce genre de manipulation pour le bien du dépôt,
le plus simple reste pour les autres de re-cloner le nouveau dépôt tout propre, tout simplement.&lt;/p&gt;
&lt;p&gt;Et si vous craigniez que votre manipulation ne fonctionne pas comme prévu, clonez simplement le dépôt quelque part avant de faire votre tambouille et vous pourrez toujours le récupérer si jamais ça ne se passe pas bien.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - Une bonne idée serait de faire ce genre d’opérations dans un branche à part. Si le résultat est convaincant, alors il n’y aura plus qu’à faire un reset hard de &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; sur cette branche.&lt;/p&gt;
&lt;p&gt;Voilà, en espérant que ça puisse vous dépanner… mais que vous n’ayez pas à vous en servir trop souvent !&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Clean your git repo, like a boss]]></title><description><![CDATA[How to properly rebase your repo, removing what should never have been in there without broking your history.]]></description><link>https://www.nicoespeon.com/en/2014/04/clean-git-repo-like-a-boss/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2014/04/clean-git-repo-like-a-boss/</guid><pubDate>Wed, 23 Apr 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;the-context&quot;&gt;&lt;a href=&quot;#the-context&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The context&lt;/h2&gt;
&lt;p&gt;The life of a git repo could last and change a lot. Conventions often move with our knowledge and mastering of that stuff.&lt;/p&gt;
&lt;p&gt;And there comes the day where you look at your project and realize that it wasn’t such a good idea to commit those &lt;em&gt;external libraries / compiled outputs / videos and other media / &amp;#x3C;your error here&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I personally did a bunch of mistakes with git:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;one day I realized a bit late that if you commit a lot of audio files in your project, then you’ll make it grow insanely. 5 minutes to perform a simple &lt;code class=&quot;language-text&quot;&gt;git clone&lt;/code&gt; is waaaaaay toooo looooooong.&lt;/li&gt;
&lt;li&gt;few time ago, I even managed to commit the whole &lt;code class=&quot;language-text&quot;&gt;vendor/&lt;/code&gt; folder of a project by mistake. It didn’t play well with the nice GitHub stats of the project. That’s a tough job to follow the activity of the team when there is a 20.000 updates peak on the very first week.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And then you realize that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;it’s pointless to revert the faulty commit(s), it won’t remove the indexed modifications from the history&lt;/li&gt;
&lt;li&gt;the project may not be young, it’d be sad to rebase and re-write every commits from the last 3 months and loose information such as the author / the date&lt;/li&gt;
&lt;li&gt;and even sometimes you’ll have your faulty files committed with other fixes and killer-features&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Need another use case? Just think about Bernard who committed confidential information in a environment config file which should never have been versioned -have you heard about a guy called Murphy?.&lt;/p&gt;
&lt;p&gt;Now you can figure out that situation when you open the Internet, searching for the magic git command. Here you go, this is precisely what’s this post about -at least, the magic command I know.&lt;/p&gt;
&lt;h2 id=&quot;magic-happens-here&quot;&gt;&lt;a href=&quot;#magic-happens-here&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Magic happens here&lt;/h2&gt;
&lt;p&gt;Let’s say I would like to &lt;strong&gt;remove every MP3 files committed by mistake&lt;/strong&gt; from a whole project. Plus, &lt;strong&gt;I don’t want to change the author of each commit, neither the date&lt;/strong&gt; - but still I want to remove all trace from those files in the history to reduce the size of my repo.&lt;/p&gt;
&lt;p&gt;To do so, I mystically wave my hand in the air and write the following incantation with the other:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git filter-branch -f --tree-filter &amp;quot;rm -rf \*.mp3&amp;quot; --prune-empty -- --all&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which would transform this history:&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-f7e1d.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 86.06965174129354%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAABYlAAAWJQFJUiTwAAACfUlEQVQ4y2VUXU/UQBTt/3/20V9gfFACApKQgEGJuyCaiLsua8AXcD/bbmem03bmeD/a3aJNTu7HTG/PnXumyWA4w2rlwI+xQGEIBZBvAOc0tlbRX2c/NFHei2rkSY7ffMCfx4UEddmgthVqVwuacmc7dOuNb9pCkWzcFk3GL18ge/ilUUG0llQ8TxWbDEjXZHMgozgjf7Wk3Irom5Zd3FJkP9nfG2I+yyRRlhGuhIBbstRy6Z/Dec3zcXi/azW2RZPzszFubm6FelVFKhqkcAfOebLeK/5di72WhaGldg4/7mEw+aSDaTYoo4GLBYFsMPDRwYZC8mW0kjchF7hgO45acLVY4+rHZ1yPB5J2tUUVPHwot+C4g29KlI0TP0QeTJAzjC2S9TLF5egSV9OhzoWYEAdi4UCvwjIjspQR3wi4gxJxy60nmwW1PNk/xMPRiWbmNMUVT5QmnhdqGWmuMdusFeo6RVzQfkJMM8QmIFlmOUbnZ5heXEi9wAukXgGpOdK4//M3hVoec10jVpVYbj1Z5EvcvT/G79NT1dNirrpLWYebnQbl+mTqr1diuVBsW+6QvH51jen9HKaiA6cPFe0VM041J3osVXemvYq8x/U02H+Syc9HfB/d4u5+LAnraRT0ZV9XKGtPvldbtzmO2/UqdPCoY61TdkWGk8EBhtNL1WHIRIOsORs3W3DOiwY7PapWec0E0i7pMZCEkr23X/Dt60TZmYiCjszQcTnbglr0fAXJLx3vUctr7Bs6Zkv7q/YIkncHV5jNUgnkmvkduphtH/1cTb+whhCCjiU5Ohzh6Ul/Ds5FGGJpbZSvc6w59W3LSv6Hhgk8HwiL5C+RuiU02PAD0AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Dirty git repository&quot;
        title=&quot;&quot;
        src=&quot;/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-c83f1.png&quot;
        srcset=&quot;/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-569e3.png 240w,
/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-93400.png 480w,
/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-c83f1.png 960w,
/static/dirty-repo-9bc37cbec88d16d9268d1ef41cee0eca-f7e1d.png 1206w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;Into this clean and shiny one:&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/clean-repo-01ac1cdb9ead771b8a6e8c336e5f821b-c2c2d.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 69.04376012965965%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB7UlEQVQ4y21U227TQBD1//8JvMEDRPQFJIQSpWpLoQ2NWqEAIiENaRLvzd71DHPZtdMWSycznt2dnDM74+p0usL7e4P8eAdoDaChV0bwiNZyXMG+c/hoHUCO9rYavT3D5XIrL00D6D1gCIPl2LEt4HWOpcSZQBIC/VSvX33G2/lSEjpi6JgFwRq1zILZFduzzeuxLQyVYrVZ/8XRxzc4X81UdmewAYcBrID9Fjz5LscHeDC032LbNX3Sarfd4+lsgpOrT8oyUpIuHKGhA23vMwL5Ci/JEqQh4cPmAaffxji9GUvQxFo2+s5lS0yz78jnuE01umSIedZ79FSH3QGn12OcXCtDG40cLmwK09Bb/98YI9IfVD8Xv/Dy7gKvFpcqOWVGVLcmQ5KQbSHkWoYcd8KYz5RaVi9fnOHibou+pgDV1tV0MXyD3GdusN6qz2vmQEpoXxvwueTt5oAX83ORLQxbYpeajICeEAQkP7VHawq9JC1DhIjV6vcST8YjvF3fSINywbVlnMhwnbYGg2XKJZW2yXHX1bKvhYYb+wvOvv5QdhZECqPI9Lm5C0qzOzs0eL3XcqRIkk/eneOf9e7Z6D0dt6ejx1PFNkbAjvqv60D78MP77zTLe01YNvKYMaOgKL7PLH35aJBN6fGl/AOJVz3TV6aILwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Clean git repository&quot;
        title=&quot;&quot;
        src=&quot;/static/clean-repo-01ac1cdb9ead771b8a6e8c336e5f821b-c83f1.png&quot;
        srcset=&quot;/static/clean-repo-01ac1cdb9ead771b8a6e8c336e5f821b-569e3.png 240w,
/static/clean-repo-01ac1cdb9ead771b8a6e8c336e5f821b-93400.png 480w,
/static/clean-repo-01ac1cdb9ead771b8a6e8c336e5f821b-c83f1.png 960w,
/static/clean-repo-01ac1cdb9ead771b8a6e8c336e5f821b-c2c2d.png 1234w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;Dates and authors are still there, which wouldn’t have been true with a classic rebase. Still, the history &lt;strong&gt;has been rewritten&lt;/strong&gt;: SHA1 of commits which have been rewritten are different.&lt;/p&gt;
&lt;h2 id=&quot;its-a-kind-of-magic&quot;&gt;&lt;a href=&quot;#its-a-kind-of-magic&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It’s a kind of magic&lt;/h2&gt;
&lt;p&gt;Let’s see what is this looooong mystical command about.&lt;/p&gt;
&lt;h3 id=&quot;git-filter-branch&quot;&gt;&lt;a href=&quot;#git-filter-branch&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;git filter-branch&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;filter-branch&lt;/code&gt; command will rewrite a large number of commit in a scriptable way. In other words, it will rewrite the history regarding the options you give.&lt;/p&gt;
&lt;h3 id=&quot;-f&quot;&gt;&lt;a href=&quot;#-f&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;-f&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;-f&lt;/code&gt; option forces &lt;code class=&quot;language-text&quot;&gt;git filter-branch&lt;/code&gt; to start even if there is an existing temporary &lt;code class=&quot;language-text&quot;&gt;refs/original/&lt;/code&gt; directory already. Git will use this directory to perform some backup before going further.&lt;/p&gt;
&lt;p&gt;It’s not mandatory then, but if the backup can’t be created, git will tell you to use it anyway.&lt;/p&gt;
&lt;h3 id=&quot;--tree-filter-shell-command&quot;&gt;&lt;a href=&quot;#--tree-filter-shell-command&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;--tree-filter &amp;quot;&amp;lt;shell command&amp;gt;&amp;quot;&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;This option will check every commit of your tree and execute the given shell command.&lt;/p&gt;
&lt;p&gt;I previously used &lt;code class=&quot;language-text&quot;&gt;rm -rf *.mp3&lt;/code&gt; to ensure there will not be any MP3 file surviving this operation. In this case, I needed to ensure the command is forced -this is for the &lt;code class=&quot;language-text&quot;&gt;-rf&lt;/code&gt; part- so the cleaning won’t stop if there is an error because of &lt;em&gt;no-mp3-file-in-this-commit&lt;/em&gt; reason.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - In case you don’t want to actually delete these files but just remove them from the git history, prefer to perform a &lt;code&gt;—index-filter “git rm -rf —cached —ignore-unmatch *.mp3”&lt;/code&gt; instead.&lt;/p&gt;
&lt;h3 id=&quot;--prune-empty&quot;&gt;&lt;a href=&quot;#--prune-empty&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;--prune-empty&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;We prune any commit that would eventually be empty after we cleaned the history.&lt;/p&gt;
&lt;h3 id=&quot;-----all&quot;&gt;&lt;a href=&quot;#-----all&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;-- --all&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The first &lt;code class=&quot;language-text&quot;&gt;--&lt;/code&gt; will ensure we don’t consider &lt;code class=&quot;language-text&quot;&gt;--all&lt;/code&gt; as a parameter for &lt;code class=&quot;language-text&quot;&gt;--prune-empty&lt;/code&gt;, but as another option. And so git will consider every branches of the history to perform the cleaning here.&lt;/p&gt;
&lt;h2 id=&quot;final-words&quot;&gt;&lt;a href=&quot;#final-words&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final words&lt;/h2&gt;
&lt;p&gt;If you’re many to work on the project, please remember that &lt;strong&gt;rewrite the history is not a genuine action&lt;/strong&gt;, whatever the method you use. Then, if you really need to do that kind of manipulation, it will be easier for you colleagues to simply clone the new shiny repo.&lt;/p&gt;
&lt;p&gt;If you fear that your manipulation won’t work as expected, just clone the repo somewhere else before doing your stuff. So you’d be able to get it back in case something is going wrong.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - A good idea is to perform that kind of operations in another branch. If you’re satisfied with the result, just reset hard the &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; branch onto this one and you’re all set.&lt;/p&gt;
&lt;p&gt;Here you go. I hope that could help you… but that you won’t need to use it too often!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Un blog multilingue avec Jekyll 1.5]]></title><description><![CDATA[Retour sur la réalisation d'un blog multilingue avec Jekyll, après upgrade à la v1.5.1.]]></description><link>https://www.nicoespeon.com/fr/2014/04/blog-multilingue-avec-jekyll-1-5/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2014/04/blog-multilingue-avec-jekyll-1-5/</guid><pubDate>Sat, 05 Apr 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;note-sur-la-compatibilité&quot;&gt;&lt;a href=&quot;#note-sur-la-compatibilit%C3%A9&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Note sur la compatibilité&lt;/h2&gt;
&lt;p&gt;Ce qui suit se base sur l’utilisation de Jekyll &lt;code class=&quot;language-text&quot;&gt;v1.5.1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ce post fait suite à &lt;a href=&quot;/fr/2013/05faire-blog-multilingue-avec-jekyll&quot;&gt;celui de Mai 2013&lt;/a&gt; où je vous faisais mon retour d’expérience sur la création d’un blog en plusieurs langue. Depuis Jekyll a (sérieusement) monté en versions et voici les correctifs à apporter en ce sens.&lt;/p&gt;
&lt;h2 id=&quot;petit-rappels-sur-jekyll&quot;&gt;&lt;a href=&quot;#petit-rappels-sur-jekyll&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Petit rappels sur Jekyll&lt;/h2&gt;
&lt;p&gt;Après bientôt une année d’utilisation (quoiqu’ayant écrit peu d’articles ces derniers mois), voilà ce que je retiens de Jekyll :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;c’est la solution la plus simple pour réaliser un site web front-end avec le confort de la compilation (templates, plugins, etc.). Bien entendu, le fait que GitHub le prenne en charge nativement joue beaucoup en ce sens.&lt;/li&gt;
&lt;li&gt;il bénéficie des avantages et inconvénients de Ruby on Rails (la beauté du langage, la prise de tête de la montée en versions)&lt;/li&gt;
&lt;li&gt;écrire ses articles en Markdown, c’est vraiment pratique&lt;/li&gt;
&lt;li&gt;si le fonctionnement standard ne nous convient pas, libre à nous de le surcharger avec nos propres plugins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En revanche, si vous élaborez vous-même vos plugins, il vous faudra compiler tout d’abord votre site pour envoyer la version statique sur GitHub.&lt;/p&gt;
&lt;h2 id=&quot;speaking-français-ze-retour&quot;&gt;&lt;a href=&quot;#speaking-fran%C3%A7ais-ze-retour&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Speaking Français, ze retour&lt;/h2&gt;
&lt;p&gt;Pour rappel, voici à quoi ressemble l’architecture de mon blog :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
|-- _data/ # Stock de variables et configuration
|-- _includes/ # Bouts de codes inclus ailleurs
|-- _layouts/ # Templates du site
|-- _plugins/ # Plugins pour surcharger de Jekyll
|-- assets/ # LESS/CSS, JS, images, …
|-- fr/ # Categorie FR
| |-- _posts/ # Articles en français
| |-- index.html # Pages html en français
| |-- about.html
| |-- (…)
|
|-- en/ # Catégorie EN
| |-- _posts/ # Articles en anglais
|
|-- index.html # Pages html par défaut (EN)
|-- about.html
|-- (…)
|-- _config.yml # Fichier de configuration de Jekyll&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Lorsqu’il est lancé, Jekyll génère le site statique final dans le dossier &lt;code class=&quot;language-text&quot;&gt;_site/&lt;/code&gt;. C’est cette version qui est envoyée (et servie) sur GitHub.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - J’ai retiré de &lt;code&gt;_config.yml&lt;/code&gt; les variables qui dépendent de la langue et que je réutilise dans les templates.&lt;/p&gt;
&lt;p&gt;Elles sont désormais isolées proprement dans le fichier &lt;code&gt;_data/locales.yml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Naturellement, mettre à jour Jekyll de la &lt;code class=&quot;language-text&quot;&gt;v0.12&lt;/code&gt; à la &lt;code class=&quot;language-text&quot;&gt;v1.5&lt;/code&gt; a nécessité quelques arrangements dans le fichier &lt;code class=&quot;language-text&quot;&gt;config.yml&lt;/code&gt;, histoire de retirer ce qui était deprecié et ajouter ce qui manquait.&lt;/p&gt;
&lt;p&gt;Egalement, il a fallu toucher aux plugins…&lt;/p&gt;
&lt;h2 id=&quot;les-plugins-ce-qui-a-changé&quot;&gt;&lt;a href=&quot;#les-plugins-ce-qui-a-chang%C3%A9&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Les plugins, ce qui a changé&lt;/h2&gt;
&lt;h3 id=&quot;1-pagination-par-catégorie&quot;&gt;&lt;a href=&quot;#1-pagination-par-cat%C3%A9gorie&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Pagination par catégorie&lt;/h3&gt;
&lt;p&gt;C’est LE plugin qu’il a fallu modifier, le fonctionnement de la pagination ayant radicalement changé avec Jekyll.&lt;/p&gt;
&lt;p&gt;N’ayant rien trouvé de convaincant, j’ai ré-écrit mon propre plugin &lt;a href=&quot;https://gist.github.com/nicoespeon/9964343&quot;&gt;category_pagination.rb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ajoutez-le simplement à votre dossier &lt;code class=&quot;language-text&quot;&gt;_plugins/&lt;/code&gt;, puis configurez votre &lt;code class=&quot;language-text&quot;&gt;config.yml&lt;/code&gt; en fonction du comportement attendu :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;paginate_per_category: true&lt;/code&gt; si vous souhaitez activer le plugin&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;default_category: &amp;quot;en&amp;quot;&lt;/code&gt; &lt;em&gt;(optionnel)&lt;/em&gt; si vous souhaitez que la pagination à la racine du projet ne prenne pas en compte tous les posts, mais uniquement ceux d’une catégorie&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le plugin fonctionne très simplement :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;si je cherche à paginer à l’intérieur d’une catégorie (aka dossier),&lt;/li&gt;
&lt;li&gt;la pagination ne considèrera que les posts de cette catégorie,&lt;/li&gt;
&lt;li&gt;je peux définir une catégorie par défaut pour les fichiers qui se trouvent à la racine si je le souhaite (sinon, ça pagine tout).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Je vous laisse jeter un oeil à &lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/fr/index.html&quot;&gt;fr/index.html&lt;/a&gt; si besoin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - C’est un premier jet qui peut aussi servir de pagination par catégorie de manière assez simpliste et orientée. N’hésitez pas à proposer des améliorations =)&lt;/p&gt;
&lt;h3 id=&quot;2-filtre-i18n&quot;&gt;&lt;a href=&quot;#2-filtre-i18n&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Filtre i18n&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/_plugins/i18n_filter.rb&quot;&gt;i18n_filter.rb&lt;/a&gt; customise le traitement de &lt;code class=&quot;language-text&quot;&gt;page.date&lt;/code&gt; en fonction de la langue.&lt;/p&gt;
&lt;p&gt;J’ai du ajouter un fichier &lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/_locales/fr.yml&quot;&gt;_locales/fr.yml&lt;/a&gt; afin de créer la fonction &lt;code class=&quot;language-text&quot;&gt;localize&lt;/code&gt;. Elle fonctionne de la même manière que &lt;code class=&quot;language-text&quot;&gt;date&lt;/code&gt; mais renvoie le format français de la date.&lt;/p&gt;
&lt;h2 id=&quot;et-voilà-&quot;&gt;&lt;a href=&quot;#et-voil%C3%A0-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Et voilà !&lt;/h2&gt;
&lt;p&gt;Rien d’autre n’a vraiment changé, juste ces correctifs à apporter et le tour est joué. Si vous avez des suggestions, remarques ou soucis avec tout ça, faîtes-le moi savoir.&lt;/p&gt;
&lt;p&gt;Plop !&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Multilingual blog with Jekyll 1.5]]></title><description><![CDATA[What changed with Jekyll v1.5.1 if you want to build a multilingual blog.]]></description><link>https://www.nicoespeon.com/en/2014/04/multilingual-blog-with-jekyll-1-5/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2014/04/multilingual-blog-with-jekyll-1-5/</guid><pubDate>Sat, 05 Apr 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;note-on-compatibility&quot;&gt;&lt;a href=&quot;#note-on-compatibility&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Note on compatibility&lt;/h2&gt;
&lt;p&gt;This post considers you’re using Jekyll &lt;code class=&quot;language-text&quot;&gt;v1.5.1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It’s an extension to &lt;a href=&quot;/en/2013/04/building-a-multinlingual-jekyll-blog&quot;&gt;my previous post from April 2013&lt;/a&gt; in which I explained how I managed to build this English-French blog. There have been a bunch of new versions of Jekyll since. I’ll explain here how to change the previous implementation accordingly.&lt;/p&gt;
&lt;h2 id=&quot;few-reminders-about-jekyll&quot;&gt;&lt;a href=&quot;#few-reminders-about-jekyll&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Few reminders about Jekyll&lt;/h2&gt;
&lt;p&gt;After almost one year using it - even though I didn’t write that much post these months - here is what I could take from Jekyll:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;this is the simplest solution to build a front-end website with the ease of compilation (templates, plugins, etc.). The fact that GitHub takes in charge the compilation helps that point of view, for sure&lt;/li&gt;
&lt;li&gt;it takes advantages and inconveniences from Ruby on Rails - the beauty of the language, the nightmare of the version upgrade&lt;/li&gt;
&lt;li&gt;writing posts in Markdown is a no-brainer&lt;/li&gt;
&lt;li&gt;if standard behavior doesn’t fit our needs, we could also override it with our own plugins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Keep in mind that if you’re using plugins, you should compile the website by yourself before sending the static version to GitHub.&lt;/p&gt;
&lt;h2 id=&quot;speaking-français-ze-retour&quot;&gt;&lt;a href=&quot;#speaking-fran%C3%A7ais-ze-retour&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Speaking Français, ze retour&lt;/h2&gt;
&lt;p&gt;As a reminder, here is my blog architecture:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
|-- _data/ # Variables and configuration
|-- _includes/ # Partials included in other files
|-- _layouts/ # Templates of the website
|-- _plugins/ # Plugins to override Jekyll workflow
|-- assets/ # LESS/CSS, JS, images, …
|-- fr/ # French category
| |-- _posts/ # French posts
| |-- index.html # French html files
| |-- about.html
| |-- (…)
|
|-- en/ # English category
| |-- _posts/ # English posts
|
|-- index.html # Default html files (EN)
|-- about.html
|-- (…)
|-- _config.yml # Jekyll configuration file&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Jekyll compile sources and will output them into &lt;code class=&quot;language-text&quot;&gt;_site/&lt;/code&gt; folder. This version is sent to GitHub.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - I removed from &lt;code&gt;_config.yml&lt;/code&gt; language-dependent variables that I can use in my templates…&lt;/p&gt;
&lt;p&gt;They are now properly isolated into the &lt;code&gt;_data/locales.yml&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;For sure, upgrading Jekyll from &lt;code class=&quot;language-text&quot;&gt;v0.12&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;v1.5&lt;/code&gt; leads to some modifications of the &lt;code class=&quot;language-text&quot;&gt;config.yml&lt;/code&gt; file in order to remove what was deprecated and add what was necessary.&lt;/p&gt;
&lt;p&gt;Then come plugins…&lt;/p&gt;
&lt;h2 id=&quot;plugins-what-has-changed-here&quot;&gt;&lt;a href=&quot;#plugins-what-has-changed-here&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Plugins, what has changed here&lt;/h2&gt;
&lt;h4 id=&quot;1-per-category-pagination&quot;&gt;&lt;a href=&quot;#1-per-category-pagination&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Per-category pagination&lt;/h4&gt;
&lt;p&gt;This is THE plugin that needed to be changed as Jekyll pagination workflow changed completely.&lt;/p&gt;
&lt;p&gt;I didn’t find anything convincing enough, so I wrote my own &lt;a href=&quot;https://gist.github.com/nicoespeon/9964343&quot;&gt;category_pagination.rb&lt;/a&gt; plugin.&lt;/p&gt;
&lt;p&gt;Just add it to your &lt;code class=&quot;language-text&quot;&gt;_plugins/&lt;/code&gt; folder, then configure your &lt;code class=&quot;language-text&quot;&gt;config.yml&lt;/code&gt; regarding your needs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;paginate_per_category: true&lt;/code&gt; if you wish to activate the plugin&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;default_category: &amp;quot;en&amp;quot;&lt;/code&gt; &lt;em&gt;(optional)&lt;/em&gt; if you wish the root pagination to be the one of a specific category&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The plugin is pretty straightforward:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;if I want to paginate a category (aka folder),&lt;/li&gt;
&lt;li&gt;pagination will only consider posts from this category,&lt;/li&gt;
&lt;li&gt;I can define a default category for files that are at the root of the project (otherwise I’d paginate everything).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can have a look to the &lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/fr/index.html&quot;&gt;fr/index.html&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - This is a first draw that could be used as a simple - and opiniated - per-category pagination. Don’t hesitate to suggest improvements =)&lt;/p&gt;
&lt;h4 id=&quot;2-i18n-filter&quot;&gt;&lt;a href=&quot;#2-i18n-filter&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. I18n filter&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/_plugins/i18n_filter.rb&quot;&gt;i18n_filter.rb&lt;/a&gt; customize the treatment of &lt;code class=&quot;language-text&quot;&gt;page.date&lt;/code&gt; variable, regarding the language.&lt;/p&gt;
&lt;p&gt;I’ve had to add a &lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/_locales/fr.yml&quot;&gt;_locales/fr.yml&lt;/a&gt; file in order to create the &lt;code class=&quot;language-text&quot;&gt;localize&lt;/code&gt; function. It works just like the &lt;code class=&quot;language-text&quot;&gt;date&lt;/code&gt; method, but output the french format for the date.&lt;/p&gt;
&lt;h2 id=&quot;et-voilà&quot;&gt;&lt;a href=&quot;#et-voil%C3%A0&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Et voilà!&lt;/h2&gt;
&lt;p&gt;Nothing has really changed, just few corrections to set and it’s done. If you have any suggestion, remark or issue with that, just drop me a line.&lt;/p&gt;
&lt;p&gt;Plop!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Gitgraph.js]]></title><description><![CDATA[Une bibliothèque JavaScript, des arbres git, des modélisations de workflows… et un peu de Georges Michael.]]></description><link>https://www.nicoespeon.com/fr/2013/11/gitgraphjs/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2013/11/gitgraphjs/</guid><pubDate>Sun, 03 Nov 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;le-problème&quot;&gt;&lt;a href=&quot;#le-probl%C3%A8me&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le problème&lt;/h2&gt;
&lt;p&gt;Il y a quelques temps je rédigeais un article sur &lt;a href=&quot;/fr/2013/08/quel-git-workflow-pour-mon-projet&quot;&gt;les workflows git&lt;/a&gt;. Pour illustrer mes propos, je souhaitais m’appuyer sur une représentation visuelle de ces workflows.&lt;/p&gt;
&lt;p&gt;Or, si le git-flow propose déjà une illustration sympathique et claire, il n’y a rien de tel pour le GitHub flow par exemple.&lt;/p&gt;
&lt;p&gt;Par chance, &lt;a href=&quot;https://twitter.com/nvie&quot;&gt;@nvie&lt;/a&gt; donne &lt;a href=&quot;http://github.com/downloads/nvie/gitflow/Git-branching-model-src.key.zip&quot;&gt;la source de son illustration&lt;/a&gt;. Par chance aussi, j’ai Keynote. J’ai donc pu créer, à la main, ma seconde illustration, pour ensuite l’exporter afin d’obtenir une image à insérer dans mon article.&lt;/p&gt;
&lt;p&gt;Si l’opération n’était pas très complexe, pour peu d’avoir les logiciels adéquats, elle n’en reste pas moins frustrante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;et si je veux apporter une petite modification à mon illustration ?&lt;/li&gt;
&lt;li&gt;et si je veux changer le style de mon dessin ?&lt;/li&gt;
&lt;li&gt;et si je veux rendre le graphe interactif ?&lt;/li&gt;
&lt;li&gt;et si je veux apprendre le saxophone ?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;la-solution&quot;&gt;&lt;a href=&quot;#la-solution&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;La solution&lt;/h2&gt;
&lt;p&gt;L’idée était donc de trouver une petite bibliothèque JavaScript qui aurait permis de dessiner à la volée des graphes pour illustrer des workflows git (ou équivalents).&lt;/p&gt;
&lt;p&gt;N’ayant rien trouvé de convaincant, &lt;a href=&quot;https://twitter.com/fabien0102&quot;&gt;@fabien0102&lt;/a&gt; et moi avons décidé de la développer : &lt;strong&gt;GitGraph.js&lt;/strong&gt; !&lt;/p&gt;
&lt;p&gt;Les &lt;em&gt;guidelines&lt;/em&gt; sont les suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;API simple et intuitive&lt;/li&gt;
&lt;li&gt;flexibilité et robustesse du résultat&lt;/li&gt;
&lt;li&gt;rendu customisable à souhait&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le projet est passé à un état standard satisfaisant pour répondre à nos premiers besoins. Nous avons donc sorti la &lt;code class=&quot;language-text&quot;&gt;v1.0.0&lt;/code&gt; (et promis, on suivra scrupuleusement &lt;a href=&quot;http://semver.org/&quot;&gt;Semver&lt;/a&gt; !).&lt;/p&gt;
&lt;h3 id=&quot;installation&quot;&gt;&lt;a href=&quot;#installation&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Installation&lt;/h3&gt;
&lt;p&gt;Plusieurs solutions sont à votre disposition :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;soit en téléchargeant &lt;a href=&quot;https://github.com/nicoespeon/gitgraph.js/releases&quot;&gt;l’une des dernières releases&lt;/a&gt; sur GitHub&lt;/li&gt;
&lt;li&gt;soit en passant par &lt;a href=&quot;http://bower.io&quot;&gt;Bower&lt;/a&gt; avec &lt;code class=&quot;language-text&quot;&gt;bower install gitgraph.js&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;mise-en-place&quot;&gt;&lt;a href=&quot;#mise-en-place&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Mise en place&lt;/h3&gt;
&lt;p&gt;Le process d’installation est assez simple.&lt;/p&gt;
&lt;p&gt;Commencez par ajouter le JavaScript (de préférence avant le &lt;code class=&quot;language-text&quot;&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;) :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/javascript&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;js/gitgraph.min.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis le CSS (de préférence avant le &lt;code class=&quot;language-text&quot;&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;) :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;css/gitgraph.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Enfin, préparez un ou plusieurs &lt;code class=&quot;language-text&quot;&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt;, identifiés pour &lt;strong&gt;GitGraph.js&lt;/strong&gt; :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;canvas&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;my-first-gitgraph&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;canvas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- un peu de HTML ici (…) --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;canvas&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;another-graph-here&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;canvas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;C’est bon, vous êtes prêts, &lt;em&gt;yapuka&lt;/em&gt; dessiner !&lt;/p&gt;
&lt;h3 id=&quot;utilisation---quelques-exemples&quot;&gt;&lt;a href=&quot;#utilisation---quelques-exemples&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Utilisation - Quelques exemples&lt;/h3&gt;
&lt;p&gt;L’utilisation de la bibliothèque est assez simple : il suffit de créer un nouveau GitGraph pour un canvas ciblé, puis de dessiner le graphe souhaité.&lt;/p&gt;
&lt;p&gt;Un certain nombre de paramètres sont personnalisables à la création, à savoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le template désiré : &lt;code class=&quot;language-text&quot;&gt;&amp;quot;blackarrow&amp;quot;&lt;/code&gt; ou &lt;code class=&quot;language-text&quot;&gt;&amp;quot;metro&amp;quot;&lt;/code&gt; (par défaut)&lt;/li&gt;
&lt;li&gt;l’orientation du graphe : &lt;code class=&quot;language-text&quot;&gt;&amp;quot;vertical-reverse&amp;quot;&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;&amp;quot;horizontal&amp;quot;&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;&amp;quot;horizontal-reverse&amp;quot;&lt;/code&gt; ou bien &lt;code class=&quot;language-text&quot;&gt;&amp;quot;vertical&amp;quot;&lt;/code&gt; (par défaut)&lt;/li&gt;
&lt;li&gt;le mode d’affichage : &lt;code class=&quot;language-text&quot;&gt;&amp;quot;compact&amp;quot;&lt;/code&gt; pour masquer les messages de commit, ou &lt;code class=&quot;language-text&quot;&gt;&amp;quot;extended&amp;quot;&lt;/code&gt; (par défaut, affichage &lt;code class=&quot;language-text&quot;&gt;&amp;quot;vertical&amp;quot;&lt;/code&gt; seulement pour le moment)&lt;/li&gt;
&lt;li&gt;l’ID du canvas ciblé (&lt;code class=&quot;language-text&quot;&gt;&amp;quot;gitGraph&amp;quot;&lt;/code&gt; par défaut)&lt;/li&gt;
&lt;li&gt;l’auteur par défaut pour les commits&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On crée donc un nouveau graphe très simplement ainsi :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; monGitGraph &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GitGraph&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  elementId&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;mon-canvas&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis on peut créer des branches :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; master &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; monGitGraph&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;master&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Faire quelques commits :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;monGitGraph
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 3 commits sur HEAD&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Créer une nouvelle branche et committer dessus :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; develop &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; monGitGraph&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;develop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Ce commit sera sur `develop`&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et faire ce que l’on veut d’ailleurs :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Une nouvelle branche `feature` depuis `develop`&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; myFeature &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;myFeature&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Un commit customisé&lt;/span&gt;
myFeature&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  dotColor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;white&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  dotSize&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  dotStrokeWidth&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  sha1&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;666&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Pimp dat commit&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  author&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Jacky &amp;lt;prince@dutunning.com&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Et on ferme la feature dans `develop`&lt;/span&gt;
myFeature&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;develop&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Epic merge commit&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Si on ne va plus committer dessus, on peut complètement supprimer la branche&lt;/span&gt;
myFeature&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L’idée est que la bibliothèque &lt;strong&gt;s’adapte aux usages&lt;/strong&gt; afin de rester intuitive.&lt;/p&gt;
&lt;p&gt;Il reste encore pas mal de fonctionnalités à implémenter et de petits bugs à corriger. Mais si vous vous en servez, n’hésitez pas à nous faire remonter soucis ou suggestions =)&lt;/p&gt;
&lt;h3 id=&quot;utilisation---le-résultat&quot;&gt;&lt;a href=&quot;#utilisation---le-r%C3%A9sultat&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Utilisation - Le résultat&lt;/h3&gt;
&lt;p&gt;Voyons donc quelques exemples d’utilisation basiques que l’on peut mettre en place actuellement avec la bibliothèque.&lt;/p&gt;
&lt;p&gt;Ce JavaScript :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; blackarrowSolution &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GitGraph&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  elementId&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;blackarrow-solution&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  orientation&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;vertical&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  template&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;blackarrow&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  author&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Nicolas Carlo &amp;lt;nicolascarlo.espeon@gmail.com&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; master &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; blackarrowSolution&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;master&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
blackarrowSolution
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;This is a commit&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;And here&apos;s another one!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; develop &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; master&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;develop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;My first commit on develop.&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; feature &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;feature&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
feature
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;This is a mandatory feature&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Meawhile, we commit on develop…&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
feature&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;develop&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Merged into develop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
feature&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Add some commit here…&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;master&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Here we merge!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
master&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Produira le résultat suivant :&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/blackarrow-e57adf8c360e8e4cad3fb300f16eed93-2489a.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 58.241758241758234%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABmUlEQVQoz51TWW/TYBDM//9DIA5R2gfUIlLSClJV9KVKX0gPVPu7j2Fn14nNK5ZGs55dj3d8rK42v7Hfj7CjI0XAOSAKhyAs8H7m4K0/jjZzOHo3Xn14f4Xd7nESxTCZEVkRFzyBRrwBuRSgNTMkVieftnh4eD5uGGOXTYSD1URKc62QXhB4Z9xa12t1w7dvrrG7f9GT1qpt6Cwa4d2MGP4F+1EwDsAwQG+2Gl4LPp+f4snt1TSVhFAionCqWThbTa4HLWnNOYIat9TINPlxv8HH83e6deoRvo2IzSP2YJCa+kEL5EZ2Muu0Z5FlQ9rW2nF5coG7s409ySFLnipZCvoota/oTp4+4U3X+lV6nE3t+LZ1Q58Cbr//xPZ0rWIdIlqQGKGg+TyD5wqp49QL1uui91xnw+23a9ycXf6foTP0NBlm+Zju1jf4xcj8pv4kiyRgfMbujO+pTfGX0YdpTm6ihhfbL1jfftXtQvEy644PfonckuqpxcWLsXlq/DHU8HHc49nZ38KL2CRYL1F6nnRyOs7azbIa/gVQNaXwvZgVsQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Template blackarrow&quot;
        title=&quot;&quot;
        src=&quot;/static/blackarrow-e57adf8c360e8e4cad3fb300f16eed93-c83f1.png&quot;
        srcset=&quot;/static/blackarrow-e57adf8c360e8e4cad3fb300f16eed93-569e3.png 240w,
/static/blackarrow-e57adf8c360e8e4cad3fb300f16eed93-93400.png 480w,
/static/blackarrow-e57adf8c360e8e4cad3fb300f16eed93-c83f1.png 960w,
/static/blackarrow-e57adf8c360e8e4cad3fb300f16eed93-2489a.png 1274w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;Tandis que ce code :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; metroSolution &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GitGraph&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  elementId&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;metro-solution&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  orientation&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;horizontal&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; master &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; metroSolution&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;master&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
metroSolution
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; develop &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; master&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;develop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;master&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Here we merge!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
master&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Donnera ce graphe :&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/metro-75c5cc62d8e9c234c383d26f8144abe0-2489a.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 18.36734693877551%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA00lEQVQY032MTUvDQBiE8989+QcELx49eOxZBKlF0q6BEKGmQsjXxhq3sMmaNAE3jxsPIoIODO8wvM94ZVkyDANVVVHXNcdjT5plmLZhdFm3hta805j5Guw4kDtGKUXXdWTzr+u11kgp8YQQzKNBEBBFEVmeIzZrzq7vEdsd3WvFvsg5yAJdlVwsAxa3K56ftqRpiu/7JElCHMeEYYjHHzqMlvPHktOHlNVLw+Vuz8k64c7l/+RZa/npyfnDeZbqB65iSdH2LAvFTfb21f9mvtlp4hN+dytMcuZzqgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Template metro&quot;
        title=&quot;&quot;
        src=&quot;/static/metro-75c5cc62d8e9c234c383d26f8144abe0-c83f1.png&quot;
        srcset=&quot;/static/metro-75c5cc62d8e9c234c383d26f8144abe0-569e3.png 240w,
/static/metro-75c5cc62d8e9c234c383d26f8144abe0-93400.png 480w,
/static/metro-75c5cc62d8e9c234c383d26f8144abe0-c83f1.png 960w,
/static/metro-75c5cc62d8e9c234c383d26f8144abe0-2489a.png 1274w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;h2 id=&quot;le-projet&quot;&gt;&lt;a href=&quot;#le-projet&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le projet&lt;/h2&gt;
&lt;p&gt;&lt;span class=&quot;icon-github&quot;&gt; &lt;/span&gt; Le projet est open-source, disponible sur GitHub : &lt;a href=&quot;https://github.com/nicoespeon/gitgraph.js&quot;&gt;https://github.com/nicoespeon/gitgraph.js&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;N’hésitez pas à &lt;a href=&quot;https://github.com/nicoespeon/gitgraph.js/issues/new&quot;&gt;ajouter une issue&lt;/a&gt; pour toute remarque / suggestion / correction à apporter au projet, voir à y contribuer. &lt;a href=&quot;http://gitgraphjs.com/docs/&quot;&gt;La documentation technique du code&lt;/a&gt; est également disponible. Une documentation plus fonctionnelle est également envisagée, avec le support d’exemples concrets.&lt;/p&gt;
&lt;p&gt;Le projet est publié sous license MIT, &lt;a href=&quot;http://choosealicense.com/licenses/mit/&quot;&gt;simple et permissif&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En attendant, vous pouvez toujours allez jeter un oeil au site pour plus d’informations sur la prise en main de la bibliothèque : &lt;a href=&quot;http://gitgraphjs.com&quot;&gt;gitgraphjs.com&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;hey-mais-et-le-sax-dans-tout-ça-&quot;&gt;&lt;a href=&quot;#hey-mais-et-le-sax-dans-tout-%C3%A7a-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hey mais et le sax dans tout ça ?&lt;/h2&gt;
&lt;p&gt;Ma foi il n’y a qu’à demander, sur ce je vous laisse sur un petit air de Georges Michael \o/&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube.com/embed/GaoLU6zKaws?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot; style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&amp;nbsp;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;</content:encoded></item><item><title><![CDATA[Gitgraph.js]]></title><description><![CDATA[A JavaScript library, git trees, workflows modelisation… and a bit of Georges Michael.]]></description><link>https://www.nicoespeon.com/en/2013/11/gitgraphjs/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2013/11/gitgraphjs/</guid><pubDate>Sun, 03 Nov 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;the-problem&quot;&gt;&lt;a href=&quot;#the-problem&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The problem&lt;/h2&gt;
&lt;p&gt;Few time ago I was writing a post about &lt;a href=&quot;/en/2013/08/which-git-workflow-for-my-project&quot;&gt;git workflows&lt;/a&gt;. I wish I could use some illustration to explicit my thoughts at this time.&lt;/p&gt;
&lt;p&gt;The git-flow already provided a nice illustration of the big picture for this workflow. But the GitHub flow didn’t.&lt;/p&gt;
&lt;p&gt;Hopefully, &lt;a href=&quot;https://twitter.com/nvie&quot;&gt;@nvie&lt;/a&gt; gave &lt;a href=&quot;http://github.com/downloads/nvie/gitflow/Git-branching-model-src.key.zip&quot;&gt;its Keynote source&lt;/a&gt; and, hopefully, I’ve got Keynote. Therefore I designed the second illustration myself, exported it and then get an image to insert in my post.&lt;/p&gt;
&lt;p&gt;It was not a difficult operation, as long as you get the correct tools. But this is frustrating:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what if I want to do a little update?&lt;/li&gt;
&lt;li&gt;what if I want to change the whole design?&lt;/li&gt;
&lt;li&gt;what if I want to add some interaction?&lt;/li&gt;
&lt;li&gt;what if I want to learn saxophone?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-solution&quot;&gt;&lt;a href=&quot;#the-solution&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The solution&lt;/h2&gt;
&lt;p&gt;I wish I could find a nice little JavaScript library to design on-the-go graphs to illustrate my git worflows.&lt;/p&gt;
&lt;p&gt;But, as we didn’t find anything convincing enough, &lt;a href=&quot;https://twitter.com/fabien0102&quot;&gt;@fabien0102&lt;/a&gt; and I decided to develop our own solution : &lt;strong&gt;GitGraph.js&lt;/strong&gt; !&lt;/p&gt;
&lt;p&gt;Our guidelines are the following :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;simple and intuitive API&lt;/li&gt;
&lt;li&gt;flexibility and robustness of the result output&lt;/li&gt;
&lt;li&gt;customisable design&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The project reached a convincing state, stable enough to meet our first requirements. And so we released &lt;code class=&quot;language-text&quot;&gt;v1.0.0&lt;/code&gt; and we’ll scrupulously follow &lt;a href=&quot;http://semver.org/&quot;&gt;Semver&lt;/a&gt;, promise!.&lt;/p&gt;
&lt;h3 id=&quot;installation&quot;&gt;&lt;a href=&quot;#installation&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Installation&lt;/h3&gt;
&lt;p&gt;Different solutions are available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;you can either download &lt;a href=&quot;https://github.com/nicoespeon/gitgraph.js/releases&quot;&gt;one of the latest releases&lt;/a&gt; sur GitHub&lt;/li&gt;
&lt;li&gt;you can either use &lt;a href=&quot;http://bower.io&quot;&gt;Bower&lt;/a&gt; with &lt;code class=&quot;language-text&quot;&gt;bower install gitgraph.js&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;setting-up&quot;&gt;&lt;a href=&quot;#setting-up&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up&lt;/h3&gt;
&lt;p&gt;The set up process is dead easy.&lt;/p&gt;
&lt;p&gt;Start adding the JavaScript (preferably before &lt;code class=&quot;language-text&quot;&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;) :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/javascript&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;js/gitgraph.min.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then add the CSS (preferably before &lt;code class=&quot;language-text&quot;&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;) :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;css/gitgraph.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, prepare some &lt;code class=&quot;language-text&quot;&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt;, identified for &lt;strong&gt;GitGraph.js&lt;/strong&gt; use :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- some HTML here (…) --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;canvas&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;another-graph-here&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;canvas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here we go!&lt;/p&gt;
&lt;h3 id=&quot;usage---some-examples&quot;&gt;&lt;a href=&quot;#usage---some-examples&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Usage - Some examples&lt;/h3&gt;
&lt;p&gt;Using the library is straightforward : you just need to create a new GitGraph for each canvas, then to draw the desired graph.&lt;/p&gt;
&lt;p&gt;Some parameters are customisable when you create your graph:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the desired template: &lt;code class=&quot;language-text&quot;&gt;&amp;quot;blackarrow&amp;quot;&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;&amp;quot;metro&amp;quot;&lt;/code&gt; (default)&lt;/li&gt;
&lt;li&gt;the graph orientation: &lt;code class=&quot;language-text&quot;&gt;&amp;quot;vertical-reverse&amp;quot;&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;&amp;quot;horizontal&amp;quot;&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;&amp;quot;horizontal-reverse&amp;quot;&lt;/code&gt; or even &lt;code class=&quot;language-text&quot;&gt;&amp;quot;vertical&amp;quot;&lt;/code&gt; (default)&lt;/li&gt;
&lt;li&gt;the display mode: &lt;code class=&quot;language-text&quot;&gt;&amp;quot;compact&amp;quot;&lt;/code&gt; to hide commit messages, or &lt;code class=&quot;language-text&quot;&gt;&amp;quot;extended&amp;quot;&lt;/code&gt; (default, only with a &lt;code class=&quot;language-text&quot;&gt;&amp;quot;vertical&amp;quot;&lt;/code&gt; display for now)&lt;/li&gt;
&lt;li&gt;the targetted canvas ID (&lt;code class=&quot;language-text&quot;&gt;&amp;quot;gitGraph&amp;quot;&lt;/code&gt; is the default)&lt;/li&gt;
&lt;li&gt;A default author for commits messages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And so we create our very first graph this way:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; myGitGraph &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GitGraph&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  elementId&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;my-canvas&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then we add some branches:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; master &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; myGitGraph&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;master&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A bunch of commits:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;myGitGraph
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 3 commits upon HEAD&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let’s create a new branch and add few commits:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; develop &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; myGitGraph&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;develop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// This commit will be on `develop`&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let’s do whatever we want:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// A new `feature` branch from `develop`&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; myFeature &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;myFeature&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// A custom commit&lt;/span&gt;
myFeature&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  dotColor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;white&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  dotSize&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  dotStrokeWidth&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  sha1&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;666&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  message&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Pimp dat commit&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  author&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Jacky &amp;lt;mailto:prince@dutunning.com&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Merge our feature branch back into `develop`&lt;/span&gt;
myFeature&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;develop&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Epic merge commit&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Well we don&apos;t want to use it again, let&apos;s delete the old feature branch now&lt;/span&gt;
myFeature&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The idea is to &lt;strong&gt;adapt the library to your needs&lt;/strong&gt; so it could be intuitive.&lt;/p&gt;
&lt;p&gt;There is still a lot of features to implement and bugs to correct. Please give us some feedbacks if you try it, that would be awesome =)&lt;/p&gt;
&lt;h3 id=&quot;usage---the-result&quot;&gt;&lt;a href=&quot;#usage---the-result&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Usage - The result&lt;/h3&gt;
&lt;p&gt;Here are some basic use cases that could already be answered with the library.&lt;/p&gt;
&lt;p&gt;This JavaScript:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; blackarrowSolution &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GitGraph&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  elementId&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;blackarrow-solution&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  orientation&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;vertical&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  template&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;blackarrow&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  author&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Nicolas Carlo &amp;lt;mailto:nicolascarlo.espeon@gmail.com&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; master &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; blackarrowSolution&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;master&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
blackarrowSolution
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;This is a commit&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;And here&apos;s another one!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; develop &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; master&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;develop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;My first commit on develop.&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; feature &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;feature&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
feature
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;This is a mandatory feature&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Meawhile, we commit on develop…&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
feature&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;develop&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Merged into develop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
feature&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Add some commit here…&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;master&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Here we merge!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
master&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Will produce the following output:&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/blackarrow-e57adf8c360e8e4cad3fb300f16eed93-2489a.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 58.241758241758234%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAABmUlEQVQoz51TWW/TYBDM//9DIA5R2gfUIlLSClJV9KVKX0gPVPu7j2Fn14nNK5ZGs55dj3d8rK42v7Hfj7CjI0XAOSAKhyAs8H7m4K0/jjZzOHo3Xn14f4Xd7nESxTCZEVkRFzyBRrwBuRSgNTMkVieftnh4eD5uGGOXTYSD1URKc62QXhB4Z9xa12t1w7dvrrG7f9GT1qpt6Cwa4d2MGP4F+1EwDsAwQG+2Gl4LPp+f4snt1TSVhFAionCqWThbTa4HLWnNOYIat9TINPlxv8HH83e6deoRvo2IzSP2YJCa+kEL5EZ2Muu0Z5FlQ9rW2nF5coG7s409ySFLnipZCvoota/oTp4+4U3X+lV6nE3t+LZ1Q58Cbr//xPZ0rWIdIlqQGKGg+TyD5wqp49QL1uui91xnw+23a9ycXf6foTP0NBlm+Zju1jf4xcj8pv4kiyRgfMbujO+pTfGX0YdpTm6ihhfbL1jfftXtQvEy644PfonckuqpxcWLsXlq/DHU8HHc49nZ38KL2CRYL1F6nnRyOs7azbIa/gVQNaXwvZgVsQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Blackarrow template result&quot;
        title=&quot;&quot;
        src=&quot;/static/blackarrow-e57adf8c360e8e4cad3fb300f16eed93-c83f1.png&quot;
        srcset=&quot;/static/blackarrow-e57adf8c360e8e4cad3fb300f16eed93-569e3.png 240w,
/static/blackarrow-e57adf8c360e8e4cad3fb300f16eed93-93400.png 480w,
/static/blackarrow-e57adf8c360e8e4cad3fb300f16eed93-c83f1.png 960w,
/static/blackarrow-e57adf8c360e8e4cad3fb300f16eed93-2489a.png 1274w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;While this code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; metroSolution &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GitGraph&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  elementId&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;metro-solution&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  orientation&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;horizontal&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; master &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; metroSolution&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;master&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
metroSolution
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; develop &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; master&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;branch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;develop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

develop&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;master&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Here we merge!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
master&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Will output this graph:&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/metro-75c5cc62d8e9c234c383d26f8144abe0-2489a.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 18.36734693877551%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA00lEQVQY032MTUvDQBiE8989+QcELx49eOxZBKlF0q6BEKGmQsjXxhq3sMmaNAE3jxsPIoIODO8wvM94ZVkyDANVVVHXNcdjT5plmLZhdFm3hta805j5Guw4kDtGKUXXdWTzr+u11kgp8YQQzKNBEBBFEVmeIzZrzq7vEdsd3WvFvsg5yAJdlVwsAxa3K56ftqRpiu/7JElCHMeEYYjHHzqMlvPHktOHlNVLw+Vuz8k64c7l/+RZa/npyfnDeZbqB65iSdH2LAvFTfb21f9mvtlp4hN+dytMcuZzqgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Metro template result&quot;
        title=&quot;&quot;
        src=&quot;/static/metro-75c5cc62d8e9c234c383d26f8144abe0-c83f1.png&quot;
        srcset=&quot;/static/metro-75c5cc62d8e9c234c383d26f8144abe0-569e3.png 240w,
/static/metro-75c5cc62d8e9c234c383d26f8144abe0-93400.png 480w,
/static/metro-75c5cc62d8e9c234c383d26f8144abe0-c83f1.png 960w,
/static/metro-75c5cc62d8e9c234c383d26f8144abe0-2489a.png 1274w&quot;
        sizes=&quot;(max-width: 960px) 100vw, 960px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;h2 id=&quot;the-project&quot;&gt;&lt;a href=&quot;#the-project&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The project&lt;/h2&gt;
&lt;p&gt;Our project is open-source, available on GitHub : &lt;a href=&quot;https://github.com/nicoespeon/gitgraph.js&quot;&gt;https://github.com/nicoespeon/gitgraph.js&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Feel free to &lt;a href=&quot;https://github.com/nicoespeon/gitgraph.js/issues/new&quot;&gt;add an issue&lt;/a&gt; for any remark / suggestion / correction you’d have to do, or even to contribute more deeply. &lt;a href=&quot;http://gitgraphjs.com/docs/&quot;&gt;A technical documentation for the source code&lt;/a&gt; is available. A much more functional one is already considered, with concrete examples and use cases.&lt;/p&gt;
&lt;p&gt;The project use the MIT license, &lt;a href=&quot;http://choosealicense.com/licenses/mit/&quot;&gt;which is simple and permissive&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Have a look to the website for more information about the library: &lt;a href=&quot;http://gitgraphjs.com&quot;&gt;gitgraphjs.com&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;hey-what-about-the-sax&quot;&gt;&lt;a href=&quot;#hey-what-about-the-sax&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hey, what about the sax?&lt;/h2&gt;
&lt;p&gt;I was afraid you wouldn’t ask. Thereupon I leave you with some Georges Michael tune \o/&lt;/p&gt;
&lt;div&gt;
          &lt;div
            class=&quot;gatsby-resp-iframe-wrapper&quot;
            style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden;margin-bottom: 1.0725rem&quot;
          &gt;
            &lt;iframe src=&quot;https://www.youtube.com/embed/GaoLU6zKaws?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot; style=&quot;
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
          &quot;&gt;&amp;nbsp;&lt;/iframe&gt;
          &lt;/div&gt;
          &lt;/div&gt;</content:encoded></item><item><title><![CDATA[Quel git workflow pour mon projet ?]]></title><description><![CDATA[Un petit tour d'horizon sur le git-flow, le GitHub flow et comment choisir le plus adapté à son projet.]]></description><link>https://www.nicoespeon.com/fr/2013/08/quel-git-workflow-pour-mon-projet/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2013/08/quel-git-workflow-pour-mon-projet/</guid><pubDate>Thu, 15 Aug 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;tldr&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;L’une des grandes forces de git réside dans la simplicité de son système de branches.&lt;br&gt;
Si vous êtes en charge d’un projet, peut-être vous êtes-vous déjà posé la question : quel workflow mettre en place pour gérer efficacement mon projet, sans me compliquer la vie avec ce sympathique système de branches ?&lt;/p&gt;
&lt;p&gt;Et forcèment : à ce problème, certains s’y sont déjà penchés et ont apporté leurs solutions.&lt;/p&gt;
&lt;p&gt;Le &lt;em&gt;git-flow&lt;/em&gt; est probablement le plus connu, voire le seul d’ailleurs.&lt;br&gt;
Il s’agit d’un modèle de branches standard qui semble s’adapter à n’importe quel projet, pas trop complexe à prendre en main, avec quelques subtilités cependant.&lt;/p&gt;
&lt;p&gt;Si la notion de versions a un sens pour votre projet, &lt;a href=&quot;#le_gitflow&quot;&gt;c’est ce workflow&lt;/a&gt; qui peut vous intéresser.&lt;/p&gt;
&lt;p&gt;Il existe une alternative pertinente qui a l’avantage d’être bien plus simple : le &lt;em&gt;GitHub flow&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Le modèle tient en 6 règles simples qui n’ont pas besoin de prendre en compte les subtilités du workflow précédent.&lt;/p&gt;
&lt;p&gt;Si la notion de versions n’a pas spécialement de sens pour votre projet et que vous souhaitez mettre en place un workflow simplifié, &lt;a href=&quot;#le_github_flow&quot;&gt;c’est ce workflow&lt;/a&gt; qui peut vous intéresser.&lt;/p&gt;
&lt;h2 id=&quot;le-git-flow&quot;&gt;&lt;a href=&quot;#le-git-flow&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le git-flow&lt;/h2&gt;
&lt;p&gt;Ce workflow a été présenté le 5 Janvier 2010 par &lt;a href=&quot;https://twitter.com/nvie&quot;&gt;Vincent Driessen&lt;/a&gt; comme un workflow de branchements git efficace. Il couvre l’ensemble des besoins standards d’un projet de développement classique.&lt;/p&gt;
&lt;h3 id=&quot;le-principe&quot;&gt;&lt;a href=&quot;#le-principe&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le principe&lt;/h3&gt;
&lt;p&gt;Le &lt;em&gt;git-flow&lt;/em&gt; présente le système de branches suivant :&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/git-flow-branching-model-86b9c1cb60d6bba0e2ec6867d021f728-e0740.jpg&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 133.4%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAIBAwX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAH2q50UCHXDFD//xAAcEAABBAMBAAAAAAAAAAAAAAABABEhMQIQEiL/2gAIAQEAAQUC6Tz6RuHY6xldI1QFf//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8BH//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8BH//EABoQAAICAwAAAAAAAAAAAAAAAAARARAxMkH/2gAIAQEABj8CEcpI2pmJuD//xAAbEAACAgMBAAAAAAAAAAAAAAAAAREhMWFx0f/aAAgBAQABPyGEXbIbsmjEOrFCBum4OMjKaK0ynkZhqSC/I//aAAwDAQACAAMAAAAQkA0A/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPxAf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPxAf/8QAHhABAAIDAAIDAAAAAAAAAAAAAQARITFBUXGBkaH/2gAIAQEAAT8QOJSjWvUqQrDSBQwuYYqixYK+WAG1bA4aggIJWqJdwFIq0baz7jWcBuuQoDScj8cBBpy48xqnaF+p/9k=&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Le c&amp;#xE9;l&amp;#xE8;bre git flow&quot; title=&quot;&quot; src=&quot;/static/git-flow-branching-model-86b9c1cb60d6bba0e2ec6867d021f728-e0740.jpg&quot; srcset=&quot;/static/git-flow-branching-model-86b9c1cb60d6bba0e2ec6867d021f728-64397.jpg 240w,
/static/git-flow-branching-model-86b9c1cb60d6bba0e2ec6867d021f728-1a212.jpg 480w,
/static/git-flow-branching-model-86b9c1cb60d6bba0e2ec6867d021f728-e0740.jpg 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Le mod&amp;#xE8;le git-flow illustr&amp;#xE9;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;On distingue les branches principales, fixes et immuables :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; est la branche où tout est stable. Chaque commit correspond à une version stable du projet (&lt;em&gt;release&lt;/em&gt;) qui peut être déployée en production et taguée en conséquence (&lt;em&gt;vX.Y.Z&lt;/em&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; est la branche sur laquelle s’effectue le développement proprement dit. On y prépare les changements en vue de la prochaine release dans &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Puis les branches secondaires qui se font et se défont avec le temps :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;feature&lt;/code&gt; part de &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; et se merge dans &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On crée une branche &lt;strong&gt;feature/xxx&lt;/strong&gt; lorsque l’on travaille sur une fonctionnalité en particulier. Lorsqu’elle est terminée, on la merge dans &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; pour ajouter la feature stable dans le scope de la prochaine release.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;release&lt;/code&gt; part de &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; et se merge dans &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; et &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On crée une branche &lt;strong&gt;release/xxx&lt;/strong&gt; à partir de &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; lorsque celle-ci reflète l’état désiré de la release (l’ensemble des fonctionnalités du scope ont été mergées). Ainsi, on peut préparer la prochaine release tranquillement, corriger d’éventuels bugs et poursuivre le développement en parallèle.&lt;/p&gt;
&lt;p&gt;Une fois que la release est prête (stable) on merge alors la branche dans &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;, mais aussi dans &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; pour mettre à jour les modifications apportées.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;hotfix&lt;/code&gt; part de &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; et se merge dans &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; et &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; / &lt;code class=&quot;language-text&quot;&gt;release&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On crée une branche &lt;strong&gt;hotfix/xxx&lt;/strong&gt; lorsque l’on veut résoudre un bug critique en production rapidement. C’est un peu comme une release non planifiée.&lt;/p&gt;
&lt;p&gt;Lorsque le correctif est développé, on le merge dans &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; avec le numéro de version qui convient, ainsi que dans &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; (ou la branche &lt;code class=&quot;language-text&quot;&gt;release&lt;/code&gt; en cours, le cas échéant) pour mettre à jour les modifications apportées.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;liens-utiles&quot;&gt;&lt;a href=&quot;#liens-utiles&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Liens utiles&lt;/h3&gt;
&lt;p&gt;Je vous suggère de jeter un oeil &lt;a href=&quot;http://nvie.com/posts/a-successful-git-branching-model/&quot;&gt;sur l’article original&lt;/a&gt; pour en apprendre plus sur la question.&lt;/p&gt;
&lt;p&gt;Pour vous simplifier la vie dans le terminal, sachez que l’auteur a également mis au point &lt;a href=&quot;https://github.com/nvie/gitflow&quot;&gt;une extension git&lt;/a&gt; pour implémenter simplement le &lt;em&gt;git-flow&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Enfin, pour les utilisateurs de &lt;em&gt;SourceTree&lt;/em&gt;, sachez que ce workflow est &lt;a href=&quot;https://www.atlassian.com/git/workflows#!workflow-gitflow&quot;&gt;nativement implémenté&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si vous êtes sous &lt;strong&gt;Windows&lt;/strong&gt; ou &lt;strong&gt;Mac&lt;/strong&gt; et que vous cherchez un bon client graphique pour git/mercurial, je vous recommande chaudement &lt;a href=&quot;http://www.sourcetreeapp.com/&quot;&gt;d’essayer SourceTree&lt;/a&gt; d’ailleurs !&lt;/p&gt;
&lt;h2 id=&quot;le-github-flow&quot;&gt;&lt;a href=&quot;#le-github-flow&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le GitHub flow&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/chacon&quot;&gt;Scott Chacon&lt;/a&gt; l’a présenté dans un post le 31 Août 2011. Il s’agit d’une version allégée du précédent et découle, en quelque sorte, du bon sens.&lt;/p&gt;
&lt;p&gt;A noter que je garde ici la référence à GitHub par rapport au superbe post de Scott mais Atlassian (Bitbucket) le présente, par exemple, comme &lt;a href=&quot;https://www.atlassian.com/git/workflows#!workflow-feature-branch&quot;&gt;le workflow &lt;em&gt;feature branch&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;le-principe-1&quot;&gt;&lt;a href=&quot;#le-principe-1&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le principe&lt;/h3&gt;
&lt;p&gt;Je me suis permis d’illustrer le &lt;em&gt;GitHub flow&lt;/em&gt; de la manière suivante :&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/github-flow-branching-model-0606fb12b7a55784a3b52833fd015ebd-e0740.jpg&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 97.60000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAIDBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHuTOhaRUiQF//EABsQAQACAgMAAAAAAAAAAAAAAAEAEQIQEiEx/9oACAEBAAEFAnzvlMhuoXpJgqf/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAABAgcAAAAAAAAAAAAAAAAQABEBICExQWGB/9oACAEBAAY/AurQd82FYyf/xAAfEAACAQQCAwAAAAAAAAAAAAAAAREhMUFREGFxgZH/2gAIAQEAAT8hZr4W7NWccKJYhoNsOK4ERXPRBobXgmLc1P/aAAwDAQACAAMAAAAQA8BA/8QAFhEBAQEAAAAAAAAAAAAAAAAAEAFB/9oACAEDAQE/EMKf/8QAFREBAQAAAAAAAAAAAAAAAAAAEAH/2gAIAQIBAT8QIf/EAB8QAQEAAgAHAQAAAAAAAAAAAAERACEQMUFRYXGR0f/aAAgBAQABPxAbUVC2dP4ypsQIdTunCATNTFpu4hHq+lv3Jyu89Mjfu4cGC3yxCtY//9k=&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Le GitHub flow&quot; title=&quot;&quot; src=&quot;/static/github-flow-branching-model-0606fb12b7a55784a3b52833fd015ebd-e0740.jpg&quot; srcset=&quot;/static/github-flow-branching-model-0606fb12b7a55784a3b52833fd015ebd-64397.jpg 240w,
/static/github-flow-branching-model-0606fb12b7a55784a3b52833fd015ebd-1a212.jpg 480w,
/static/github-flow-branching-model-0606fb12b7a55784a3b52833fd015ebd-e0740.jpg 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Le mod&amp;#xE8;le GitHub flow illustr&amp;#xE9;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Vous constaterez qu’il n’y a qu’une seule branche &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; (pas de &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; ici) et des features à gogo. Il est frappant de constater que le modèle est &lt;strong&gt;extrêmement simple&lt;/strong&gt; et c’est le but. La courbe d’apprentissage est faible, les développeurs prennent rapidement en main ce workflow qui s’avère parfaitement adapté dans certains cas de figures.&lt;/p&gt;
&lt;p&gt;Ce workflow se base donc sur 6 règles essentielles :&lt;/p&gt;
&lt;h4 id=&quot;1-tout-ce-qui-est-dans-master-peut-être-déployé-en-production&quot;&gt;&lt;a href=&quot;#1-tout-ce-qui-est-dans-master-peut-%C3%AAtre-d%C3%A9ploy%C3%A9-en-production&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Tout ce qui est dans &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; peut être déployé en production&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;La règle&lt;/strong&gt; absolue, commune au &lt;em&gt;git-flow&lt;/em&gt; d’ailleurs. C’est la seule branche consistante du projet et elle doit rester stable pour pouvoir se baser dessus et être déployée en production.&lt;/p&gt;
&lt;h4 id=&quot;2-créer-des-branches-explicites-depuis-master-features&quot;&gt;&lt;a href=&quot;#2-cr%C3%A9er-des-branches-explicites-depuis-master-features&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Créer des branches explicites depuis &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; (features)&lt;/h4&gt;
&lt;p&gt;Lorsqu’on souhaite travailler sur quelque chose (une fonctionnalité, un hotfix, etc.), on crée une branche depuis &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; avec un nom explicite, si possible : &lt;code class=&quot;language-text&quot;&gt;bug-grunt-tests&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;infrastructure-ssl&lt;/code&gt; ou &lt;code class=&quot;language-text&quot;&gt;module-game-workers&lt;/code&gt; sont des exemples tirés d’un projet sur lequel je travaille actuellement par exemple.&lt;/p&gt;
&lt;h4 id=&quot;3-pousser-sur-origin-régulièrement&quot;&gt;&lt;a href=&quot;#3-pousser-sur-origin-r%C3%A9guli%C3%A8rement&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Pousser sur &lt;code class=&quot;language-text&quot;&gt;origin&lt;/code&gt; régulièrement&lt;/h4&gt;
&lt;p&gt;Contrairement au &lt;em&gt;git-flow&lt;/em&gt;, où le développeur ne va pas forcément pousser sa branche &lt;code class=&quot;language-text&quot;&gt;feature&lt;/code&gt; locale sur le dépôt central, il s’agit ici de pousser les branches régulièrement.&lt;/p&gt;
&lt;p&gt;En effet, tant que nous ne sommes pas sur &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; il importe peu que la branche soit stable. En contrepartie, cela permet de &lt;em&gt;communiquer&lt;/em&gt; avec l’équipe.&lt;/p&gt;
&lt;h4 id=&quot;4-ouvrir-une-pull-request-à-tout-moment&quot;&gt;&lt;a href=&quot;#4-ouvrir-une-pull-request-%C3%A0-tout-moment&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. Ouvrir une pull-request à tout moment&lt;/h4&gt;
&lt;p&gt;Si votre projet est hébergé sur GitHub ou Bitbucket, sachez que les deux proposent une fonctionnalité extrêmement intéressante pour la revue de code : les pull-request.&lt;/p&gt;
&lt;p&gt;Il est très facile, depuis une branche, de faire un diff avec &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; et d’ouvrir une pull-request à n’importe quel moment : que l’on pense avoir terminé ou que l’on soit coincé, la pull-request permet de demander une revue du code. Il est alors possible de commenter le code, d’apporter des modifications et de visualiser ce que l’on s’apprête à fusionner dans &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;5-fusionner-seulement-après-une-pull-request-review&quot;&gt;&lt;a href=&quot;#5-fusionner-seulement-apr%C3%A8s-une-pull-request-review&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;5. Fusionner seulement après une pull-request review&lt;/h4&gt;
&lt;p&gt;Il s’agit plus d’un conseil que d’une règle absolue. Mais c’est la bonne pratique à mettre en place pour s’assurer que la première règle est respectée : un développeur ne doit pas fusionner sa branche dans &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; lorsqu’il pense que c’est bon, un autre doit venir faire une revue du code et confirmer la stabilité de la branche.&lt;/p&gt;
&lt;p&gt;Ainsi, si le merge vient mettre la pagaille sur &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;, on sait sur qui taper… 0:-)&lt;/p&gt;
&lt;p&gt;Vous pouvez alors :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fusionner la branche dans &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;, directement depuis la pull-request&lt;/li&gt;
&lt;li&gt;supprimer la branche, devenue inutile, sur le serveur&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si cela fait un moment que vous travaillez sur votre branche et que vous n’êtes plus synchro avec &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;, &lt;strong&gt;vous ne pourrez pas fusionner directement depuis la pull-request&lt;/strong&gt; car il y aura des conflits. Il vous suffit de faire un merge de &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; dans votre branche et règler les potentiels conflits pour la mettre à jour.&lt;/p&gt;
&lt;h4 id=&quot;6-déployer-immédiatement-après-merge-dans-master&quot;&gt;&lt;a href=&quot;#6-d%C3%A9ployer-imm%C3%A9diatement-apr%C3%A8s-merge-dans-master&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;6. Déployer immédiatement après merge dans &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Une fois que la pull-request est validée, la branche est mergée dans &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; ce qui signifie que le tout est déployé en production (ou va être déployé sous peu).&lt;/p&gt;
&lt;p&gt;C’est également une façon d’accentuer la pression sur la nécessaire stabilité de &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; : le développeur ne souhaite généralement pas que le déploiement de ses modifications ne casse tout, il fera donc d’autant plus attention à la stabilité de son code avant de fusionner.&lt;/p&gt;
&lt;h3 id=&quot;quelques-remarques&quot;&gt;&lt;a href=&quot;#quelques-remarques&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Quelques remarques&lt;/h3&gt;
&lt;p&gt;Ce genre de workflow s’adapte parfaitement à un projet pour lequel il n’y a pas vraiment de &lt;em&gt;releases&lt;/em&gt;, ni de &lt;em&gt;versions&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;On intègre en continue dans &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; les fonctionnalités et on déploie, parfois plusieurs fois par jour, le projet stable. On revient assez rarement (jamais) en arrière sur &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ainsi, il est difficile d’ajouter une série de gros bugs. Si des problèmes apparaissent, ils sont rapidement résolus dans la foulée. Il n’y a pas de différence entre une grosse feature et un petit hotfix avec ce process. Peu importe la nature du changement à effectuer, le workflow est toujours le même (et donc très simple à prendre en main).&lt;/p&gt;
&lt;h3 id=&quot;liens-utiles-1&quot;&gt;&lt;a href=&quot;#liens-utiles-1&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Liens utiles&lt;/h3&gt;
&lt;p&gt;Je vous suggère là encore de jeter un oeil &lt;a href=&quot;http://scottchacon.com/2011/08/31/github-flow.html&quot;&gt;sur l’article original&lt;/a&gt; pour en apprendre plus sur la question.&lt;/p&gt;
&lt;p&gt;Techniquement, GitHub a fait en sorte de vous permettre de gérer ce workflow entièrement, &lt;a href=&quot;https://github.com/blog/1557-github-flow-in-the-browser&quot;&gt;directement depuis le navigateur&lt;/a&gt;. Bitbucket se débrouille pas mal non plus.&lt;/p&gt;
&lt;p&gt;Si vous en ressentez le besoin, il y a également &lt;a href=&quot;https://github.com/github-flow/github-flow&quot;&gt;une extension git&lt;/a&gt; pour implémenter le workflow. Mais dans l’ensemble, il se manie assez bien dans le navigateur.&lt;/p&gt;
&lt;h2 id=&quot;le-mot-de-la-fin&quot;&gt;&lt;a href=&quot;#le-mot-de-la-fin&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le mot de la fin&lt;/h2&gt;
&lt;p&gt;Choisir son workflow dépend de la nature et des besoins de son projet. A vous de voir si ces exemples s’adaptent plus ou moins à votre réalité, quitte à faire quelques adaptations si nécessaire.&lt;/p&gt;
&lt;p&gt;Voici donc pour les workflows que j’utilise, n’hésitez pas à partager d’autres pistes, d’autres idées.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Which git workflow for my project?]]></title><description><![CDATA[A little look around git-flow, GitHub flow and which one to choose regarding your needs.]]></description><link>https://www.nicoespeon.com/en/2013/08/which-git-workflow-for-my-project/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2013/08/which-git-workflow-for-my-project/</guid><pubDate>Thu, 15 Aug 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;tldr&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;One of the greatest strenght of git is the simplicity of its branching system.&lt;/p&gt;
&lt;p&gt;If you’re in charge of a project, you may have wondered: which workflow could I set up to efficiently deal with my project and keep it simple thanks to this cool branching system?&lt;/p&gt;
&lt;p&gt;As usual: some people already wondered the same and have found possible solutions to your problem.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;git-flow&lt;/em&gt; is the most popular with no doubt.&lt;/p&gt;
&lt;p&gt;It’s a standard branching model that seems to adapt to any project, not that complex to deal with even though there are some specificities to understand.&lt;/p&gt;
&lt;p&gt;If versioning has a meaning for you project, &lt;a href=&quot;#the_gitflow&quot;&gt;this workflow&lt;/a&gt; is for you.&lt;/p&gt;
&lt;p&gt;There is a relevant alternative that is far easier: the &lt;em&gt;Github flow&lt;/em&gt;.&lt;br&gt;
This model has 6 simple rules and doesn’t have to consider every subtleties the previous one does.&lt;/p&gt;
&lt;p&gt;If versioning doesn’t have a particular meaning for you project de sens and you would like to use an easy workflow, &lt;a href=&quot;#the_github_flow&quot;&gt;this workflow&lt;/a&gt; is for you.&lt;/p&gt;
&lt;h2 id=&quot;the-git-flow&quot;&gt;&lt;a href=&quot;#the-git-flow&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The git-flow&lt;/h2&gt;
&lt;p&gt;This workflow has been published the 5th of January, 2010 by &lt;a href=&quot;https://twitter.com/nvie&quot;&gt;Vincent Driessen&lt;/a&gt; as a successful branching model for git. It covers most of the standard needs for a classical development project.&lt;/p&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;&lt;a href=&quot;#how-it-works&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How it works&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;git-flow&lt;/em&gt; has the following branching model:&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/git-flow-branching-model-86b9c1cb60d6bba0e2ec6867d021f728-e0740.jpg&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 133.4%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAIBAwX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAH2q50UCHXDFD//xAAcEAABBAMBAAAAAAAAAAAAAAABABEhMQIQEiL/2gAIAQEAAQUC6Tz6RuHY6xldI1QFf//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8BH//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8BH//EABoQAAICAwAAAAAAAAAAAAAAAAARARAxMkH/2gAIAQEABj8CEcpI2pmJuD//xAAbEAACAgMBAAAAAAAAAAAAAAAAAREhMWFx0f/aAAgBAQABPyGEXbIbsmjEOrFCBum4OMjKaK0ynkZhqSC/I//aAAwDAQACAAMAAAAQkA0A/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPxAf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPxAf/8QAHhABAAIDAAIDAAAAAAAAAAAAAQARITFBUXGBkaH/2gAIAQEAAT8QOJSjWvUqQrDSBQwuYYqixYK+WAG1bA4aggIJWqJdwFIq0baz7jWcBuuQoDScj8cBBpy48xqnaF+p/9k=&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;The famous gitflow&quot; title=&quot;&quot; src=&quot;/static/git-flow-branching-model-86b9c1cb60d6bba0e2ec6867d021f728-e0740.jpg&quot; srcset=&quot;/static/git-flow-branching-model-86b9c1cb60d6bba0e2ec6867d021f728-64397.jpg 240w,
/static/git-flow-branching-model-86b9c1cb60d6bba0e2ec6867d021f728-1a212.jpg 480w,
/static/git-flow-branching-model-86b9c1cb60d6bba0e2ec6867d021f728-e0740.jpg 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
	&lt;figcaption&gt;The illustrated git-flow model&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;We have first the primary branches, fixed and unchanging:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; is the main branch where everything is stable. Each commit is a stable version of the project - a &lt;em&gt;release&lt;/em&gt; - which could be deployed in production and tagged accordingly (&lt;em&gt;vX.Y.Z&lt;/em&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; is the main branch where development is made. There will be prepared changes for the next release in &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then come the secondary branches which are flexible over time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;feature&lt;/code&gt; starts from &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; and merge into &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When you’re working on a specific feature, you create a &lt;strong&gt;feature/xxx&lt;/strong&gt; branch. Then, when it’s over, you merge it back into &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; to add the stable feature to the scope for the next release.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;release&lt;/code&gt; starts from &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; and merge into &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; is reflecting the desired state of the future release - every features from the scope have been merged -, you create a &lt;strong&gt;release/xxx&lt;/strong&gt; branch. Doing so, you can prepare the next release, correct eventual bugs and continue the development in parallel.&lt;/p&gt;
&lt;p&gt;Once the release is ready - stable - you merge the branch back into &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;, but also into &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; to update it with modifications you made.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;hotfix&lt;/code&gt; starts from &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; and merge into &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; / &lt;code class=&quot;language-text&quot;&gt;release&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When you want to quickly resolve a critical bug in production, you create a &lt;strong&gt;hotfix/xxx&lt;/strong&gt; branch. It’s kind of a non-planned release.&lt;/p&gt;
&lt;p&gt;When the hotfix is developed, you merge it back into &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; with the according version number, and into &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; as well - or the according &lt;code class=&quot;language-text&quot;&gt;release&lt;/code&gt; branch, if so - to update it with modifications you made.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;useful-links&quot;&gt;&lt;a href=&quot;#useful-links&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Useful links&lt;/h3&gt;
&lt;p&gt;You might have a look at &lt;a href=&quot;http://nvie.com/posts/a-successful-git-branching-model/&quot;&gt;the original post&lt;/a&gt; to go deeper into details.&lt;/p&gt;
&lt;p&gt;To make it simple when using the terminal, the author also created &lt;a href=&quot;https://github.com/nvie/gitflow&quot;&gt;a git extension&lt;/a&gt; that easily implement the &lt;em&gt;git-flow&lt;/em&gt; for you.&lt;/p&gt;
&lt;p&gt;By the way, if you use &lt;em&gt;SourceTree&lt;/em&gt; you may know that this workflow is &lt;a href=&quot;https://www.atlassian.com/git/workflows#!workflow-gitflow&quot;&gt;natively implemented&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are a &lt;strong&gt;Windows&lt;/strong&gt; or &lt;strong&gt;Mac&lt;/strong&gt; user and you’re searching for a good graphic client for git/mercurial, I warmly recommend you to &lt;a href=&quot;http://www.sourcetreeapp.com/&quot;&gt;try SourceTree&lt;/a&gt;!&lt;/p&gt;
&lt;h2 id=&quot;the-github-flow&quot;&gt;&lt;a href=&quot;#the-github-flow&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The GitHub flow&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/chacon&quot;&gt;Scott Chacon&lt;/a&gt; shared this workflow in a blog post the 31th of August, 2011. It’s kind of a lightwight version of the previous one which, with a lot of common sense.&lt;/p&gt;
&lt;p&gt;You’ll notice that I kept the reference to GitHub because of the Scott’s blog post, but Atlassian - Bitbucket - presented it as the &lt;a href=&quot;https://www.atlassian.com/git/workflows#!workflow-feature-branch&quot;&gt;&lt;em&gt;feature branch&lt;/em&gt; workflow&lt;/a&gt; for instance.&lt;/p&gt;
&lt;h3 id=&quot;how-it-works-1&quot;&gt;&lt;a href=&quot;#how-it-works-1&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How it works&lt;/h3&gt;
&lt;p&gt;I have taken the liberty to illustrate the &lt;em&gt;GitHub flow&lt;/em&gt; as follows:&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/github-flow-branching-model-0606fb12b7a55784a3b52833fd015ebd-e0740.jpg&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 97.60000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAIDBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHuTOhaRUiQF//EABsQAQACAgMAAAAAAAAAAAAAAAEAEQIQEiEx/9oACAEBAAEFAnzvlMhuoXpJgqf/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAABAgcAAAAAAAAAAAAAAAAQABEBICExQWGB/9oACAEBAAY/AurQd82FYyf/xAAfEAACAQQCAwAAAAAAAAAAAAAAAREhMUFREGFxgZH/2gAIAQEAAT8hZr4W7NWccKJYhoNsOK4ERXPRBobXgmLc1P/aAAwDAQACAAMAAAAQA8BA/8QAFhEBAQEAAAAAAAAAAAAAAAAAEAFB/9oACAEDAQE/EMKf/8QAFREBAQAAAAAAAAAAAAAAAAAAEAH/2gAIAQIBAT8QIf/EAB8QAQEAAgAHAQAAAAAAAAAAAAERACEQMUFRYXGR0f/aAAgBAQABPxAbUVC2dP4ypsQIdTunCATNTFpu4hHq+lv3Jyu89Mjfu4cGC3yxCtY//9k=&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;The GitHub flow&quot; title=&quot;&quot; src=&quot;/static/github-flow-branching-model-0606fb12b7a55784a3b52833fd015ebd-e0740.jpg&quot; srcset=&quot;/static/github-flow-branching-model-0606fb12b7a55784a3b52833fd015ebd-64397.jpg 240w,
/static/github-flow-branching-model-0606fb12b7a55784a3b52833fd015ebd-1a212.jpg 480w,
/static/github-flow-branching-model-0606fb12b7a55784a3b52833fd015ebd-e0740.jpg 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
	&lt;figcaption&gt;The illustrated GitHub flow model&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;You’ll notice that there is only a single &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; branch - no &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; - and a bunch of features. This model is &lt;strong&gt;extremely simple&lt;/strong&gt; and this is precisely the goal. The learning curve est low, developers can quickly master this workflow which is perfectly relevant in some cases.&lt;/p&gt;
&lt;p&gt;This workflow follows 6 basic rules:&lt;/p&gt;
&lt;h4 id=&quot;1-everything-that-is-in-master-could-be-deployed-in-production&quot;&gt;&lt;a href=&quot;#1-everything-that-is-in-master-could-be-deployed-in-production&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Everything that is in &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; could be deployed in production&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;The absolute rule&lt;/strong&gt;, same as the &lt;em&gt;git-flow&lt;/em&gt; by the way. This is the only meaningful branch of the project and it should stay stable in any circumstance so you can base your work upon and deploy it in production at anytime.&lt;/p&gt;
&lt;h4 id=&quot;2-create-descriptive-features-branchs-from-master&quot;&gt;&lt;a href=&quot;#2-create-descriptive-features-branchs-from-master&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Create descriptive features branchs from &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;When you want to develop a feature or a hotfix, for instance, you just create your branch from &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; with an explicit name that describe your work: &lt;code class=&quot;language-text&quot;&gt;bug-grunt-tests&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;infrastructure-ssl&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;module-game-workers&lt;/code&gt; are examples from a project I currently work on, for example.&lt;/p&gt;
&lt;h4 id=&quot;3-regularly-push-to-origin&quot;&gt;&lt;a href=&quot;#3-regularly-push-to-origin&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Regularly push to &lt;code class=&quot;language-text&quot;&gt;origin&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;In contrary of the &lt;em&gt;git-flow&lt;/em&gt; where developer doesn’t have to push its local &lt;code class=&quot;language-text&quot;&gt;feature&lt;/code&gt; branch to the main repo, you have to regularly do that here.&lt;/p&gt;
&lt;p&gt;Indeed, as far as you’re not on &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;, the stability of the branch doesn’t really matter. Doing so allows you to &lt;em&gt;communicate&lt;/em&gt; and share your work with the whole team.&lt;/p&gt;
&lt;h4 id=&quot;4-open-a-pull-request-at-anytime&quot;&gt;&lt;a href=&quot;#4-open-a-pull-request-at-anytime&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. Open a pull-request at anytime&lt;/h4&gt;
&lt;p&gt;If your project is hosted on GitHub or Bitbucket, you should know that they both propose an incredibly interesting feature for code review: pull-requests.&lt;/p&gt;
&lt;p&gt;It’s dead easy then, from any branch, to make a diff with &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; and open a pull-request at anytime: either you think you’re done or stuck on something, the pull-request allows you to ask someone else to have a look on what you did. Then, it’s possible to comment code, add modifications and visualize precisely what you’re about to merge into &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;5-only-merge-after-a-pull-request-review&quot;&gt;&lt;a href=&quot;#5-only-merge-after-a-pull-request-review&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;5. Only merge after a pull-request review&lt;/h4&gt;
&lt;p&gt;This is much more and advice than an absolute rule. It’s a best practice that you can use to be sure that the first rule is less likely to be broken, still: a developer should not merge its own branch into &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; when he thinks he is done. Another one should review his pull-request and confirm that the branch is stable.&lt;/p&gt;
&lt;p&gt;Doing so, if &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; becomes a mess because of this merge, you know who gave his agreement… 0:-)&lt;/p&gt;
&lt;p&gt;From here you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;merge the branch back into &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;, directly from the pull-request&lt;/li&gt;
&lt;li&gt;delete the merge branch, which became useless, on the server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are not synchronized anymore with &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; because you spend a long time working on your branch, &lt;strong&gt;you can’t merge directly the pull-request&lt;/strong&gt; because there would be conflicts. You just need to merge &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; into your branch before, so you can fix conflicts and update your feature before merging it back into &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;6-immediately-deploy-after-you-merge-into-master&quot;&gt;&lt;a href=&quot;#6-immediately-deploy-after-you-merge-into-master&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;6. Immediately deploy after you merge into &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Once pull-request is valid, your branch is merged into &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; so it means the whole thing is deployed to production, or will be soon.&lt;/p&gt;
&lt;p&gt;Doing so, you’ll stress on the necessity to keep &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; stable: developers don’t want to break everything because of its modifications were deployed, so they’re more likely to pay attention about his code stability before merge.&lt;/p&gt;
&lt;h3 id=&quot;few-comments&quot;&gt;&lt;a href=&quot;#few-comments&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Few comments&lt;/h3&gt;
&lt;p&gt;This kind of workflow perfectly fits for projects that doesn’t have &lt;em&gt;release&lt;/em&gt; nor &lt;em&gt;versions&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;You do continuous integration into &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; and you deploy the stable project to production, sometimes several times a day. You’ll probably never rollback on &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Thus, you’ll very unlikely add series of big bugs. If problems appears, they’re quickly fixed on the go. There is no difference between a big feature and a small hotfix in terms of process. No matters what kind of change you have to do, the workflow still the same and keeps easy to use.&lt;/p&gt;
&lt;h3 id=&quot;useful-links-1&quot;&gt;&lt;a href=&quot;#useful-links-1&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Useful links&lt;/h3&gt;
&lt;p&gt;Here again, you might have a look to &lt;a href=&quot;http://scottchacon.com/2011/08/31/github-flow.html&quot;&gt;the original post&lt;/a&gt; to go further into explanations.&lt;/p&gt;
&lt;p&gt;Technically, GitHub is doing his best so you can deal with this entire workflow &lt;a href=&quot;https://github.com/blog/1557-github-flow-in-the-browser&quot;&gt;directly from your browser&lt;/a&gt;. Bitbucket is doing a great job also.&lt;/p&gt;
&lt;p&gt;If you ever need, there is also &lt;a href=&quot;https://github.com/github-flow/github-flow&quot;&gt;a git extension&lt;/a&gt; which helps you to implement the workflow. But I guess you can handle it by yourself, in the browser.&lt;/p&gt;
&lt;h2 id=&quot;final-words&quot;&gt;&lt;a href=&quot;#final-words&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final words&lt;/h2&gt;
&lt;p&gt;To choose the best workflow depends on the nature and needs of your project. It’s up to you to consider which of these examples fit more or less with your reality, and adapt a workflow to your needs if so.&lt;/p&gt;
&lt;p&gt;These are workflows I typically use so far. If you have other tracks, ideas or comments, please share.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Convert a SASS project into LESS]]></title><description><![CDATA[Similarities, differences et equivalents between those two CSS preprocessors.]]></description><link>https://www.nicoespeon.com/en/2013/06/convert-sass-project-into-less/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2013/06/convert-sass-project-into-less/</guid><pubDate>Tue, 11 Jun 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;matters-of-taste&quot;&gt;&lt;a href=&quot;#matters-of-taste&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Matters of taste&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://lesscss.org/&quot;&gt;LESS&lt;/a&gt; and &lt;a href=&quot;http://sass-lang.com/&quot;&gt;SASS&lt;/a&gt; today are &lt;a href=&quot;http://css-tricks.com/poll-results-popularity-of-css-preprocessors/&quot;&gt;the two most popular CSS preprocessors so far&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;They are quite similar and give functionalities to CSS that every front-end developer ever dreamt: variables, functions, mathematical operations, selectors nesting, etc.&lt;/p&gt;
&lt;p&gt;However, there are some differences:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SASS is compiled with Ruby, it has two different syntaxes: &lt;code class=&quot;language-text&quot;&gt;.sass&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;.scss&lt;/code&gt;.&lt;br&gt;
The second one, closer to the CSS syntax, is the most used.&lt;/li&gt;
&lt;li&gt;LESS is compiled with Javascript, it has one syntax which is quite close to the CSS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a general rule, we can say that &lt;a href=&quot;http://css-tricks.com/sass-vs-less/&quot;&gt;SASS is more powerful than LESS&lt;/a&gt; because it notably has a bunch of additional functionalities. However, this is a matter of taste and LESS could suffice enough to please you and, in my opinion, is easier to use at first.&lt;/p&gt;
&lt;p&gt;Personally, &lt;strong&gt;I use LESS instead of SASS&lt;/strong&gt; with my projects, mostfully because I get used to it.&lt;/p&gt;
&lt;p&gt;In the same time, I tend to use the inuit.css framework (instead of Bootstrap) on these projects. But inuit.css uses SASS!&lt;/p&gt;
&lt;p&gt;Hopefully, I’m not the only one who likes LESS and &lt;a href=&quot;http://twitter.com/pwcc&quot;&gt;Peter Wilson&lt;/a&gt; has worked to create the LESS version of the framework. As I was keen on this idea, I joined the project we are maintaining today: &lt;a href=&quot;https://github.com/peterwilsoncc/inuit.css&quot;&gt;the official LESS port of inuit.css&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It’s all about &lt;strong&gt;traducing the SASS framework into LESS&lt;/strong&gt;, which leads us to 3 options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The SASS code is identical to the LESS one, so it’s the same principle&lt;/li&gt;
&lt;li&gt;The SASS code as an equivalent in LESS, so you need to find the alternative&lt;/li&gt;
&lt;li&gt;The SASS code doesn’t have any equivalent in LESS and you need to ruse - or ignore it -&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here is a broad overview of these options, as far as I know.&lt;/p&gt;
&lt;h2 id=&quot;what-is-identical-in-less&quot;&gt;&lt;a href=&quot;#what-is-identical-in-less&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is identical in LESS&lt;/h2&gt;
&lt;p&gt;In such a case, it’s dead easy: there is nothing to do.&lt;/p&gt;
&lt;p&gt;Indeed, even though they are differents, SASS and LESS both share some basic concepts.&lt;/p&gt;
&lt;h3 id=&quot;nesting&quot;&gt;&lt;a href=&quot;#nesting&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Nesting&lt;/h3&gt;
&lt;p&gt;One of the guiding principle of CSS preprocessors: selectors nesting.&lt;/p&gt;
&lt;p&gt;Instead of creating huge selectors to specify inheritance, you just have to nest them like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.islet&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px&lt;span class=&quot;token selector&quot;&gt;;

  p&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #bada55&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bold&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That will produce the following code, in both languages:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.islet&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.islet p&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #bada55&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bold&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Beware&lt;/strong&gt; - Developers, whether they are experimented or not, often abuse of nesting which bloats their CSS for no valuable reason.&lt;/p&gt;
&lt;p&gt;Keep in mind &lt;a href=&quot;http://thesassway.com/beginner/the-inception-rule&quot;&gt;the inception rule&lt;/a&gt;: &lt;strong&gt;never go farther than 4 nested levels&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;comments-and-compilation&quot;&gt;&lt;a href=&quot;#comments-and-compilation&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Comments and compilation&lt;/h3&gt;
&lt;p&gt;In addition to features they bring, preprocessors help you to produce code clear and organized while having a single compiled - and compressed - CSS file as the output for production.&lt;/p&gt;
&lt;p&gt;In that spirit, SASS and LESS both have alternate comments that are not compiled into CSS. So this code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * The date/time
 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.timeline__time &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// The actual inner width is `25% - x`, `x` is the padding&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 200px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Will produce the following code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * The date/time
 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.timeline__time&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 200px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which could be very helpful in case you want to add some code comments which would not be relevant for production code.&lt;/p&gt;
&lt;p&gt;Please note that a compiled file for production should be compressed so it doesn’t have CSS comments neither, excepted if you decide to preserve them. &lt;a href=&quot;http://yui.github.io/yuicompressor/css.html&quot;&gt;YUI compressor&lt;/a&gt; uses &lt;code class=&quot;language-text&quot;&gt;/*! */&lt;/code&gt; to preserve CSS comments for instance.&lt;/p&gt;
&lt;h3 id=&quot;imports&quot;&gt;&lt;a href=&quot;#imports&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Imports&lt;/h3&gt;
&lt;p&gt;Preprocessors help you to import other files very easily with &lt;code class=&quot;language-text&quot;&gt;@import&lt;/code&gt;, which allows you to build a clear and modular architecture of your source files. Dare I say: CSS preprocessors are OOCSS best friends.&lt;/p&gt;
&lt;p&gt;A best practice may be to create a &lt;code class=&quot;language-text&quot;&gt;main.less&lt;/code&gt; / &lt;code class=&quot;language-text&quot;&gt;_main.scss&lt;/code&gt; file which role is to import the source file you need to produce your final &lt;code class=&quot;language-text&quot;&gt;main.css&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * Setup
 */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;inuit.css/defaults&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;vars&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;inuit.css/inuit&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/**
 * It&apos;s all yours, cap’n… Begin importing your stuff here.
 */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ui/base&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ui/layout&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ui/mod-block-list&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ui/mod-helper&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* etc. */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You’ll note here that it’s pointless to add the extension, whatever preprocessor you use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Beware&lt;/strong&gt; - All likeness taken after, the &lt;code&gt;@import&lt;/code&gt; command of preprocessors has nothing to do with CSS one. Indeed, preprocessors will import your files when you compile them to output a unique CSS file that will be used in production. But CSS import will load many files by the browser.&lt;/p&gt;
&lt;p&gt;Please note that the use of &lt;code&gt;@import&lt;/code&gt; is &lt;a href=&quot;http://browserdiet.com/#prefer-link-over-import&quot;&gt;not a very good CSS practice&lt;/a&gt;, try to avoid it.&lt;/p&gt;
&lt;h2 id=&quot;what-has-an-equivalent-in-less&quot;&gt;&lt;a href=&quot;#what-has-an-equivalent-in-less&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What has an equivalent in LESS&lt;/h2&gt;
&lt;p&gt;In such a case, you mainly have to know the syntax and specificities of each language as fundamentals principles are the same. Let’s see what you’ve got…&lt;/p&gt;
&lt;h3 id=&quot;variables&quot;&gt;&lt;a href=&quot;#variables&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Variables&lt;/h3&gt;
&lt;p&gt;SASS and LESS both allow you to create variables, which is basically the Holy Grail in CSS!&lt;/p&gt;
&lt;p&gt;The concept is very straight forward. The only difference here is that SASS uses &lt;code class=&quot;language-text&quot;&gt;$&lt;/code&gt; while LESS uses &lt;code class=&quot;language-text&quot;&gt;@&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* With SASS */&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$color&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #bada55&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.header &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* With LESS */&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;@color&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt; #bada55&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And so the CSS output is:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #bada55&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;mixins&quot;&gt;&lt;a href=&quot;#mixins&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Mixins&lt;/h3&gt;
&lt;p&gt;SASS and LESS both allow you to create what we call &lt;strong&gt;mixins&lt;/strong&gt;. That means that you could simply create groups of properties that can be quickly included wherever you want to.&lt;/p&gt;
&lt;p&gt;Here again, the main difference is the syntax, not the concept:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* With SASS */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@mixin&lt;/span&gt; &lt;span class=&quot;token selector&quot;&gt;bordered &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; dotted 1px black&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid 2px black&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.header &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;@include&lt;/span&gt; bordered&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* With LESS */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.bordered()&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; dotted 1px black&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid 2px black&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token mixin-usage function&quot;&gt;.bordered&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will output:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; dotted 1px black&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid 2px black&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You should know that mixins can do more and have parameters, default values, conditions, etc.&lt;/p&gt;
&lt;p&gt;Without going further into details, you should know also that mixins can take a &lt;strong&gt;variable number of arguments&lt;/strong&gt; into account.&lt;/p&gt;
&lt;p&gt;However, while SASS deals perfectly with the different values you give to the parameters, you would have to escape those you pass to LESS if you don’t want him to interpret the whole thing as a single big variable.&lt;/p&gt;
&lt;p&gt;Escaping in LESS would return the exactly given output thanks to &lt;code&gt;~“my string”&lt;/code&gt;, which could be helpful for a bunch of tips.&lt;/p&gt;
&lt;p&gt;Technically, code is the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* With SASS */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@mixin&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$shadows&lt;/span&gt;…&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-moz-box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$shadows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-webkit-box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$shadows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$shadows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.shadows &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;@include&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0 4px 5px #666, 2px 6px 10px #999&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* With LESS */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.box-shadow(&lt;span class=&quot;token variable&quot;&gt;@shadows&lt;/span&gt;…)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-moz-box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@shadows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-webkit-box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@shadows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@shadows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.shadows&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token mixin-usage function&quot;&gt;.box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;~&lt;span class=&quot;token string&quot;&gt;&apos;0 4px 5px #666, 2px 6px 10px #999&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And that would produce this CSS:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.shadows&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-moz-box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 4px 5px #666, 2px 6px 10px #999&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-webkit-box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 4px 5px #666, 2px 6px 10px #999&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 4px 5px #666, 2px 6px 10px #999&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Excepted some little specificities, mixins just work the same.&lt;/p&gt;
&lt;h3 id=&quot;operations&quot;&gt;&lt;a href=&quot;#operations&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Operations&lt;/h3&gt;
&lt;p&gt;Every preprocessor has is bunch of mathematical operations which could be very useful to do some flexible styling with variables.&lt;/p&gt;
&lt;p&gt;Syntaxes are very close and intuitive - just a matter of &lt;code class=&quot;language-text&quot;&gt;+&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;-&lt;/code&gt;, etc. A best practice is to isolate these operations into parenthesis so you avoid potential confusions and conflicts.&lt;/p&gt;
&lt;p&gt;However, you should know that LESS is considering the first unit specified in the calculus, which could lead to some aberrations while SASS will properly output a warning instead of compiling something wrong:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300px &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; 2em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// == 302px o_O&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So in LESS you should better &lt;strong&gt;not specify variables unit&lt;/strong&gt; so you don’t have that kind of nasty surprises when you do operations. You just have to apply the unit at the very end and you’re all set:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;@base-font-size&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt; 16&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;@base-spacing-unit&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt; 24&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@base-font-size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;16&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;1em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@base-spacing-unit&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;1px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which will produce:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;functions&quot;&gt;&lt;a href=&quot;#functions&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Functions&lt;/h3&gt;
&lt;p&gt;Each preprocessor brings their own functions that allow you to do a bunch of very nice things with colors, maths, strings, etc.&lt;/p&gt;
&lt;p&gt;You may have a look to each respective list to get an idea:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html&quot;&gt;SASS functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://lesscss.org/#reference&quot;&gt;LESS functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;interpolation&quot;&gt;&lt;a href=&quot;#interpolation&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Interpolation&lt;/h3&gt;
&lt;p&gt;Sometimes you’ll need to include some variables into stings and interprate them however. That’s what we call interpolation and both SASS and LESS allow you to do that:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* With SASS */&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$base-url&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;../images&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.container &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#{$base-url}/bg.png&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* With LESS */&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;@base-url&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;../images&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;url(&apos;@{base-url}/bg.png&apos;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which will produce:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;url(&apos;../images/bg.png&apos;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The only difference is the syntax: &lt;code class=&quot;language-text&quot;&gt;#{ $var }&lt;/code&gt; with SASS and &lt;code class=&quot;language-text&quot;&gt;@{ var }&lt;/code&gt; with LESS.&lt;/p&gt;
&lt;p&gt;You also can interpolate variables within selectors as we could see with loops - yep, I’m working on my transitions.&lt;/p&gt;
&lt;h3 id=&quot;loops&quot;&gt;&lt;a href=&quot;#loops&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Loops&lt;/h3&gt;
&lt;p&gt;Technically speaking, both preprocessors can implement loops which could be very useful.&lt;/p&gt;
&lt;p&gt;However, SASS natively deals with the iteration logic, not LESS. In fact, you can use an alternative based on mixins to create the loop behavior with LESS.&lt;/p&gt;
&lt;p&gt;With LESS, here is the deal:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a mixin with an &lt;code class=&quot;language-text&quot;&gt;@index&lt;/code&gt; parameter&lt;/li&gt;
&lt;li&gt;The mixin will produce the content of the loop while &lt;code class=&quot;language-text&quot;&gt;@index &amp;gt; 0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;At the end of the mixin, you decrease &lt;code class=&quot;language-text&quot;&gt;@index&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;You create an empty verion of the mixin to stop the loop when &lt;code class=&quot;language-text&quot;&gt;@index = 0&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Which leads us to the following syntaxes for a loop:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* With SASS */&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$index&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;@while&lt;/span&gt; &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$index&lt;/span&gt; &gt; 0 &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Interpolate the class name&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;.container-&lt;span class=&quot;token variable&quot;&gt;#{$index}&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Decrease the index&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$index&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$index&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* With LESS */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.loop (&lt;span class=&quot;token variable&quot;&gt;@index&lt;/span&gt;) when (&lt;span class=&quot;token variable&quot;&gt;@index&lt;/span&gt; &gt; 0)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Interpolate the class name&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;.container-@{index}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Decrease the index and start the loop again&lt;/span&gt;
  .loop &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@index&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Stop the loop at 0&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.loop (0)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Start the loop&lt;/span&gt;
.loop &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;5&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which will output, once compiled:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container-5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.container-4&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.container-3&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.container-2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.container-1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This technique is used by Bootstrap &lt;a href=&quot;https://github.com/twitter/bootstrap/blob/master/less/mixins.less#L577-L595&quot;&gt;to generate spans regarding the number of columns&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;extend-and-silent-classes&quot;&gt;&lt;a href=&quot;#extend-and-silent-classes&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Extend and silent classes&lt;/h3&gt;
&lt;p&gt;With SASS you can extend a class properties very easily to share a common style, the second class inherits style of the first one.&lt;/p&gt;
&lt;p&gt;For instance, this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.error &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px #f00&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #fdd&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.serious-error &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;@extend&lt;/span&gt; .error&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Will give the following code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.error,
.serious-error&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px #f00&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #fdd&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.serious-error&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;SASS can create what we call &lt;em&gt;silent classes&lt;/em&gt;: you just define classes that wouldn’t be compiled until they are included somewhere with &lt;code class=&quot;language-text&quot;&gt;@extend&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So this code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;a&lt;span class=&quot;token placeholder&quot;&gt;%error&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bold&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.notice &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;@extend&lt;/span&gt; &lt;span class=&quot;token placeholder selector&quot;&gt;%error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Will output the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;a.notice&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bold&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With LESS, you’ll generally use &lt;strong&gt;mixins&lt;/strong&gt; to realize that kind of extensions. Just like a silent class, the mixin won’t be compiled until it’s included somewhere. So it comes with the same spirit, only the syntax changes:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.error()&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;a&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bold&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.notice&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token mixin-usage function&quot;&gt;.error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That said, you’ll note that SASS is extending smartly selectors - &lt;code class=&quot;language-text&quot;&gt;.error, serious-error&lt;/code&gt; in the previous example. With LESS, you’d need to do that by hand.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - &lt;a href=&quot;https://github.com/cloudhead/less.js/blob/master/CHANGELOG.md#140-beta-1--2&quot;&gt;LESS v1.4&lt;/a&gt; - which is currently in beta - will introduce &lt;code&gt;:extend()&lt;/code&gt; that could handle selectors extension. The syntax would be closer to the CSS one, just like a pseudo-selector, which should produce something like that:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.error&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px #f00&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #fdd&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.serious-error:extend(.error)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;default-variables&quot;&gt;&lt;a href=&quot;#default-variables&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;!default&lt;/code&gt; variables&lt;/h3&gt;
&lt;p&gt;With SASS you can set a default value to variables at any time. The default value is used if the variable is not already defined somewhere.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$base-font-size&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 14px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$base-font-size&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 16px &lt;span class=&quot;token statement keyword&quot;&gt;!default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$base-spacing-unit&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px &lt;span class=&quot;token statement keyword&quot;&gt;!default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.container &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$base-font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$base-spacing-unit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 16px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This technique is very useful because you can define defaults into the core of the module you’re developing, so you allow users to override them if necessary &lt;strong&gt;from the outside&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Need a concrete example? I’ve got that: the framework core of inuit.css use a bunch of defaults so the developer can use the framework as a submodule: he can update it but he never has to touch it, never!&lt;/p&gt;
&lt;p&gt;To override a variable, he just needs to define it in its own configuration file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
|-- inuit.css/ # Framework core
| |-- base/
| |-- generic/
| |-- objects/
| |-- \_defaults.scss # Default variables
| |-- \_inuit.scss # Setup file for inuit.css
|
|-- ui/
|-- \_vars.scss # Specific variables
|-- main.scss # Setup file for the project&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So he can override variables in &lt;code class=&quot;language-text&quot;&gt;_vars.scss&lt;/code&gt; and organize &lt;code class=&quot;language-text&quot;&gt;main.scss&lt;/code&gt; as follows:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * Setup
 */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;vars&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;inuit.css/inuit&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Without touching anything from the inuit.css core he is able to configure it entirely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The fact is, you ain’t gonna need this with LESS.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Thanks &lt;a href=&quot;https://twitter.com/KB1RMA&quot;&gt;Chris Snyder&lt;/a&gt; for pointing this out!&lt;/p&gt;
&lt;p&gt;For a long time I thought LESS didn’t provide the ability to do the same, and I’ve had to find hacks to this problem.&lt;/p&gt;
&lt;p&gt;Actually, variables work differently in LESS since the pre-processor uses &lt;a href=&quot;http://lesscss.org/features/#variables-feature-lazy-loading&quot;&gt;lazy loading&lt;/a&gt;. That means variables can be used &lt;strong&gt;before&lt;/strong&gt; being described.&lt;/p&gt;
&lt;p&gt;Hence, you can perfectly override variables later in your codebase. Which is the equivalent of having default variables:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;@base-font-size&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt; 14px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;@base-spacing-unit&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt; 24px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@base-font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@base-spacing-unit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* … later in your code */&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;@base-font-size&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt; 16px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Will produce the same result:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 16px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hence, we could do the same with inuit.css and use proper (default) variables in the framework while giving the capacity to developers to override them after.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * Setup
 */&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;inuit.css/inuit&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;vars&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;what-couldnt-be-reproduced-in-less&quot;&gt;&lt;a href=&quot;#what-couldnt-be-reproduced-in-less&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What couldn’t be reproduced in LESS&lt;/h2&gt;
&lt;p&gt;Here is a non-exhaustive list of what SASS is able to do and not LESS, without any real alternative but ingenious hacks.&lt;/p&gt;
&lt;h3 id=&quot;block-of-content-within-a-mixin&quot;&gt;&lt;a href=&quot;#block-of-content-within-a-mixin&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Block of content within a mixin&lt;/h3&gt;
&lt;p&gt;If you are using SASS, you can pass a whole block of content into a mixin thanks to the &lt;code class=&quot;language-text&quot;&gt;@content&lt;/code&gt; variable. Concretely, this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;@mixin&lt;/span&gt; &lt;span class=&quot;token selector&quot;&gt;apply-to-ie6-only &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;html &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;@content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;@include&lt;/span&gt; &lt;span class=&quot;token selector&quot;&gt;apply-to-ie6-only &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;#logo &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/logo.gif&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Will compile into:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;html #logo&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;url(/logo.gif)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As far as I know, there is no possibility to do that in LESS - but I’d consider any suggestion!&lt;/p&gt;
&lt;h3 id=&quot;variable-properties&quot;&gt;&lt;a href=&quot;#variable-properties&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Variable properties&lt;/h3&gt;
&lt;p&gt;With SASS you also can use interpolation to have variable properties. This is extremely useful to create powerful mixins like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;@mixin&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;border-badass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$side&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-&lt;span class=&quot;token variable&quot;&gt;#{$side}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px #bada55 solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.container &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;@include&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;border-badass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;left&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Will output:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px #bada55 solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;However, you need to do a mixin per property in LESS&lt;/strong&gt;, which is very painfull. So you may need to get use of it…&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;… well, in fact, there IS a kind of &lt;em&gt;weird&lt;/em&gt; hack that can produce the same result. I deny any responsibility for its weirdness, you are smart enough to decide whether or not it worth using it!&lt;/p&gt;
&lt;p&gt;The thing is that browsers will ignore unknown CSS properties.&lt;/p&gt;
&lt;p&gt;So let’s say, &lt;code class=&quot;language-text&quot;&gt;hack: 1;&lt;/code&gt; would’n be very valid right? But it wouldn’t be considered. If you keep that in mind and use LESS interpolation over properties values, you’d be able to imagine the following code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;.&lt;span class=&quot;token function&quot;&gt;border-badass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@side&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;hack&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1 ~&lt;span class=&quot;token string&quot;&gt;&quot;; border-@{side}: 1px #BADA55 solid&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.container &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    .&lt;span class=&quot;token function&quot;&gt;border-badass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;left&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which will output:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;hack&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px #bada55 solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Technically, it works.&lt;/p&gt;
&lt;p&gt;I don’t tell you to use it, but we can imagine that you automatically treat your compiled CSS so you delete every &lt;code class=&quot;language-text&quot;&gt;hack:1;&lt;/code&gt; for instance. We can also imagine that LESS will have this feature later.&lt;/p&gt;
&lt;p&gt;So keep in mind: it’s weird, but it works though…&lt;/p&gt;
&lt;h2 id=&quot;final-words&quot;&gt;&lt;a href=&quot;#final-words&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final words&lt;/h2&gt;
&lt;p&gt;Here we are! That was my 50 cents about main similarities and differencies I experimented between SASS and LESS. To convert a SASS project into LESS isn’t that difficult, but you need do take care of each language specificities.&lt;/p&gt;
&lt;p&gt;From an objective point of view, SASS is more powerful than LESS and has real programming notions inside. However, its syntax and spirit is even more far from the original CSS compared to LESS, in my humble opinion.&lt;/p&gt;
&lt;p&gt;It’s much more &lt;strong&gt;a question of habit and comfort&lt;/strong&gt;. What counts is that you’re using a CSS preprocessor to simplify development and make your stylesheets easier to scale and maintain: the future you will thank the present you for that!&lt;/p&gt;
&lt;p&gt;For those who would like to play with it online, here you go:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://sass-lang.com/try.html&quot;&gt;Sass-try&lt;/a&gt;, for SASS&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://less2css.org/&quot;&gt;Less2css&lt;/a&gt;, for LESS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have any suggestion, spot any mistake or have some comments to do on this (long) post, please do.&lt;/p&gt;
&lt;p&gt;Plop!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Convertir un projet SASS en LESS]]></title><description><![CDATA[Similitudes, différences et équivalences de ces deux pré-processeurs CSS.]]></description><link>https://www.nicoespeon.com/fr/2013/06/convertir-projet-sass-en-less/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2013/06/convertir-projet-sass-en-less/</guid><pubDate>Sun, 09 Jun 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;les-goûts-et-les-couleurs&quot;&gt;&lt;a href=&quot;#les-go%C3%BBts-et-les-couleurs&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Les goûts et les couleurs&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://lesscss.org/&quot;&gt;LESS&lt;/a&gt; et &lt;a href=&quot;http://sass-lang.com/&quot;&gt;SASS&lt;/a&gt; sont aujourd’hui &lt;a href=&quot;http://css-tricks.com/poll-results-popularity-of-css-preprocessors/&quot;&gt;les deux pré-processeurs CSS les plus populaires&lt;/a&gt;, et de loin.&lt;/p&gt;
&lt;p&gt;Tous deux sont assez similaires et apportent au CSS les fonctionnalités dont rêvent basiquement tout développeur front-end, à savoir : variables, fonctions, opérations mathématiques, imbrication des sélecteurs, etc.&lt;/p&gt;
&lt;p&gt;Cependant, leur nature diffère quelque peu :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SASS est compilé en Ruby, il présente deux syntaxes différentes : &lt;code class=&quot;language-text&quot;&gt;.sass&lt;/code&gt; et &lt;code class=&quot;language-text&quot;&gt;.scss&lt;/code&gt;.&lt;br&gt;
La seconde, plus proche de celle du CSS, est la plus utilisée.&lt;/li&gt;
&lt;li&gt;LESS est compilé en Javascript, il présente une syntaxe assez proche du CSS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;D’une manière générale, on constate que &lt;a href=&quot;http://css-tricks.com/sass-vs-less/&quot;&gt;SASS est plus puissant que LESS&lt;/a&gt; car il dispose notamment d’un certain nombre de fonctionnalités supplémentaires. Toutefois, les goûts et les couleurs étant ce qu’ils sont, LESS peut tout à fait suffir à vous contenter car il est bien suffisant et, selon moi, un peu plus facile à prendre en main au début (puis l’habitude fait le reste).&lt;/p&gt;
&lt;p&gt;Personnellement, &lt;strong&gt;j’utilise LESS plutôt que SASS&lt;/strong&gt; sur mes projets, par habitude probablement.&lt;br&gt;
Dans le même temps, j’ai tendance à utiliser le framework &lt;a href=&quot;/fr/2013/04/decouvrez-inuitcss&quot;&gt;inuit.css (plutôt que Bootstrap)&lt;/a&gt; sur ces projets. Mais inuit.css, c’est du SASS !&lt;/p&gt;
&lt;p&gt;Fort heureusement, je ne suis pas le seul à aimer LESS et &lt;a href=&quot;http://twitter.com/pwcc&quot;&gt;Peter Wilson&lt;/a&gt; s’est efforcé de mettre en place la version LESS du framework. Emballé par l’idée, j’ai rejoint son projet et je maintient aujourd’hui &lt;a href=&quot;https://github.com/peterwilsoncc/inuit.css&quot;&gt;le port LESS officiel de inuit.css&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le principe consiste donc à &lt;strong&gt;traduire le framework SASS en LESS&lt;/strong&gt;, ce qui conduit à 3 éventualités :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Le code SASS est identique au code LESS, c’est le même principe&lt;/li&gt;
&lt;li&gt;Le code SASS a un équivalent en LESS, il faut alors trouver l’alternative&lt;/li&gt;
&lt;li&gt;Le code SASS n’a pas d’équivalent en LESS et il faut savoir ruser (ou fermer les yeux)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Voici donc un petit tour sur ces cas de figures, d’après ce que j’ai pu en expérimenter.&lt;/p&gt;
&lt;h2 id=&quot;ce-qui-est-identique-en-less&quot;&gt;&lt;a href=&quot;#ce-qui-est-identique-en-less&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ce qui est identique en LESS&lt;/h2&gt;
&lt;p&gt;Dans ce cas, c’est peinard : il n’y a pas grand chose à faire.&lt;/p&gt;
&lt;p&gt;En effet, malgré leurs différences, SASS et LESS partagent quelques concepts fondamentaux.&lt;/p&gt;
&lt;h3 id=&quot;imbrication-nesting&quot;&gt;&lt;a href=&quot;#imbrication-nesting&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Imbrication (nesting)&lt;/h3&gt;
&lt;p&gt;L’un des principes phares du pré-processeur CSS : l’imbrication des sélecteurs.&lt;/p&gt;
&lt;p&gt;Plutôt que de créer des sélecteurs à rallonge afin de spécifier l’héritage, il suffit d’imbriquer les sélecteurs les uns dans les autres. Ainsi, ceci :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.islet&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px&lt;span class=&quot;token selector&quot;&gt;;

  p&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #bada55&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bold&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Produira le code suivant, dans les deux langages :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.islet&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.islet p&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #bada55&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bold&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Attention&lt;/strong&gt; - Il arrive souvent que les développeurs, expérimentés ou non, s’emportent avec l’imbrication et en abusent plus que de raison, ce qui a tendance à alourdir inutilement le CSS, un vrai cauchemard !&lt;/p&gt;
&lt;p&gt;Gardez donc en tête la &lt;a href=&quot;http://thesassway.com/beginner/the-inception-rule&quot;&gt;règle de l’inception&lt;/a&gt; : &lt;strong&gt;ne jamais aller au delà de 4 niveau d’imbrication&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;commentaires-et-compilation&quot;&gt;&lt;a href=&quot;#commentaires-et-compilation&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Commentaires et compilation&lt;/h3&gt;
&lt;p&gt;Outre les fonctionnalités qu’ils apportent, les pré-processeurs permettent de disposer d’un code source clair et organisé, tout en produisant un seul fichier CSS compilé (et compressé) pour la production.&lt;/p&gt;
&lt;p&gt;Dans cet état d’esprit, SASS et LESS proposent tous deux des commentaires alternatifs qui ne sont pas conservés lors de la compilation. Ainsi donc, ceci :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * The date/time
 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.timeline__time &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// The actual inner width is `25% - x`, `x` is the padding&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 200px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Produira le code suivant :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * The date/time
 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.timeline__time&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 200px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui peut être assez pratique pour placer des commentaires qui n’ont aucune pertinence dans le code compilé, mais ont un sens vis-à-vis du code source.&lt;/p&gt;
&lt;p&gt;Notez cependant qu’un fichier compilé en production sera préférentiellement compressé de manière à ne pas inclure les commentaires CSS, à moins de les préserver explicitement (avec &lt;code class=&quot;language-text&quot;&gt;/*! */&lt;/code&gt; en utilisant &lt;a href=&quot;http://yui.github.io/yuicompressor/css.html&quot;&gt;YUI compressor&lt;/a&gt;, par exemple).&lt;/p&gt;
&lt;h3 id=&quot;imports&quot;&gt;&lt;a href=&quot;#imports&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Imports&lt;/h3&gt;
&lt;p&gt;Les pré-processeurs permettent également d’importer très simplement d’autres fichiers grâce à &lt;code class=&quot;language-text&quot;&gt;@import&lt;/code&gt;, ce qui permet la mise en place d’une architecture claire et modulaire des fichiers sources. Oui, les pré-processeurs CSS sont les grands amis de l’OOCSS.&lt;/p&gt;
&lt;p&gt;Une bonne pratique consiste donc à créer un fichier principal &lt;code class=&quot;language-text&quot;&gt;main.less&lt;/code&gt; / &lt;code class=&quot;language-text&quot;&gt;_main.scss&lt;/code&gt; dont le rôle est d’importer les fichiers dont vous aurez besoin pour produire le fichier final &lt;code class=&quot;language-text&quot;&gt;main.css&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * Setup
 */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;inuit.css/defaults&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;vars&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;inuit.css/inuit&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/**
 * It&apos;s all yours, cap’n… Begin importing your stuff here.
 */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ui/base&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ui/layout&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ui/mod-block-list&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ui/mod-helper&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* etc. */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Vous noterez que préciser l’extension n’est pas utile, que ce soit en SASS ou en LESS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attention&lt;/strong&gt; - Malgré toute ressemblance, la commande &lt;code&gt;@import&lt;/code&gt; des pré-processeurs n’a rien à voir avec celle de CSS. En effet, le pré-processeur va importer vos fichiers lors de la compilation afin de produire un fichier CSS unique tandis que l’import en CSS fera télécharger plusieurs fichiers par le navigateur.&lt;/p&gt;
&lt;p&gt;Notez également que l’utilisation de &lt;code&gt;@import&lt;/code&gt; est &lt;a href=&quot;http://browserdiet.com/fr/#prefer-link-over-import&quot;&gt;une mauvaise pratique CSS&lt;/a&gt;, à éviter donc.&lt;/p&gt;
&lt;h2 id=&quot;ce-qui-a-un-équivalent-en-less&quot;&gt;&lt;a href=&quot;#ce-qui-a-un-%C3%A9quivalent-en-less&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ce qui a un équivalent en LESS&lt;/h2&gt;
&lt;p&gt;Dans ce cas, il s’agit surtout de connaître la syntaxe et les spécificités de chaque langage, les principes fondamentaux étant les mêmes. Voyons donc ce que nous avons…&lt;/p&gt;
&lt;h3 id=&quot;variables&quot;&gt;&lt;a href=&quot;#variables&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Variables&lt;/h3&gt;
&lt;p&gt;SASS comme LESS donnent la possibilité de créer des variables. Et les variables en CSS, c’est quasiment le Saint Graal !&lt;/p&gt;
&lt;p&gt;Le concept est assez simple à assimiler, la seule différence entre les deux c’est que SASS utilise des &lt;code class=&quot;language-text&quot;&gt;$&lt;/code&gt; tandis que LESS utilise des &lt;code class=&quot;language-text&quot;&gt;@&lt;/code&gt;. Les goûts et les couleurs…&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Avec SASS */&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$color&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #bada55&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.header &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Avec LESS */&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;@color&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt; #bada55&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le rendu CSS :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #bada55&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;mixins&quot;&gt;&lt;a href=&quot;#mixins&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Mixins&lt;/h3&gt;
&lt;p&gt;SASS et LESS permettent de créer ce qu’on appelle des &lt;strong&gt;mixins&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ce mot barbare signifie tout simplement qu’il est possible de créer des groupes de propriétés pouvant être inclus très simplement ailleurs.&lt;/p&gt;
&lt;p&gt;Là encore, c’est surtout la syntaxe qui diffère, le principe est le même :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* En SASS */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@mixin&lt;/span&gt; &lt;span class=&quot;token selector&quot;&gt;bordered &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; dotted 1px black&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid 2px black&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.header &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;@include&lt;/span&gt; bordered&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* En LESS */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.bordered()&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; dotted 1px black&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid 2px black&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token mixin-usage function&quot;&gt;.bordered&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui donnera en CSS :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; dotted 1px black&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid 2px black&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il est à savoir que les mixins vont plus loin que ça et peuvent prendre en compte des paramètres, des valeurs par défaut, des conditions, etc.&lt;/p&gt;
&lt;p&gt;Sans rentrer dans les détails, sachez par exemple que les mixins peuvent prendre en compte &lt;strong&gt;un nombre d’arguments variables&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Cependant, là où SASS gère parfaitement les différentes valeurs distinctes passées en paramètre, il faut échapper celles de LESS si on veut qu’il n’interprète pas le tout comme une seule grosse variable (qu’il prenne en compte la virgule quoi).&lt;/p&gt;
&lt;p&gt;L’échappement en LESS permet tout simplement de retourner une chaîne de caractère telle quelle grâce à &lt;code&gt;~“ma chaîne”&lt;/code&gt;, ce qui servira dans un certain nombre d’astuces (du coup).&lt;/p&gt;
&lt;p&gt;Techniquement cela se présente comme ceci :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* En SASS */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@mixin&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$shadows&lt;/span&gt;…&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-moz-box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$shadows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-webkit-box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$shadows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$shadows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.shadows &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;@include&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0 4px 5px #666, 2px 6px 10px #999&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* En LESS */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.box-shadow(&lt;span class=&quot;token variable&quot;&gt;@shadows&lt;/span&gt;…)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-moz-box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@shadows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-webkit-box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@shadows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@shadows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.shadows&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token mixin-usage function&quot;&gt;.box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;~&lt;span class=&quot;token string&quot;&gt;&apos;0 4px 5px #666, 2px 6px 10px #999&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui donnera en CSS :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.shadows&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-moz-box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 4px 5px #666, 2px 6px 10px #999&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-webkit-box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 4px 5px #666, 2px 6px 10px #999&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 4px 5px #666, 2px 6px 10px #999&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Outre les petites spécificités, les mixins fonctionnent de la même manière.&lt;/p&gt;
&lt;h3 id=&quot;opérations&quot;&gt;&lt;a href=&quot;#op%C3%A9rations&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Opérations&lt;/h3&gt;
&lt;p&gt;Chaque pré-processeur apporte son lot d’opérations mathématiques, très utiles pour réaliser un certain nombre de calculs et d’ajustements qui ne dépendront que de quelques variables, modifiables à souhait.&lt;/p&gt;
&lt;p&gt;Les syntaxes sont similaires et assez intuitives (des histoires de &lt;code class=&quot;language-text&quot;&gt;+&lt;/code&gt;, de &lt;code class=&quot;language-text&quot;&gt;-&lt;/code&gt;, etc.). Une bonne pratique consiste à isoler les opérations entre parenthèses afin d’éviter les confusions et potentiels conflits.&lt;/p&gt;
&lt;p&gt;Cependant, il faut savoir que LESS considère la première unité spécifiée dans le calcul, ce qui peut conduire à des aberrations (SASS lui ne compilera pas et vous sortira un joli warning) :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300px &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; 2em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// == 302px o_O&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En LESS il est donc préférable de &lt;strong&gt;ne pas spécifier les unités des variables&lt;/strong&gt; afin de ne pas avoir de mauvaises surprises lors des opérations mathématiques. Il suffit de prendre l’habitude d’appliquer l’unité à la fin, lors de son affectation à une propriété :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;@base-font-size&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt; 16&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;@base-spacing-unit&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt; 24&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@base-font-size&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;16&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;1em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@base-spacing-unit&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;1px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui donnera :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;fonctions&quot;&gt;&lt;a href=&quot;#fonctions&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Fonctions&lt;/h3&gt;
&lt;p&gt;Chaque pré-processeur vient avec son lot de fonctions qui permettent de faire un certain nombre de trucs très sympa comme transformer les couleurs, faire des maths, manipuler des chaînes de caractères, etc.&lt;/p&gt;
&lt;p&gt;Le plus simple, c’est de vous donner les liens vers les listes exhaustives de chacun :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html&quot;&gt;Les fonctions de SASS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://lesscss.org/#reference&quot;&gt;Les fonctions de LESS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;interpolation&quot;&gt;&lt;a href=&quot;#interpolation&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Interpolation&lt;/h3&gt;
&lt;p&gt;Parfois, il est nécessaire d’inclure des variables au sein de chaines de caractères et de les interpréter tout de même. C’est ce qu’on appelle l’interpolation et SASS comme LESS permettent cela :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Avec SASS */&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$base-url&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;../images&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.container &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#{$base-url}/bg.png&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Avec LESS */&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;@base-url&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;../images&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;url(&apos;@{base-url}/bg.png&apos;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui donnera :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;url(&apos;../images/bg.png&apos;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Seule la syntaxe diffère, &lt;code class=&quot;language-text&quot;&gt;#{ $var }&lt;/code&gt; pour SASS et &lt;code class=&quot;language-text&quot;&gt;@{ var }&lt;/code&gt; pour LESS.&lt;/p&gt;
&lt;p&gt;Il est également possible d’interpoler des variables dans les sélecteurs, comme nous allons le voir avec les boucles (oui, je travaille mes transitions).&lt;/p&gt;
&lt;h3 id=&quot;boucles&quot;&gt;&lt;a href=&quot;#boucles&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Boucles&lt;/h3&gt;
&lt;p&gt;Techniquement parlant, les deux pré-processeurs permettent de créer des boucles, ce qui peut s’avérer assez utile parfois.&lt;/p&gt;
&lt;p&gt;En revanche, si SASS gère nativement la logique de l’itération, LESS n’a rien de tel. En fait, il s’agit véritablement d’une alternative qui consiste à se baser sur les mixins afin de créer le comportement de la boucle.&lt;/p&gt;
&lt;p&gt;En LESS, le principe est donc le suivant :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;On crée un mixin se basant sur un &lt;code class=&quot;language-text&quot;&gt;@index&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Le mixin produit le contenu de la boucle tant que &lt;code class=&quot;language-text&quot;&gt;@index &amp;gt; 0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;A la fin du mixin, on décrémente &lt;code class=&quot;language-text&quot;&gt;@index&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;On crée une variante vide du mixin pour arrêter la boucle quand &lt;code class=&quot;language-text&quot;&gt;@index = 0&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ce qui nous donne les syntaxes suivantes :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* En SASS */&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$index&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;@while&lt;/span&gt; &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$index&lt;/span&gt; &gt; 0 &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// On interpole le nom de la classe&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;.container-&lt;span class=&quot;token variable&quot;&gt;#{$index}&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// On décrémente l&apos;index&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$index&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$index&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* En LESS */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.loop (&lt;span class=&quot;token variable&quot;&gt;@index&lt;/span&gt;) when (&lt;span class=&quot;token variable&quot;&gt;@index&lt;/span&gt; &gt; 0)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// On interpole le nom de la classe&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;.container-@{index}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Relance la boucle en décrémentant l&apos;index&lt;/span&gt;
  .loop &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;@index&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Arrête la boucle à 0&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.loop (0)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Lance la boucle (le mixin)&lt;/span&gt;
.loop &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;5&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui donnera, une fois compilé :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container-5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.container-4&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.container-3&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.container-2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.container-1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;z-index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette technique est notamment utilisée par Bootstrap &lt;a href=&quot;https://github.com/twitter/bootstrap/blob/master/less/mixins.less#L577-L595&quot;&gt;pour générer leurs spans en fonction du nombre de colonnes&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;extensions-et-classes-silencieuses&quot;&gt;&lt;a href=&quot;#extensions-et-classes-silencieuses&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Extensions et classes silencieuses&lt;/h3&gt;
&lt;p&gt;En SASS, il est possible d’étendre les propriétés d’une classe à une autre afin de partager un style commun, la seconde classe héritant de la première.&lt;/p&gt;
&lt;p&gt;Par exemple, ceci :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.error &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px #f00&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #fdd&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.serious-error &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;@extend&lt;/span&gt; .error&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Donnera le code suivant :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.error,
.serious-error&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px #f00&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #fdd&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.serious-error&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;SASS permet également de créer ce que l’on appelle des &lt;em&gt;classes silencieuses&lt;/em&gt; : il s’agit de définir des classes qui ne seront pas compilées avant d’être explicitement incluses avec &lt;code class=&quot;language-text&quot;&gt;@extend&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ainsi, ceci :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;a&lt;span class=&quot;token placeholder&quot;&gt;%error&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bold&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.notice &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;@extend&lt;/span&gt; &lt;span class=&quot;token placeholder selector&quot;&gt;%error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Produira le code suivant :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;a.notice&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bold&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En LESS, on utilise généralement &lt;strong&gt;les mixins&lt;/strong&gt; pour réaliser ce genre d’extension. Selon le même principe que la classe silencieuse, le mixin ne sera pas compilé tant qu’il n’aura pas été inclus quelque part. Le principe est donc sensiblement le même, seule la syntaxe diffère :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.error()&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;a&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bold&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.notice&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token mixin-usage function&quot;&gt;.error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cela étant, vous noterez que SASS gère intelligemment l’extension en synthétisant les sélecteurs (&lt;code class=&quot;language-text&quot;&gt;.error, serious-error&lt;/code&gt; dans l’exemple précédent). En LESS, il faudrait le faire à la main.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - &lt;a href=&quot;https://github.com/cloudhead/less.js/blob/master/CHANGELOG.md#140-beta-1--2&quot;&gt;La version 1.4 de LESS&lt;/a&gt; (actuellement en béta) introduit &lt;code&gt;:extend()&lt;/code&gt; qui permettra de gérer les extensions au niveau des sélecteurs. La syntaxe sera donc plus proche du CSS, rappelant celle des pseudo-sélecteurs, ce qui devrait donner quelque chose du genre :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.error&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px #f00&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #fdd&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.serious-error:extend(.error)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;variables-default&quot;&gt;&lt;a href=&quot;#variables-default&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Variables &lt;code class=&quot;language-text&quot;&gt;!default&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Avec SASS, il est possible de donner une valeur par défaut aux variables, a posteriori. Cela signifie que la valeur sera affectée si et seulement si la variable n’est pas déjà définie.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$base-font-size&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 14px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$base-font-size&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 16px &lt;span class=&quot;token statement keyword&quot;&gt;!default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$base-spacing-unit&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px &lt;span class=&quot;token statement keyword&quot;&gt;!default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.container &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$base-font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$base-spacing-unit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 16px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L’intérêt de cette technique, c’est de pouvoir définir des variables par défaut au coeur du module développé, tout en permettant à celles-ci d’être &lt;strong&gt;redéfinies de l’extérieur&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Un exemple concret ? Le coeur du framework d’inuit.css utilise un ensemble de variables par défaut, permettant au développeur d’utiliser ce dernier comme un sous-module : il le met éventuellement à jour mais ne touche jamais au code qu’il y a dedans.&lt;/p&gt;
&lt;p&gt;Pour modifier une variable, il doit simplement la redéfinir plus haut, dans son propre fichier de configuration :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
|-- inuit.css/ # Coeur du framework
| |-- base/
| |-- generic/
| |-- objects/
| |-- _defaults.scss # Variables par défaut
| |-- _inuit.scss # Fichier setup inuit.css
|
|-- ui/
|-- _vars.scss # Variables spécifiques
|-- main.scss # Fichier setup projet&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il lui suffit de surcharger éventuellement des variables dans &lt;code class=&quot;language-text&quot;&gt;_vars.scss&lt;/code&gt; et d’organiser son &lt;code class=&quot;language-text&quot;&gt;main.scss&lt;/code&gt; ainsi :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * Setup
 */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;vars&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;inuit.css/inuit&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sans toucher au code de inuit.css, il est donc capable de le configurer entièrement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En vérité, vous n’avez pas besoin de cette fonctionnalité en LESS.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Merci &lt;a href=&quot;https://twitter.com/KB1RMA&quot;&gt;Chris Snyder&lt;/a&gt; de m’avoir fait remarqué ce point !&lt;/p&gt;
&lt;p&gt;Pendant un bon moment je pensais que LESS ne proposait pas d’équivalent aux variables par défaut de SASS, et qu’il fallait trouver d’habiles hacks pour contourner le problème.&lt;/p&gt;
&lt;p&gt;En réalité, les variables fonctionnent différement avec LESS car le pré-processeur fait du &lt;a href=&quot;http://lesscss.org/features/#variables-feature-lazy-loading&quot;&gt;lazy loading&lt;/a&gt;. Ce qui signifie que les variables peuvent être utilisées &lt;strong&gt;avant&lt;/strong&gt; d’être définies.&lt;/p&gt;
&lt;p&gt;Ainsi, vous pouvez parfaitement surcharger les variables plus tard dans votre code. Ce qui est équivalent à avoir des variables par défaut :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;@base-font-size&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt; 14px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;@base-spacing-unit&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt; 24px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@base-font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@base-spacing-unit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* … plus loin dans le code */&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;@base-font-size&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/span&gt; 16px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Donnera le même résultat :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 16px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 24px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;De cette façon, nous pouvons faire la même chose avec inuit.css et tranquillement utiliser des variables (par défaut) dans le framework tout en laissant la possibilité aux développeurs de les surcharger ensuite.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * Setup
 */&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;inuit.css/inuit&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;vars&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;ce-qui-ne-peut-être-reproduit-en-less&quot;&gt;&lt;a href=&quot;#ce-qui-ne-peut-%C3%AAtre-reproduit-en-less&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ce qui ne peut être reproduit en LESS&lt;/h2&gt;
&lt;p&gt;Voici donc une liste non exhaustive de ce dont SASS est capable sans qu’il n’existe de véritable alternative en LESS (éventuellement des ruses de sioux).&lt;/p&gt;
&lt;h3 id=&quot;bloc-de-contenu-dans-un-mixin&quot;&gt;&lt;a href=&quot;#bloc-de-contenu-dans-un-mixin&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Bloc de contenu dans un mixin&lt;/h3&gt;
&lt;p&gt;Avec SASS il est possible de passer tout un bloc de contenu au sein d’un mixin avec la variable &lt;code class=&quot;language-text&quot;&gt;@content&lt;/code&gt;. Concrètement, ceci :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;@mixin&lt;/span&gt; &lt;span class=&quot;token selector&quot;&gt;apply-to-ie6-only &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;*html &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;@content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;@include&lt;/span&gt; &lt;span class=&quot;token selector&quot;&gt;apply-to-ie6-only &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;#logo &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/logo.gif&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Se compile ainsi :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;*html #logo&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;url(/logo.gif)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;D’autant que je sache, il n’existe pas d’équivalent en LESS (désolé).&lt;/p&gt;
&lt;h3 id=&quot;variabiliser-les-propriétés&quot;&gt;&lt;a href=&quot;#variabiliser-les-propri%C3%A9t%C3%A9s&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Variabiliser les propriétés&lt;/h3&gt;
&lt;p&gt;En SASS, il est également possible d’utiliser l’interpolation pour variabiliser une propriété. C’est extrêmement utile pour créer des mixins concis et puissants. Ainsi, ceci :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;@mixin&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;border-badass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$side&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-&lt;span class=&quot;token variable&quot;&gt;#{$side}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px #bada55 solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.container &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;@include&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;border-badass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;left&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Donnera par exemple :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px #bada55 solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;En LESS en revanche, il s’agira de faire un mixin par propriété&lt;/strong&gt;, ce qui complique énormément la tâche pour ce genre de cas de figure. Il faut donc apprendre à s’en passer…&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;… bon, en réalité, il existe une bidouille qui permet d’obtenir le même résultat, mais qui n’a rien de très propre. A utiliser en votre âme et conscience donc !&lt;/p&gt;
&lt;p&gt;Le principe se base sur le fait que les navigateurs ignorent les propriétés inconnues en CSS.&lt;/p&gt;
&lt;p&gt;Ainsi, &lt;code class=&quot;language-text&quot;&gt;hack: 1;&lt;/code&gt; ne sera pas très valide, mais ne sera pas considéré. Sachant cela, et en le combinant avec l’interpolation LESS qui peut se faire sur les valeurs, on peut imaginer le code suivant :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;less&quot;&gt;&lt;pre class=&quot;language-less&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.border-badass(&lt;span class=&quot;token variable&quot;&gt;@side&lt;/span&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;hack&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1 ~&lt;span class=&quot;token string&quot;&gt;&apos;; border-@{side}: 1px #BADA55 solid&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token mixin-usage function&quot;&gt;.border-badass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;left&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Qui donnera :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;hack&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px #bada55 solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Techniquement, ça marche.&lt;/p&gt;
&lt;p&gt;De là à l’utiliser, tout dépend de votre besoin je dirais. On peut imaginer que vous traitiez automatiquement votre CSS compilé lors du build pour supprimer les occurrences à &lt;code class=&quot;language-text&quot;&gt;hack:1;&lt;/code&gt; par exemple. On peut aussi imaginer que LESS intègrera cette fonctionnalité à l’avenir.&lt;/p&gt;
&lt;p&gt;Sinon, gardez en tête que c’est un peu sale (quand même).&lt;/p&gt;
&lt;h2 id=&quot;pour-finir&quot;&gt;&lt;a href=&quot;#pour-finir&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pour finir&lt;/h2&gt;
&lt;p&gt;Voici donc les principales similarités et différences qui existent entre SASS et LESS, d’après mon expérience. Convertir un projet SASS en LESS n’a rien de bien sorcier en soit, à condition de connaître et prendre garde aux spécificités de chaque langage.&lt;/p&gt;
&lt;p&gt;D’un point de vue objectif, SASS est plus puissant que LESS et dispose de véritables notions de programmation qui peuvent en séduire plus d’un. Cependant, sa syntaxe et son esprit s’éloignent d’autant, LESS étant plus “naturel” et proche du langage CSS selon moi.&lt;/p&gt;
&lt;p&gt;C’est donc plutôt &lt;strong&gt;une question de préférence et de confort&lt;/strong&gt; que vous aurez à faire dans la plupart des cas. Le principal, c’est d’avoir fait le pas et d’utiliser un pré-processeur pour simplifier le développement et faciliter la maintenance de votre CSS : vous vous direz merci tôt ou tard !&lt;/p&gt;
&lt;p&gt;Pour ceux qui veulent jouer et tester tout ceci en ligne, voici :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://sass-lang.com/try.html&quot;&gt;Sass-try&lt;/a&gt;, pour le SASS&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://less2css.org/&quot;&gt;Less2css&lt;/a&gt;, pour le LESS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous voyez des ajouts, des erreurs ou avez des remarques à émettre sur ce post, n’hésitez pas.&lt;/p&gt;
&lt;p&gt;Plop !&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Faire un blog multilingue avec Jekyll]]></title><description><![CDATA[Un petit état des lieux des choses à savoir et des astuces que je peux vous donner pour réaliser un blog multilingue avec Jekyll.]]></description><link>https://www.nicoespeon.com/fr/2013/05/faire-blog-multilingue-avec-jekyll/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2013/05/faire-blog-multilingue-avec-jekyll/</guid><pubDate>Wed, 29 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;note-sur-la-compatibilité&quot;&gt;&lt;a href=&quot;#note-sur-la-compatibilit%C3%A9&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Note sur la compatibilité&lt;/h2&gt;
&lt;p&gt;Ce qui suit se base sur l’utilisation de Jekyll &lt;code class=&quot;language-text&quot;&gt;v0.12.1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour Jekyll &lt;code class=&quot;language-text&quot;&gt;v1.5&lt;/code&gt;, allez jeter un oeil à &lt;a href=&quot;/fr/2014/04/blog-multilingue-avec-jekyll-1-5&quot;&gt;celui d’Avril 2014&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Veuillez noter que des changements majeurs sont survenus lors du passage à la &lt;code class=&quot;language-text&quot;&gt;v1.0.0&lt;/code&gt;, rendant certaines de ces astuces non compatibles (je pense surtout aux plugins). Je rédigerai un nouvel article lorsque je mettrais à jour mon propre Jekyll à une version v1.0+.&lt;/p&gt;
&lt;p&gt;Si vous le souhaitez, vous pouvez toujours installer une ancienne version de Jekyll avec la commande suivante :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Installe l&apos;ancienne version de jekyll&lt;/span&gt;
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; gem &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; jekyll --version 0.12.1

&lt;span class=&quot;token comment&quot;&gt;# Désinstalle la version actuelle si vous l&apos;avez téléchargée&lt;/span&gt;
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; gem uninstall jekyll --version &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;your current version&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;petit-retour-sur-jekyll&quot;&gt;&lt;a href=&quot;#petit-retour-sur-jekyll&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Petit retour sur Jekyll&lt;/h2&gt;
&lt;p&gt;J’ai commencé ce blog avec &lt;a href=&quot;%7B%25%20post_url%202013-04-07-faire-son-blog-avec-jekyll%20%25%7D&quot;&gt;un article présentant Jekyll&lt;/a&gt; et ce qui m’avait amené à ce choix.&lt;/p&gt;
&lt;p&gt;Pour résumer l’intérêt de ce “générateur de site dynamique” par rapport à un CMS tout prêt tel que Wordpress, j’avais avancé les points suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pas besoin/envie de m’embêter avec une BDD&lt;/strong&gt;. Restons simple et faisons du front-end.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pouvoir mettre mon site à jour quand je push sur Github&lt;/strong&gt;. J’aurais évidemment pu mettre en place des hooks pour reproduire le même comportement sur un serveur, mais c’est totalement inutile grâce à Jekyll et &lt;a href=&quot;https://help.github.com/categories/20/articles&quot;&gt;Github Pages&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Suivre les dernières tendances en matière de développement web&lt;/strong&gt;. L’expérience Jekyll me paraissait donc tentante, j’ai succombé.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Simplement, Jekyll est adapté pour du blogging… mais du blogging en anglais (et voui). Par défaut, il n’est donc pas vraiment optimisé pour le français et encore moins pour créer un blog multilingue.&lt;/p&gt;
&lt;p&gt;Bien entendu, c’est tout à fait possible si l’on sait ruser et mettre un peu les mains dans le cambouis. Je me propose donc ici de vous expliquer les quelques étapes dont vous aurez besoin si vous souhaitez pouvoir blogger dans 2 langues, ou plus.&lt;/p&gt;
&lt;h2 id=&quot;do-you-parler-français-&quot;&gt;&lt;a href=&quot;#do-you-parler-fran%C3%A7ais-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Do you parler Français ?&lt;/h2&gt;
&lt;p&gt;Le meilleur exemple de la nature &lt;em&gt;english oriented&lt;/em&gt; de Jekyll est certainement &lt;a href=&quot;http://liquid.rubyforge.org/classes/Liquid/StandardFilters.html#M000012&quot;&gt;le filtre Liquid &lt;code class=&quot;language-text&quot;&gt;date&lt;/code&gt;&lt;/a&gt;. Ce dernier permet de retourner très simplement la date de publication d’un post, par exemple, mais dans le format anglais ! Certes, si vous vous contentez des chiffres ça passera sans problème. En revanche ça risque de faire tâche d’avoir des &lt;code class=&quot;language-text&quot;&gt;19 April, 2013&lt;/code&gt; qui trainent un peu partout sur votre blog francophone.&lt;/p&gt;
&lt;p&gt;Le deuxième soucis majeur se pose lorsque vous souhaitez &lt;strong&gt;distinguer les articles en fonction de leur langue&lt;/strong&gt;, pour proposer 2 pages d’index différentes par exemple. La bonne idée qui vous vient, c’est naturellement de créer une catégorie par langue. Mais le &lt;code class=&quot;language-text&quot;&gt;paginator&lt;/code&gt; Jekyll, qui vous permet d’afficher le listing paginé des posts de votre site, n’a pas été créé pour gérer les catégories. Cela pose un léger soucis puisque vous allez vous retrouver à choisir entre :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tous les posts d’une catégorie, listés sur une seule page&lt;/li&gt;
&lt;li&gt;Un listing de X posts par page, toutes catégories (langues) confondues&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bref, autant d’obstacles qui pimentent un peu le challenge. Voyons comment s’en sortir malgré tout.&lt;/p&gt;
&lt;h3 id=&quot;parlons-stratégie&quot;&gt;&lt;a href=&quot;#parlons-strat%C3%A9gie&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Parlons stratégie&lt;/h3&gt;
&lt;p&gt;Prenons le problème à l’envers, et définissons ce que nous souhaitons obtenir pour commencer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nous voulons que l’anglais soit la langue par défaut, à la racine de projet.&lt;/li&gt;
&lt;li&gt;Chaque langue représente une catégorie, ce qui peut être aisément retranscrit avec l’architecture des dossiers.&lt;/li&gt;
&lt;li&gt;La partie française doit être accessible à partir de l’URL de base &lt;code class=&quot;language-text&quot;&gt;/fr&lt;/code&gt; (ce qui se goupille pas trop mal avec les précédentes considérations).&lt;/li&gt;
&lt;li&gt;Les articles en anglais doivent être listés uniquement sur &lt;code class=&quot;language-text&quot;&gt;index.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Les articles en français doivent être listés uniquement sur &lt;code class=&quot;language-text&quot;&gt;index.html/fr&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;La pagination doit gérer la distinction anglais/français.&lt;/li&gt;
&lt;li&gt;Ca doit rester simple !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Élaborons donc l’architecture de nos fichiers source d’après ce que nous venons de dire :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
|-- _includes/ # Bouts de codes inclus ailleurs
|-- _layouts/ # Templates du site
|-- _plugins/ # Plugins pour surcharger de Jekyll
|-- assets/ # LESS/CSS, JS, images, …
|-- fr/ # Categorie FR
| |-- _posts/ # Articles en français
| |-- index.html # Pages html en français
| |-- about.html
| |-- (…)
|
|-- en/ # Catégorie EN
| |-- _posts/ # Articles en anglais
|
|-- index.html # Pages html par défaut (EN)
|-- about.html
|-- (…)
|-- _config.yml # Fichier de configuration de Jekyll&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Lorsqu’il est lancé, Jekyll génère le site statique final dans le dossier &lt;code class=&quot;language-text&quot;&gt;_site/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - Personnellement, j’utilise le fichier &lt;code class=&quot;language-text&quot;&gt;_config.yml&lt;/code&gt; pour y mettre des variables qui dépendent de la langue et que je réutilise dans les templates.&lt;/p&gt;
&lt;p&gt;Ce n’est pas &lt;strong&gt;la solution la plus propre&lt;/strong&gt; selon moi, mais c’est assez facile à mettre en place et cela fonctionne plutôt bien pour le moment (tant qu’il n’y en a pas trop). Cela changera à l’avenir lorsque je me serais penché sur une manière plus élégante pour faire ça.&lt;/p&gt;
&lt;h2 id=&quot;les-plugins-en-renfort&quot;&gt;&lt;a href=&quot;#les-plugins-en-renfort&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Les plugins en renfort&lt;/h2&gt;
&lt;p&gt;Pour résoudre les problèmes que nous avons soulevé plus tôt, j’ai mis en place 2 petits plugins qui vont surcharger le workflow classique de Jekyll pour le plier à notre volonté (c’est qui l’patron ?).&lt;/p&gt;
&lt;h3 id=&quot;1-pagination-par-categorie&quot;&gt;&lt;a href=&quot;#1-pagination-par-categorie&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Pagination par categorie&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/_plugins/category_pagination.rb&quot;&gt;category_pagination.rb&lt;/a&gt; modifie le fonctionnement du &lt;code class=&quot;language-text&quot;&gt;paginator&lt;/code&gt; afin de prendre seulement en compte les articles qui correspondent à la catégorie spécifiée, et ainsi pouvoir distinguer les deux.&lt;/p&gt;
&lt;p&gt;J’ai modifié le plugin original afin de définir l’anglais comme catégorie par défaut à la racine au lien d’afficher tous les &lt;code class=&quot;language-text&quot;&gt;site.posts&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;2-filtre-i18n&quot;&gt;&lt;a href=&quot;#2-filtre-i18n&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Filtre i18n&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/_plugins/i18n_filter.rb&quot;&gt;i18n_filter.rb&lt;/a&gt; customise le traitement de &lt;code class=&quot;language-text&quot;&gt;page.date&lt;/code&gt; en fonction de la langue.&lt;/p&gt;
&lt;p&gt;J’ai du ajouter un fichier &lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/_locales/fr.yml&quot;&gt;_locales/fr.yml&lt;/a&gt; afin de créer la fonction &lt;code class=&quot;language-text&quot;&gt;localize&lt;/code&gt;. Elle fonctionne de la même manière que &lt;code class=&quot;language-text&quot;&gt;date&lt;/code&gt; mais renvoie le format français de la date.&lt;/p&gt;
&lt;h2 id=&quot;le-point-github&quot;&gt;&lt;a href=&quot;#le-point-github&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le point Github&lt;/h2&gt;
&lt;p&gt;Les plugins sont installés, les templates sont élaborés, le design est mis en place, le git flow est prêt ainsi que le dépôt sur Github… &lt;em&gt;Pushons joyeusement !&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Je constate que &lt;a href=&quot;https://help.github.com/articles/setting-up-a-custom-domain-with-pages&quot;&gt;la redirection DNS de mon domaine perso&lt;/a&gt; fonctionne à merveille mais… erf. Le résultat n’est vraiment pas celui attendu !&lt;/p&gt;
&lt;p&gt;Yep, pour ceux qui l’auraient remarqué tout comme moi à ce moment là, Github lance Jekyll en mode &lt;code class=&quot;language-text&quot;&gt;--safe&lt;/code&gt;, ce qui veut dire que &lt;strong&gt;les plugins sont désactivés&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Au revoir pagination par catégorie et filtre i18n.&lt;/p&gt;
&lt;h3 id=&quot;a-chaque-problème-sa-solution-&quot;&gt;&lt;a href=&quot;#a-chaque-probl%C3%A8me-sa-solution-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A chaque problème, sa solution …&lt;/h3&gt;
&lt;p&gt;… et Google votre meilleur ami.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://charliepark.org/jekyll-with-plugins/&quot;&gt;J’ai pu trouver l’inspiration&lt;/a&gt; pour redéfinir mon workflow git et contourner ce nouveau problème en ce qui me concerne. C’est ce que je vous propose très concrètement ci-dessous.&lt;/p&gt;
&lt;h3 id=&quot;un-petit-retour-sur-le-workflow-et-les-branches&quot;&gt;&lt;a href=&quot;#un-petit-retour-sur-le-workflow-et-les-branches&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Un petit retour sur le workflow et les branches&lt;/h3&gt;
&lt;p&gt;Nous allons considérer que notre workflow comporte 2 branches distinctes :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;La branche &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;, qui correspond au site final compilé. Il est généré par Jekyll dans le dossier &lt;code class=&quot;language-text&quot;&gt;_site/&lt;/code&gt; lors de la compilation et Github peut très bien héberger directement un site statique avec l’ajout &lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/master/.nojekyll&quot;&gt;d’un fichier &lt;code class=&quot;language-text&quot;&gt;.nojekyll&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La branche &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt;, qui correspond aux fichiers sources puisque nous avons besoin de les versionner. Ces fichiers seront compilés par Jekyll lors du déploiement, afin de commiter le rendu sur la branche &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Il n’y a pas de merge de &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; dans &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; avec ce workflow. Il s’agit de deux branches évoluant en parallèle avec une version source du code pour l’une, et compilée pour l’autre.&lt;/p&gt;
&lt;p&gt;Le déploiement consiste à compiler le code source de la branche de développement (&lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt;) et à venir committer ces changements sur la branche de production (&lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id=&quot;deux-branches-parallèles-wtf-&quot;&gt;&lt;a href=&quot;#deux-branches-parall%C3%A8les-wtf-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Deux branches parallèles WTF ?&lt;/h3&gt;
&lt;p&gt;Bien que cela sorte de la vision classique des branchements aka &lt;em&gt;“tout le modèle de branches part d’un ancêtre commun”&lt;/em&gt;, Git permet également de créer de nouvelles branches n’ayant pas d’ancêtre commun avec le commit sur lequel nous nous trouvons. Un peu comme un nouveau projet dans le projet.&lt;/p&gt;
&lt;p&gt;C’est ce que l’on appelle &lt;strong&gt;des branches orphelines&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pour créer une telle branche, c’est très simple :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;console&quot;&gt;&lt;pre class=&quot;language-console&quot;&gt;&lt;code class=&quot;language-console&quot;&gt;$ git checkout --orphan &amp;lt;new branch&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans notre cas, considérons donc que notre branche initiale (par défaut) soit &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt;. Il s’agit donc de créer une branche &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; depuis cette branche afin d’y versionner la version compilée de notre site :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;console&quot;&gt;&lt;pre class=&quot;language-console&quot;&gt;&lt;code class=&quot;language-console&quot;&gt;$ git checkout --orphan master&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il suffit donc de considérer cette branche comme une version alternative de votre code.&lt;/p&gt;
&lt;p&gt;Supprimez tout ce qui n’a rien à y faire (les fichiers sources) et faîtes en sorte d’y versionner le code final, compilé (celui qui se trouve normalement dans le répertoire &lt;code class=&quot;language-text&quot;&gt;_site/&lt;/code&gt; du code source).&lt;/p&gt;
&lt;p&gt;En ce qui me concerne, j’avais déjà pushé les premiers commits quand je me suis rendu compte de mon erreur. Mon workflow initial se basait sur des merge de &lt;code&gt;develop&lt;/code&gt; dans &lt;code&gt;master&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Mais plutôt que de recréer l’ensemble du dépôt et de rebaser tout ça, j’ai décidé de conserver cet historique en corrigeant le tir avec quelques commits. Il n’y a pas à rougir de faire des erreurs après tout, c’est ainsi qu’on apprend.&lt;/p&gt;
&lt;h3 id=&quot;déployer-comme-un-prince&quot;&gt;&lt;a href=&quot;#d%C3%A9ployer-comme-un-prince&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Déployer comme un prince&lt;/h3&gt;
&lt;p&gt;L’idée de base à présent, c’est de travailler sur vos fichiers sources dans &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt;. Puis, il faut que vous compiliez votre code, que vous changiez de branche, supprimiez ce qui n’a rien à faire là et ne conserviez que le code du site compilé final. La manière de procéder pour en arriver là est à votre entière disposition, tout dépend de votre façon de fonctionner.&lt;/p&gt;
&lt;p&gt;Pour ma part, j’ai 2 solutions à vous proposer pour vous permettre de déployer tout ça plus facilement (= sans avoir à vous taper le process à la main) :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Vous vous faîtes un petit script de build qui vous permet de faire tout ça en une ligne de commande. C’est le cas de &lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/Makefile&quot;&gt;mon Makefile&lt;/a&gt; qui me permet de déployer en lançant un simple &lt;code class=&quot;language-text&quot;&gt;make deploy&lt;/code&gt; dans mon terminal. Libre à moi de pusher ensuite.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vous pouvez aller jeter un oeil à &lt;a href=&quot;https://github.com/prost87/git-publish-pages&quot;&gt;git publish&lt;/a&gt; qui est un script que vous pouvez rajouter à Git et qui vous permettra de déployer des sites Jekyll avec ce workflow justement (quand on vous dit que d’autres y ont pensé avant vous).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;et-voilà-&quot;&gt;&lt;a href=&quot;#et-voil%C3%A0-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Et voilà !&lt;/h2&gt;
&lt;p&gt;Nous y voilà, cela devrait fonctionner parfaitement à présent. Avec ces petits conseils vous devriez être en mesure de faire votre blog Jekyll, hébergé sur Github et multilingue &lt;em&gt;\o/&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Comme d’habitude, nhésitez pas à émettre commentaires, suggestions, remarques et autres questions qui vous trotteraient dans la tête, si besoin, ci-dessous.&lt;/p&gt;
&lt;p&gt;Plop !&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Bien isoler ses variables en Javascript]]></title><description><![CDATA[Une histoire de fonctions anonymes et auto-exécutantes (IIFE)… Parce-qu'on n'y pense pas assez, et que c'est bien pratique quand même !]]></description><link>https://www.nicoespeon.com/fr/2013/05/bien-isoler-ses-variables-en-javascript/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2013/05/bien-isoler-ses-variables-en-javascript/</guid><pubDate>Sun, 19 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;tldr&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Ne pas se préoccuper de la portée des variables en Javascript, c’est aller au-devant de graves déconvenues. Il est important &lt;strong&gt;d’isoler l’environnement de son script&lt;/strong&gt; afin de ne pas modifier involontairement des variables globales lors de son exécution.&lt;/p&gt;
&lt;p&gt;Les &lt;strong&gt;fonctions anonymes auto-exécutantes&lt;/strong&gt; (ou &lt;a href=&quot;http://en.wikipedia.org/wiki/Immediately-invoked_function_expression&quot;&gt;IIFE&lt;/a&gt;, selon) permettent donc d’isoler le code sans perturber son exécution :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// votre code JS&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;De plus, elle rendent le code plus flexible et robuste en permettant de créer des alias aux variables globales passées en paramètre :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// votre code JS&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; jQuery&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;enveloppé-piqué-portée-&quot;&gt;&lt;a href=&quot;#envelopp%C3%A9-piqu%C3%A9-port%C3%A9e-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Enveloppé, Piqué, Porté(e) !&lt;/h2&gt;
&lt;p&gt;Je laisse les premiers points aux Étoiles et je me concentrerais ici sur la question de &lt;strong&gt;la portée des variables&lt;/strong&gt; en Javascript. Ce point, auquel on ne songe pas assez, est en effet susceptible de causer bien des soucis à grande échelle si l’on n’y prend pas garde.&lt;/p&gt;
&lt;p&gt;Pour faire simple, il serait fort regrettable que le script que l’on est en train d’écrire ne se comporte pas comme prévu parce-que la variable &lt;code class=&quot;language-text&quot;&gt;gobgob&lt;/code&gt; que l’on déclare est déjà utilisée ailleurs et qu’on n’y a pas fait attention.&lt;/p&gt;
&lt;p&gt;Il serait également gênant que notre superbe plugin de slideshow se mettent à planter complètement à l’exécution de notre script. Pourquoi ? Parce-que nous n’aurons pas pris garde au fait que ce magnifique plugin utilise la même variable que nous, et que nous venons tout juste de changer sa valeur (du coup) !&lt;/p&gt;
&lt;p&gt;Pour éviter ce genre de scénario bien fâcheux, il faut &lt;strong&gt;isoler les variables&lt;/strong&gt; de notre script du reste de l’environnement. C’est tout à fait réalisable et, si ce plugin avait été si magnifique que ça, c’est ce qu’il aurait fait !&lt;/p&gt;
&lt;h3 id=&quot;petit-rappel-sur-la-portée-des-variables-en-js&quot;&gt;&lt;a href=&quot;#petit-rappel-sur-la-port%C3%A9e-des-variables-en-js&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Petit rappel sur la portée des variables en JS&lt;/h3&gt;
&lt;p&gt;En déclarant une variable comme il se doit, celle-ci est accessible à tout le script dans lequel elle est contenue, y compris dans les fonctions qui y sont déclarées.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Hey !&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;maFonction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gobgob&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Renvoie &quot;Hey !&quot;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;maFonction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En revanche, une variable proprement déclarée dans une fonction n’est pas accessible à l’extérieur de celle-ci : elle est isolée dans la fonction.&lt;/p&gt;
&lt;p&gt;Cependant, le fait d’omettre le mot clef &lt;code class=&quot;language-text&quot;&gt;var&lt;/code&gt; lors de la déclaration d’une variable rend celle-ci &lt;strong&gt;globale&lt;/strong&gt;, c’est à dire accessible depuis tout le script (ce qui, en général, n’est pas très très propre).&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;maFonction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Hey !&apos;&lt;/span&gt;
  gubgub &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Ho !&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;maFonction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Renvoie &quot;ReferenceError: gobgob is not defined&quot;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gobgob&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Renvoie &quot;Ho !&quot;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gubgub&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce que nous souhaitons, c’est faire en sorte que les variables de notre script ne viennent pas modifier d’éventuelles variables qui existeraient déjà ailleurs !&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Hey!&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// (…)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Quelque part, bien loin dans votre JavaScript…&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// … une surchage sauvage d&apos;une variable existante (et oubliée) apparaît !&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Ho!&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;sortez-couverts-&quot;&gt;&lt;a href=&quot;#sortez-couverts-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sortez couverts !&lt;/h2&gt;
&lt;p&gt;Pour résoudre nos soucis, il s’agit donc &lt;strong&gt;d’isoler les variables&lt;/strong&gt; afin de limiter leur portée au seul endroit qui nous intéresse et ne pas venir redéfinir par mégarde des variables ou polluer l’environnement (écologie toussa toussa) avec des variables globales qui n’ont pas lieu d’être.&lt;/p&gt;
&lt;p&gt;Pour cela, il s’agit d’envelopper notre code Javascript dans ce que l’on appelle basiquement une &lt;strong&gt;fonction anonyme auto-exécutante&lt;/strong&gt; :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// votre code JS&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette encapsulation est donc :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;anonyme&lt;/strong&gt; car la fonction ne porte pas de nom&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;auto-exécutante&lt;/strong&gt; car elle est interprétée directement grâce au petit &lt;code class=&quot;language-text&quot;&gt;();&lt;/code&gt; final&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour reprendre notre exemple précédent :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Hey !&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// On enveloppe notre script comme il faut&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Ho!&apos;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Renvoie &quot;Ho!&quot;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gobgob&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Renvoie &quot;Hey !&quot; -&gt; bingo !&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gobgob&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Rien n’est boulversé dans l’exécution du script.&lt;/p&gt;
&lt;p&gt;Par contre, &lt;strong&gt;nous n’avons plus à nous soucier des autres variables&lt;/strong&gt; qui peuvent exister à partir du moment où nous travaillons dans notre environnement isolé : nous ne venons pas modifier par mégarde une variable globale !&lt;/p&gt;
&lt;p&gt;En revanche, rien ne nous empêche d’utiliser une variable globale pour autant :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Hey !&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Renvoie &quot;Hey !&quot;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gobgob&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;renommer-des-variables-globales-dans-notre-script&quot;&gt;&lt;a href=&quot;#renommer-des-variables-globales-dans-notre-script&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Renommer des variables globales dans notre script&lt;/h3&gt;
&lt;p&gt;Il est également possible de &lt;strong&gt;passer des variables en paramètre&lt;/strong&gt;, généralement afin de les redéfinir pour l’usage de notre script. C’est d’ailleurs une bonne pratique à adopter lorsque vous travailler avec une librairie telle que &lt;em&gt;jQuery&lt;/em&gt; !&lt;/p&gt;
&lt;p&gt;Imaginez que vous souhaitiez créer un petit script sympatoche. Si vous utilisez &lt;em&gt;jQuery&lt;/em&gt;, vous allez probablement utiliser des &lt;code class=&quot;language-text&quot;&gt;$&lt;/code&gt; à gogo !&lt;/p&gt;
&lt;p&gt;Seulement, que se passe-t-il si demain une autre bibliothèque vient complémenter &lt;em&gt;jQuery&lt;/em&gt; et utilise également le &lt;code class=&quot;language-text&quot;&gt;$&lt;/code&gt; comme référence ? Vous aller passer &lt;em&gt;jQuery&lt;/em&gt; &lt;a href=&quot;http://api.jquery.com/jQuery.noConflict/&quot;&gt;en mode &lt;code class=&quot;language-text&quot;&gt;noConflict()&lt;/code&gt;&lt;/a&gt;… et vous allez devoir reprendre votre script pour transformer tous vos &lt;code class=&quot;language-text&quot;&gt;$&lt;/code&gt; en &lt;code class=&quot;language-text&quot;&gt;jQuery&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ou alors, vous avez retenu ce que vous avez lu ici et 2 lignes de code vous permettront d’isoler bien proprement votre script, qui s’exécutera quoiqu’il arrive :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// votre script JS avec des $ tout partout&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;jQuery&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L’avantage de cette technique c’est que vous pouvez rapidement switcher de librairie sans modifier votre script, qui gagne donc en flexibilité et stabilité :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// votre script JS avec des $ tout partout&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Zepto&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Note performance&lt;/strong&gt; - Le double effet Kiss Cool de cette technique intervient lors de la minification de votre script. En effet, il sera possible de minifier les noms de toutes vos variables sans affecter le code (puisqu’il s’agit ni plus ni moins d’alias au final), donc de gagner de la place.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Exemple où les occurrences à `window` ont été minimifiées&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Renvoie `true`&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;astuce--créer-un-alias-pour-undefined&quot;&gt;&lt;a href=&quot;#astuce--cr%C3%A9er-un-alias-pour-undefined&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Astuce : Créer un alias pour &lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Une bonne pratique, qui est également utilisée &lt;a href=&quot;http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.js&quot;&gt;dans le code source de &lt;em&gt;jQuery&lt;/em&gt;&lt;/a&gt;, consiste à déclarer un paramètre supplémentaire non défini, qui vaudra alors &lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt; dans votre script :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; undefined&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Crée une variable gobgob valant `undefined`&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gobgob &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; undefined&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Renvoie `true`&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Notre dernière variable est donc un alias pour `undefined`&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; jQuery&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;astuce-bis--accéder-au-variables-en-dehors&quot;&gt;&lt;a href=&quot;#astuce-bis--acc%C3%A9der-au-variables-en-dehors&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Astuce bis : Accéder au variables, en dehors&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Merci &lt;a href=&quot;https://twitter.com/fabien0102&quot;&gt;@fabien0102&lt;/a&gt; pour m’avoir fait remarquer qu’il manquait ce point de détail.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Isoler son code, c’est bien. Mais parfois, on développe un plugin/une librairie et on aimerait bien pouvoir accéder à notre objet de l’extérieur, histoire de pouvoir s’en servir.&lt;/p&gt;
&lt;p&gt;Il existe probablement différentes alternatives, mais en voici une toute simple : il suffit d’attacher notre variable à &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt;, et ça marche.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; undefined&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Crée une variable gobgob et l&apos;attache à window&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Hey !&apos;&lt;/span&gt;
  window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gobgob
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Renvoie &quot;Hey !&quot;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gobgob&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;le-mot-de-la-fin&quot;&gt;&lt;a href=&quot;#le-mot-de-la-fin&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le mot de la fin&lt;/h2&gt;
&lt;p&gt;Cet article français se place dans la lignée des bonnes pratiques Javascript. C’est un premier pas vers l’élaboration de splendides scripts modulaires qui sont les composantes de plus gros projets.&lt;/p&gt;
&lt;p&gt;Ce n’est pas quelque chose de radicalement nouveau pour autant, bien qu’il n’y ait pas masse d’articles francophones sur la question (à ce niveau là, il faut généralement se mettre à la langue de Shakespeare).&lt;/p&gt;
&lt;p&gt;Enfin, je trouvais que cela faisait une bonne mise en pied à l’explication du fonctionnement d’un plugin jQuery (ça c’est du teasing).&lt;/p&gt;
&lt;p&gt;Comme d’habitude, n’hésitez pas à émettre remarques, suggestions et questions aussi diverses que variées ci-dessous.&lt;/p&gt;
&lt;p&gt;Plop !&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Properly isolate your variables in JavaScript]]></title><description><![CDATA[A story of immediately-invoked function expression (IIFE)… Know them, it could save your life!]]></description><link>https://www.nicoespeon.com/en/2013/05/properly-isolate-variables-in-javascript/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2013/05/properly-isolate-variables-in-javascript/</guid><pubDate>Sun, 19 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;tldr&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;If you don’t care about variable scoping in JavaScript, you may face some unpleasant troubles. &lt;strong&gt;Properly isolate your script environment&lt;/strong&gt; is a best practice to have so you don’t override global variables when it executes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Immediately-invoked function expressions&lt;/strong&gt; (IIFE) allow you do to that:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// your JS code&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Moreover, it makes your code flexible and robust so you can create global variables aliases as parameters for your script:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// your JS code&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; jQuery&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;its-all-about-scope&quot;&gt;&lt;a href=&quot;#its-all-about-scope&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It’s all about scope&lt;/h2&gt;
&lt;p&gt;I bet you wouldn’t like your new script not to behave as you want because the &lt;code class=&quot;language-text&quot;&gt;gobgob&lt;/code&gt; variable you use is already declared somewhere else and you didn’t pay attention for that.&lt;/p&gt;
&lt;p&gt;I would even be worse if your splendid slideshow plugin starts going wrong when your new script is executing. Why? Because you didn’t notice that this plugin use the same variable you do and that you just change its value - if so, it wouldn’t be such a splendid plugin by the way.&lt;/p&gt;
&lt;p&gt;To avoid that kind of scenario, you have to &lt;strong&gt;isolate your script&lt;/strong&gt; from the rest of the environment, so it’s still safe. It’s dead easy to do and, if your slideshow plugin were a good one, that’s what it should have done!&lt;/p&gt;
&lt;h3 id=&quot;few-reminder-about-scope-in-js&quot;&gt;&lt;a href=&quot;#few-reminder-about-scope-in-js&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Few reminder about scope in JS&lt;/h3&gt;
&lt;p&gt;If you declare properly a variable, it would be accessible from the whole script which is &lt;em&gt;inside&lt;/em&gt; it’s container.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Hey!&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;myFonction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gobgob&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Outputs &quot;Hey!&quot;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;myFonction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On the contrary, a variable properly declared into a function is not accesible from the outside of this function: the scope is limited to the function.&lt;/p&gt;
&lt;p&gt;However, if you forget to use the &lt;code class=&quot;language-text&quot;&gt;var&lt;/code&gt; keyword when you declare your variable, you’ll make it &lt;strong&gt;global&lt;/strong&gt; which means it would be accessible from anywhere - which is generally not a best practice.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;myFonction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Hey!&apos;&lt;/span&gt;
  gubgub &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Ho!&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;myFonction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Outputs &quot;ReferenceError: gobgob is not defined&quot;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gobgob&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Outputs &quot;Ho!&quot;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gubgub&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We don’t want our script variables override any other variables which would eventually exists!&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Hey!&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// (…)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Somewhere else far far away in your JavaScript…&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// … a wild override of an existing (and forgetted) variable appears!&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Ho!&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;dont-forget-the-love-glove&quot;&gt;&lt;a href=&quot;#dont-forget-the-love-glove&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Don’t forget the love glove!&lt;/h2&gt;
&lt;p&gt;To resolve our problem, we just need to &lt;strong&gt;isolate variables&lt;/strong&gt; so we limit their scope to the code we decided to.&lt;/p&gt;
&lt;p&gt;To do so, we wrap our JavaScript code into what we called an IIFE - or a &lt;strong&gt;self-executing anonymous function&lt;/strong&gt; apparently - :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// your JS code&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This code encapsulation is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;anonymous&lt;/strong&gt; because you don’t name the function&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;self-executing&lt;/strong&gt; or immediately-invoked thanks to the final little &lt;code class=&quot;language-text&quot;&gt;();&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Going back to our previous example:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Hey!&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// We wrap our script properly&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Ho!&apos;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Outputs &quot;Ho!&quot;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gobgob&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Outputs &quot;Hey!&quot; -&gt; bingo !&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gobgob&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nothing is changed for script execution.&lt;/p&gt;
&lt;p&gt;But &lt;strong&gt;we don’t have to worry about other variables&lt;/strong&gt; which could exist because we now work into a safe environment: we won’t modify a global variable inadvertently!&lt;/p&gt;
&lt;p&gt;However, we can still use global variables inside our code:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Hey!&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Outputs &quot;Hey!&quot;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gobgob&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;rename-global-variables-in-our-script&quot;&gt;&lt;a href=&quot;#rename-global-variables-in-our-script&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Rename global variables in our script&lt;/h3&gt;
&lt;p&gt;It’s even possible to &lt;strong&gt;pass variables as parameters&lt;/strong&gt; for your script. You can generally redefine them for your script usage, which is good if you’re working with some library such as &lt;em&gt;jQuery&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Imagine you’d like to create a tiny nice script using &lt;em&gt;jQuery&lt;/em&gt;. You’d probably use &lt;code class=&quot;language-text&quot;&gt;$&lt;/code&gt; everywhere.&lt;/p&gt;
&lt;p&gt;What if I told you we’re now using another library which also uses &lt;code class=&quot;language-text&quot;&gt;$&lt;/code&gt; as an alias? You’d probably pass &lt;em&gt;jQuery&lt;/em&gt; &lt;a href=&quot;http://api.jquery.com/jQuery.noConflict/&quot;&gt;in &lt;code class=&quot;language-text&quot;&gt;noConflict()&lt;/code&gt; mode&lt;/a&gt;… and you’ll have to change your script to replace &lt;code class=&quot;language-text&quot;&gt;$&lt;/code&gt; with &lt;code class=&quot;language-text&quot;&gt;jQuery&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Or you’d have listen to me and these two lines of code would have properly isolate your script which would execute, regardless of your environment:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// your JS script with a bunch of $&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;jQuery&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The good part of this technique is that you could quickly switch library without changing anything in your script, which is more flexible and stable:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// your JS script with a bunch of $&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Zepto&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Performance note&lt;/strong&gt; - When you minify your script, it’d minify your variables’ name without ruining your code, so it would make it even smaller as a result.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Example with minification for `window`&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Outputs `true`&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;tip-1-create-an-alias-for-undefined&quot;&gt;&lt;a href=&quot;#tip-1-create-an-alias-for-undefined&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tip 1: Create an alias for &lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;One of JS best practice that &lt;a href=&quot;http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.js&quot;&gt;&lt;em&gt;jQuery&lt;/em&gt; uses in its source code&lt;/a&gt; is to declare a last parameter which is not defined and would be equal to &lt;code class=&quot;language-text&quot;&gt;undefined&lt;/code&gt; in your script:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; undefined&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Create a gobgob variable which value is `undefined`&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gobgob &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; undefined&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Outputs `true`&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Our last variable is an alias for `undefined`&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; jQuery&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;tip-2-still-access-to-variables-from-the-outside&quot;&gt;&lt;a href=&quot;#tip-2-still-access-to-variables-from-the-outside&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tip 2: Still access to variables, from the outside&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Thanks &lt;a href=&quot;https://twitter.com/fabien0102&quot;&gt;@fabien0102&lt;/a&gt; for pointing this was missing.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Isolate your code is good. But you’d sometimes need to develop a plugin/a library and you’d like to access the main object from the outside, so you can use it.&lt;/p&gt;
&lt;p&gt;There are a bunch of possibilities but here is, IMHO, the simplest one: you just need to attach your variable to &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt; so it becomes global for the other scripts.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; undefined&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Create a gobgob variable and attach it to window&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Hey!&apos;&lt;/span&gt;
  window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;gobgob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gobgob
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Outputs &quot;Hey!&quot;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gobgob&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;final-words&quot;&gt;&lt;a href=&quot;#final-words&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final words&lt;/h2&gt;
&lt;p&gt;This post is not a really new one and you can find a bunch of that kind all over the web. But it’s still a few reminder to start thinking about modular scripts which are components for bigger projects.&lt;/p&gt;
&lt;p&gt;Finally, the most we speak about that, the most developers are likely to use this best practice.&lt;/p&gt;
&lt;p&gt;As usual don’t hesitate to leave me comments, suggestions or even questions if you need to.&lt;/p&gt;
&lt;p&gt;Plop!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Tombez pour SMACSS]]></title><description><![CDATA[Petit tour d'horizon sur ces guidelines qui feront de vous un bûcheron du CSS, un vrai. Timber !]]></description><link>https://www.nicoespeon.com/fr/2013/05/tombez-pour-smacss/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2013/05/tombez-pour-smacss/</guid><pubDate>Thu, 16 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;tldr&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SMACSS&lt;/strong&gt; est un ensemble de conseils et de lignes de conduite élaborés par &lt;a href=&quot;https://twitter.com/snookca&quot;&gt;Jonathan Snoovvk&lt;/a&gt; et dont le but est de vous permettre d’organiser votre CSS de manière claire et intelligente.&lt;/p&gt;
&lt;p&gt;Le premier principe réside dans &lt;strong&gt;la catégorisation&lt;/strong&gt; : on distingue et regroupe les règles CSS par affinité logique afin de structurer son code (&lt;em&gt;base, layout, module, state, theme&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Le second principe relève de &lt;strong&gt;la convention de nommage&lt;/strong&gt; : ne pas utiliser des ID quand une classe fait très bien l’affaire, nommer les classes de manière à faire ressortir la logique qui s’y cache, …&lt;/p&gt;
&lt;p&gt;Le troisième principe consiste à &lt;strong&gt;découpler le HTML du CSS&lt;/strong&gt; : garder chaque module indépendant du contexte HTML dans lequel il se trouve, utiliser les &lt;a href=&quot;http://www.yoyodesign.org/doc/w3c/css2/selector.html#child-selectors&quot;&gt;sélecteurs d’enfants&lt;/a&gt; à bon escient, …&lt;/p&gt;
&lt;p&gt;Avec ces 3 principes, SMACSS vous permet de poser des bases solides pour un CSS de qualité, made in Canada !&lt;/p&gt;
&lt;h2 id=&quot;principe-et-intérêts&quot;&gt;&lt;a href=&quot;#principe-et-int%C3%A9r%C3%AAts&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Principe et intérêts&lt;/h2&gt;
&lt;p&gt;Il arrive bien (trop) souvent que l’organisation du CSS d’un projet web soit vraiment, vraiment mauvaise.&lt;/p&gt;
&lt;p&gt;La raison à cela étant que les gens considèrent que &lt;a href=&quot;http://www.veronique-bouvier.com/css-cest-facile-par-hugo-giraudel/&quot;&gt;le CSS c’est facile&lt;/a&gt; : des sélecteurs, des attributs, des valeurs et roule ma poule ! Si bien que la plupart des projets sur lesquels j’ai travaillé tendent à organiser leur CSS de manière “naturelle”, à savoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un éventuel reset CSS ou autre framework de base,&lt;/li&gt;
&lt;li&gt;un fichier CSS principal pour tout ce qui est commun sur l’ensemble du site,&lt;/li&gt;
&lt;li&gt;un fichier CSS spécifique par page lorsqu’il est nécessaire d’ajouter du style,&lt;/li&gt;
&lt;li&gt;d’autres fichiers éventuels plus ou moins pertinents (“le CSS du carousel jQuery qu’on a choppé sur le web” en fait partie)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les problèmes sont alors présents et de plus en plus évidents à mesure que le projet évolue :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;on ne livre pas un seul et unique fichier CSS compressé par page, &lt;a href=&quot;http://browserdiet.com/#combine-css&quot;&gt;comme il le faudrait&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;on duplique les propriétés et le code qui va avec&lt;/li&gt;
&lt;li&gt;on ne sait plus où sont rangées les règles correspondant au formulaire X&lt;/li&gt;
&lt;li&gt;on galère pour maintenir le CSS, on préfère rajouter des règles les unes par dessus les autres&lt;/li&gt;
&lt;li&gt;on se demande où placer cette règle qui apparaît sur quelques pages… mais pas toutes&lt;/li&gt;
&lt;li&gt;on a oublié de racheter du café et c’est dimanche&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bref, c’est le bordel dans votre CSS !&lt;/p&gt;
&lt;p&gt;
  &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/your-css-is-a-mess-cf1b14e7fdb36982325b73285ba698a4-e0740.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
  
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 73.6%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEEAgP/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB5YdEIoE//8QAGhAAAgMBAQAAAAAAAAAAAAAAAAECAxIRE//aAAgBAQABBQLKdXkjArHEqc5kq+P/xAAVEQEBAAAAAAAAAAAAAAAAAAAAE//aAAgBAwEBPwFN/8QAFREBAQAAAAAAAAAAAAAAAAAAABL/2gAIAQIBAT8BW//EABwQAAICAgMAAAAAAAAAAAAAAAABAhETITEycf/aAAgBAQAGPwLskJ5ImqIxjSSVlKXmjmrP/8QAGhAAAgMBAQAAAAAAAAAAAAAAAREAITFBUf/aAAgBAQABPyEk2/VwaF2MdkBTcwsQV2DEKSeIQtCtP//aAAwDAQACAAMAAAAQj+//xAAXEQADAQAAAAAAAAAAAAAAAAAAAREh/9oACAEDAQE/EEpiIP/EABgRAAIDAAAAAAAAAAAAAAAAAAABEUFR/9oACAECAQE/EGrZHT//xAAfEAEBAAIBBAMAAAAAAAAAAAABEQAhMUFRgaFxkdH/2gAIAQEAAT8QpuxtoRv79ZRDG1WPLPXvC3g4NGdsDHQgqkRXyuFYJEQG3XxiWuLEWvfXxn//2Q==&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Your CSS is a MESS&quot;
        title=&quot;&quot;
        src=&quot;/static/your-css-is-a-mess-cf1b14e7fdb36982325b73285ba698a4-e0740.jpg&quot;
        srcset=&quot;/static/your-css-is-a-mess-cf1b14e7fdb36982325b73285ba698a4-64397.jpg 240w,
/static/your-css-is-a-mess-cf1b14e7fdb36982325b73285ba698a4-1a212.jpg 480w,
/static/your-css-is-a-mess-cf1b14e7fdb36982325b73285ba698a4-e0740.jpg 500w&quot;
        sizes=&quot;(max-width: 500px) 100vw, 500px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    &lt;/p&gt;
&lt;p&gt;La méthode &lt;strong&gt;Scalable and Modular Architecture for CSS (SMACSS)&lt;/strong&gt; a pour but de venir organiser tout ça selon un ensemble de lignes de conduite assez simples à appréhender.&lt;/p&gt;
&lt;p&gt;Ce n’est pas un framework au sens rigide du terme, mais des bonnes pratiques pour garder un code clairement architecturé et aisé à maintenir.&lt;/p&gt;
&lt;p&gt;La philosophie &lt;strong&gt;SMACSS&lt;/strong&gt; repose sur ces 3 grands principes que je vais détailler par la suite :&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/smacss-principles-5826f4ae14c0a4a16ea9d435ddb23646-e0740.jpg&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 74.2%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMCBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAevO2SoP/8QAGRABAQADAQAAAAAAAAAAAAAAAQACERMD/9oACAEBAAEFAs/Qxu0O5wG5kGj/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAcEAEAAQQDAAAAAAAAAAAAAAAAkREhMUFCouH/2gAIAQEABj8C9Y7LNy5So//EABoQAQADAQEBAAAAAAAAAAAAAAEAEVEhkYH/2gAIAQEAAT8hRri5xA48QBas2MqpvGTrd+sCpf1uf//aAAwDAQACAAMAAAAQsA//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAcEAEAAgIDAQAAAAAAAAAAAAABADERUSFBkeH/2gAIAQEAAT8Qy23VBh1cRZxDkWg8MQDWxHg4gdlv7wgqDYvWf//Z&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Les principes de SMACSS&quot; title=&quot;&quot; src=&quot;/static/smacss-principles-5826f4ae14c0a4a16ea9d435ddb23646-e0740.jpg&quot; srcset=&quot;/static/smacss-principles-5826f4ae14c0a4a16ea9d435ddb23646-64397.jpg 240w,
/static/smacss-principles-5826f4ae14c0a4a16ea9d435ddb23646-1a212.jpg 480w,
/static/smacss-principles-5826f4ae14c0a4a16ea9d435ddb23646-e0740.jpg 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Les 3 grands principes de SMACSS&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;catégoriser-son-css&quot;&gt;&lt;a href=&quot;#cat%C3%A9goriser-son-css&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Catégoriser son CSS&lt;/h2&gt;
&lt;p&gt;La première considération de SMACSS consiste à &lt;strong&gt;regrouper les règles CSS selon des catégories&lt;/strong&gt; qui vont définir l’organisation du code.&lt;/p&gt;
&lt;p&gt;La catégorisation est le principe central de SMACSS. Le fait de catégoriser les règles permet de distinguer des modèles type et de définir des bonnes pratiques pour chacunes de ces catégories.&lt;/p&gt;
&lt;p&gt;On distingue 5 types de catégories :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Base&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Layout&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Module&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;State&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Theme&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;base&quot;&gt;&lt;a href=&quot;#base&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Base&lt;/h3&gt;
&lt;p&gt;Il s’agit des éléments par défaut tels qu’ils sont définis sur l’ensemble du site. Ce sont les règles de style “de base” (sans blague).&lt;/p&gt;
&lt;p&gt;Bien généralement il s’agit des éléments HTML basiques.&lt;br&gt;
Mais on peut également y retrouver des sélecteurs descendants (&lt;code class=&quot;language-text&quot;&gt;h1 em&lt;/code&gt;), des sélecteurs d’enfants (&lt;code class=&quot;language-text&quot;&gt;ul &amp;gt; li&lt;/code&gt;) ou même des pseudo-classes (&lt;code class=&quot;language-text&quot;&gt;a:hover&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cette catégorie ne doit contenir ni classe, ni identifiant !&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Vous ne devez pas utiliser &lt;code class=&quot;language-text&quot;&gt;!important&lt;/code&gt; dans cette catégorie.&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Exemple des styles de base de ce blog */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #000&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;url(&apos;/assets/img/background.png&apos;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #fff&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Roboto&apos;&lt;/span&gt;, sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #f44&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;h1,
h2,
h3&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Snippet&apos;&lt;/span&gt;, sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;h1 &gt; span,
h2 &gt; span,
h3 &gt; span&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #333&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; normal&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;em&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; normal&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Snippet&apos;&lt;/span&gt;, sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Les &lt;strong&gt;resets CSS&lt;/strong&gt; font partie de cette catégorie.&lt;/p&gt;
&lt;h3 id=&quot;layout&quot;&gt;&lt;a href=&quot;#layout&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Layout&lt;/h3&gt;
&lt;p&gt;Il s’agit du découpage de l’architecture de votre site en sections principales.&lt;/p&gt;
&lt;p&gt;Généralement, il s’agit de sélecteurs simples, descendants ou d’enfants, voire de classes ou d’identifiants (pour le coup, c’est bien le seul endroit où l’usage d’ID est tolérable).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vous ne devez pas utiliser &lt;code class=&quot;language-text&quot;&gt;!important&lt;/code&gt; dans cette catégorie.&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/smacss-layout-40a830bd78f235b53cd9331734cb1d16-e0740.jpg&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 65.60000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBBAX/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAgP/2gAMAwEAAhADEAAAAdCXF5ILIf/EABkQAAIDAQAAAAAAAAAAAAAAAAABEBESE//aAAgBAQABBQLDMM5sSKj/xAAWEQADAAAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8BrKz/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAXEAADAQAAAAAAAAAAAAAAAAAAATIg/9oACAEBAAY/AqZbLeP/xAAZEAACAwEAAAAAAAAAAAAAAAAAARARIUH/2gAIAQEAAT8hxwkI2ghLCl32P//aAAwDAQACAAMAAAAQnD//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/EAP/xAAVEQEBAAAAAAAAAAAAAAAAAAAAIf/aAAgBAgEBPxCI/8QAHRAAAwACAgMAAAAAAAAAAAAAAAERQXExYYHR4f/aAAgBAQABPxCyxvYrU2du+xjZ+Po5JErzEYjbJD//2Q==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;La couche layout&quot; title=&quot;&quot; src=&quot;/static/smacss-layout-40a830bd78f235b53cd9331734cb1d16-e0740.jpg&quot; srcset=&quot;/static/smacss-layout-40a830bd78f235b53cd9331734cb1d16-64397.jpg 240w,
/static/smacss-layout-40a830bd78f235b53cd9331734cb1d16-1a212.jpg 480w,
/static/smacss-layout-40a830bd78f235b53cd9331734cb1d16-e0740.jpg 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;D&amp;#xE9;coupage du site en sections majeures pour le layout&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Exemple des styles layout de ce blog */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1050px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;header &gt; img,
header &gt; nav&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 80px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;footer&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 12px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.75rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;padding-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Attention à ne pas confondre le &lt;em&gt;layout&lt;/em&gt; et les &lt;em&gt;modules&lt;/em&gt; !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le &lt;em&gt;layout&lt;/em&gt; correspond aux sections majeures de votre site, ce sont les grandes parties de votre template (le header, le footer, la sidebar, …).&lt;/p&gt;
&lt;p&gt;Les &lt;em&gt;modules&lt;/em&gt; correspondent aux sections mineures qui peuvent apparaître sur votre site (menu de navigation, formulaire de connexion, …). Le &lt;em&gt;layout&lt;/em&gt; peut contenir un ou plusieurs &lt;em&gt;modules&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id=&quot;module&quot;&gt;&lt;a href=&quot;#module&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Module&lt;/h3&gt;
&lt;p&gt;Un module est une section mineure, un composant autonome de la page.&lt;/p&gt;
&lt;p&gt;Partir sur une structure modulaire est une bonne pratique à appliquer pour créer et maintenir un CSS flexible et réutilisable. A titre d’exemple, les modules les plus classiques sont certainement la navigation et les boutons.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vous ne devez pas utiliser d’ID ou &lt;code class=&quot;language-text&quot;&gt;!important&lt;/code&gt; dans cette catégorie.&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/smacss-module-e72757c07b945dd8837ebd0cbe842afc-e0740.jpg&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 65.60000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUBBP/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHsyksnKY//xAAaEAACAgMAAAAAAAAAAAAAAAABAwAREBMx/9oACAEBAAEFAillBbJpZBysf//EABURAQEAAAAAAAAAAAAAAAAAAAAh/9oACAEDAQE/Aar/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPwGq/8QAGxAAAQQDAAAAAAAAAAAAAAAAAAIDIZEBIDP/2gAIAQEABj8Ch1RLmaOyq0//xAAbEAABBAMAAAAAAAAAAAAAAAABABARMXGB8f/aAAgBAQABPyGkRVHJ6RMwhAWdt//aAAwDAQACAAMAAAAQFN//xAAXEQADAQAAAAAAAAAAAAAAAAAAEVGh/9oACAEDAQE/EHQ6w//EABURAQEAAAAAAAAAAAAAAAAAAABx/9oACAECAQE/ECH/xAAcEAACAgIDAAAAAAAAAAAAAAABEQAhMWEQcfD/2gAIAQEAAT8QQNmEWpXqasvuCrT5uAyDOE5XP2TPH//Z&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;La couche module&quot; title=&quot;&quot; src=&quot;/static/smacss-module-e72757c07b945dd8837ebd0cbe842afc-e0740.jpg&quot; srcset=&quot;/static/smacss-module-e72757c07b945dd8837ebd0cbe842afc-64397.jpg 240w,
/static/smacss-module-e72757c07b945dd8837ebd0cbe842afc-1a212.jpg 480w,
/static/smacss-module-e72757c07b945dd8837ebd0cbe842afc-e0740.jpg 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Mise en lumi&amp;#xE8;re des modules de la page&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Exemple des styles du module block-list de ce blog */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.block-list&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;list-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.block-list &gt; li&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 12px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 dashed #ddd&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-bottom-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.block-list &gt; li:last-child&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.block-list__link&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 12px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; -12px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le plus complexe dans l’élaboration des modules est certainement le fait de devoir prendre garde à ce qu’ils soient modulaires, justement.&lt;/p&gt;
&lt;p&gt;Un module doit être &lt;strong&gt;un bloc autonome&lt;/strong&gt; et la structure des sélecteurs doit refléter cela. Si vous commencez à ajouter un contexte spécifique dans votre CSS pour styliser votre module “en fonction de là où il se trouve”, vous passez à côté de la plaque !&lt;/p&gt;
&lt;p&gt;Il faut penser modularité et réusabilité.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;header .block-list&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* Mauvaise idée =( */&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.block-list-fit&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* Bien mieux ! */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Utilisation concrète --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;block-list block-list-fit&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Lorem ipsum dolor sit amet&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Possimus est fugit reiciendis&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Nostrum, ducimus, temporibus&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ainsi, rien ne vous empêche d’appliquer le modificateur &lt;code class=&quot;language-text&quot;&gt;.block-list-fit&lt;/code&gt; ailleurs, ou de le retirer si besoin. C’est un Lego qui apporte sa pierre à l’édifice de votre design.&lt;/p&gt;
&lt;h3 id=&quot;state&quot;&gt;&lt;a href=&quot;#state&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;State&lt;/h3&gt;
&lt;p&gt;Il s’agit de classes qui viennent définir un état particulier dans lequel se trouvent vos éléments.&lt;/p&gt;
&lt;p&gt;Généralement, une règle qui se trouve dans cette catégorie correspond à une simple classe CSS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C’est la seule catégorie où l’usage de &lt;code class=&quot;language-text&quot;&gt;!important&lt;/code&gt; peut être toléré, voire recommandé.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En effet, ce genre de règles déterminent &lt;strong&gt;un état final&lt;/strong&gt; du design, qui doit s’appliquer quoiqu’il advienne. Si votre code est propre, vous ne devriez pas avoir deux états s’appliquant sur le même élément et modifiant les mêmes attributs (sinon, vous avez un petit soucis de logique).&lt;/p&gt;
&lt;figure&gt;
  
  &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/smacss-state-be756d14664baca399990b429accbc34-e0740.jpg&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAECBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAe7mig//xAAWEAADAAAAAAAAAAAAAAAAAAAAESD/2gAIAQEAAQUCHP8A/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFBABAAAAAAAAAAAAAAAAAAAAIP/aAAgBAQAGPwJf/8QAHBAAAQMFAAAAAAAAAAAAAAAAAAEQESExcYGR/9oACAEBAAE/ITTrVm4iYb//2gAMAwEAAgADAAAAEAAP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGhABAQEBAAMAAAAAAAAAAAAAAREAIRBRYf/aAAgBAQABPxBs4a4wqzCzpHI+BPUco9o+E8f/2Q==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;La couche state&quot; title=&quot;&quot; src=&quot;/static/smacss-state-be756d14664baca399990b429accbc34-e0740.jpg&quot; srcset=&quot;/static/smacss-state-be756d14664baca399990b429accbc34-64397.jpg 240w,
/static/smacss-state-be756d14664baca399990b429accbc34-1a212.jpg 480w,
/static/smacss-state-be756d14664baca399990b429accbc34-e0740.jpg 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;/a&gt;
    
  &lt;figcaption&gt;Exemple des diff&amp;#xE9;rents &amp;#xE9;tats possibles d&amp;apos;un bouton&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Exemple des styles state d&apos;un projet */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.is-block&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block  &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.is-dragged&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0, 85, 128&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;217, 237, 247&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bien souvent, les états correspondent à des interactions avec l’utilisateur et ont des dépendances avec Javascript.&lt;/p&gt;
&lt;p&gt;En effet, quoi de plus simple que de rajouter et d’enlever une classe &lt;code class=&quot;language-text&quot;&gt;.is-loading&lt;/code&gt; sur la page pour faire un retour à l’utilisateur du traitement de sa requête ? Le JS n’en est que plus simple :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Exemple d&apos;utilisation lors d&apos;un traitement de formulaire&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;form#update-quantity&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;input&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;change&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Ajoute le loading sur la page (calcul en cours)&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;is-loading&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// Requête AJAX pour mettre directement à jour le formulaire&lt;/span&gt;
    $&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ajax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      url&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;/cart/update/&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; ref &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;/&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; quantity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      dataType&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;json&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      success&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// Retire le loading (fin du calcul)&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;removeClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;is-loading&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;// …&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;100&quot; src=&quot;https://jsfiddle.net/espeon/dt58C/embedded/result&quot; allowfullscreen=&quot;allowfullscreen&quot; frameborder=&quot;0&quot;&gt;Exemple du loading sur la page&lt;/iframe&gt;
&lt;p&gt;&lt;em&gt;Exemple de l’utilisation de &lt;code&gt;.is-loading&lt;/code&gt; lors de la modification d’un champ&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;theme&quot;&gt;&lt;a href=&quot;#theme&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Theme&lt;/h3&gt;
&lt;p&gt;Dans certains cas, il se peut qu’un projet nécessite l’élaboration de différents thèmes pouvant s’interchanger en fonction des choix de l’utilisateur ou de l’équipe.&lt;/p&gt;
&lt;p&gt;Dans ces cas, on peut &lt;strong&gt;découpler l’apparence de la structure&lt;/strong&gt; des modules (notamment) afin de pouvoir switcher facilement entre ces différents designs.&lt;/p&gt;
&lt;p&gt;Il s’agit donc généralement de redéfinir les styles de &lt;em&gt;base&lt;/em&gt;, de &lt;em&gt;layout&lt;/em&gt;, de &lt;em&gt;module&lt;/em&gt; ou même de &lt;em&gt;state&lt;/em&gt; en indiquant de manière claire quelles sont les règles qui définissent le thème et quelles sont celles qui n’en font pas partie.&lt;/p&gt;
&lt;p&gt;Bien souvent, séparer clairement ces règles en les regroupant dans un fichier CSS relatif au thème suffit à montrer cette distinction.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Exemple des styles d&apos;un theme d&apos;un projet */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Roboto&apos;&lt;/span&gt;, sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #33f&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #a66105&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.block-list &gt; li&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 dashed #00d&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* Ou bien si le thème est interchangeable, on peut envisager ceci */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.theme-ocean&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Roboto&apos;&lt;/span&gt;, sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.theme-ocean header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #33f&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #a66105&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.theme-ocean .block-list &gt; li&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 dashed #00d&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;bonus--shame&quot;&gt;&lt;a href=&quot;#bonus--shame&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Bonus : Shame&lt;/h3&gt;
&lt;p&gt;Ce point ne fait pas véritablement partie de &lt;strong&gt;SMACSS&lt;/strong&gt;, mais relève d’une idée/blague de Harry Roberts &lt;a href=&quot;http://csswizardry.com/2013/04/shame-css/&quot;&gt;au détour d’un post&lt;/a&gt;. Tant qu’à y aller dans l’organisation du code, je trouvais pertinent de rajouter ce dernier point.&lt;/p&gt;
&lt;p&gt;L’idée c’est que, dans la vraie vie, il arrive que les développeurs n’aient pas le temps de coder bien proprement une fonctionnalité de dernière minute ou bien qu’il soit nécessaire de rapidement corriger un problème sans qu’on n’ait vraiment eu le temps de comprendre ce qui n’allait pas.&lt;/p&gt;
&lt;p&gt;Ainsi, en CSS comme ailleurs, il arrive de devoir faire un petit correctif rapide à grand coup de &lt;code class=&quot;language-text&quot;&gt;overflow:hidden;&lt;/code&gt; et autres &lt;code class=&quot;language-text&quot;&gt;!important&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Le problème, c’est que bien souvent les développeurs ne prennent pas (n’ont pas) le temps de venir faire le refactoring qui s’impose, histoire de nettoyer tout ça. Et ainsi le CSS se remplit de petits hacks divers et variés, dont on oublie la raison voire l’existence, et qui viennent saloper tout le travail (je vous raconte pas quand y’a plus d’un développeur sur le projet).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La solution&lt;/strong&gt; est donc d’isoler ces petites magouilles dans un seul et même fichier : &lt;code class=&quot;language-text&quot;&gt;shame.css&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Le workflow est le suivant :&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Si la règle CSS que l&apos;on va rajouter est un hack, on la place dans &lt;code&gt;shame.css&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;On commente le hack le mieux possible
        &lt;ul&gt;
            &lt;li&gt;à quel code cela se réfère-t-il ?&lt;/li&gt;
            &lt;li&gt;pourquoi c&apos;était nécessaire ?&lt;/li&gt;
            &lt;li&gt;comment ça fonctionne ?&lt;/li&gt;
            &lt;li&gt;comment on pourrait le faire proprement en ayant plus de temps ?&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;On ne blâme pas le développeur s&apos;il a correctement expliqué son hack&lt;/li&gt;
    &lt;li&gt;Quand on a du temps disponible, on vient nettoyer &lt;code&gt;shame.css&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Voici un exemple de hack (librement inspiré de celui de Harry) :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * Nav specificity fix.
 *
 * Quelqu&apos;un a utilisé un ID dans le header (`#header a{}`)
 * qui l&apos;emporte sur le sélecteur de nav (`.site-nav a{}`).
 * Utilisation de !important pour le surcharger d&apos;ici qu&apos;on ait
 * le temps de refactor le header.
 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.site-nav a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #bada55  &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si vous faîtes les choses correctement, vous devrez inclure ce fichier &lt;strong&gt;à la fin de votre CSS compressé final&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;nommer-ses-classes&quot;&gt;&lt;a href=&quot;#nommer-ses-classes&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Nommer ses classes&lt;/h2&gt;
&lt;p&gt;En plus de la catégorisation des règles CSS et de la nouvelle structure que cela donne à notre code, il peut être particulièrement utile de convenir de certaines &lt;strong&gt;conventions de nommage&lt;/strong&gt; au sein du projet.&lt;/p&gt;
&lt;p&gt;Sans aller chercher très loin, c’est apporter une certaine rigueur et intelligence au code qui évitera aux futurs développeurs de venir se casser les dents sur des classes aux noms aléatoires.&lt;/p&gt;
&lt;p&gt;Par exemple, &lt;code class=&quot;language-text&quot;&gt;.titre-bleu&lt;/code&gt; fait partie de ces fausses bonnes idées de début de projet. Si effectivement il s’agit de mettre le titre en bleu avec cette classe, qu’en sera-t-il dans 1 an lorsque finalement il aura été décrété que le rouge était plus tendance ? Changer le CSS ne fera que relever l’absurdité des ces &lt;code class=&quot;language-text&quot;&gt;.titre-bleu&lt;/code&gt; qui sont finalement rouges… Il faudra donc se taper toutes les occurences de cette classe dans le projet pour aller corriger le tir !&lt;/p&gt;
&lt;p&gt;D’un autre côté, si le choix avait été porté sur &lt;code class=&quot;language-text&quot;&gt;.titre-festif&lt;/code&gt; (ou quelque chose d’aussi sémantique), alors il n’y aurait jamais eu de problème. C’est un concept de base qu’il faut bien assimiler si on veut éviter les erreurs qui coûtent (du temps, donc de l’argent).&lt;/p&gt;
&lt;p&gt;D’une manière générale, &lt;strong&gt;la convention de nommage doit clarifier les intentions&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Voici quelques pistes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pour les &lt;em&gt;modules&lt;/em&gt;, il est judicieux que les classes partagent la même racine correspondant au module en question. Des projets comme &lt;em&gt;Bootstrap&lt;/em&gt; &lt;a href=&quot;https://github.com/twitter/bootstrap/blob/master/less/buttons.less&quot;&gt;adoptent d’ailleurs cette convention&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.btn&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.btn-search&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.btn-small&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.btn-large&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;pour &lt;em&gt;state&lt;/em&gt;, il s’agit d’un état logique dans lequel se trouve un élément. Ainsi, il n’est pas bête que chaque classe transmettent cette intention avec &lt;code class=&quot;language-text&quot;&gt;.is-&lt;/code&gt; par exemple :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.is-loading&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.is-collapsed&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* et pour les états relatifs à un module… */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.is-btn-active&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.is-btn-disabled&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;pour les &lt;em&gt;themes&lt;/em&gt; donc, il est envisageable de créer une sorte de namespace explicite, notamment s’il est possible de switcher entre les différents thèmes proposés :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.theme-ocean&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.theme-silver&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;découpler-le-html-du-css&quot;&gt;&lt;a href=&quot;#d%C3%A9coupler-le-html-du-css&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Découpler le HTML du CSS&lt;/h2&gt;
&lt;p&gt;Ce point recoupe de manière assez explicite les bonnes pratiques d’OOCSS &lt;a href=&quot;%7B%25%20post_url%202013-05-08-plongee-au-coeur-de-oocss%20%25%7D&quot;&gt;que j’avais introduites il y a quelque temps&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le principe est donc le même : &lt;strong&gt;le CSS doit être indépendant du contexte HTML dans lequel les éléments se trouvent&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;C’est la condition &lt;em&gt;sine qua none&lt;/em&gt; d’un code flexible, modulaire et réutilisable. C’est d’autant plus vrai quand vous pensez aux modules qui constituent une bonne partie de votre CSS une fois les bases et le layout posés.&lt;/p&gt;
&lt;p&gt;De plus, faîtes en sorte que vos modules aient &lt;strong&gt;une structure prédictible&lt;/strong&gt; ! Pour cela, utilisez les sélecteurs d’enfants et ne soyez pas trop génériques, au risque de ne pas envisager tous les cas de figure.&lt;/p&gt;
&lt;p&gt;Enfin, &lt;strong&gt;si le HTML n’est pas prédictible, créez une classe !&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;des-modules-prédictibles&quot;&gt;&lt;a href=&quot;#des-modules-pr%C3%A9dictibles&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Des modules prédictibles&lt;/h3&gt;
&lt;p&gt;Pour reprendre l’exemple employé par Jonathan Snoovvk, voici un code à problème :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Un menu de navigation classique --&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Accueil&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/products&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Nos produits&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/contact&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Contactez-nois&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.nav&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;list-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.nav li&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; left&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.nav li a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; blue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;C’est un cas de figure tout ce qu’il y a de plus classique sur un projet et, jusqu’à présent, ça fonctionnait pas trop mal.&lt;/p&gt;
&lt;p&gt;Seulement voilà, le projet évolue et le menu se développe, donnant quelque chose d’un peu plus complexe :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Un menu de navigation un peu plus cossu --&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Accueil&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/products&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Nos produits&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/products/shoes&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Chaussures&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/products/jackets&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Blousons&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/contact&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Contactez-nois&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et là, c’est le drame…&lt;/p&gt;
&lt;p&gt;Le code précédent n’avait pas envisagé cette possibilité et voilà que le menu imbriqué hérite d’un design non désiré : le sous-menu est affecté par le &lt;code class=&quot;language-text&quot;&gt;float: left;&lt;/code&gt; qu’il faut à présent annuler (et pis le client, il voulait le sous-menu en rouge, paraît que c’est tendance).&lt;/p&gt;
&lt;p&gt;Une fausse bonne idée (mais naturelle) pour corriger cela consiste à créer de nouvelles règles plus spécifiques :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.nav&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;list-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.nav li&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; left&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.nav li a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; blue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.nav li li&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.nav li li a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et c’est ainsi que votre CSS devient petit à petit un joyeux bordel…&lt;/p&gt;
&lt;p&gt;Avec SMACSS, vous auriez retenu le 3e principe et pris garde à ce que la structure de votre module soit prédictible :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Un menu de navigation un peu plus cossu --&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Accueil&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/products&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Nos produits&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav nav-imbricated&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/products/shoes&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Chaussures&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/products/jackets&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Blousons&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/contact&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Contactez-nois&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.nav&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;list-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.nav &gt; li&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; left&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.nav &gt; li &gt; a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; blue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.nav-imbricated &gt; li &gt; a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Plus de problème de design du sous-menu : il suffit de lui appliquer une variante du menu de navigation. Plus besoin de devoir annuler le &lt;code class=&quot;language-text&quot;&gt;float: left;&lt;/code&gt; non désiré non plus, c’est goody !&lt;/p&gt;
&lt;h3 id=&quot;dans-le-doute-créez-une-classe&quot;&gt;&lt;a href=&quot;#dans-le-doute-cr%C3%A9ez-une-classe&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Dans le doute, créez une classe&lt;/h3&gt;
&lt;p&gt;Parfois, il s’avère que la structure d’un module soit flexible et qu’il puisse contenir tout un tas d’éléments différents. Il serait alors absurde de vouloir envisager toutes les possibilités ainsi :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.media &gt; div&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; left&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.media &gt; div img,
.media &gt; p img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.media &gt; p,
.media &gt; ul,
.media &gt; div&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La solution à ce genre de problème consiste à créer une classe afin de définir la structure, quelque soit l’élément qui sera utilisé pour la sémantique HTML :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.media-img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; left&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.media-img img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.media-body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui peut être à nouveau simplifié et présente les bases du &lt;strong&gt;media object&lt;/strong&gt; :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.media,
.media-body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.media-img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; left&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.media-img img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;C’est ce que l’on appelle découpler le HTML du CSS \o/&lt;/p&gt;
&lt;h2 id=&quot;démonstration-par-lexemple&quot;&gt;&lt;a href=&quot;#d%C3%A9monstration-par-lexemple&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Démonstration par l’exemple&lt;/h2&gt;
&lt;p&gt;Pour terminer sur la question, je me propose de vous présenter comment je met en application SMACSS dans l’organisation de mon CSS.&lt;/p&gt;
&lt;p&gt;Prenons l’exemple de ce blog (&lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io&quot;&gt;dont le code est disponible sur Github&lt;/a&gt;). L’architecture du CSS se présente de la manière suivante (dossier &lt;code class=&quot;language-text&quot;&gt;/assets/less&lt;/code&gt;) :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
|-- inuit.css/ # Framework inuit.css
|
|-- ui/
| |-- base.less # Éléments de base
| |-- layout.less # Structure globale
| |-- mod-block-list.less # Module block-list
| |-- mod-image.less # Module image
| |-- mod-island.less # Module island
| |-- mod-pagination.less # Module pagination
| (…)
| |-- (state.less) # Design des états possibles
|
|-- vars.less # Variables globales LESS
|-- nicoespeon.less # Fichier de setup&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En pratique, c’est le fichier &lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/assets/less/nicoespeon.less&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;nicoespeon.less&lt;/code&gt;&lt;/a&gt; qui est interprété et qui s’occupe d’importer les fichiers utilisés dans le bon ordre, puis de compiler tout ça et de générer un seul et unique fichier CSS compressé, rangé dans &lt;code class=&quot;language-text&quot;&gt;/assets/css/nicoespeon.css&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Personnellement, j’ai choisi de préfixer les noms de chaque module par &lt;code class=&quot;language-text&quot;&gt;mod-&lt;/code&gt;. J’aurais également pu les placer dans un dossier &lt;code class=&quot;language-text&quot;&gt;modules/&lt;/code&gt;, tout comme inuit.css dispose du dossier &lt;code class=&quot;language-text&quot;&gt;objects/&lt;/code&gt; qui remplit ni plus ni moins le même rôle.&lt;/p&gt;
&lt;p&gt;C’est donc &lt;strong&gt;un choix personnel&lt;/strong&gt;, et là est toute la question : à vous de prendre la philosophie et de l’adapter à votre réalité, à vos besoins… et de vous y tenir !&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Voilà pour cette présentation de la philosophie SMACSS !&lt;/p&gt;
&lt;p&gt;Bien évidemment, je vous suggère d’aller faire un tour du côté du site officiel :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://smacss.com&quot;&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 74.8%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQBAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB2FWqIcIK/8QAGxAAAwACAwAAAAAAAAAAAAAAAQIDABIEETH/2gAIAQEAAQUCqdZx5AdsYt2s9SPP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAHBAAAgICAwAAAAAAAAAAAAAAAAERIQIDEBKR/9oACAEBAAY/Am0dfOKxolaoZZ//xAAZEAEBAQEBAQAAAAAAAAAAAAABEVEAIRD/2gAIAQEAAT8hWmph1GSuPgPQ6p3g7QnUiI53/9oADAMBAAIAAwAAABB/D//EABYRAQEBAAAAAAAAAAAAAAAAAAEREP/aAAgBAwEBPxASNM//xAAXEQADAQAAAAAAAAAAAAAAAAABEBFR/9oACAECAQE/EIdX/8QAHxAAAgIBBAMAAAAAAAAAAAAAAREAITEQQWFxgZGh/9oACAEBAAE/EA5EF5Ct66gcicCtNsnhaIqlgBnzGd0onzdQyBTCyIK9T//Z&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Get Smacked&quot;
        title=&quot;&quot;
        src=&quot;/static/get-smacked-65b8c1850961c7e02cb7d0d2d1cb99ec-e0740.jpg&quot;
        srcset=&quot;/static/get-smacked-65b8c1850961c7e02cb7d0d2d1cb99ec-64397.jpg 240w,
/static/get-smacked-65b8c1850961c7e02cb7d0d2d1cb99ec-1a212.jpg 480w,
/static/get-smacked-65b8c1850961c7e02cb7d0d2d1cb99ec-e0740.jpg 500w&quot;
        sizes=&quot;(max-width: 500px) 100vw, 500px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vous y trouverez l’essentiel du livre gratuitement. Vous pourrez également vous procurer le bouquin pour $15-20 si le cœur vous en dit (et disposer de conseils plus avancées sur la question).&lt;/p&gt;
&lt;p&gt;Les images utilisées dans cet article sont tirées de ”&lt;a href=&quot;https://speakerdeck.com/snookca/your&quot;&gt;Your CSS is a mess&lt;/a&gt;”, slideshow de Jonathan Snoovvk que je vous recommande.&lt;/p&gt;
&lt;p&gt;Vous pouvez également jeter un oeil à &lt;a href=&quot;http://vimeo.com/61755493&quot;&gt;son intervention à la Smashing Conference 2012&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Enfin, si vous avez des réactions à propos de cet article je vous en prie : faîtes donc ci-dessous !&lt;/p&gt;
&lt;p&gt;Plop !&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Déléguer les événements en jQuery]]></title><description><![CDATA[Un petit rappel sur les écouteurs d'événements et les bonnes pratiques de délégations en jQuery.]]></description><link>https://www.nicoespeon.com/fr/2013/05/deleguer-evenements-jquery/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2013/05/deleguer-evenements-jquery/</guid><pubDate>Mon, 13 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;tldr&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Jusqu’à &lt;strong&gt;jQuery 1.7&lt;/strong&gt; on faisait la distinction entre &lt;code class=&quot;language-text&quot;&gt;$.fn.bind&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt; et &lt;code class=&quot;language-text&quot;&gt;$.fn.delegate&lt;/code&gt; afin de créer des écouteurs d’événements.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$.fn.bind&lt;/code&gt; est la manière la plus basique d’attacher un écouteur à un objet, généralement un noeud du DOM.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt; est plus puissant car il attache l’écouteur à la racine du document et fait &lt;em&gt;vivre&lt;/em&gt; le comportement sur chaque élément du DOM correspondant, y compris ceux créés par la suite.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$.fn.delegate&lt;/code&gt; se comporte plus ou moins comme &lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt; à ceci près que l’on spécifie un noeud du DOM où l’on attache notre écouteur &lt;em&gt;live&lt;/em&gt;, ce qui est bien plus rapide à l’exécution.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$.fn.delegate&lt;/code&gt; est plus performant que &lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt; qui est plus performant que &lt;code class=&quot;language-text&quot;&gt;$.fn.bind&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Depuis &lt;strong&gt;jQuery 1.7&lt;/strong&gt;, toutes ces méthodes ont étés remplacées par l’unique méthode &lt;code class=&quot;language-text&quot;&gt;$.fn.on&lt;/code&gt;. Les principes de performance sont les mêmes, seule la syntaxe change.&lt;/p&gt;
&lt;h2 id=&quot;never-gonna-bind-you-up&quot;&gt;&lt;a href=&quot;#never-gonna-bind-you-up&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Never gonna &lt;code class=&quot;language-text&quot;&gt;bind&lt;/code&gt; you up&lt;/h2&gt;
&lt;p&gt;C’est la méthode la plus élémentaire pour attacher un écouteur d’événements à un objet jQuery. Elle est généralement utilisée sur des éléments du DOM dans le but de créer des intéractions avec l’utilisateur :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Utilisation basique de $.fn.bind&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;div#main-content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Notre objet écoute désormais l’événement nommé &lt;code class=&quot;language-text&quot;&gt;&amp;#39;click&amp;#39;&lt;/code&gt; et réagira à chaque fois que cet événement sera déclenché. Sur l’exemple précédent par exemple, la fonction définie sera déclenchée à chaque fois que l’on cliquera sur l’élément &lt;code class=&quot;language-text&quot;&gt;#main-content&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;#39;click&amp;#39;&lt;/code&gt; est l’un des noms d’événements usuels qui dispose d’une méthode raccourcie équivalente :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Équivalent du code précédent&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;div#main-content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cependant, il est possible de spécifier n’importe quel nom d’événement utilisé dans le code. En fait, c’est le point de départ de la &lt;a href=&quot;http://fr.wikipedia.org/wiki/Programmation_%C3%A9v%C3%A9nementielle&quot;&gt;programmation événementielle&lt;/a&gt; en JS, permettant de créer des applications web avancées.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;my-event&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;my-event&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Déclenchera l&apos;événement lié&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La méthode pour arrêter un tel écouteur est &lt;code class=&quot;language-text&quot;&gt;$.fn.unbind&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Avant &lt;strong&gt;jQuery 1.7&lt;/strong&gt;, c’était la manière la plus basique de faire les choses.&lt;/p&gt;
&lt;h2 id=&quot;born-to-be-a-live&quot;&gt;&lt;a href=&quot;#born-to-be-a-live&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Born to be a &lt;code class=&quot;language-text&quot;&gt;live&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Bien que le principe de &lt;code class=&quot;language-text&quot;&gt;$.fn.bind&lt;/code&gt; soit sympatoche, la méthode est assez limitée. Typiquement, elle a deux inconvénients :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Il attache un écouteur pour chacun des éléments qui correspondent au sélecteur, ce qui n’est pas la solution la plus optimale lorsque l’on cible plus d’un élément&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Il attache un écouteur seuelement sur les éléments qui correspondent au sélecteur à ce moment précis, si vous modifiez le DOM et souhaitez créer de nouveaux éléments identiques, il vous faudra attacher les événements à nouveau.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Pas glop…&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a.tooltip&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ou $(&apos;a.tooltip&apos;).click(function() { /* … */ });&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La solution développée avant &lt;strong&gt;jQuery 1.7&lt;/strong&gt; était la méthode &lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Utilisation basique de $.fn.live&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;li.text-info&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;live&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;hover&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Au lieu d’attacher un écouteur d’événements à chaque élément, il en attache un au niveau du &lt;em&gt;document root&lt;/em&gt;. Ainsi, chaque nouvel élément qui correspond au sélecteur se comportera de la même manière. De plus, c’est &lt;strong&gt;bien plus efficace&lt;/strong&gt; en termes de performance.&lt;/p&gt;
&lt;p&gt;La méthode pour arrêter un tel écouteur est &lt;code class=&quot;language-text&quot;&gt;$.fn.die&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Cette méthode est dépréciée depuis &lt;strong&gt;jQuery 1.7&lt;/strong&gt;, mais le principe reste le même, ce qui est bon à savoir.&lt;/p&gt;
&lt;h2 id=&quot;learn-to-delegate&quot;&gt;&lt;a href=&quot;#learn-to-delegate&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Learn to &lt;code class=&quot;language-text&quot;&gt;delegate&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;La méthode &lt;code class=&quot;language-text&quot;&gt;$.fn.delegate&lt;/code&gt; est basiquement la même que &lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt;, présentant les mêmes avantages par rapport à &lt;code class=&quot;language-text&quot;&gt;$.fn.bind&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Utilisation basique de $.fn.delegate&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ul#main-navigation&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;delegate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;li.text-info&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;hover&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le truc c’est que, au lieu d’attacher chaque écouteur au &lt;em&gt;document root&lt;/em&gt;, vous spécifiez l’élément du DOM où vous souhaitez porter votre attention. Ainsi, vous &lt;strong&gt;augmentez significativement la performance&lt;/strong&gt; car c’est bien plus spécifique !&lt;/p&gt;
&lt;p&gt;La méthode pour arrêter un tel écouteur est &lt;code class=&quot;language-text&quot;&gt;$.fn.undelegate&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;turn-me-on&quot;&gt;&lt;a href=&quot;#turn-me-on&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Turn me &lt;code class=&quot;language-text&quot;&gt;on&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Depuis &lt;strong&gt;jQuery 1.7&lt;/strong&gt;, toutes les précédentes méthodes ont étés fusionnées dans une seule, puissante et unique méthode : &lt;code class=&quot;language-text&quot;&gt;$.fn.on&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Maintenant que vous avez compris comment les précédentes fonctionnent, voyons quels sont leur équivalent avec la syntaxe de celle-ci :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Utilisation basique de $.fn.on au lieu de $.fn.bind&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;div#main-content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Utilisation basique de $.fn.on au lieu de $.fn.live&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;hover&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;li.text-info&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Utilisation basique de $.fn.on au lieu de $.fn.delegate&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ul#main-nav&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;hover&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;li.text-info&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La distinction entre &lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt; et &lt;code class=&quot;language-text&quot;&gt;$.fn.delegate&lt;/code&gt; et plus claire avec cette simple méthode, l’accent mis sur la délégation prend son sens (sauf si vous souhaitez explicitement attacher votre écouteur à la racine du document, ce qui est rare).&lt;/p&gt;
&lt;p&gt;Vous pouvez également passer des &lt;strong&gt;event data&lt;/strong&gt; via la méthode :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Attache des données à l&apos;événement&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; index&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; i &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;My index is &apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L’utilisation de &lt;code class=&quot;language-text&quot;&gt;$.fn.on&lt;/code&gt; est instinctive et rend la gestion événementielle très facile à prendre en main avec jQuery!&lt;/p&gt;
&lt;p&gt;La méthode pour arrêter un tel écouteur est… &lt;code class=&quot;language-text&quot;&gt;$.fn.off&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;et-pour-la-performance-&quot;&gt;&lt;a href=&quot;#et-pour-la-performance-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Et pour la performance ?&lt;/h2&gt;
&lt;p&gt;Comme expliqué, voici le listing des méthodes, de la plus performante à la moins performante :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;.on(events, selector, [data,] handler)&lt;/code&gt; équivaut à &lt;code class=&quot;language-text&quot;&gt;$.fn.delegate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;$(document).on(events, selector, [data,] handler)&lt;/code&gt; équivaut à &lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;.on(events, [data,] handler)&lt;/code&gt; équivaut à &lt;code class=&quot;language-text&quot;&gt;$.fn.bind&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pour résumer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si vous avez besoin d’attacher un écouteur d’événements à plus d’un élément, utilisez &lt;code class=&quot;language-text&quot;&gt;.on(events, selector, [data,] handler)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Si vous n’avez pas d’ancre sur laquelle vous rattacher, utilisez &lt;code class=&quot;language-text&quot;&gt;$(document).on(events, selector, [data,] handler)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Sinon, utilisez &lt;code class=&quot;language-text&quot;&gt;.on(events, [data,] handler)&lt;/code&gt;, ou la fonction raccourcie s’il y en a une&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;C’était un bref et gentil rappel sur la délégation des événements en jQuery.&lt;/p&gt;
&lt;p&gt;Rien de nouveau sous le soleil mais cette article traite d’un point important. C’est un point à savoir que vous pouvez facilement retrouver sur le net en faisant quelques recherches.&lt;/p&gt;
&lt;p&gt;Je me suis rendu compte il y a quelque temps que j’avais la fâcheuse tendance de toujours utiliser la fonction raccourcie, même pour traiter un certain nombre d’éléments, alors que j’aurais pu employer des méthodes bien plus efficaces. &lt;strong&gt;Lorsque vous vous retrouvez à gérer plus d’un élément, pensez à la méthode &lt;code class=&quot;language-text&quot;&gt;$.fn.on&lt;/code&gt; !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J’espère que ce petit point vous aura appris quelque chose ou rafraîchi la mémoire. Si c’est le cas, n’hésitez pas à me laisser votre opinion ci-dessous ;-)&lt;/p&gt;
&lt;p&gt;Plop!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Event delegation in jQuery]]></title><description><![CDATA[A few reminders about event listeners and the event delegation best practices in jQuery.]]></description><link>https://www.nicoespeon.com/en/2013/05/event-delegation-jquery/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2013/05/event-delegation-jquery/</guid><pubDate>Mon, 13 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;tldr&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Before &lt;strong&gt;jQuery 1.7&lt;/strong&gt; we used to distinguish &lt;code class=&quot;language-text&quot;&gt;$.fn.bind&lt;/code&gt; from &lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;$.fn.delegate&lt;/code&gt; to create events listeners.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$.fn.bind&lt;/code&gt; is the most basic one which attach an event listener to an object, usually a DOM node.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt; is more powerful as it attach the event listener at the document root and makes the behavior &lt;em&gt;live&lt;/em&gt; in every corresponding element of the DOM, even if they are created later.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$.fn.delegate&lt;/code&gt; behaves almost the same as &lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt;, but you specify a DOM node where to attach your &lt;em&gt;live&lt;/em&gt; listener, which is much more faster.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$.fn.delegate&lt;/code&gt; is more efficient than &lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt; which is more efficient than &lt;code class=&quot;language-text&quot;&gt;$.fn.bind&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Since &lt;strong&gt;jQuery 1.7&lt;/strong&gt;, all of these methods have been replaced by the &lt;code class=&quot;language-text&quot;&gt;$.fn.on&lt;/code&gt; method. Performance principles still the same, but the syntax changes.&lt;/p&gt;
&lt;h2 id=&quot;never-gonna-bind-you-up&quot;&gt;&lt;a href=&quot;#never-gonna-bind-you-up&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Never gonna &lt;code class=&quot;language-text&quot;&gt;bind&lt;/code&gt; you up&lt;/h2&gt;
&lt;p&gt;The most basic method to attach an event listener to a jQuery object. It’s commonly used on DOM elements to create some interaction with the user:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Basic use of $.fn.bind&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;div#main-content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Your object is now listening at the event named &lt;code class=&quot;language-text&quot;&gt;&amp;#39;click&amp;#39;&lt;/code&gt; and will do something everytime this event is triggered. With the previous code, for instance, the functon defined will be triggered everytime you click on the &lt;code class=&quot;language-text&quot;&gt;#main-content&lt;/code&gt; element.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;#39;click&amp;#39;&lt;/code&gt; is one of the usual events name which has a shorthand method which is equivalent:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Equivalent of the previous code&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;div#main-content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;However, you can pass any event name you may have specify within your code. In fact, this is the key start for &lt;a href=&quot;http://en.wikipedia.org/wiki/Event-driven_programming&quot;&gt;event-driven programming&lt;/a&gt; in JS, which helps to create advanced web-applications.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;my-event&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#foo&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;trigger&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;my-event&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Will trigger the binded event&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The method to stop such an event listener is &lt;code class=&quot;language-text&quot;&gt;$.fn.unbind&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Until &lt;strong&gt;jQuery 1.7&lt;/strong&gt;, this was the most basic way to do things.&lt;/p&gt;
&lt;h2 id=&quot;born-to-be-a-live&quot;&gt;&lt;a href=&quot;#born-to-be-a-live&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Born to be a &lt;code class=&quot;language-text&quot;&gt;live&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Although &lt;code class=&quot;language-text&quot;&gt;$.fn.bind&lt;/code&gt; principle is very nice, the method is very limited. It basically has two downsides:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;It attaches an event listener for every single element which matches the selector, which is not the most efficient solution when you target more than one element&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It attaches an event listener only for elements which matches the selector at this time, if you modify the DOM and want to create the same elements, you’ll need to bind events again.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// This sucks…&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a.tooltip&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// or $(&apos;a.tooltip&apos;).click(function() { … });&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The solution found before &lt;strong&gt;jQuery 1.7&lt;/strong&gt; was the &lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt; method:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Basic use of $.fn.live&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;li.text-info&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;live&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;hover&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Instead of attaching an event listener to every single element, it attaches just one at the &lt;em&gt;document root&lt;/em&gt; level. Doing so, any new element which matches the selector will behave the same. Futhermore, it’s &lt;strong&gt;much more efficient&lt;/strong&gt; if you speak about performance.&lt;/p&gt;
&lt;p&gt;The method to stop such an event listener is &lt;code class=&quot;language-text&quot;&gt;$.fn.die&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The method is deprecated since &lt;strong&gt;jQuery 1.7&lt;/strong&gt;, but the principle still the same, which is good to keep in mind.&lt;/p&gt;
&lt;h2 id=&quot;learn-to-delegate&quot;&gt;&lt;a href=&quot;#learn-to-delegate&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Learn to &lt;code class=&quot;language-text&quot;&gt;delegate&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;$.fn.delegate&lt;/code&gt; method is basically the same than the &lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt;, coming with the same advantages over &lt;code class=&quot;language-text&quot;&gt;$.fn.bind&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Basic use of $.fn.delegate&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ul#main-navigation&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;delegate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;li.text-info&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;hover&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The point is that, instead of attaching every event listener to the &lt;em&gt;document root&lt;/em&gt;, you specify a DOM element where you want to focus. Doing so &lt;strong&gt;increase significantly performance&lt;/strong&gt; as it’s much more specific!&lt;/p&gt;
&lt;p&gt;The method to stop such an event listener is &lt;code class=&quot;language-text&quot;&gt;$.fn.undelegate&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;turn-me-on&quot;&gt;&lt;a href=&quot;#turn-me-on&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Turn me &lt;code class=&quot;language-text&quot;&gt;on&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Since &lt;strong&gt;jQuery 1.7&lt;/strong&gt;, all of the previous methods have been merged into one single, powerful method: &lt;code class=&quot;language-text&quot;&gt;$.fn.on&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now you’ve understood the previous ones, let see what are the equivalent syntaxes with the single new method:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Basic use of $.fn.on instead of $.fn.bind&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;div#main-content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Basic use of $.fn.on instead of $.fn.live&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;hover&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;li.text-info&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Basic use of $.fn.on instead of $.fn.delegate&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ul#main-nav&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;hover&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;li.text-info&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The distinction between &lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;$.fn.delegate&lt;/code&gt; is more clear with that single method, and the emphasis on a powerful delegation makes sense (excepted if you explicitly want to attach your listener to the root of the document, which is rare).&lt;/p&gt;
&lt;p&gt;You can either pass &lt;strong&gt;event data&lt;/strong&gt; through the method:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Give some data to the event&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; index&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; i &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;My index is &apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The use of &lt;code class=&quot;language-text&quot;&gt;$.fn.on&lt;/code&gt; is pretty straightforward which makes event handling dead easy with jQuery!&lt;/p&gt;
&lt;p&gt;The method to stop such an event listener is… &lt;code class=&quot;language-text&quot;&gt;$.fn.off&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-about-performance&quot;&gt;&lt;a href=&quot;#what-about-performance&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What about performance?&lt;/h2&gt;
&lt;p&gt;As explained, here are the list of methods from the most efficient to the less one:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;.on(events, selector, [data,] handler)&lt;/code&gt; equivalent to &lt;code class=&quot;language-text&quot;&gt;$.fn.delegate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;$(document).on(events, selector, [data,] handler)&lt;/code&gt; equivalent to &lt;code class=&quot;language-text&quot;&gt;$.fn.live&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;.on(events, [data,] handler)&lt;/code&gt; equivalent to &lt;code class=&quot;language-text&quot;&gt;$.fn.bind&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In a nutshell:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you need to attach an event listener to more than one element, use &lt;code class=&quot;language-text&quot;&gt;.on(events, selector, [data,] handler)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If don’t have any anchor to focus on, use &lt;code class=&quot;language-text&quot;&gt;$(document).on(events, selector, [data,] handler)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Otherwise, use &lt;code class=&quot;language-text&quot;&gt;.on(events, [data,] handler)&lt;/code&gt;, or the shorthand function if exists&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This was a short and friendly reminder about event delegation in jQuery.&lt;/p&gt;
&lt;p&gt;No hot news but such a big deal in this article. That was a point worth noting you could also find easily, doing some researches through the Internet.&lt;/p&gt;
&lt;p&gt;I realized very few time ago that I always used shorthand functions, dealing with a bunch of DOM elements sometimes, when I could have used more efficient methods. &lt;strong&gt;When you’ve to deal with more than one element, think about the &lt;code class=&quot;language-text&quot;&gt;$.fn.on&lt;/code&gt; method!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I hope this have you learn something or refresh your mind on that point. If so, don’t hesitate to leave me comment below ;-)&lt;/p&gt;
&lt;p&gt;Plop!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Plongée au coeur de l'OOCSS]]></title><description><![CDATA[OOCSS - qu'est-ce-que c'est, pourquoi c'est bien et comment ça marche.]]></description><link>https://www.nicoespeon.com/fr/2013/05/plongee-au-coeur-de-oocss/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2013/05/plongee-au-coeur-de-oocss/</guid><pubDate>Wed, 08 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;tldr&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;“C’est comme j’te dis tu fais du CSS et tu te base sur le contexte ! Non mais all’OOCSS ! J’sais pas vous m’recevez ?”&lt;/p&gt;
&lt;p&gt;− Margina Remattia, OOCSS Evangelist&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;oocss-cest-quoi-&quot;&gt;&lt;a href=&quot;#oocss-cest-quoi-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;OOCSS, c’est quoi ?&lt;/h2&gt;
&lt;p&gt;Considérons un projet web qui débute : une start-up lambda qui se rêve de développer LA web-application incontournable du web de demain. La start-up veut bien faire et choisi judicieusement les technos, frameworks et environnements… Mais quoiqu’il en soit, le rendu front-end sera le même : &lt;em&gt;HTML, CSS et Javascript&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Seulement voilà, si l’ensemble de l’application bénéficiera sûrement des avantages de quelques frameworks, jeter un coup d’oeil du côté de la feuille de style donnera probablement quelque chose dans ce goût là (avec ou sans pré-processeur) :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;#generateur-formulaire&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 760px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;#generateur-formulaire label&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bold&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 12px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;#generateur-formulaire label.champ-titre&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; normal&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 11px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;#generateur-formulaire textarea&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 350px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;#generateur-formulaire .big textarea&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 500px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* tout plein de CSS */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Or ce code va poser un certain nombre de problèmes avec le temps :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Manque de flexibilité&lt;/strong&gt;, il ne peut s’appliquer qu’aux éléments contenus dans le formulaire portant l’identifiant &lt;code class=&quot;language-text&quot;&gt;#generateur-formulaire&lt;/code&gt;. Ca peut paraître pertinent au début, mais quid si demain une autre page du site présente deux formulaires à l’apparence similaire ?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Trop de spécificité&lt;/strong&gt;, il oblige à accentuer toujours plus la spécificité des sélecteurs si l’on souhaite rajouter un cas particulier (&lt;code class=&quot;language-text&quot;&gt;label.champ-titre&lt;/code&gt; ou &lt;code class=&quot;language-text&quot;&gt;.big textarea&lt;/code&gt; par exemple).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Trop compliqué&lt;/strong&gt;, sa maintenance nécessite d’être &lt;strong&gt;un expert&lt;/strong&gt; et de connaître l’architecture de chaque page pour décortiquer tout ce bazar. D’autant que cela promet de grossir encore et encore à mesure que le site se développe.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ajoutez à cela une organisation plus ou moins claire des fichiers CSS et vous obtenez un joli code spaghetti propice aux erreurs et à la duplication de code, surtout si d’autres développeurs se rajoutent au projet par la suite.&lt;/p&gt;
&lt;p&gt;Cette extrême dépendance à la structure HTML rend le code &lt;strong&gt;particulièrement fragile&lt;/strong&gt; : même avec le code le plus propre qu’il soit, une simple maladresse d’un non-expert peut le ruiner complètement.&lt;/p&gt;
&lt;p&gt;Bref, autant de signes de non-maturité qui risquent, à la longue, de lui compliquer la tâche à notre start-up, lui promettant de longues nuits blanches de debuggage et de refactoring.&lt;/p&gt;
&lt;p&gt;Finalement, &lt;strong&gt;le soucis de ce code réside dans la relation 1:1&lt;/strong&gt; que le CSS entretient avec le nombre de blocs, de pages et de modules du site. A mesure que le site grossit, le CSS grossit tout autant. Ca demande du temps de développement, donc de l’argent… On a vu mieux en terme de &lt;a href=&quot;http://fr.wikipedia.org/wiki/Retour_sur_investissement&quot;&gt;ROI&lt;/a&gt; !&lt;/p&gt;
&lt;figure&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 73.6%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEEAgP/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB5YdEIoE//8QAGhAAAgMBAQAAAAAAAAAAAAAAAAECAxIRE//aAAgBAQABBQLKdXkjArHEqc5kq+P/xAAVEQEBAAAAAAAAAAAAAAAAAAAAE//aAAgBAwEBPwFN/8QAFREBAQAAAAAAAAAAAAAAAAAAABL/2gAIAQIBAT8BW//EABwQAAICAgMAAAAAAAAAAAAAAAABAhETITEycf/aAAgBAQAGPwLskJ5ImqIxjSSVlKXmjmrP/8QAGhAAAgMBAQAAAAAAAAAAAAAAAREAITFBUf/aAAgBAQABPyEk2/VwaF2MdkBTcwsQV2DEKSeIQtCtP//aAAwDAQACAAMAAAAQj+//xAAXEQADAQAAAAAAAAAAAAAAAAAAAREh/9oACAEDAQE/EEpiIP/EABgRAAIDAAAAAAAAAAAAAAAAAAABEUFR/9oACAECAQE/EGrZHT//xAAfEAEBAAIBBAMAAAAAAAAAAAABEQAhMUFRgaFxkdH/2gAIAQEAAT8QpuxtoRv79ZRDG1WPLPXvC3g4NGdsDHQgqkRXyuFYJEQG3XxiWuLEWvfXxn//2Q==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Your CSS is a MESS&quot; title=&quot;&quot; src=&quot;/static/your-css-is-a-mess-cf1b14e7fdb36982325b73285ba698a4-e0740.jpg&quot; srcset=&quot;/static/your-css-is-a-mess-cf1b14e7fdb36982325b73285ba698a4-64397.jpg 240w,
/static/your-css-is-a-mess-cf1b14e7fdb36982325b73285ba698a4-1a212.jpg 480w,
/static/your-css-is-a-mess-cf1b14e7fdb36982325b73285ba698a4-e0740.jpg 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;figcaption&gt;Librement inspir&amp;#xE9; par &lt;a href=&quot;https://speakerdeck.com/snookca/your&quot;&gt;Jonathan Snoovvk&lt;/a&gt; =)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;L’&lt;strong&gt;Object Oriented CSS (OOCSS)&lt;/strong&gt; vient apporter sa solution à tous ces problèmes. Il ne s’agit pas d’un pré-processeur, ni même d’un nouveau langage, mais plutôt d’une &lt;em&gt;philosphie de code&lt;/em&gt;. C’est un ensemble de bonnes pratiques, de règles et de conseils.&lt;/p&gt;
&lt;p&gt;L’OOCSS repose sur 2 grands principes :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Séparation de la structure et de l’apparence&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Séparation du conteneur et du contenu&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;1-séparation-de-la-structure-et-de-lapparence&quot;&gt;&lt;a href=&quot;#1-s%C3%A9paration-de-la-structure-et-de-lapparence&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Séparation de la structure et de l’apparence&lt;/h3&gt;
&lt;p&gt;Les éléments d’un site web ont généralement un aspect visuel qui se répètent dans différents contextes (couleurs, police, bordures, bref… charte graphique). C’est &lt;strong&gt;l’apparence&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Dans le même temps, un certain nombre de propriétés “invisibles” sont également répétés (dimensions des blocs, overflow, etc.). C’est &lt;strong&gt;la structure&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Le fait de distinguer les deux permet de créer des éléments &lt;strong&gt;ré-utilisables&lt;/strong&gt; à souhait sur d’autres éléments partageant les mêmes propriétés : on parle alors d’&lt;strong&gt;objets&lt;/strong&gt; (ce qui devrait sonner familier aux développeurs back-end, soit dit en passant).&lt;/p&gt;
&lt;h3 id=&quot;2-séparation-du-conteneur-et-du-contenu&quot;&gt;&lt;a href=&quot;#2-s%C3%A9paration-du-conteneur-et-du-contenu&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Séparation du conteneur et du contenu&lt;/h3&gt;
&lt;p&gt;On parle ici de ne pas limiter bêtement le style d’un élément (le &lt;strong&gt;contenu&lt;/strong&gt;) au contexte dans lequel il se trouve (le &lt;strong&gt;conteneur&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;Si l’on stylise les titres, pourquoi se limiter à ceux du &lt;code class=&quot;language-text&quot;&gt;&amp;lt;header&amp;gt;&lt;/code&gt;, simplement parce-que c’est le seul titre actuel ? Il y a même de fortes chances, si notre design est un tant soit peu homogène, que les titres se comportent sensiblement de la même façon sur l’ensemble des pages du site, question d’ergonomie.&lt;/p&gt;
&lt;p&gt;C’est encore plus vrai pour les modules.&lt;/p&gt;
&lt;h2 id=&quot;oocss-pourquoi-cest-bien-&quot;&gt;&lt;a href=&quot;#oocss-pourquoi-cest-bien-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;OOCSS, pourquoi c’est bien ?&lt;/h2&gt;
&lt;h3 id=&quot;les-10-bonnes-pratiques&quot;&gt;&lt;a href=&quot;#les-10-bonnes-pratiques&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Les 10 bonnes pratiques&lt;/h3&gt;
&lt;p&gt;Voici la liste des 10 bonnes pratiques qui forment l’esprit de l’OOCSS :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Créer une bibliothèque par composant&lt;/strong&gt;&lt;br&gt;
Chaque composant (bouton, tableau, lien, image, clearfix, etc.) doit être tel un Lego = combinable et réutilisable à souhait.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Utiliser des styles sémantiques et consistants&lt;/strong&gt;&lt;br&gt;
Le style d’un nouvel élément créé en HTML doit être prévisible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Designer des modules transparents&lt;/strong&gt;&lt;br&gt;
Le module est le cadre conteneur pouvant être utilisé avec n’importe quel contenu.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Être flexible&lt;/strong&gt;&lt;br&gt;
Les hauteurs et largeurs doivent être extensibles et s’adapter (&lt;a href=&quot;http://fr.wikipedia.org/wiki/Responsive_Web_Design&quot;&gt;RWD&lt;/a&gt; inside).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apprendre à aimer les grilles&lt;/strong&gt;&lt;br&gt;
Les grilles permettent de contrôler la largeur, la hauteur se gère par le contenu.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Minimiser les sélecteurs&lt;/strong&gt;&lt;br&gt;
S’en tenir à une spécificité &lt;code class=&quot;language-text&quot;&gt;[0-0-1-0]&lt;/code&gt; permet &lt;a href=&quot;/fr/2013/05/optimiser-selecteurs-css-vs-js#bewaaaaare_la_spcificit_&quot;&gt;un meilleur contrôle sur les sélecteurs&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Séparer la structure de l’apparence&lt;/strong&gt;&lt;br&gt;
Il faut distinguer les deux, c’est un principe fondamental de l’OOCSS. Elaborez des objets abstraits pour la structure des blocs et des classes pour habiller ces blocs, indépendamment de leur nature.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Séparer le conteneur du contenu&lt;/strong&gt;&lt;br&gt;
Il faut distinguer les deux, c’est un principe fondamental de l’OOCSS. Construisez des &lt;strong&gt;relations 1:n&lt;/strong&gt; en décomposant conteneur et contenu.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Étendre les objets en appliquant de multiples classes aux éléments&lt;/strong&gt;
Les classes/objets sont autant de Legos qui s’assemblent pour obtenir le résultat désiré.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Utiliser les resets et les fonts YUI&lt;/strong&gt;&lt;br&gt;
C’est un choix relatif du &lt;a href=&quot;https://github.com/stubbornella/oocss/wiki&quot;&gt;framework OOCSS&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Les Legos d’abord&lt;/strong&gt; - Une bonne pratique consiste également à styliser les pages individuelles après que tous les composants basiques aient étés créés.&lt;/p&gt;
&lt;h3 id=&quot;les-9-pièges-à-éviter&quot;&gt;&lt;a href=&quot;#les-9-pi%C3%A8ges-%C3%A0-%C3%A9viter&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Les 9 pièges à éviter&lt;/h3&gt;
&lt;p&gt;Voici la liste des 9 erreurs &lt;strong&gt;à bannir&lt;/strong&gt; selon l’esprit OOCSS :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Créer des styles dépendant du contexte&lt;/strong&gt;&lt;br&gt;
Il n’y a rien de moins flexible qu’un sélecteur du genre &lt;code class=&quot;language-text&quot;&gt;article &amp;gt; p:nth-child(2) &amp;gt; span.plop&lt;/code&gt; ou autres fantaisies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Spécifier le tag auquel s’applique une classe&lt;/strong&gt;&lt;br&gt;
&lt;code class=&quot;language-text&quot;&gt;div.ma-classe&lt;/code&gt; est inutilement spécifique, &lt;code class=&quot;language-text&quot;&gt;.ma-classe&lt;/code&gt; suffit tout autant. En revanche, c’est tout à fait pertinent s’il s’agit de surcharger une classe pour certains éléments spécifiques (&lt;code class=&quot;language-text&quot;&gt;strong.error&lt;/code&gt; permet de surcharger les règles par défaut de &lt;code class=&quot;language-text&quot;&gt;.error&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Utiliser des identifiants&lt;/strong&gt;&lt;br&gt;
&lt;a href=&quot;/fr/2013/05/optimiser-selecteurs-css-vs-js#class_ou_id_&quot;&gt;Ce qu’un identifiant peut faire, une classe le fait tout autant&lt;/a&gt; ; la réciproque est en revanche fausse. De plus, les identifiants contribuent à créer des problèmes de spécificité.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Utiliser des ombres et des bords arrondis sur des backgrounds irréguliers&lt;/strong&gt;&lt;br&gt;
Ca tend à donner des résultats inattendus.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Faire une sprite contenant toutes les images (sauf s’il y a très peu de pages)&lt;/strong&gt;&lt;br&gt;
C’est pas très très optimal non plus sachant qu’il faut alors tout gérer en CSS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ajuster très précisément la hauteur&lt;/strong&gt;&lt;br&gt;
La hauteur d’un élément se contrôle par le contenu. Différencier le conteneur du contenu vous simplifiera la vie.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Utiliser des images comme des textes&lt;/strong&gt;&lt;br&gt;
Niveau accessibilité on fait mieux.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Faire de la redondance&lt;/strong&gt;&lt;br&gt;
Deux composants qui se ressemblent trop pour être différenciés sur une même page, se ressemblent trop pour être utilisés sur le site : choisissez-en un !&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Faire de l’optimisation précoce&lt;/strong&gt;&lt;br&gt;
Les développeurs ont tendance à perdre plus de temps à réfléchir à l’optimisation de parties non critiques avant de se concentrer sur l’essentiel.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;les-avantages-de-loocss&quot;&gt;&lt;a href=&quot;#les-avantages-de-loocss&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Les avantages de l’OOCSS&lt;/h3&gt;
&lt;p&gt;Au fur et à mesure que le projet avance, il devient possible de créer de nouvelles pages en combinant les composants de sorte qu’&lt;strong&gt;il n’est plus nécessaire de rajouter du CSS&lt;/strong&gt;, même pour une architecture complètement différente.&lt;/p&gt;
&lt;p&gt;Réutiliser les éléments est également un &lt;strong&gt;gain de performance&lt;/strong&gt; totalement gratuit ! Vous créez de nouveaux éléments avec 0 ligne de code CSS, on peut difficilement faire mieux.&lt;/p&gt;
&lt;p&gt;L’OOCSS nous force à penser le site dans sa globalité plutôt que de simples pages mises les unes à côtés des autres. Il s’agit d’anticiper l’avenir.&lt;/p&gt;
&lt;p&gt;Enfin, le principal avantage de cette philosophie selon moi est qu’elle rend le CSS modulaire, donc plus &lt;strong&gt;facilement maintenable dans le temps&lt;/strong&gt;. Cette modularité rend le CSS plus robuste : un nouveau développeur sur le projet aura moins de chance de tout casser en travaillant dessus.&lt;/p&gt;
&lt;h2 id=&quot;oocss-comment-ça-marche-&quot;&gt;&lt;a href=&quot;#oocss-comment-%C3%A7a-marche-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;OOCSS, comment ça marche ?&lt;/h2&gt;
&lt;h3 id=&quot;des-exemples-concrets&quot;&gt;&lt;a href=&quot;#des-exemples-concrets&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Des exemples concrets&lt;/h3&gt;
&lt;p&gt;Souvenez-vous des 2 grands principes de la philosophie :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Séparation de la structure et de l’apparence&lt;/li&gt;
&lt;li&gt;Séparation du conteneur et du contenu&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Avec les bonnes pratiques en tête, voyons comment l’appliquer sur un code de tout les jours.&lt;/p&gt;
&lt;h3 id=&quot;1-séparation-de-la-structure-et-de-lapparence-1&quot;&gt;&lt;a href=&quot;#1-s%C3%A9paration-de-la-structure-et-de-lapparence-1&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Séparation de la structure et de l’apparence&lt;/h3&gt;
&lt;p&gt;Pour reprendre l’éternel exemple du bouton, un code CSS “classique” ressemble souvent à cela :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;#button&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inline-block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4px 12px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 14px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #333333&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;vertical-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; middle&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pointer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #d5d5d5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;#button-primary&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inline-block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4px 12px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 14px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #ffffff&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 -1px 0 &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0, 0, 0, 0.25&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;vertical-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; middle&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pointer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #006dcc&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;#button-large&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inline-block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 8px 16px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 18px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 28px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #333333&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;vertical-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; middle&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pointer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #d5d5d5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;#button-activation&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inline-block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 8px 16px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 18px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 28px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #ffffff&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 -1px 0 &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0, 0, 0, 0.25&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;vertical-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; middle&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pointer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #006dcc&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Le HTML correspondant --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Default&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button-primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Primary&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button-large&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Large&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button-activation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Large Primary&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Au final, beaucoup de redondance et un &lt;code class=&quot;language-text&quot;&gt;#bouton-activation&lt;/code&gt; qui n’est que la version large du &lt;code class=&quot;language-text&quot;&gt;#bouton-primary&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En retravaillant le CSS avec OOCSS, on obtient quelque chose de beaucoup plus flexible :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.button&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inline-block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4px 12px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 14px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #333333&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;vertical-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; middle&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pointer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #d5d5d5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.button-primary&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #ffffff&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 -1px 0 &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0, 0, 0, 0.25&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #006dcc&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.button-large&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 8px 16px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 18px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 28px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Le HTML correspondant --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Default&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button button-primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Primary&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button button-large&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Large&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button button-large button-primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Large Primary&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;.button&lt;/code&gt; définit les propriétés génériques (et ici “par défaut”) de nos boutons. En le surchargeant, l’on obtient des classes qui peuvent se combiner pour donner le résultat attendu, &lt;strong&gt;tels des Lego&lt;/strong&gt; !&lt;/p&gt;
&lt;p&gt;Et elle est là l’astuce.&lt;/p&gt;
&lt;h3 id=&quot;2-séparation-du-conteneur-et-du-contenu-1&quot;&gt;&lt;a href=&quot;#2-s%C3%A9paration-du-conteneur-et-du-contenu-1&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Séparation du conteneur et du contenu&lt;/h3&gt;
&lt;p&gt;Il n’est pas rare au cours du développement du design principal de se retrouver avec un code ressemblant à cela :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;header h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Roboto&apos;&lt;/span&gt;, Helvetica, sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #f44&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* tout plein de code CSS */&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;footer h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Roboto&apos;&lt;/span&gt;, Helvetica, sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.5em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #f44&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;opacity = 50&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Le HTML correspondant --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Header Title&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Small title in the footer&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Là encore, échec : &lt;strong&gt;on duplique du code inutilement&lt;/strong&gt;, probablement sans même s’en rendre compte.&lt;/p&gt;
&lt;p&gt;Les éléments déclarés ici ne sont tout simplement pas réutilisables, ils dépendent directement du conteneur dans lequel on les a défini. Or il apparaît clairement que certaines propriétés ne sont pas simplement spécifiques à ces conteneurs.&lt;/p&gt;
&lt;p&gt;Ainsi, on devrait plutôt envisager l’alternative suivante :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Roboto&apos;&lt;/span&gt;, Helvetica, sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #f44&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;h1,
.h1-size&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;h2,
.h2-size&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.8em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;h3,
.h3-size&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.5em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.muted&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;opacity = 50&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Le HTML correspondant --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Header Title&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;h3-size muted&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Small title in the footer&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici vous me direz : &lt;em&gt;“Bah, à quoi bon s’embêter avec ça ? On a pas vraiment gagné de place dans le code pour le coup !”&lt;/em&gt;. Et oui, pour le coup, c’est vrai… sur cet exemple particulier où l’on ne se concentre que sur le titre.&lt;/p&gt;
&lt;p&gt;Mais l’OOCSS vous oblige à penser bien plus en amont les possibilités d’évolution de votre site. Ici, je n’ai pas simplement amélioré la flexibilité de mes titres, j’ai également introduit de nouveaux éléments :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Chaque niveau de titre à une &lt;code class=&quot;language-text&quot;&gt;font-size&lt;/code&gt; standard, homogène. Mais chacune de ces &lt;code class=&quot;language-text&quot;&gt;font-size&lt;/code&gt; est affecté dans le même temps à une classe afin de pouvoir être réutilisé indépendamment du contexte.&lt;br&gt;&lt;br&gt;
Vous noterez qu’en faisant cela je me préserve de tomber dans la mauvaise pratique (bouh !) qui consiste à choisir le niveau de titre en fonction de la taille que je veux donner visuellement à mon élément : c’est bon pour ma sémantique, c’est bon pour mon accessibilité et c’est bon pour ma &lt;a href=&quot;http://fr.wikipedia.org/wiki/Optimisation_pour_les_moteurs_de_recherche&quot;&gt;SEO&lt;/a&gt; \o/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;J’ai créé l’élément &lt;code class=&quot;language-text&quot;&gt;.muted&lt;/code&gt; qui me permet d’atténuer la visibilité (opacité) d’un élément. Je gage que cette petite classe utilitaire pourra me reservir ça et là à l’avenir et je suis sûr que je n’irais pas dupliquer le code un peu partout dans mon CSS.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;le-media-object&quot;&gt;&lt;a href=&quot;#le-media-object&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le media object&lt;/h3&gt;
&lt;p&gt;L’exemple le plus célèbre pour illustrer l’OOCSS est bien entendu le &lt;strong&gt;media object&lt;/strong&gt; créé par &lt;a href=&quot;http://www.stubbornella.org/&quot;&gt;Nicole Sullivan&lt;/a&gt; et qui &lt;a href=&quot;http://www.stubbornella.org/content/2010/06/25/the-media-object-saves-hundreds-of-lines-of-code/&quot;&gt;permet d’économiser des centaines de lignes de code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 75.2%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAIDBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHr1RM1D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAMBAAMAAAAAAAAAAAAAAAABESEQQbH/2gAIAQEAAT8h2xecSiN7G9P/2gAMAwEAAgADAAAAEFT/AP/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABkQAQADAQEAAAAAAAAAAAAAAAEAESExgf/aAAgBAQABPxDHBzYqysY9KfSOzIA6uER//9k=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Media Object, un exemple d’extension d’objets&quot;
        title=&quot;&quot;
        src=&quot;/static/media-object-d0c1a92768c3d599cffe58b7655202c2-e0740.jpg&quot;
        srcset=&quot;/static/media-object-d0c1a92768c3d599cffe58b7655202c2-64397.jpg 240w,
/static/media-object-d0c1a92768c3d599cffe58b7655202c2-1a212.jpg 480w,
/static/media-object-d0c1a92768c3d599cffe58b7655202c2-e0740.jpg 500w&quot;
        sizes=&quot;(max-width: 500px) 100vw, 500px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;Il s’agit ni plus ni moins de l’objet abstrait pour représenter un &lt;em&gt;media object&lt;/em&gt; (une image, une vidéo) à côté d’un &lt;em&gt;media body&lt;/em&gt; (texte typiquement), à gauche comme à droite.&lt;/p&gt;
&lt;p&gt;C’est un schéma typique qui tend à se répéter, le meilleur exemple qu’il soit étant Facebook notamment.&lt;/p&gt;
&lt;p&gt;Voici basiquement en quoi le module consiste :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.media,
.media-body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.media-img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; left&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.media-img-rev&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; right&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.media-img img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Structure du media object de base --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;media&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;media-img&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;media-body&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
            Lorem ipsum dolor sit amet, consectetur adipisicing elit.
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ces quelques lignes de CSS, réutilisables à souhait, génère un gain de temps et de performance considérable sur l’ensemble d’un projet.&lt;/p&gt;
&lt;p&gt;Je ne saurais que trop vous conseiller de jeter un oeil au court article de Nicole que je vous ai indiqué précédemment. D’ailleurs &lt;a href=&quot;http://www.stubbornella.org/content/2010/06/25/the-media-object-saves-hundreds-of-lines-of-code/&quot;&gt;je le remet&lt;/a&gt;, vous n’aurez pas d’excuse !&lt;/p&gt;
&lt;p&gt;Notez par exemple que &lt;a href=&quot;https://github.com/twitter/bootstrap/blob/master/less/media.less&quot;&gt;Bootstrap l’a implémenté&lt;/a&gt;, de même que &lt;a href=&quot;https://github.com/csswizardry/inuit.css/blob/master/objects/_media.scss&quot;&gt;inuit.css&lt;/a&gt; ce qui n’est pas étonnant sachant que ces deux frameworks se basent sur le concept de l’OOCSS.&lt;/p&gt;
&lt;p&gt;Harry Roberts a récemment &lt;a href=&quot;http://csswizardry.com/2013/05/the-flag-object/&quot;&gt;proposé le &lt;strong&gt;flag object&lt;/strong&gt;&lt;/a&gt; qui reprend ni plus ni moins le &lt;strong&gt;media object&lt;/strong&gt; avec la notion de centrage vertical en bonus, ce qui peut servir à certaines occasions.&lt;/p&gt;
&lt;h3 id=&quot;implémenter-loocss-dans-son-projet&quot;&gt;&lt;a href=&quot;#impl%C3%A9menter-loocss-dans-son-projet&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Implémenter l’OOCSS dans son projet&lt;/h3&gt;
&lt;p&gt;Avant tout, il s’agit de bien comprendre et adhérer à la philosophie. Il n’y a pas de règles absolue et les bonnes pratiques changent à mesure que le web se développe et évolue. De plus, il faut toujours considérer le contexte du projet et définir ce qui est bon pour vous.&lt;/p&gt;
&lt;p&gt;Cela étant, l’on peut synthétiser la mise en place d’un esprit OOCSS par quelques pratiques concrètes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;N’utilisez pas d’ID dans le CSS&lt;/li&gt;
&lt;li&gt;Ne spécifiez pas vos sélecteurs (&lt;code class=&quot;language-text&quot;&gt;.error&lt;/code&gt; et pas &lt;code class=&quot;language-text&quot;&gt;p.error&lt;/code&gt;), sauf pour surcharger&lt;/li&gt;
&lt;li&gt;Évitez au maximum l’utilisation de &lt;code class=&quot;language-text&quot;&gt;!important&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Distinguer les composants de votre projet et faîtes en des modules&lt;/li&gt;
&lt;li&gt;Si c’est pertinent, adoptez un framework CSS qui se base sur l’OOCSS. Je vous conseillerais &lt;em&gt;&lt;a href=&quot;http://twitter.github.io/bootstrap/&quot;&gt;Bootstrap&lt;/a&gt;&lt;/em&gt; si vous avez besoin d’un design pré-conçu ; &lt;em&gt;&lt;a href=&quot;http://inuitcss.com/&quot;&gt;inuit.css&lt;/a&gt;&lt;/em&gt; si seule la structure vous suffit (vous vous occupez de l’apparence, principe #1). Notez qu’il existe le framework &lt;em&gt;&lt;a href=&quot;https://github.com/stubbornella/oocss/wiki&quot;&gt;oocss&lt;/a&gt;&lt;/em&gt; de Nicole Sullivan comme référence.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;quelques-remarques&quot;&gt;&lt;a href=&quot;#quelques-remarques&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Quelques remarques&lt;/h2&gt;
&lt;h3 id=&quot;bonnes-remarques-et-fausses-idées&quot;&gt;&lt;a href=&quot;#bonnes-remarques-et-fausses-id%C3%A9es&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Bonnes remarques et fausses idées&lt;/h3&gt;
&lt;p&gt;Il va sans dire que cette manière de voir les choses n’est pas absolue et suscite débats.&lt;/p&gt;
&lt;p&gt;Voici cependant quelques points qu’il convient de noter :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Il est tout à fait possible d’utiliser des ID&lt;/strong&gt; dans le HTML, pour le Javascript notamment. De plus, les identifiants pourraient également se révéler intéressants en guise de &lt;em&gt;namespace&lt;/em&gt; pour un module particulier que l’on partagerait, afin de ne pas causer de conflit potentiel.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Une des réticences à l’encontre de l’OOCSS rélève du fait que le HTML se retrouve “pollué” par un nombre conséquent de classes, ce qui fait rechigner les puristes. Il s’agit d’une appréciation personnelle de ce qu’est le juste milieu et cela se fait dans le choix de niveau d’abstraction. Cela étant, &lt;strong&gt;l’OOCSS n’impacte en rien la sémantique du HTML&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Les principes de l’OOCSS font des miracles du côté des gros projets où le jeu vaut vraiment la chandelle. Pour des petits projets (le site vitrine d’une association par exemple), &lt;em&gt;it’s up to you!&lt;/em&gt; Cependant, &lt;strong&gt;la philosophie s’adpate quelque soit la taille du projet&lt;/strong&gt; et ne demande pas plus de temps à être mise en place qu’un développement ordinaire une fois que vous commencez à vous faire la main dessus. Au contraire, les modules que vous avez créé pour tel ou tel autre projet peuvent tout autant vous resservir tels quels, il n’y a qu’à les rhabiller.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bien que l’OOCSS soit une vision plutôt bien répandue par les bienfaits qu’elle apporte, je dois dire que moi j’étais perplexe en lisant ZE phrase choc : &lt;em&gt;“avoid the use of ID in CSS, ever”&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Mais depuis que j’ai compris l’intérêt de cette pratique je la recommande chaudement.&lt;/p&gt;
&lt;p&gt;Cela étant, ayant également adopté &lt;a href=&quot;http://smacss.com/&quot;&gt;SMACSS&lt;/a&gt; dans l’organisation de mon code, j’utilise les identifiants dans mon CSS à &lt;strong&gt;un seul et unique endroit&lt;/strong&gt; : &lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/assets/less/ui/layout.less&quot;&gt;le layout&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tout est donc question d’adapter ce qui convient à son projet et sa philosophie.&lt;/p&gt;
&lt;h3 id=&quot;une-autre-philosophie&quot;&gt;&lt;a href=&quot;#une-autre-philosophie&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Une autre philosophie&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://coding.smashingmagazine.com/2012/06/19/classes-where-were-going-we-dont-need-classes/&quot;&gt;Une autre vision du CSS&lt;/a&gt; consiste au contraire dans une importance accordée au contexte où se situent les éléments.&lt;/p&gt;
&lt;p&gt;C’est une autre philosophie, &lt;em&gt;“interface-oriented”&lt;/em&gt; qui pose comme principe que le CSS vient styliser l’interface HTML existante. Il n’y a pas lieu de venir polluer le HTML avec des classes alors que les sélecteurs et une bonne organisation du code peuvent tout aussi bien intervenir sur le design.&lt;/p&gt;
&lt;p&gt;Bien que je n’adhère pas à cette pratique (du moins pour tout projet susceptible de prendre de l’ampleur), elle est néamoins intéressante et n’en reste pas moins pertinente, dans le cas de petits projets par exemple.&lt;/p&gt;
&lt;h2 id=&quot;pour-aller-plus-loin&quot;&gt;&lt;a href=&quot;#pour-aller-plus-loin&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pour aller plus loin&lt;/h2&gt;
&lt;h3 id=&quot;articles-et-liens-intéressants&quot;&gt;&lt;a href=&quot;#articles-et-liens-int%C3%A9ressants&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Articles et liens intéressants&lt;/h3&gt;
&lt;p&gt;Voici une série de liens auxquels je vous suggère de jeter un oeil si vous souhaitez approfondir ma présentation :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://coding.smashingmagazine.com/2011/12/12/an-introduction-to-object-oriented-css-oocss/&quot;&gt;An introduction to OOCSS&lt;/a&gt;, article introductif sur le concept par Smashing Magazine.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://fr.slideshare.net/stubbornella/the-cascade-grids-headings-and-selectors-from-an-oocss-perspective-ajax-experience-2009&quot;&gt;The OOCSS perspective&lt;/a&gt; par Nicole Sullivan, ou bien &lt;a href=&quot;http://fr.slideshare.net/stubbornella/object-oriented-css&quot;&gt;la version courte&lt;/a&gt; si vous n’êtes pas téméraires.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.stubbornella.org/content/category/general/geek/css/oocss-css-geek-general/&quot;&gt;Liste des articles OOCSS&lt;/a&gt; sur le blog de Nicole Sullivan (oui, toujours elle, il faut rendre à César ce qui est à César).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://vimeo.com/44773888&quot;&gt;Breaking Good Habits&lt;/a&gt;, speech de Harry Robert’s sur la question dont &lt;a href=&quot;https://speakerdeck.com/csswizardry/breaking-good-habits&quot;&gt;voici les slides&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://andrewhathaway.net/posts/oocss-and-rwd&quot;&gt;OOCSS &amp;#x26; RWD&lt;/a&gt; pour une petite réflexion sur comment l’OOCSS contribue à réaliser des sites web responsive et consistants.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.design-fluide.com/21-09-2011/le-css-oriente-objet-explique-avec-monsieur-patate/&quot;&gt;Le CSS Orienté Objet expliqué avec Monsieur Patate&lt;/a&gt;, parce-que oui il y a quand même quelques articles français sur la question qui trainent sur le web.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://csslint.net/&quot;&gt;CSSLint&lt;/a&gt; est un outil permettant de confronter votre CSS aux principes de OOCSS et de le corriger en ce sens.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Notre petite plongée au coeur de l’OOCSS s’achève ici.&lt;/p&gt;
&lt;p&gt;Vous remarquerez que la très grande majorité des articles/sujets portant sur ces pratiques avancées de CSS sont en anglais, ce qui peut s’expliquer notamment par le fait que le sujet est encore récent (2009 pour les prémices, en pleine popularisation depuis le développement des frameworks CSS). Ce fut d’ailleurs la raison pour laquelle j’ai souhaité apporter ma pierre à l’édifice en rédigeant cet article en français.&lt;/p&gt;
&lt;p&gt;J’espère que le sujet aura pu vous faire réfléchir sur vos pratiques CSS, voire même vous intéresser. Si vous avez des questions, des remarques, des suggestions ou même des idées à partager avec moi, n’hésitez pas à me laisser quelques commentaires ci-dessous =)&lt;/p&gt;
&lt;figure&gt;
  
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 69.4%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAOABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQCAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB0aWFmXiQP//EABkQAAMBAQEAAAAAAAAAAAAAAAECAxEAEP/aAAgBAQABBQKrFVaueVBZRJ97/8QAFhEAAwAAAAAAAAAAAAAAAAAAARAR/9oACAEDAQE/ATV//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGxABAAICAwAAAAAAAAAAAAAAAQAQERIhMYH/2gAIAQEABj8CME4Bo1x7Dqv/xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhMUFR/9oACAEBAAE/IWQm3biAuM+xNneIfU0Ca7UXZ//aAAwDAQACAAMAAAAQjz//xAAWEQEBAQAAAAAAAAAAAAAAAAABEDH/2gAIAQMBAT8QWCf/xAAWEQEBAQAAAAAAAAAAAAAAAAABEDH/2gAIAQIBAT8QA1n/xAAbEAEAAwEAAwAAAAAAAAAAAAABABEhYUFxgf/aAAgBAQABPxDLRtiUVyJyLAPk+5qmFF/QHODHAFTRbr5Nk//Z&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Le code sent meilleur avec OOCSS&quot; title=&quot;&quot; src=&quot;/static/after-oocss-024e38f309f8bbeb056bbef3411f6868-e0740.jpg&quot; srcset=&quot;/static/after-oocss-024e38f309f8bbeb056bbef3411f6868-64397.jpg 240w,
/static/after-oocss-024e38f309f8bbeb056bbef3411f6868-1a212.jpg 480w,
/static/after-oocss-024e38f309f8bbeb056bbef3411f6868-e0740.jpg 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
  &lt;figcaption&gt;Vous aussi, adoptez le &amp;quot;Oh Oh&amp;quot; CSS&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Plop !&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Dive into OOCSS principles]]></title><description><![CDATA[OOCSS - what it is, what it does, what it is, what it isn't.]]></description><link>https://www.nicoespeon.com/en/2013/05/dive-into-oocss/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2013/05/dive-into-oocss/</guid><pubDate>Wed, 08 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;i-can-haz-oocss&quot;&gt;&lt;a href=&quot;#i-can-haz-oocss&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;I can haz OOCSS?&lt;/h2&gt;
&lt;p&gt;Consider a new web project: a start-up dreams of developing THE indispensable webapplication of tomorrow’s web. They choose wisefully technologies, frameworks, environments they’ll use… However, the front-end rendering will still the same for the browser: &lt;em&gt;HTML, CSS and Javascript&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;But here’s the thing: even if the whole application will probably take advantages of some frameworks, have a look over the stylesheet and you’ll probably get something like that, with or without preprocessor:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;#form-generator&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 760px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;#form-generator label&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bold&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 12px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;#form-generator label.title&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; normal&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 11px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;#form-generator textarea&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 350px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;#form-generator .big textarea&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 500px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* a bunch of CSS */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This kind of code will cause a lot of hassles over time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lack of flexibility&lt;/strong&gt;, it can only apply to elements which are contained in the form which gets the &lt;code class=&quot;language-text&quot;&gt;#form-generator&lt;/code&gt; identifier. That could sound relevant at first, but what if you want to build other pages with some similars forms in it?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Too much specificity&lt;/strong&gt;, you have to overspecified again and again selectors when you want to create some particular cases. Just look at &lt;code class=&quot;language-text&quot;&gt;label.title-titre&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;.big textarea&lt;/code&gt; for instance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Too complicated&lt;/strong&gt;, you need to be an &lt;strong&gt;expert&lt;/strong&gt; and know the architecture of every single page to dissect and maintain all of this mess. Plus, it would probably grow as the project develops.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you add some messy organisation for CSS files, then you get a spaghetti code which would lead to a lot of troubles, errors, code duplication as new developers enters the ring over time.&lt;/p&gt;
&lt;p&gt;This extreme dependency between the HTML structure makes the code be &lt;strong&gt;especially fragile&lt;/strong&gt;: even if it’s clean, a simple mistake of a non-expert can ruined it completely.&lt;/p&gt;
&lt;p&gt;In short, these non-mature practices will make things harder for the start-up and promises long sleepless nights of debug and refactor.&lt;/p&gt;
&lt;p&gt;Finally, &lt;strong&gt;the problem here belongs to the 1:1 relation&lt;/strong&gt; between CSS and the number of blocks, pages, modules of the website. As long as it grows, the stylesheet grows as well. That implies development time, and so money… We could do better in terms of &lt;a href=&quot;http://en.wikipedia.org/wiki/Rate_of_return&quot;&gt;ROI&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
	
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 73.6%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEEAgP/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB5YdEIoE//8QAGhAAAgMBAQAAAAAAAAAAAAAAAAECAxIRE//aAAgBAQABBQLKdXkjArHEqc5kq+P/xAAVEQEBAAAAAAAAAAAAAAAAAAAAE//aAAgBAwEBPwFN/8QAFREBAQAAAAAAAAAAAAAAAAAAABL/2gAIAQIBAT8BW//EABwQAAICAgMAAAAAAAAAAAAAAAABAhETITEycf/aAAgBAQAGPwLskJ5ImqIxjSSVlKXmjmrP/8QAGhAAAgMBAQAAAAAAAAAAAAAAAREAITFBUf/aAAgBAQABPyEk2/VwaF2MdkBTcwsQV2DEKSeIQtCtP//aAAwDAQACAAMAAAAQj+//xAAXEQADAQAAAAAAAAAAAAAAAAAAAREh/9oACAEDAQE/EEpiIP/EABgRAAIDAAAAAAAAAAAAAAAAAAABEUFR/9oACAECAQE/EGrZHT//xAAfEAEBAAIBBAMAAAAAAAAAAAABEQAhMUFRgaFxkdH/2gAIAQEAAT8QpuxtoRv79ZRDG1WPLPXvC3g4NGdsDHQgqkRXyuFYJEQG3XxiWuLEWvfXxn//2Q==&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Your CSS is a MESS&quot; title=&quot;&quot; src=&quot;/static/your-css-is-a-mess-cf1b14e7fdb36982325b73285ba698a4-e0740.jpg&quot; srcset=&quot;/static/your-css-is-a-mess-cf1b14e7fdb36982325b73285ba698a4-64397.jpg 240w,
/static/your-css-is-a-mess-cf1b14e7fdb36982325b73285ba698a4-1a212.jpg 480w,
/static/your-css-is-a-mess-cf1b14e7fdb36982325b73285ba698a4-e0740.jpg 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
	&lt;figcaption&gt;Freely inspired by &lt;a href=&quot;https://speakerdeck.com/snookca/your&quot;&gt;Jonathan Snoovvk&lt;/a&gt; =)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;strong&gt;Object Oriented CSS (OOCSS)&lt;/strong&gt; bring its own solution to these problems. It’s nor a new preprocessor, nor a new language, but a &lt;em&gt;code philosophy&lt;/em&gt;. It’s a set of best practices, rules and advices to help your CSS become scalable.&lt;/p&gt;
&lt;p&gt;OOCSS has 2 principles :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Separate structure from skin&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Separate container from content&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;1-separate-structure-from-skin&quot;&gt;&lt;a href=&quot;#1-separate-structure-from-skin&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Separate structure from skin&lt;/h3&gt;
&lt;p&gt;Usually, elements of a website have a visual aspect which is repeated in different contexts : colors, font, borders, … the graphic charter in a whole. This is the &lt;strong&gt;skin&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In the same time, a bunch of “non-visible” properties are repeated : width/height, overflow, etc. This is the &lt;strong&gt;structure&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you separate them, you create &lt;strong&gt;re-usable&lt;/strong&gt; components that can be shared into elements which have same properties. And so we speak about &lt;strong&gt;objects&lt;/strong&gt;, which may sound familiar to back-end developers by the way.&lt;/p&gt;
&lt;h3 id=&quot;2-separate-container-from-content&quot;&gt;&lt;a href=&quot;#2-separate-container-from-content&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Separate container from content&lt;/h3&gt;
&lt;p&gt;The deal here is not to stupidly constrain the style of an element (the &lt;strong&gt;content&lt;/strong&gt;) to the its context (its &lt;strong&gt;container&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;If you are designing titles, why limit yourself to those who are into the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;header&amp;gt;&lt;/code&gt;, just because this is the only title place for now? Plus, it’s very likely that all your titles have a consistent design in your whole website for ergonomics concerns.&lt;/p&gt;
&lt;p&gt;It’s even more true for modules.&lt;/p&gt;
&lt;h2 id=&quot;why-is-oocss-good&quot;&gt;&lt;a href=&quot;#why-is-oocss-good&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why is OOCSS good?&lt;/h2&gt;
&lt;h3 id=&quot;the-10-best-practices&quot;&gt;&lt;a href=&quot;#the-10-best-practices&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The 10 best practices&lt;/h3&gt;
&lt;p&gt;Here are the 10 best practices that are part of the OOCSS spirit:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a library per component&lt;/strong&gt;&lt;br&gt;
Each component - button, table, link, image, clearfix, etc. - should be a piece of Lego = combinable and re-usable as you wish.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use semantic and consistent styles&lt;/strong&gt;&lt;br&gt;
The style of a new HTML element should be predictable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Design transparent modules&lt;/strong&gt;&lt;br&gt;
The module is the container that could be used with any content.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Be flexible&lt;/strong&gt;&lt;br&gt;
Height and width should be extensible and adapt themself - &lt;a href=&quot;http://fr.wikipedia.org/wiki/Responsive_Web_Design&quot;&gt;RWD&lt;/a&gt; inside -.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Learn to love grids&lt;/strong&gt;&lt;br&gt;
Grids allow you to control width. Height is generally defined by the content.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Minimize selectors&lt;/strong&gt;&lt;br&gt;
Keep a low specificity &lt;code class=&quot;language-text&quot;&gt;[0-0-1-0]&lt;/code&gt; to &lt;a href=&quot;/en/2013/05/optimize-selectors-css-vs-js/#bewaaaaare_specificity&quot;&gt;have a better control over selectors&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Separate structure from skin&lt;/strong&gt;&lt;br&gt;
You must do the distinction, it’s a fundamental principle of OOCSS. Create abstract objects for blocks structure and use class to dress these blocks, regardless their nature.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Separate container from content&lt;/strong&gt;&lt;br&gt;
You must do the distinction, it’s a fundamental principle of OOCSS. Create &lt;strong&gt;1:n relationship&lt;/strong&gt; separating the container from its content.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Extend objects with multiple classes&lt;/strong&gt;
Class/objects are just like Legos you put together to build the expected result.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use resets and YUI fonts&lt;/strong&gt;&lt;br&gt;
This is a specific choice of the &lt;a href=&quot;https://github.com/stubbornella/oocss/wiki&quot;&gt;OOCSS framework&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Legos first&lt;/strong&gt; - A best practice is to design individual pages after having created basic components for the whole website.&lt;/p&gt;
&lt;h3 id=&quot;the-9-pitfalls-to-avoid&quot;&gt;&lt;a href=&quot;#the-9-pitfalls-to-avoid&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The 9 pitfalls to avoid&lt;/h3&gt;
&lt;p&gt;Here are the 9 pitfalls &lt;strong&gt;to ban&lt;/strong&gt;, according to the OOCSS spirit:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create styles that depend on context&lt;/strong&gt;&lt;br&gt;
There is nothing less flexible but a &lt;code class=&quot;language-text&quot;&gt;article &amp;gt; p:nth-child(2) &amp;gt; span.plop&lt;/code&gt; selector.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Overspecify selectors&lt;/strong&gt;&lt;br&gt;
&lt;code class=&quot;language-text&quot;&gt;div.my-class&lt;/code&gt; is uselessly overspecific as &lt;code class=&quot;language-text&quot;&gt;.my-class&lt;/code&gt; is sufficient enough. However, it becomes relevant if you want to override a class styling for some specific elements - &lt;code class=&quot;language-text&quot;&gt;strong.error&lt;/code&gt; will override the defaults rules of &lt;code class=&quot;language-text&quot;&gt;.error&lt;/code&gt; for this special use -.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use IDs&lt;/strong&gt;&lt;br&gt;
&lt;a href=&quot;/en/2013/05/optimize-selectors-css-vs-js/#class_or_id_&quot;&gt;What an ID can do, a class can do better&lt;/a&gt;. Futhermore, IDs contribute in creating unexpected specificity mess.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use shadows and border-radius on irregular backgrounds&lt;/strong&gt;&lt;br&gt;
It could have unexpected results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a sprite containing every images, excepted if you don’t have a lot of pages&lt;/strong&gt;&lt;br&gt;
It’s not very optimal in certain cases as you need to deal with image rendering exclusively in CSS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Precisely adjust the height&lt;/strong&gt;&lt;br&gt;
An element height is controlled by its content. Separate container from content will make your life easier.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use images as texts&lt;/strong&gt;&lt;br&gt;
I guess you can reach a better accessibility level.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Be redundant&lt;/strong&gt;&lt;br&gt;
Two components which that look too close to be differenciate on a same page look too close to be used on the website: choose one!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Do early optimisation&lt;/strong&gt;&lt;br&gt;
Developers tend to waste a lot of time on the optimisation question when it’s not critical than to focus on what is essential to go on.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;oocss-benefits&quot;&gt;&lt;a href=&quot;#oocss-benefits&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;OOCSS benefits&lt;/h3&gt;
&lt;p&gt;As the project is going on, you will be able to create whole new pages combining existing elements &lt;strong&gt;without adding any CSS&lt;/strong&gt;, even for a completely new architecture.&lt;/p&gt;
&lt;p&gt;Re-use elements is also a totally free &lt;strong&gt;performance gain&lt;/strong&gt;! You’ll create new elements with 0 line of CSS code, what could be better?&lt;/p&gt;
&lt;p&gt;OOCSS force you to think the website as a whole instead of focusing on simple pages put one along the others. You should anticipate the future.&lt;/p&gt;
&lt;p&gt;Finally, the main advantage of this philosophy IMHO is that it makes your CSS modular, &lt;strong&gt;easier to maintain&lt;/strong&gt;. This modularity makes your CSS robust: a new developer would be less likely to break the design when working on it.&lt;/p&gt;
&lt;h2 id=&quot;oocss-how-does-that-works&quot;&gt;&lt;a href=&quot;#oocss-how-does-that-works&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;OOCSS, how does that works?&lt;/h2&gt;
&lt;h3 id=&quot;gimme-concrete-examples&quot;&gt;&lt;a href=&quot;#gimme-concrete-examples&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Gimme concrete examples!&lt;/h3&gt;
&lt;p&gt;Remember the 2 main principles:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Separate structure from skin&lt;/li&gt;
&lt;li&gt;Separate container from content&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With these good practices in mind, let’s see how to apply the philosophy on a daily code.&lt;/p&gt;
&lt;h3 id=&quot;1-separate-structure-from-skin-1&quot;&gt;&lt;a href=&quot;#1-separate-structure-from-skin-1&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Separate structure from skin&lt;/h3&gt;
&lt;p&gt;Let’s take the favorite example over blog posts: buttons. A “classic” CSS would look like this, I guess:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;#button&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inline-block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4px 12px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 14px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #333333&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;vertical-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; middle&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pointer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #d5d5d5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;#button-primary&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inline-block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4px 12px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 14px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #ffffff&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 -1px 0 &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0, 0, 0, 0.25&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;vertical-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; middle&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pointer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #006dcc&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;#button-large&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inline-block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 8px 16px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 18px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 28px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #333333&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;vertical-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; middle&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pointer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #d5d5d5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;#button-activation&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inline-block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 8px 16px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 18px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 28px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #ffffff&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 -1px 0 &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0, 0, 0, 0.25&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;vertical-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; middle&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pointer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #006dcc&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- The corresponding HTML --&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Default&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button-primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Primary&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button-large&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Large&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button-activation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Large Primary&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the end, you come with a lot of redundancy and a &lt;code class=&quot;language-text&quot;&gt;#button-activation&lt;/code&gt; which is nothing but a large version of &lt;code class=&quot;language-text&quot;&gt;#botton-primary&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you refactor this CSS with OOCSS principles, you’ll get something more flexible:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.button&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inline-block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4px 12px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 14px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #333333&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;vertical-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; middle&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pointer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #d5d5d5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.button-primary&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #ffffff&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 -1px 0 &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0, 0, 0, 0.25&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #006dcc&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.button-large&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 8px 16px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 18px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 28px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- The corresponding HTML --&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Default&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button button-primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Primary&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button button-large&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Large&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button button-large button-primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Large Primary&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;.button&lt;/code&gt; define the generic properties - the “defaults” ones - for our buttons. If you override it, you come with new classes that you can combine to get the expected result, &lt;strong&gt;just like Legos&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;Here was the trick.&lt;/p&gt;
&lt;h3 id=&quot;2-separate-container-from-content-1&quot;&gt;&lt;a href=&quot;#2-separate-container-from-content-1&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Separate container from content&lt;/h3&gt;
&lt;p&gt;It did happen, sometimes, that my code looked like this when developing the main design:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;header h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Roboto&apos;&lt;/span&gt;, Helvetica, sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #f44&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* a bunch of CSS */&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;footer h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Roboto&apos;&lt;/span&gt;, Helvetica, sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.5em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #f44&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;opacity = 50&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- The corresponding HTML --&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Header Title&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Small title in the footer&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here again, it’s a fail: &lt;strong&gt;I am duplicating code&lt;/strong&gt;, which is useless and I didn’t even notice that!&lt;/p&gt;
&lt;p&gt;The elements I defined here are simply not re-usable. They directly rely on a specific container. But it’s clear enough that some properties are not specific to this container.&lt;/p&gt;
&lt;p&gt;And so I may have consider the following alternative:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Roboto&apos;&lt;/span&gt;, Helvetica, sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #f44&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;h1,
.h1-size&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;h2,
.h2-size&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.8em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;h3,
.h3-size&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.5em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* … */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.muted&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;opacity = 50&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- The corresponding HTML --&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Header Title&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;h3-size muted&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Small title in the footer&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You may think “Why should I care? We don’t really reduce code here!“. For sure that’s true here… if you only focus on the title.&lt;/p&gt;
&lt;p&gt;But OOCSS makes you think further about the future of your website. Here we don’t just improved titles flexibility, but we add few new elements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Each level of title has a standard and homogene &lt;code class=&quot;language-text&quot;&gt;font-size&lt;/code&gt;. Each of these &lt;code class=&quot;language-text&quot;&gt;font-size&lt;/code&gt; is also set to an independent class and could be re-used, whatever the context&lt;/p&gt;
&lt;p&gt;Doing so, you’ll notice that I didn’t choose the level of title because of the default sizing it would render on the screen: it’s better for semantics, for accessibility and &lt;a href=&quot;http://en.wikipedia.org/wiki/Search_engine_optimization&quot;&gt;SEO&lt;/a&gt; \o/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I created a &lt;code class=&quot;language-text&quot;&gt;.muted&lt;/code&gt; class that allows me to mitigate the visibility/opacity of an element. I guess this little utility would be useful later and I’m sure I won’t have to duplicate that kind of code around in my CSS.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;the-media-object&quot;&gt;&lt;a href=&quot;#the-media-object&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The media object&lt;/h3&gt;
&lt;p&gt;The most famous example which illustrate OOCSS is the &lt;strong&gt;media object&lt;/strong&gt; created by &lt;a href=&quot;http://www.stubbornella.org/&quot;&gt;Nicole Sullivan&lt;/a&gt;. It saves &lt;a href=&quot;http://www.stubbornella.org/content/2010/06/25/the-media-object-saves-hundreds-of-lines-of-code/&quot;&gt;hundreds of lines of code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;span
    class=&quot;gatsby-resp-image-wrapper&quot;
    style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;
  &gt;
    &lt;span
      class=&quot;gatsby-resp-image-background-image&quot;
      style=&quot;padding-bottom: 75.2%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAIDBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHr1RM1D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAMBAAMAAAAAAAAAAAAAAAABESEQQbH/2gAIAQEAAT8h2xecSiN7G9P/2gAMAwEAAgADAAAAEFT/AP/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABkQAQADAQEAAAAAAAAAAAAAAAEAESExgf/aAAgBAQABPxDHBzYqysY9KfSOzIA6uER//9k=&apos;); background-size: cover; display: block;&quot;
    &gt;
      &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot;
        alt=&quot;Media Object, an example of objects extension&quot;
        title=&quot;&quot;
        src=&quot;/static/media-object-d0c1a92768c3d599cffe58b7655202c2-e0740.jpg&quot;
        srcset=&quot;/static/media-object-d0c1a92768c3d599cffe58b7655202c2-64397.jpg 240w,
/static/media-object-d0c1a92768c3d599cffe58b7655202c2-1a212.jpg 480w,
/static/media-object-d0c1a92768c3d599cffe58b7655202c2-e0740.jpg 500w&quot;
        sizes=&quot;(max-width: 500px) 100vw, 500px&quot;
      /&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  &lt;/p&gt;
&lt;p&gt;It’s nothing but an abstract object which represents a &lt;em&gt;media object&lt;/em&gt; - a picture, a video - aside to a &lt;em&gt;media body&lt;/em&gt; - typically a text -, to its left or to its right.&lt;/p&gt;
&lt;p&gt;It’s a typical scheme that is repeated everywhere. Think about the Facebook display.&lt;/p&gt;
&lt;p&gt;Here is basically the module content:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.media,
.media-body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.media-img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; left&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.media-img-rev&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; right&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.media-img img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Base structure for the media object --&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;media&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;media-img&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;media-body&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      Lorem ipsum dolor sit amet, consectetur adipisicing elit.
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;These few re-usable lines of CSS will save a lot of time and help to improve performance over a whole project.&lt;/p&gt;
&lt;p&gt;You’ll note that &lt;a href=&quot;https://github.com/twitter/bootstrap/blob/master/less/media.less&quot;&gt;Bootstrap has implemented it&lt;/a&gt;, just like &lt;a href=&quot;https://github.com/csswizardry/inuit.css/blob/master/objects/_media.scss&quot;&gt;inuit.css&lt;/a&gt;, which is not that surprising when you consider these two frameworks use OOCSS concepts.&lt;/p&gt;
&lt;p&gt;Harry Roberts has recently &lt;a href=&quot;http://csswizardry.com/2013/05/the-flag-object/&quot;&gt;proposed the &lt;strong&gt;flag object&lt;/strong&gt;&lt;/a&gt; which incorporates more or less the &lt;strong&gt;media object&lt;/strong&gt; with the vertical centering concept.&lt;/p&gt;
&lt;h3 id=&quot;implement-the-oocss-in-your-project&quot;&gt;&lt;a href=&quot;#implement-the-oocss-in-your-project&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Implement the OOCSS in your project&lt;/h3&gt;
&lt;p&gt;First of all, you need to understand and adhere to the philosophy. There is no absolute rule and best practices change as the web develop and evolve. Plus, you should always consider the context of your project and define what is good for you.&lt;/p&gt;
&lt;p&gt;That said, we can sum up the implementation of an OOCSS spirit with some concrete practices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don’t use IDs for CSS&lt;/li&gt;
&lt;li&gt;Don’t overspecify your selectors (&lt;code class=&quot;language-text&quot;&gt;.error&lt;/code&gt; and not &lt;code class=&quot;language-text&quot;&gt;p.error&lt;/code&gt;), excepted for overriding reasons&lt;/li&gt;
&lt;li&gt;Avoid the use of &lt;code class=&quot;language-text&quot;&gt;!important&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Distinguish components of your project and create modules out of them&lt;/li&gt;
&lt;li&gt;If relevant, adopt a CSS framework based over OOCSS principles. I’d advice you to use &lt;em&gt;&lt;a href=&quot;http://twitter.github.io/bootstrap/&quot;&gt;Bootstrap&lt;/a&gt;&lt;/em&gt; if you need a predefined design ; &lt;em&gt;&lt;a href=&quot;http://inuitcss.com/&quot;&gt;inuit.css&lt;/a&gt;&lt;/em&gt; is you just need about structure and deal with the design by yourself. Note that the &lt;em&gt;&lt;a href=&quot;https://github.com/stubbornella/oocss/wiki&quot;&gt;oocss&lt;/a&gt;&lt;/em&gt; framework from Nicole Sullivan exists as a reference.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;few-comments&quot;&gt;&lt;a href=&quot;#few-comments&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Few comments&lt;/h2&gt;
&lt;h3 id=&quot;good-remarks-and-poor-ideas&quot;&gt;&lt;a href=&quot;#good-remarks-and-poor-ideas&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Good remarks and poor ideas&lt;/h3&gt;
&lt;p&gt;No need to say that these philosophy is a non-absolute vision of CSS that we could debate on.&lt;/p&gt;
&lt;p&gt;However, we can point out the following things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;It’s absolutely possible to use IDs&lt;/strong&gt; in HTML for JavaScript purpose, for instance. Moreover, identifiers could be useful as &lt;em&gt;namespaces&lt;/em&gt; for a particular module that you want to share without breaking anything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One of the arguments against OOCSS is that you are “polluting” HTML with a bunch of classes that some HTML-evangelist don’t appreciate, which is understandable. However, &lt;strong&gt;OOCSS doesn’t impact the HTML semantics&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OOCSS principles can perform miracles over big projects, where it worth to implement them. For little ones, &lt;em&gt;it’s up to you!&lt;/em&gt; However, &lt;strong&gt;the philosophy is relevant regardless the size of your project&lt;/strong&gt; and doesn’t take that long to be implemented than an ordinary development when you get used to it. Rather, modules you’ve already created for any other project could be re-used in a new one, you just have to change their design a bit and there you go!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even if OOCSS is now a well-spread vision for the benefits it brings, I must say that I was suspicious when I read the assertion: &lt;em&gt;“avoid the use of ID in CSS, ever”&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;But since I understood the benefits of this practice, I warmly recommend it.&lt;/p&gt;
&lt;p&gt;That said, as I &lt;a href=&quot;http://smacss.com/&quot;&gt;get smacked&lt;/a&gt; for my code organisation, I now use IDs in my CSS &lt;strong&gt;in a unique place&lt;/strong&gt; : the layout.&lt;/p&gt;
&lt;p&gt;It’s just a matter of adaptation to your project needs and philosophy.&lt;/p&gt;
&lt;h3 id=&quot;another-philosophy&quot;&gt;&lt;a href=&quot;#another-philosophy&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Another philosophy&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://coding.smashingmagazine.com/2012/06/19/classes-where-were-going-we-dont-need-classes/&quot;&gt;Another vision of CSS&lt;/a&gt; give its importance to the context of elements.&lt;/p&gt;
&lt;p&gt;It’s another philosophy, &lt;em&gt;interface-oriented&lt;/em&gt; which considers that CSS is defined to design the existing HTML interface. To pollute HTML with classes is a non-sense when selectors and good code organisation can deal with the design.&lt;/p&gt;
&lt;p&gt;Even though I don’t adhere to this practice - at least for a project which is meant to evolve -, it’s an interesting philosophy which could be relevant for small projects, for instance.&lt;/p&gt;
&lt;h2 id=&quot;to-go-further&quot;&gt;&lt;a href=&quot;#to-go-further&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;To go further&lt;/h2&gt;
&lt;h3 id=&quot;posts-and-interesting-links&quot;&gt;&lt;a href=&quot;#posts-and-interesting-links&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Posts and interesting links&lt;/h3&gt;
&lt;p&gt;Here is a list of links you may have a look to go deeper into OOCSS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://coding.smashingmagazine.com/2011/12/12/an-introduction-to-object-oriented-css-oocss/&quot;&gt;An introduction to OOCSS&lt;/a&gt;, is an introducting post about this concept, by Smashing Magazine.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://fr.slideshare.net/stubbornella/the-cascade-grids-headings-and-selectors-from-an-oocss-perspective-ajax-experience-2009&quot;&gt;The OOCSS perspective&lt;/a&gt; by Nicole Sullivan, or even &lt;a href=&quot;http://fr.slideshare.net/stubbornella/object-oriented-css&quot;&gt;the short version&lt;/a&gt; if you don’t have time.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.stubbornella.org/content/category/general/geek/css/oocss-css-geek-general/&quot;&gt;List of Nicole Sullivan’s blog post about OOCSS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://vimeo.com/44773888&quot;&gt;Breaking Good Habits&lt;/a&gt;, speech from Harry Robert with &lt;a href=&quot;https://speakerdeck.com/csswizardry/breaking-good-habits&quot;&gt;the according slides&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://andrewhathaway.net/posts/oocss-and-rwd&quot;&gt;OOCSS &amp;#x26; RWD&lt;/a&gt; to think about how the OOCSS can help to build responsive websites.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://csslint.net/&quot;&gt;CSSLint&lt;/a&gt; is a tool that will lint your CSS according to OOCSS principles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Our little dive into OOCSS is now over.&lt;/p&gt;
&lt;figure&gt;
	
  &lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block;  max-width: 500px; margin-left: auto; margin-right: auto;&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 69.4%; position: relative; bottom: 0; left: 0; background-image: url(&amp;apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAOABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQCAwX/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB0aWFmXiQP//EABkQAAMBAQEAAAAAAAAAAAAAAAECAxEAEP/aAAgBAQABBQKrFVaueVBZRJ97/8QAFhEAAwAAAAAAAAAAAAAAAAAAARAR/9oACAEDAQE/ATV//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGxABAAICAwAAAAAAAAAAAAAAAQAQERIhMYH/2gAIAQEABj8CME4Bo1x7Dqv/xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhMUFR/9oACAEBAAE/IWQm3biAuM+xNneIfU0Ca7UXZ//aAAwDAQACAAMAAAAQjz//xAAWEQEBAQAAAAAAAAAAAAAAAAABEDH/2gAIAQMBAT8QWCf/xAAWEQEBAQAAAAAAAAAAAAAAAAABEDH/2gAIAQIBAT8QA1n/xAAbEAEAAwEAAwAAAAAAAAAAAAABABEhYUFxgf/aAAgBAQABPxDLRtiUVyJyLAPk+5qmFF/QHODHAFTRbr5Nk//Z&amp;apos;); background-size: cover; display: block;&quot;&gt;
      &lt;img class=&quot;gatsby-resp-image-image&quot; style=&quot;width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;&quot; alt=&quot;Code smells better with OOCSS&quot; title=&quot;&quot; src=&quot;/static/after-oocss-024e38f309f8bbeb056bbef3411f6868-e0740.jpg&quot; srcset=&quot;/static/after-oocss-024e38f309f8bbeb056bbef3411f6868-64397.jpg 240w,
/static/after-oocss-024e38f309f8bbeb056bbef3411f6868-1a212.jpg 480w,
/static/after-oocss-024e38f309f8bbeb056bbef3411f6868-e0740.jpg 500w&quot; sizes=&quot;(max-width: 500px) 100vw, 500px&quot;&gt;
    &lt;/span&gt;
  &lt;/span&gt;
  
	&lt;figcaption&gt;Adopt the &amp;quot;Oh Oh&amp;quot; CSS&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Plop!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[jQuery, data et performance]]></title><description><![CDATA[Bonne pratique et manipulation des données en jQuery, sans colorants ni conservateurs.]]></description><link>https://www.nicoespeon.com/fr/2013/05/jquery-data-et-performance/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2013/05/jquery-data-et-performance/</guid><pubDate>Sat, 04 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;tldr&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;jQuery simplifie la manipulation des données rattachées aux éléments.&lt;/p&gt;
&lt;p&gt;L’attribut HTML5 &lt;code class=&quot;language-text&quot;&gt;data-*&lt;/code&gt; est lié à l’objet &lt;strong&gt;data&lt;/strong&gt; de jQuery pour les éléments du DOM.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$.data(element, key[, value])&lt;/code&gt; permet de manipuler des données rattachées aux éléments du DOM.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$.fn.data(key[, value])&lt;/code&gt; permet de manipuler des données rattachées aux éléments jQuery.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$.data&lt;/code&gt; étant plus basique que &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt;, il est plus rapide à l’exécution. Il est en revanche moins flexible, moins pratique et il ne permet pas d’accéder aux attributs &lt;code class=&quot;language-text&quot;&gt;data-*&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- HTML --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main-content&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Javascript&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $el &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

$el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// rapide&lt;/span&gt;
$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$el&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 10 fois plus rapide&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Enfin, ces 2 méthodes ne modifient pas le DOM, contrairement à &lt;code class=&quot;language-text&quot;&gt;$.fn.attr&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;$el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;lt;div id=&quot;main-content&quot;&gt;&amp;lt;/div&gt;&lt;/span&gt;
$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$el&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;lt;div id=&quot;main-content&quot;&gt;&amp;lt;/div&gt;&lt;/span&gt;
$el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;data-key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;lt;div id=&quot;main-content&quot; data-key=&quot;plop&quot;&gt;&amp;lt;/div&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;manipuler-des-data-avec-jquery&quot;&gt;&lt;a href=&quot;#manipuler-des-data-avec-jquery&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Manipuler des data avec jQuery&lt;/h2&gt;
&lt;p&gt;Rattacher une information à un élément et la manipuler au fil de l’exécution d’un script est une opération vraiment simple avec jQuery. En effet, la bibliothèque dispose de méthodes permettant de stocker, modifier et supprimer les données relatives à un élément.&lt;/p&gt;
&lt;p&gt;Par ailleurs, il est intéressant de savoir que les attributs &lt;code class=&quot;language-text&quot;&gt;data-*&lt;/code&gt; introduits par le HTML5 sont automatiquement transformés en objet &lt;strong&gt;data&lt;/strong&gt; jQuery et sont donc accessibles par le biais de certaines de ces méthodes.&lt;/p&gt;
&lt;h3 id=&quot;fndata&quot;&gt;&lt;a href=&quot;#fndata&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;$.fn.data&lt;/h3&gt;
&lt;p&gt;La méthode la plus populaire est &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt; qui s’utilise de la manière suivante :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Affecte la chaîne de caractère &quot;plop&quot; à la clef &quot;key&quot;&lt;/span&gt;
elem&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Lit la donnée portant la clef &quot;key&quot;&lt;/span&gt;
elem&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Code valide en HTML5 --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-my-key&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;hey&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#elem&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;myKey&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Retourne &quot;hey&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Vous noterez que l’on retire &lt;code&gt;data-&lt;/code&gt; et l’on supprime les tirets du HTML pour spécifier la clef, avec une notation à la CamelCase conformément à &lt;a href=&quot;http://www.w3.org/TR/html5/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes&quot;&gt;la spécification W3C&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://api.jquery.com/data/&quot;&gt;La documentation&lt;/a&gt; est simple à assimiler et présente plutôt bien le concept.&lt;/p&gt;
&lt;p&gt;Notez que l’on dispose également de la méthode &lt;code class=&quot;language-text&quot;&gt;$.fn.removeData&lt;/code&gt; pour nettoyer tout cela si besoin :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;removeData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Bye bye !&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;data&quot;&gt;&lt;a href=&quot;#data&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;$.data&lt;/h3&gt;
&lt;p&gt;Il existe également la méthode jQuery &lt;code class=&quot;language-text&quot;&gt;$.data&lt;/code&gt; plus bas-niveau, moins connue. Elle remplie quasiment le même rôle, à ceci près que sa syntaxe diffère et qu’elle considère l’élément du DOM associé en paramètre.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Affecte la chaîne de caractère &quot;plop&quot; à la clef &quot;key&quot;&lt;/span&gt;
$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Lit la donnée portant la clef &quot;key&quot;&lt;/span&gt;
$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Là encore, je vous invite à jeter un oeil à &lt;a href=&quot;http://api.jquery.com/jQuery.data/&quot;&gt;la documentation officielle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;L’on dispose également de la méthode &lt;code class=&quot;language-text&quot;&gt;$.removeData&lt;/code&gt; pour supprimer des données, ainsi que de la méthode &lt;code class=&quot;language-text&quot;&gt;$.hasData&lt;/code&gt; pour vérifier si l’élément a des données rattachées ou non :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hasData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Retourne &quot;true&quot;&lt;/span&gt;
$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;removeData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Bye bye !&lt;/span&gt;
$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hasData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Retourne &quot;false&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;performance-vs-puissance&quot;&gt;&lt;a href=&quot;#performance-vs-puissance&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Performance vs. Puissance&lt;/h2&gt;
&lt;p&gt;Quel est l’intérêt d’utiliser &lt;code class=&quot;language-text&quot;&gt;$.data&lt;/code&gt; quand &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt; est plus sexy me direz-vous ?&lt;/p&gt;
&lt;p&gt;Et bien comme la méthode est plus bas-niveau, plus simple, &lt;strong&gt;elle s’exécute aussi bien plus rapidement&lt;/strong&gt; !&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// rapide&lt;/span&gt;
$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;el&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// jusqu&apos;à 10 fois plus rapide&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Je vous invite à &lt;a href=&quot;jsperf.com/jquery-fn-data-vs-data&quot;&gt;tester les performances par vous-même&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En contrepartie, elle doit rattacher les données à un élément du DOM tandis que &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt; peut gérer des données sur toute sorte d’objet jQuery, y compris les évènements :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Affecte l&apos;index de chaque lien comme donnée de l&apos;événement &quot;click&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Quand on clique sur un lien, ça affiche son index&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; index&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; i &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Mon index est &apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Enfin, &lt;code class=&quot;language-text&quot;&gt;$.data&lt;/code&gt; ne gère pas les attributs HTML5 &lt;code class=&quot;language-text&quot;&gt;data-*&lt;/code&gt; tandis que &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt; si.&lt;/p&gt;
&lt;p&gt;En pratique :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;si l’on travaille avec un événement, on utilise &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;si l’on travaille avec un attribut HTML5 &lt;code class=&quot;language-text&quot;&gt;data-*&lt;/code&gt;, on utilise &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;dans tous les autres cas, on utilise &lt;code class=&quot;language-text&quot;&gt;$.data&lt;/code&gt; parce-qu’il est plus performant&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;un-mot-sur-le-dom&quot;&gt;&lt;a href=&quot;#un-mot-sur-le-dom&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Un mot sur le DOM&lt;/h2&gt;
&lt;p&gt;Il est bon de noter que les deux méthodes &lt;code class=&quot;language-text&quot;&gt;$.data&lt;/code&gt; et &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt; ont ceci en commun qu’elles &lt;strong&gt;ne modifient pas le DOM&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Plus concrètement, si la méthode &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt; permet d’accéder aux attributs &lt;code class=&quot;language-text&quot;&gt;data-*&lt;/code&gt;, elle ne les modifiera pas (pas dans le DOM). En effet, il ne faut pas se laisser embrouiller par le niveau d’abstraction de la fonction : ce n’est pas l’attribut que vous manipulez par cette méthode mais &lt;strong&gt;un objet jQuery&lt;/strong&gt;, créé automatiquement pour l’occasion.&lt;/p&gt;
&lt;p&gt;En contrepartie, la méthode &lt;code class=&quot;language-text&quot;&gt;$.fn.attr&lt;/code&gt; est une alternative qui permet d’accéder aux attributs du DOM ainsi que de les modifier.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main-content&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-my-key&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;hey&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;myKey&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Change l&apos;objet jQuery mais ne change pas le DOM&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;lt;div id=&quot;main-content&quot; data-my-key=&quot;hey&quot;&gt;&amp;lt;/div&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Rq: $(&apos;#main-content&apos;).data(&apos;myKey&apos;) retourne bien &quot;plop&quot;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;data-my-key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Change effectivement le DOM&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;lt;div id=&quot;main-content&quot; data-key=&quot;plop&quot;&gt;&amp;lt;/div&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans le premier cas, nous avons bel et bien modifié l’objet jQuery, mais aucune opération n’est menée sur le HTML.&lt;/p&gt;
&lt;p&gt;Dans le second cas en revanche, c’est bel et bien le HTML que l’on modifie.&lt;/p&gt;
&lt;p&gt;En ce qui concerne la performance, il est à noter que &lt;a href=&quot;http://jsperf.com/jquery-fn-data-vs-fn-attr&quot;&gt;le second est plus rapide que le premier&lt;/a&gt;. Une raison à cela est probablement que &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt; fait bien plus que juste “accéder” à l’élément : il le caste en fonction de son type.&lt;/p&gt;
&lt;p&gt;Ainsi, cela peut être assez utile pour l’élaboration de plugins ou de widgets :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;widget&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-row&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-responsive&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.widget&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;myWidget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;rows&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;responsive&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En contrepartie, &lt;code class=&quot;language-text&quot;&gt;$.fn.attr&lt;/code&gt; renverra toujours une chaîne de caractères, ce qui peut être utile dans certains cas.&lt;/p&gt;
&lt;h2 id=&quot;le-mot-de-la-fin&quot;&gt;&lt;a href=&quot;#le-mot-de-la-fin&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le mot de la fin&lt;/h2&gt;
&lt;p&gt;Voici pour une brève (mais intense !) présentation des méthodes qui existent en jQuery pour manipuler les données.&lt;/p&gt;
&lt;p&gt;Le point sur la performance me semblait intéressant, il ne faut pas se formaliser pour autant : ce n’est pas cela qui boostera considérablement vos scripts. Cela étant, c’est toujours bon à savoir !&lt;/p&gt;
&lt;p&gt;Avec un peu de chance, cela aura été l’un de vos &lt;em&gt;“Aha moment”&lt;/em&gt; en JS (&lt;a href=&quot;http://hugogiraudel.com/2013/04/30/css-aha-moment/&quot;&gt;comme diraient certains&lt;/a&gt;) =)&lt;/p&gt;
&lt;p&gt;Plop !&lt;/p&gt;</content:encoded></item><item><title><![CDATA[jQuery, data and performance]]></title><description><![CDATA[Best practice and data manipulation with jQuery, no added colourings or preservatives.]]></description><link>https://www.nicoespeon.com/en/2013/05/jquery-data-and-performance/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2013/05/jquery-data-and-performance/</guid><pubDate>Sat, 04 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;tldr&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;jQuery makes elements-related data manipulation easy.&lt;/p&gt;
&lt;p&gt;The HTML5 &lt;code class=&quot;language-text&quot;&gt;data-*&lt;/code&gt; attribute is linked in some way to the jQuery &lt;strong&gt;data&lt;/strong&gt; object for DOM elements.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$.data(element, key[, value])&lt;/code&gt; deals with DOM elements related data.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$.fn.data(key[, value])&lt;/code&gt; deals with jQuery elements related data.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$.data&lt;/code&gt; is low-level and executes faster while &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt; is much more convenient and flexible. Futhermore, the second one can access to the &lt;code class=&quot;language-text&quot;&gt;data-*&lt;/code&gt; attributes.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- HTML --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main-content&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Javascript&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $el &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

$el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// fast&lt;/span&gt;
$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$el&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 10 times faster&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally, unlike &lt;code class=&quot;language-text&quot;&gt;$.fn.attr&lt;/code&gt;, both of these methods don’t modify the DOM.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;$el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;lt;div id=&quot;main-content&quot;&gt;&amp;lt;/div&gt;&lt;/span&gt;
$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$el&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;lt;div id=&quot;main-content&quot;&gt;&amp;lt;/div&gt;&lt;/span&gt;
$el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;data-key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;lt;div id=&quot;main-content&quot; data-key=&quot;plop&quot;&gt;&amp;lt;/div&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;data-manipulation-with-jquery&quot;&gt;&lt;a href=&quot;#data-manipulation-with-jquery&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Data manipulation with jQuery&lt;/h2&gt;
&lt;p&gt;To attach an information to an element and manipulate it over script execution is dead easy with jQuery. Indeed, the library has methods to store, modify and delete data which are related to an element.&lt;/p&gt;
&lt;p&gt;Futhermore, it’s good to know that the &lt;code class=&quot;language-text&quot;&gt;data-*&lt;/code&gt; attributes introduced with HTML5 are automatically pulled as a jQuery &lt;strong&gt;data&lt;/strong&gt; object. Doing so, they are accessible through some of its methods.&lt;/p&gt;
&lt;h3 id=&quot;fndata&quot;&gt;&lt;a href=&quot;#fndata&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;$.fn.data&lt;/h3&gt;
&lt;p&gt;The most popular method is &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt; which is used as below:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Affects the &quot;plop&quot; string to the &quot;key&quot; key&lt;/span&gt;
elem&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Reads the data with the &quot;key&quot; key&lt;/span&gt;
elem&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Valid HTML5 code --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-my-key&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;hey&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#elem&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;myKey&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Outputs &quot;hey&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You’ll notice that we remove &lt;code class=&quot;language-text&quot;&gt;data-&lt;/code&gt; and the HTML hyphens to specify the key the CamelCase way, accordingly to the &lt;a href=&quot;http://www.w3.org/TR/html5/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes&quot;&gt;W3C specification&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://api.jquery.com/data/&quot;&gt;The documentation&lt;/a&gt; is very simple to get in and gives a good overview of the concept.&lt;/p&gt;
&lt;p&gt;But wait there’s more… use the &lt;code class=&quot;language-text&quot;&gt;$.fn.removeData&lt;/code&gt; method to clean all that mess:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;removeData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Bye!&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;data&quot;&gt;&lt;a href=&quot;#data&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;$.data&lt;/h3&gt;
&lt;p&gt;The library also comes with a more low-level and less known method, &lt;code class=&quot;language-text&quot;&gt;$.data&lt;/code&gt;. It plays the same role excepted the syntax and the fact that you need to provide a DOM element associated to the data as a parameter.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Affects the &quot;plop&quot; string to the &quot;key&quot; key&lt;/span&gt;
$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Reads the data with the &quot;key&quot; key&lt;/span&gt;
$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here again, please have a look to the &lt;a href=&quot;http://api.jquery.com/jQuery.data/&quot;&gt;official documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We also get the &lt;code class=&quot;language-text&quot;&gt;$.removeData&lt;/code&gt; method to remove data and the &lt;code class=&quot;language-text&quot;&gt;$.hasData&lt;/code&gt; one to check if an element does or doesn’t have data attached:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hasData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Outputs &quot;true&quot;&lt;/span&gt;
$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;removeData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Bye!&lt;/span&gt;
$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hasData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Outputs &quot;false&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;performance-vs-power&quot;&gt;&lt;a href=&quot;#performance-vs-power&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Performance vs. Power&lt;/h2&gt;
&lt;p&gt;Why should I use &lt;code class=&quot;language-text&quot;&gt;$.data&lt;/code&gt; when &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt; is much more sexy to write?&lt;/p&gt;
&lt;p&gt;Well, as the method is low-level, &lt;strong&gt;it goes way faster&lt;/strong&gt;!&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// fast&lt;/span&gt;
$&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;el&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// up to 10 times faster&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I invite you to &lt;a href=&quot;jsperf.com/jquery-fn-data-vs-data&quot;&gt;test performances by yourself&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The other side of the coin is that it should attach data to a DOM element while &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt; can handle any sort of jQuery object, events included:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Affects each link index as a data for the &quot;click&quot; event&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// When you click on a link, it shows its index&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; index&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; i &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;My index is &apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally, &lt;code class=&quot;language-text&quot;&gt;$.data&lt;/code&gt; doesn’t manage HTML5 &lt;code class=&quot;language-text&quot;&gt;data-*&lt;/code&gt; attributes while &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt; does.&lt;/p&gt;
&lt;p&gt;Concretely:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if you deal with an event, use &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;if you deal with an HTML5 &lt;code class=&quot;language-text&quot;&gt;data-*&lt;/code&gt; attribute, use &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;otherwise, use &lt;code class=&quot;language-text&quot;&gt;$.data&lt;/code&gt; because of performance&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;a-word-about-the-dom&quot;&gt;&lt;a href=&quot;#a-word-about-the-dom&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A word about the DOM&lt;/h2&gt;
&lt;p&gt;It’s also good to know that both of the &lt;code class=&quot;language-text&quot;&gt;$.data&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt; methods &lt;strong&gt;do not modify the DOM&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;More precisely, although the &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt; methods can access to &lt;code class=&quot;language-text&quot;&gt;data-*&lt;/code&gt; attributes, it wouldn’t modify them in the DOM. You shouldn’t get tricked because of the function abstraction: it’s not the attribute you are manipulating but an automatically created &lt;strong&gt;jQuery object&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In return, the &lt;code class=&quot;language-text&quot;&gt;$.fn.attr&lt;/code&gt; method is an alternative to reach DOM attributes and to modify them.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main-content&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-my-key&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;hey&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;myKey&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Change the jQuery object, not the DOM&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;lt;div id=&quot;main-content&quot; data-my-key=&quot;hey&quot;&gt;&amp;lt;/div&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Note: $(&apos;#main-content&apos;).data(&apos;myKey&apos;) outputs &quot;plop&quot;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-content&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;data-my-key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;plop&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Change effectively the DOM&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;lt;div id=&quot;main-content&quot; data-key=&quot;plop&quot;&gt;&amp;lt;/div&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the first code, we modified the jQuery object but nothing happen on the HTML.&lt;/p&gt;
&lt;p&gt;In the second code however, we concretely modified the HTML.&lt;/p&gt;
&lt;p&gt;Concerning performance, you might note that &lt;a href=&quot;http://jsperf.com/jquery-fn-data-vs-fn-attr&quot;&gt;the second is way faster than the first one&lt;/a&gt;. A reason for that would probably be that &lt;code class=&quot;language-text&quot;&gt;$.fn.data&lt;/code&gt; does more than just “reach” the element: it performs some casting regarding to the type of the element.&lt;/p&gt;
&lt;p&gt;Thus, it could be very helpful for plugins or widgets initialization:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;widget&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-row&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-responsive&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.widget&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;myWidget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;rows&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;responsive&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On the other hand, &lt;code class=&quot;language-text&quot;&gt;$.fn.attr&lt;/code&gt; will always output a string, which could be necessary sometimes.&lt;/p&gt;
&lt;h2 id=&quot;last-words&quot;&gt;&lt;a href=&quot;#last-words&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Last words&lt;/h2&gt;
&lt;p&gt;That’s it for my short (but intense!) presentation of existing jQuery methods to manipulate data.&lt;/p&gt;
&lt;p&gt;I thought that notes about performance would have been interesting, but it shouldn’t be a concern: this is not what would make you script significantly faster. Still, it’s good to know about it!&lt;/p&gt;
&lt;p&gt;If I’m lucky enough, that may have been one of your &lt;em&gt;“Aha moment”&lt;/em&gt; with JS (&lt;a href=&quot;http://hugogiraudel.com/2013/04/30/css-aha-moment/&quot;&gt;as some people would call that&lt;/a&gt;) =)&lt;/p&gt;
&lt;p&gt;Plop!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Optimiser ses sélecteurs, CSS vs. JS]]></title><description><![CDATA[Petit mémo de bonnes pratiques quant à l'utilisation de sélecteurs en CSS et en Javascript. Ce qui vaut pour l'un ne l'est pas nécessairement pour l'autre.]]></description><link>https://www.nicoespeon.com/fr/2013/05/optimiser-selecteurs-css-vs-js/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2013/05/optimiser-selecteurs-css-vs-js/</guid><pubDate>Thu, 02 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;tldr&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Les sélecteurs sont interprétés &lt;strong&gt;de la droite vers la gauche&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En CSS&lt;/strong&gt;, il est préférable d’utiliser une classe plutôt qu’un identifiant dans la mesure où le premier fait tout aussi bien que le second et même plus. L’idée est de garder la spécificité du sélecteur la plus basse possible pour simplifier la maintenabilité du code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En JS&lt;/strong&gt;, un identifiant et une spécificité accrue donnera de meilleurs résultats en terme de performance. Il s’agit d’aller droit au but. Inutile cependant d’être trop spécifique, c’est contre-productif.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Évitez d’utiliser le sélecteur universel &lt;code class=&quot;language-text&quot;&gt;*&lt;/code&gt; dans une chaîne de sélecteurs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Les deux pratiques ne sont pas incompatibles et n’empêchent pas votre HTML d’être sémantique :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- HTML --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;article&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main-article&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- … --&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ol&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav nav--block pagination&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;pagination__prev&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/page1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token entity&quot; title=&quot;&amp;lt;&quot;&gt;&amp;amp;lt;&lt;/span&gt; Previous&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;pagination__next&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/page3&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Next &lt;span class=&quot;token entity&quot; title=&quot;&amp;gt;&quot;&gt;&amp;amp;gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* CSS */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.nav&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;list-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.nav--block&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* Mauvaise idée */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.nav--block *&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* Pas de gros soucis */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;box-sizing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; border-box&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Javascript (jQuery)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-article .nav--block .pagination__prev&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// fast&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-article .nav--block li.pagination__prev&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// faster&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-article&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.pagination__prev&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// super-fast&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;en-css&quot;&gt;&lt;a href=&quot;#en-css&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;En CSS&lt;/h2&gt;
&lt;p&gt;Ce qui va suivre relève de bonnes pratiques CSS connues sous le nom d’OOCSS (&lt;em&gt;Object Oriented CSS&lt;/em&gt;). C’est une philosophie assez répandue et à laquelle j’adhère, mais ce n’est pas la seule façon de voir les choses. Je crois cependant qu’elle s’adapte à tout type de projets, grands ou petits, avec l’avantage d’être &lt;em&gt;future-proof&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://coding.smashingmagazine.com/2011/12/12/an-introduction-to-object-oriented-css-oocss/&quot;&gt;Voici une introduction à ses principes&lt;/a&gt;, pour ceux que ça intéresse, ainsi qu’une &lt;a href=&quot;http://coding.smashingmagazine.com/2012/06/19/classes-where-were-going-we-dont-need-classes/&quot;&gt;vision alternative&lt;/a&gt; (que je ne partage pas, mais qui a sa légitimité selon moi). Libre à chacun de suivre sa voie.&lt;/p&gt;
&lt;h3 id=&quot;class-ou-id-&quot;&gt;&lt;a href=&quot;#class-ou-id-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Class ou ID ?&lt;/h3&gt;
&lt;p&gt;Pour faire bref, du point de vue du CSS &lt;strong&gt;une classe peut faire tout ce que fait un identifiant mais un identifiant ne peut pas être réutilisé&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Partant de ce constat, l’usage d’une classe peut facilement se substituer à celui d’un identifiant et permet d’anticiper sur l’avenir.&lt;/p&gt;
&lt;p&gt;De plus, un identifiant augmente considérablement la spécificité de la déclaration, ce qui peut vite entraîner un joli bordel au fil du temps, et une utilisation inappropriée de &lt;code class=&quot;language-text&quot;&gt;!important&lt;/code&gt; ou autre déclarations de style inline, directement dans le HTML, pour surcharger le style désiré. Autrement dit, c’est pas joli à voir !&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Pas très future-proof --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ol&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;pagination&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/page1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token entity&quot; title=&quot;&amp;lt;&quot;&gt;&amp;amp;lt;&lt;/span&gt; Previous&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/page3&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Next &lt;span class=&quot;token entity&quot; title=&quot;&amp;gt;&quot;&gt;&amp;amp;gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;#pagination&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;list-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Quid si demain apparaît un autre type de pagination sur un module de la page ? On crée un nouvel identifiant avec un autre nom et peu ou prou les mêmes propriétés ? Et puis, la pagination n’est-elle pas une sorte de menu de navigation en soi ?&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Future-proof --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ol&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav pagination&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/page1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token entity&quot; title=&quot;&amp;lt;&quot;&gt;&amp;amp;lt;&lt;/span&gt; Previous&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/page3&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Next &lt;span class=&quot;token entity&quot; title=&quot;&amp;gt;&quot;&gt;&amp;amp;gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.nav&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;list-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.pagination&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La classe &lt;code class=&quot;language-text&quot;&gt;.nav&lt;/code&gt; est d’ailleurs parfaitement réutilisable, c’est une couche d’abstraction qui détermine les propriétés communes à tous mes menus de type &lt;em&gt;navigation&lt;/em&gt; sur mon site (&lt;em&gt;à son pépère !&lt;/em&gt;).&lt;/p&gt;
&lt;h3 id=&quot;bewaaaaare-la-spécificité-&quot;&gt;&lt;a href=&quot;#bewaaaaare-la-sp%C3%A9cificit%C3%A9-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Bewaaaaare la spécificité !&lt;/h3&gt;
&lt;p&gt;En CSS, &lt;a href=&quot;http://blog.organicweb.fr/comprendre-le-poids-des-regles-css&quot;&gt;les règles de spécificité&lt;/a&gt; sont plus ou moins simples, plus ou moins connues et engendrent plus ou moins de problèmes selon que l’on ait plus ou moins écrit son CSS intelligemment.&lt;/p&gt;
&lt;p&gt;Pour faire bien, faisons simple : &lt;strong&gt;ne vous lancez pas dans des sélecteurs trop spécifiques qui alourdissent la règle inutilement&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Il s’agit de rester dans l’esprit OOCSS : les classes sont autant d’objets plus ou moins abstraits que l’on combine, tels des legos, pour produire le résultat attendu. C’est plus stable et maintenable dans le temps !&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;ol.nav&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 0-0-1-1 spécification inutile */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;article &gt; .nav li a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 0-0-1-3 trop spécifique ! */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.pagination__prev&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 0-0-1-0 OK */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L’idée est de produire un code CSS performant car :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;non dépendant du contexte HTML dans lequel il se trouve (flexibilité)&lt;/li&gt;
&lt;li&gt;pouvant être facilement surchargé (maintenabilité)&lt;/li&gt;
&lt;li&gt;accessoirement, simple à concevoir&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un bon indicateur d’un CSS qui part en vrille réside dans le fait d’utiliser &lt;code class=&quot;language-text&quot;&gt;!important&lt;/code&gt; pour appliquer un style &lt;em&gt;“parce-que sinon ça ne marche pas et konsaipapourkoi”&lt;/em&gt; !&lt;/p&gt;
&lt;p&gt;Si les chiffres ne sont pas votre fort (et que vous n’aimez pas mon lien précédent et son dessin récapitulatif), &lt;a href=&quot;http://css-specificity.webapp-prototypes.appspot.com/&quot;&gt;voici un calculateur en ligne de spécificité CSS&lt;/a&gt; qui peut vous aider. L’idée est de garder une spécificité avoisinant &lt;code class=&quot;language-text&quot;&gt;[0-0-1-0]&lt;/code&gt; pour vos règles (l’équivalent d’une classe CSS), d’une manière générale. Ainsi, plus de perte de temps à investiguer pourquoi votre style ne s’applique pas.&lt;/p&gt;
&lt;h2 id=&quot;en-javascript&quot;&gt;&lt;a href=&quot;#en-javascript&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;En Javascript&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;N.B.&lt;/strong&gt; - &lt;em&gt;Javascript&lt;/em&gt; est un abus de langage ici dans la mesure où je parle de bibliothèques JS avec jQuery en référence.&lt;/p&gt;
&lt;p&gt;Il convient cependant de noter qu’en termes de performances, le JS pur donnera de meilleurs résultats et &lt;code&gt;document.getElementById()&lt;/code&gt; est probablement &lt;a href=&quot;http://jsperf.com/id-selector-comparison/3&quot;&gt;le plus performant&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;une-bonne-id&quot;&gt;&lt;a href=&quot;#une-bonne-id&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Un(e) bon(ne) ID&lt;/h3&gt;
&lt;p&gt;L’identifiant est de loin le plus efficace des sélecteurs. Une fois que le moteur de sélection a trouvé l’élément, il arrête sa traversée du DOM. L’utilisation d’un identifiant est pertinente dans le cas du Javascript car l’on souhaite, la plupart du temps, travailler avec un élément bien précis, identifié.&lt;/p&gt;
&lt;p&gt;En bref, il est bien plus efficace &lt;strong&gt;d’isoler l’identifiant dans le sélecteur&lt;/strong&gt;, puis de chainer avec une fonction de recherche, afin de limiter le champ de recherche du moteur :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-article .pagination__prev&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// rapide&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-article&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.pagination__prev&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 2 fois plus rapide&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans le premier cas, le moteur va chercher l’ensemble des éléments dans le DOM portant la classe &lt;code class=&quot;language-text&quot;&gt;.pagination__prev&lt;/code&gt;, puis rechercher ceux qui se trouvent dans le bloc identifié par &lt;code class=&quot;language-text&quot;&gt;#main-article&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Dans le second cas, le moteur va d’abord rechercher le bloc &lt;code class=&quot;language-text&quot;&gt;#main-article&lt;/code&gt;, puis va chercher les éléments portant la classe &lt;code class=&quot;language-text&quot;&gt;.pagination__prev&lt;/code&gt; à l’intérieur de ce bloc.&lt;/p&gt;
&lt;p&gt;Je vous invite à &lt;a href=&quot;http://jsperf.com/optimized-js-selectors&quot;&gt;tester par vous-même les performances&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;spécifique-mais-pas-trop&quot;&gt;&lt;a href=&quot;#sp%C3%A9cifique-mais-pas-trop&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Spécifique mais pas trop&lt;/h3&gt;
&lt;p&gt;Il s’agit d’un petit point mais &lt;strong&gt;augmenter la spécificité à droite de votre sélecteur&lt;/strong&gt; peut permettre à votre moteur d’aller plus vite dans sa recherche effectivement.&lt;/p&gt;
&lt;p&gt;En revanche, inutile d’en faire des caisses : évitez d’alourdir inutilement votre sélecteur ou votre performance en pâtira.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ol.nav--block .muted&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// non-optimisé&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.nav--block li.pagination__next a.muted&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// non-optimisé&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.nav--block a.muted&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// optimisé&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;gare-au-sélecteur-universel&quot;&gt;&lt;a href=&quot;#gare-au-s%C3%A9lecteur-universel&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Gare au sélecteur universel&lt;/h2&gt;
&lt;p&gt;MAJ le 4 Mai 2013 après une &lt;a href=&quot;http://paulirish.com/2012/box-sizing-border-box-ftw/&quot;&gt;intéressante lecture&lt;/a&gt; sur l’utilisation de &lt;code&gt;*&lt;/code&gt; en CSS et son impact sur la performance (le paragraphe sur la performance).&lt;/p&gt;
&lt;p&gt;Que ce soit en CSS ou en JS, &lt;code class=&quot;language-text&quot;&gt;*&lt;/code&gt; peut devenir la bête noire des performances en terme de sélection.&lt;/p&gt;
&lt;p&gt;Mal utilisé en CSS ou, sans le savoir, dans les sélecteurs JS, c’est ce qu’il peut y avoir de pire pour le moteur de sélection qui doit se coltiner tous les éléments du DOM.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dans le cas du CSS&lt;/strong&gt;, posez-vous la question : ais-je vraiment besoin de cibler tous les éléments, quels qu’ils soient ? La réponse sera probablement “non”.&lt;/p&gt;
&lt;p&gt;Et n’allez pas croire que ceci est une bonne idée :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.nav--block *&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Car si vous lisez &lt;em&gt;“dans les éléments &lt;code class=&quot;language-text&quot;&gt;.nav--block&lt;/code&gt;, tous les éléments”&lt;/em&gt;, le moteur lira &lt;em&gt;“tous les éléments, puis ceux qui ont &lt;code class=&quot;language-text&quot;&gt;.nav--block&lt;/code&gt; comme parent”&lt;/em&gt;. De droite à gauche on vous dit !&lt;/p&gt;
&lt;p&gt;En revanche, ceci ne posera pas de soucis de performance, à moins que vous en soyez à peaufiner votre score &lt;a href=&quot;https://developers.google.com/speed/pagespeed&quot;&gt;Page Speed&lt;/a&gt; au delà de 90 (autrement dit, c’est pas la priorité) :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* apply a natural box layout model to all elements */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-moz-box-sizing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; border-box&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-webkit-box-sizing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; border-box&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;box-sizing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; border-box&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Dans le cas du JS&lt;/strong&gt;, c’est encore plus fourbe car si vous ne faîtes pas attention, vous le suggérez par défaut. Enfin, il existe probablement des fonctions alternatives qui permettent d’arriver à exprimer ce que vous souhaitez faire.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.nav--block &gt; *&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// ouch !&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.nav--block&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// mieux&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.form-fields :radio&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// = $(&apos;.form-fields *:radio&apos;);&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.form-fields input:radio&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// mieux&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;le-mot-de-la-fin&quot;&gt;&lt;a href=&quot;#le-mot-de-la-fin&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le mot de la fin&lt;/h2&gt;
&lt;p&gt;Voilà pour mon petit point de vue sur les sélecteurs.&lt;/p&gt;
&lt;p&gt;Ce sont quelques bonnes pratiques que j’ai intégré avec le temps et qui sont ouvertes à la discussion ; n’hésitez pas à émettre des remarques, questions ou suggestions ci-dessous =)&lt;/p&gt;
&lt;p&gt;Plop !&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Optimize selectors, CSS vs. JS]]></title><description><![CDATA[Short round up of best practices for selectors use in CSS and Javascript. What is sauce for the goose is not necessarily sauce for the gander.]]></description><link>https://www.nicoespeon.com/en/2013/05/optimize-selectors-css-vs-js/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2013/05/optimize-selectors-css-vs-js/</guid><pubDate>Thu, 02 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;tldr&quot;&gt;&lt;a href=&quot;#tldr&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Selectors are interpreted &lt;strong&gt;from right to left&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With CSS&lt;/strong&gt;, it’s better to use a class instead of an identifier as the first one can do exactly the same than the second one, and more. You have to keep the specificity as low as possible to improve code scalability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With JS&lt;/strong&gt;, an identifier and an high specificity will lead to more efficient results. You’ve to go straight to the point. But it’s pointless to be over-specific, it’s counter-productive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don’t use the universal selector &lt;code class=&quot;language-text&quot;&gt;*&lt;/code&gt; in a selector chain&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Both are not mutually exclusive and do not prevent your HTML to be semantic:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- HTML --&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;article&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;main-article&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- … --&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ol&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav nav--block pagination&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;pagination__prev&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/page1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token entity&quot; title=&quot;&amp;lt;&quot;&gt;&amp;amp;lt;&lt;/span&gt; Previous&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;pagination__next&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/page3&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Next &lt;span class=&quot;token entity&quot; title=&quot;&amp;gt;&quot;&gt;&amp;amp;gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* CSS */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.nav&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;list-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.nav--block&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* Bad idea */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.nav--block \*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* Not a big deal */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;box-sizing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; border-box&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Javascript (jQuery)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-article .nav--block .pagination**prev&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// fast&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-article .nav--block li.pagination**prev&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// faster&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-article&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.pagination__prev&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// super-fast&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;with-css&quot;&gt;&lt;a href=&quot;#with-css&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;With CSS&lt;/h2&gt;
&lt;p&gt;This come from CSS best practices known as OOCSS (&lt;em&gt;Object Oriented CSS&lt;/em&gt;). It’s a fairly generalized philosophy I agree with, but it’s not the only way. However, I trust it could be used for any kind of project, regardless its size, with a &lt;em&gt;future-proof&lt;/em&gt; argument.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://coding.smashingmagazine.com/2011/12/12/an-introduction-to-object-oriented-css-oocss/&quot;&gt;Here is an introduction to OOCSS principles&lt;/a&gt; for those who are interested in. &lt;a href=&quot;http://coding.smashingmagazine.com/2012/06/19/classes-where-were-going-we-dont-need-classes/&quot;&gt;This is an alternative vision&lt;/a&gt; I don’t share but which is legit still. Feel free to follow your own path.&lt;/p&gt;
&lt;h3 id=&quot;class-or-id-&quot;&gt;&lt;a href=&quot;#class-or-id-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Class or ID ?&lt;/h3&gt;
&lt;p&gt;In short, from CSS point of view &lt;strong&gt;a class can do whatever an identifier does, but an identifier cannot be reused&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That said, we can use classes instead of identifier and anticipate the future.&lt;/p&gt;
&lt;p&gt;Furthermore, an identifier considerably increase the declaration specificity. This will make your CSS a mess with inappropriate uses of &lt;code class=&quot;language-text&quot;&gt;!important&lt;/code&gt; or other inline style declarations directly within the HTML to override the desired style.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Not really future-proof --&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ol&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;pagination&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/page1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token entity&quot; title=&quot;&amp;lt;&quot;&gt;&amp;amp;lt;&lt;/span&gt; Previous&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/page3&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Next &lt;span class=&quot;token entity&quot; title=&quot;&amp;gt;&quot;&gt;&amp;amp;gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;#pagination&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;list-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;What if another type of pagination appears somewhere else on the page? Do we create a completely new identifier with kind of the same properties? However, pagination sounds like some kind of navigation, doesn’t it?&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Future-proof --&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ol&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;nav pagination&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/page1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token entity&quot; title=&quot;&amp;lt;&quot;&gt;&amp;amp;lt;&lt;/span&gt; Previous&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/page3&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Next &lt;span class=&quot;token entity&quot; title=&quot;&amp;gt;&quot;&gt;&amp;amp;gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.nav&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;list-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.pagination&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;.nav&lt;/code&gt; class is perfectly reusable. It’s an abstract layer which determine the common properties to all the &lt;em&gt;navigation&lt;/em&gt; menu of my website.&lt;/p&gt;
&lt;h3 id=&quot;bewaaaaare-specificity&quot;&gt;&lt;a href=&quot;#bewaaaaare-specificity&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Bewaaaaare specificity!&lt;/h3&gt;
&lt;p&gt;With CSS, &lt;a href=&quot;http://coding.smashingmagazine.com/2007/07/27/css-specificity-things-you-should-know/&quot;&gt;the specificity rules&lt;/a&gt; are more or less easy to figure out, more or less known and lead to more or less problems whether our CSS is more or less cleverly written.&lt;/p&gt;
&lt;p&gt;In a few words: &lt;strong&gt;don’t write over-specified selectors which make rules unnecessarily heavy&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It’s about OOCSS spirit: classes are more or less abstracts objects you can combine as lego to produce the expected output. It’s much more stable and scalable over time!&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;ol.nav&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 0-0-1-1 useless specification */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;article &gt; .nav li a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 0-0-1-3 too specific! */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.pagination__prev&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 0-0-1-0 OK */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The deal is to produce an efficient CSS because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;it’s &lt;a href=&quot;http://en.wikipedia.org/wiki/Loose_coupling&quot;&gt;loosely coupled&lt;/a&gt; with the HTML context (flexibility)&lt;/li&gt;
&lt;li&gt;it could be easily override (scalability)&lt;/li&gt;
&lt;li&gt;plus, it’s easy to figure out&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The use of &lt;code class=&quot;language-text&quot;&gt;!important&lt;/code&gt; to set a style &lt;em&gt;“becoz’, otherwise, it duzn’t work and we dun’t know why”&lt;/em&gt; is a good indicator of a poor-quality CSS.&lt;/p&gt;
&lt;p&gt;If you’re not a really good numbers person, &lt;a href=&quot;http://css-specificity.webapp-prototypes.appspot.com/&quot;&gt;here is an online CSS specificity calculator&lt;/a&gt; which can help you. The deal is to keep a specificity close to &lt;code class=&quot;language-text&quot;&gt;[0-0-1-0]&lt;/code&gt;, which is equivalent to a class. Doing so, you won’t lose time anymore in debugging why your style doesn’t apply.&lt;/p&gt;
&lt;h2 id=&quot;with-javascript&quot;&gt;&lt;a href=&quot;#with-javascript&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;With Javascript&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;NB&lt;/strong&gt; - &lt;em&gt;Javascript&lt;/em&gt; is an abuse of terms. I mainly deal with JS libraries, jQuery as a reference.&lt;/p&gt;
&lt;p&gt;It worth noting that vanilla JS will give better results and &lt;code class=&quot;language-text&quot;&gt;document.getElementById()&lt;/code&gt; is probably &lt;a href=&quot;http://jsperf.com/id-selector-comparison/3&quot;&gt;the most efficient&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;a-good-id&quot;&gt;&lt;a href=&quot;#a-good-id&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A good ID&lt;/h3&gt;
&lt;p&gt;An identifier is the most efficient of selectors. Once the selector engine has found the element, it stops its journey through the DOM. The use of an identifier is relevant with Javascript because we want to deal with a precise, identified element most of the time.&lt;/p&gt;
&lt;p&gt;In short, it’s much more efficient to &lt;strong&gt;isolate the identifier within the selector&lt;/strong&gt;, then to chain with a query function to limit the scope for the engine:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-article .pagination**prev&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// fast&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#main-article&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.pagination**prev&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 2 times faster&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the first attempt, the engine will search for all the elements from the DOM with the &lt;code class=&quot;language-text&quot;&gt;.pagination__prev&lt;/code&gt; class, then search for those who are inside the &lt;code class=&quot;language-text&quot;&gt;#main-article&lt;/code&gt; block.&lt;/p&gt;
&lt;p&gt;In the second attempt, the engine will first search for the &lt;code class=&quot;language-text&quot;&gt;#main-article&lt;/code&gt; block, then for elements with the &lt;code class=&quot;language-text&quot;&gt;.pagination__prev&lt;/code&gt; class inside this block.&lt;/p&gt;
&lt;p&gt;Please &lt;a href=&quot;http://jsperf.com/optimized-js-selectors&quot;&gt;check performances by yourself&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;specific-enough&quot;&gt;&lt;a href=&quot;#specific-enough&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Specific enough&lt;/h3&gt;
&lt;p&gt;This is a small bullet point worth noting. To &lt;strong&gt;increase the specificity at the right of the selector&lt;/strong&gt; could increase the speed of the selector engine.&lt;/p&gt;
&lt;p&gt;However, it’s pointless and counter-productive to make your selector far too heavy than necessary.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ol.nav--block .muted&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// not-optimized&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.nav--block li.pagination__next a.muted&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// not-optimized&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.nav--block a.muted&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// optimized&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;be-careful-with-the-universal-selector&quot;&gt;&lt;a href=&quot;#be-careful-with-the-universal-selector&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Be careful with the universal selector&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Updated on May 4th, 2013 after an &lt;a href=&quot;http://paulirish.com/2012/box-sizing-border-box-ftw/&quot;&gt;insightful reading&lt;/a&gt; about the use of &lt;code class=&quot;language-text&quot;&gt;*&lt;/code&gt; in CSS and its performance impact (the performance paragraph).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Whether it is with CSS or JS, &lt;code class=&quot;language-text&quot;&gt;*&lt;/code&gt; could be the bugbear of selection performance.&lt;/p&gt;
&lt;p&gt;Improperly used with CSS or, without knowing it, in JS selectors, this is the worst thing the selector engine could have to deal with, as it should check against all the DOM elements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In CSS&lt;/strong&gt;, ask yourself: do I really need to point out all the elements, whatever they are? “No” would probably be the answer.&lt;/p&gt;
&lt;p&gt;This, is a bad idea:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.nav--block *&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When you read &lt;em&gt;“within &lt;code class=&quot;language-text&quot;&gt;.nav--block&lt;/code&gt; elements, all the elements”&lt;/em&gt;, the selector engine read &lt;em&gt;“all the elements, then those who have &lt;code class=&quot;language-text&quot;&gt;.nav--block&lt;/code&gt; as a parent”&lt;/em&gt;. From the right to the left!&lt;/p&gt;
&lt;p&gt;However, this won’t lead to performance leak and shouldn’t be a concern excepted if you try to improve your &lt;a href=&quot;https://developers.google.com/speed/pagespeed&quot;&gt;Page Speed&lt;/a&gt; score beyond 90:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* apply a natural box layout model to all elements */&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-moz-box-sizing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; border-box&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-webkit-box-sizing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; border-box&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;box-sizing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; border-box&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;In JS&lt;/strong&gt;, if you don’t pay attention you’ll make it implicit by default. Plus, there should be alternative functions to achieve what you want to do.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.nav--block &gt; *&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// ouch!&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.nav--block&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// better&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.form-fields :radio&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// = $(&apos;.form-fields \*:radio&apos;);&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.form-fields input:radio&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// better&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;last-words&quot;&gt;&lt;a href=&quot;#last-words&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Last words&lt;/h2&gt;
&lt;p&gt;That’s it folks, that was my point of view over selectors.&lt;/p&gt;
&lt;p&gt;These are best practices I learnt over time. It’s completely open to discuss, do not hesitate to do remarks, questions or suggestions below =)&lt;/p&gt;
&lt;p&gt;Plop!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Lassés de Bootstrap ? Découvrez inuit.css !]]></title><description><![CDATA[inuit.css est un framework CSS extensible, construit sur un ensemble de bonnes pratiques CSS et qui n'impose pas de design prédéfini.]]></description><link>https://www.nicoespeon.com/fr/2013/04/decouvrez-inuitcss/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2013/04/decouvrez-inuitcss/</guid><pubDate>Fri, 12 Apr 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;inuitcss-est-il-fait-pour-vous-&quot;&gt;&lt;a href=&quot;#inuitcss-est-il-fait-pour-vous-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;inuit.css est-il fait pour vous ?&lt;/h2&gt;
&lt;p&gt;Pour faire simple, voici les cas de figure dans lesquels ce framework peut vous intéresser :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vous avez besoin de mettre en place rapidement une architecture CSS décente&lt;/li&gt;
&lt;li&gt;Vous découvrez/connaissez les avantages du code &lt;em&gt;Orienté Objet&lt;/em&gt; et appréciez son adaptabilité et sa réusabilité&lt;/li&gt;
&lt;li&gt;Vous devez implémenter un certain design qui ne colle pas forcément aux éléments “par défaut” des autres frameworks&lt;/li&gt;
&lt;li&gt;Vous aimez le concept de framework mais, développeur dans l’âme, aimez avoir la main-mise sur le code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et voici clairement le cas de figure où vous pouvez passer votre chemin (sauf si vous êtes curieux) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vous cherchez un framework CSS qui prenne en charge le design des éléments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En ce qui me concerne, je suis un assez grand utilisateur de &lt;a href=&quot;http://twitter.github.io/bootstrap/&quot;&gt;Bootstrap&lt;/a&gt;. Mais en travaillant sur des projets où le design était imposé, je me suis confronté au problème de &lt;strong&gt;devoir surcharger le design du framework&lt;/strong&gt;. Il faut alors annuler des effets par défaut, changer la couleur, la taille, … Ca fonctionne, mais vous vous retrouvez avec un CSS inutilement gonflé parce-que vous avez défini et redéfini les propriétés des mêmes éléments. C’est pas glop.&lt;/p&gt;
&lt;p&gt;Ainsi, quand on veut produire un code CSS optimal et que l’on apprécie les valeurs de &lt;a href=&quot;http://coding.smashingmagazine.com/2011/12/12/an-introduction-to-object-oriented-css-oocss/&quot;&gt;OOCSS&lt;/a&gt; on se rend compte que, dans certains cas de figure, Bootstrap n’est pas l’idéal.&lt;/p&gt;
&lt;p&gt;Je suis donc tombé sur &lt;a href=&quot;http://inuitcss.com&quot;&gt;inuit.css&lt;/a&gt;, à peu près par hasard. Et comme je suis un peu curieux de nature, j’ai tenté le coup. J’ai adopté !&lt;/p&gt;
&lt;p&gt;En guise d’overview, je ne peux que vous conseiller d’aller faire joujou sur &lt;a href=&quot;http://jsfiddle.net/user/inuitcss/fiddles/&quot;&gt;les fiddles d’inuit.css&lt;/a&gt; !&lt;/p&gt;
&lt;h2 id=&quot;philosophie&quot;&gt;&lt;a href=&quot;#philosophie&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Philosophie&lt;/h2&gt;
&lt;p&gt;inuit.css a été créé &lt;a href=&quot;http://csswizardry.com/2011/06/what-is-inuit-css/&quot;&gt;en Avril 2011&lt;/a&gt; par &lt;a href=&quot;http://csswizardry.com/about/&quot;&gt;Harry Roberts&lt;/a&gt; (c’est un anglais !).&lt;/p&gt;
&lt;p&gt;Il est parti du principe qu’un framework CSS devait apporter une logique et un ligne de conduite pour le développeur, sans forcément le contraindre à un design particulier. Et comme le bougre n’est pas mauvais question bonnes pratiques CSS, il en a fait un framework.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;inuit.css is a powerful, scalable, Sass-based, BEM, OOCSS framework.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;inuit.css est développé en &lt;a href=&quot;http://sass-lang.com/&quot;&gt;Sass&lt;/a&gt;&lt;/strong&gt;. Sass est un &lt;em&gt;pré-processeur CSS&lt;/em&gt;, une sorte de langage CSS amélioré permettant de réaliser pas mal de choses dont le CSS n’est pas capable (sélecteurs imbriqués, boucles, conditions, etc.). Le code du pré-processeur doit ensuite être compilé pour donner le fichier CSS final qui sera utilisé pour le site, car c’est bien le CSS qu’il faut fournir au navigateur, les fichiers Sass n’étant là que pour simplifier le développement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;inuit.css utilise la convention de nommage &lt;a href=&quot;http://bem.info/method/definitions/&quot;&gt;BEM&lt;/a&gt;&lt;/strong&gt;. Alors pour le coup c’est un choix personnel du créateur qui peut être, comme toute bonne pratique CSS, controversée. C’est un coup à prendre, ça secoue les habitudes, c’est pas forcément très esthétique mais les avantages sont indéniables. Le mieux reste encore de lire &lt;a href=&quot;http://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/&quot;&gt;l’article d’Harry Roberts sur la question&lt;/a&gt; car il l’explique très bien lui-même.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;inuit.css est un framework OOCSS&lt;/strong&gt;. C’est à dire que l’ensemble des composants du framework sont des objets indépendants, combinables et réutilisables. De plus, le framework tire partie des avantages de cette philosophie, ce qui le rend extensible à souhait sans crise de nerf à l’horizon. Je ferais un article sur les principes OOCSS, en attendant je peux vous conseiller &lt;a href=&quot;http://fr.slideshare.net/stubbornella/the-cascade-grids-headings-and-selectors-from-an-oocss-perspective-ajax-experience-2009&quot;&gt;les slides de Nicole Sullivan sur la question&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;installation&quot;&gt;&lt;a href=&quot;#installation&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Installation&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Pré-requis&lt;/strong&gt; - avoir &lt;a href=&quot;http://sass-lang.com/tutorial.html&quot;&gt;installé Sass&lt;/a&gt; au préalable pour pouvoir compiler le code.&lt;/p&gt;
&lt;p&gt;A l’heure actuelle, &lt;strong&gt;inuit.css&lt;/strong&gt; est passé à la version &lt;strong&gt;v5.0&lt;/strong&gt;, ce qui change considérablement la manière de l’implémenter par rapport aux versions précédentes.&lt;/p&gt;
&lt;p&gt;L’idée était &lt;a href=&quot;http://inuitcss.com/2013/03/inuit-css-v5.0/&quot;&gt;d’en faire un module&lt;/a&gt; dont le coeur peut être mis à jour sans perturber le projet dans lequel il est implémenté. Toutes les configurations propres au projet ont donc été exportées en dehors du coeur, qui peut être mis à jour sans aucun problème.&lt;/p&gt;
&lt;h3 id=&quot;méthode-1---avec-git&quot;&gt;&lt;a href=&quot;#m%C3%A9thode-1---avec-git&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Méthode 1 - Avec Git&lt;/h3&gt;
&lt;p&gt;Pour un nouveau projet, clonez simplement le dépôt de la manière suivante :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git clone --recursive git@github.com:csswizardry/inuit.css-web-template.git your-project-folder
$ cd your-project-folder
$ ./go&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/csswizardry/inuit.css-web-template/blob/master/go&quot;&gt;Le script &lt;code class=&quot;language-text&quot;&gt;go&lt;/code&gt;&lt;/a&gt; installe la dernière version de &lt;code class=&quot;language-text&quot;&gt;inuit.css&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Astuce&lt;/strong&gt; - Si vous souhaitez incorporer le framework dans un projet existant :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git submodule add git://github.com/csswizardry/inuit.css.git your-project-folder/inuit.css&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il vous faudra ensuite organiser vos fichiers selon vos besoin, en vous inspirant de l’architecture du dossier &lt;code&gt;css/&lt;/code&gt; du &lt;a href=&quot;https://github.com/csswizardry/inuit.css-web-template/tree/master/css&quot;&gt;template web&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour mettre à jour le coeur du framework, il suffira de mettre à jour le sous-module Git :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git submodule update&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;méthode-2---sans-git&quot;&gt;&lt;a href=&quot;#m%C3%A9thode-2---sans-git&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Méthode 2 - Sans Git&lt;/h3&gt;
&lt;p&gt;Téléchargez le &lt;a href=&quot;https://github.com/csswizardry/inuit.css-web-template/&quot;&gt;template web&lt;/a&gt; puis téléchargez &lt;a href=&quot;https://github.com/csswizardry/inuit.css&quot;&gt;le coeur du framework&lt;/a&gt; et placez ce dernier dans le dossier &lt;code class=&quot;language-text&quot;&gt;css/&lt;/code&gt; du template web. Placez le tout dans &lt;code class=&quot;language-text&quot;&gt;your-project-folder&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour mettre à jour le coeur du framework, il vous suffira de remplacer le dossier &lt;code class=&quot;language-text&quot;&gt;inuit.css&lt;/code&gt; par la version la plus récente.&lt;/p&gt;
&lt;h2 id=&quot;architecture-et-fonctionnement&quot;&gt;&lt;a href=&quot;#architecture-et-fonctionnement&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Architecture et fonctionnement&lt;/h2&gt;
&lt;p&gt;Idéalement, créez également un dossier &lt;code class=&quot;language-text&quot;&gt;ui/&lt;/code&gt; en parallèle de &lt;code class=&quot;language-text&quot;&gt;inuit.css/&lt;/code&gt; pour y placer tout ce qui à trait au &lt;strong&gt;design&lt;/strong&gt; de votre projet.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
|-- inuit.css/         # Coeur du framework - ne pas toucher
|   |-- generic/       # Eléments standards (clearfix, reset)
|   |-- base/          # Eléments de base (tables, forms, …)
|   |-- objects/       # Eléments modulaires (grid, nav, …)
|   |-- _defaults.scss # Variables par défaut
|   |-- _inuit.scss    # Fichier principal du coeur
|
|-- ui/                # Dossier contenant vos fichiers Sass
|-- _vars.scss         # Variables configurables
|-- _style.scss        # Fichier principal de votre CSS
|-- watch              # Script pour compiler vos changements&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le dossier &lt;code class=&quot;language-text&quot;&gt;inuit.css/&lt;/code&gt; contient le coeur du framework. Le truc, &lt;strong&gt;c’est de ne rien toucher à ce qui se trouve en dessous&lt;/strong&gt;. De cette manière, le framework peut être mis à jour sans perturber les configurations de votre projet, ce qui n’était pas le cas dans les versions précédentes de inuit.css. Comme le framework n’impacte pas le design des éléments, le fait de considérer &lt;code class=&quot;language-text&quot;&gt;inuit.css/&lt;/code&gt; comme un module que l’on peut mettre à jour est assez pertinent.&lt;/p&gt;
&lt;p&gt;Le dossier &lt;code class=&quot;language-text&quot;&gt;ui/&lt;/code&gt; contient idéalement vos fichiers de style à vous. C’est vous qui voyez pour le coup. Y’en a qu’ont essayé, ils ont pas eu de problème.&lt;/p&gt;
&lt;p&gt;Le fichier &lt;code class=&quot;language-text&quot;&gt;_vars.scss&lt;/code&gt; doit contenir les variables du framework que vous souhaitez personnaliser. Vous avez la liste des variables par défaut dans &lt;code class=&quot;language-text&quot;&gt;inuit.css/_defaults.scss&lt;/code&gt;. Le process conseillé est donc le suivant :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;recopiez la variable par défaut dans &lt;code class=&quot;language-text&quot;&gt;_vars.scss&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;changez &lt;code class=&quot;language-text&quot;&gt;$var: defaultvalue!default;&lt;/code&gt; par &lt;code class=&quot;language-text&quot;&gt;$var: newvalue;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;rien d’autre&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Vous avez également dans ce fichier l’ensemble des objets du frameworks contenus dans le dossier &lt;code class=&quot;language-text&quot;&gt;objects/&lt;/code&gt;. Vous pouvez les activer selon vos besoins, le framework est &lt;strong&gt;modulaire&lt;/strong&gt; !&lt;/p&gt;
&lt;p&gt;Le fichier &lt;code class=&quot;language-text&quot;&gt;_style.scss&lt;/code&gt; importe les fichiers Sass pour la compilation du CSS. C’est lui le grand architecte. A vous d’y incorporer les fichiers que vous aurez créé dans &lt;code class=&quot;language-text&quot;&gt;ui/&lt;/code&gt; notamment.&lt;/p&gt;
&lt;p&gt;Le script &lt;code class=&quot;language-text&quot;&gt;watch&lt;/code&gt; permet à Sass de compiler votre code à la volée lorsque vous faîtes des mises à jour. C’est pas impératif, ça dépend de votre workflow personnel… C’est vous qui voyez ! Le script est personnalisable et lance la commande suivante :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ sass --watch style.scss:style.min.css --style compressed&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour le lancer, inutile de mémoriser la commande précédente, exécutez simplement :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ ./watch&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En définitive, vous disposez d’un fichier CSS unique, compressé et optimisé, qu’il ne vous reste plus qu’à incorporer dans votre HTML :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/your-css-folder/style.min.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;une-version-less--oui-môsieur-&quot;&gt;&lt;a href=&quot;#une-version-less--oui-m%C3%B4sieur-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Une version LESS ? Oui Môsieur !&lt;/h2&gt;
&lt;p&gt;Pour ceux qui, comme moi, utilisent &lt;a href=&quot;http://lesscss.org/&quot;&gt;LESS&lt;/a&gt; plutôt que Sass, il existe &lt;a href=&quot;https://github.com/peterwilsoncc/inuit.css&quot;&gt;une version LESS de inuit.css&lt;/a&gt; entretenue par &lt;a href=&quot;http://twitter.com/pwcc&quot;&gt;Peter Wilson&lt;/a&gt; et moi-même.&lt;/p&gt;
&lt;p&gt;LESS est en effet une alternative plausible, même si moins puissante, à Sass. Ce pré-processeur est plus abordable dans un premier temps selon moi. Aussi, il fonctionne avec Javascript et non Ruby (les goûts et les couleurs me direz vous…).&lt;/p&gt;
&lt;p&gt;Le seul hic est qu’&lt;strong&gt;il ne s’agit pas forcément de la même version&lt;/strong&gt;. Si inuit.css est passé à la &lt;code class=&quot;language-text&quot;&gt;v5.0&lt;/code&gt;, l’alternative LESS correspond aujourd’hui à la &lt;code class=&quot;language-text&quot;&gt;v4.3.7&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Nous tâchons cependant de faire évoluer la version LESS avec l’optique d’offrir une version la plus up-to-date possible. Par exemple, Peter devrait traiter ma pull-request pour la &lt;code class=&quot;language-text&quot;&gt;v4.5&lt;/code&gt; ce week-end et j’ai actuellement la &lt;code class=&quot;language-text&quot;&gt;v4.5.4&lt;/code&gt; dans les bacs donc c’est une question de temps !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit du 15/04&lt;/strong&gt; - La version correspond à présent à la &lt;code&gt;v4.5&lt;/code&gt; et la &lt;code&gt;v5.0.0&lt;/code&gt; est en chemin !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit du 23/05&lt;/strong&gt; - La version actuelle correspond à la &lt;code&gt;v5.0.0&lt;/code&gt; qui comporte &lt;a href=&quot;https://github.com/nicoespeon/inuit.css-web-template&quot;&gt;le template web&lt;/a&gt; ainsi donc que &lt;a href=&quot;https://github.com/peterwilsoncc/inuit.css&quot;&gt;le coeur du framework&lt;/a&gt; (même principe, mais en LESS).&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Pour ceux qui auraient des questions diverses et variées sur le framework, n’hésitez pas à laisser des commentaires ci-dessous.&lt;/p&gt;
&lt;p&gt;Et si vous êtes curieux et avides de découvrir ce qu’est le CSS qui déchire, &lt;em&gt;give it a try&lt;/em&gt; !&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Tired of Bootstrap? Discover inuit.css!]]></title><description><![CDATA[inuit.css is a a powerful, scalable, BEM, OOCSS framework which doesn't impose you a design.]]></description><link>https://www.nicoespeon.com/en/2013/04/discover-inuitcss/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2013/04/discover-inuitcss/</guid><pubDate>Fri, 12 Apr 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;is-inuitcss-built-for-you&quot;&gt;&lt;a href=&quot;#is-inuitcss-built-for-you&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Is inuit.css built for you?&lt;/h2&gt;
&lt;p&gt;To make it easy, you could find this framework interesting in theses cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You need to quickly setup a decent CSS architecture&lt;/li&gt;
&lt;li&gt;You discover/know about &lt;em&gt;Object Oriented&lt;/em&gt; advantages and like its scalability and reusability&lt;/li&gt;
&lt;li&gt;You should implement a specific design which doesn’t fit well with the “default” elements of others frameworks&lt;/li&gt;
&lt;li&gt;You like the framework concept but, as a developer, you like to get your hand dirty into code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, this framework may not be a good choice for you in such a situation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You are searching for a CSS framework which takes care of elements design&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Personally, I used a lot &lt;a href=&quot;http://twitter.github.io/bootstrap/&quot;&gt;Bootstrap&lt;/a&gt;. But, working on projects where design has been imposed, I faced the issue of being overriding the default design of the framework. You should most of the time cancel defaults effects, change color, size, … It works, but you are bloating your CSS with useless code because you defined and redefined the same properties of same elements. It could have been better.&lt;/p&gt;
&lt;p&gt;Thus, when you want to produce an optimal CSS and you appreciate &lt;a href=&quot;http://coding.smashingmagazine.com/2011/12/12/an-introduction-to-object-oriented-css-oocss/&quot;&gt;OOCSS&lt;/a&gt; values, you realized that, under some circumstances, Bootstrap is not always the ideal solution.&lt;/p&gt;
&lt;p&gt;I finally found by chance &lt;a href=&quot;http://inuitcss.com&quot;&gt;inuit.css&lt;/a&gt;. As I’m a curious guy, I gave it a try. I love it!&lt;/p&gt;
&lt;p&gt;As an overview, I’d suggest you to play around with &lt;a href=&quot;http://jsfiddle.net/user/inuitcss/fiddles/&quot;&gt;inuit.css fiddles&lt;/a&gt;!&lt;/p&gt;
&lt;h2 id=&quot;philosophy&quot;&gt;&lt;a href=&quot;#philosophy&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Philosophy&lt;/h2&gt;
&lt;p&gt;inuit.css was created &lt;a href=&quot;http://csswizardry.com/2011/06/what-is-inuit-css/&quot;&gt;in April 2011&lt;/a&gt; by &lt;a href=&quot;http://csswizardry.com/about/&quot;&gt;Harry Roberts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This guy made the assumption that a CSS framework should bring some kind of logic and guideline to the developer, without impose any specific design. As this dude isn’t that bad in term of CSS best practices, he made them a framework.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;inuit.css is a powerful, scalable, Sass-based, BEM, OOCSS framework.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;inuit.css is developed in &lt;a href=&quot;http://sass-lang.com/&quot;&gt;Sass&lt;/a&gt;&lt;/strong&gt;. Sass is a &lt;em&gt;CSS preprocessor&lt;/em&gt;, some kind of improved CSS language which allows you to do a bunch of nice stuff that vanilla CSS can’t do (nested selectors, loops, conditions, etc.). The preprocessor code should be compiled to produce the final CSS file which would be used for the browser. Sass files just make the development a piece of cake.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;inuit.css use the &lt;a href=&quot;http://bem.info/method/definitions/&quot;&gt;BEM&lt;/a&gt; naming convention&lt;/strong&gt;. This is a very opiniated choice of its creator which can ba, as every best practice, questionable (or at least debated). It can hurts your feelings, mostly because it looks ugly the very first time you see it, but it’s really worthy. I’d suggest you to read &lt;a href=&quot;http://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/&quot;&gt;Harry Roberts’ post about that&lt;/a&gt; as he explained it very well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;inuit.css is an OOCSS framework&lt;/strong&gt;. I mean that every component of the framework is an independent, combinable and reusable object. Futhermore, the framework takes advantages from that philosophy which means that you can extend it without any hassle. I’ll probably write a post about OOCSS principles. Until then I can suggest you to have a look at &lt;a href=&quot;http://fr.slideshare.net/stubbornella/the-cascade-grids-headings-and-selectors-from-an-oocss-perspective-ajax-experience-2009&quot;&gt;Nicole Sullivan’s slides on this topic&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;installation&quot;&gt;&lt;a href=&quot;#installation&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Installation&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Pre-requisite&lt;/strong&gt; - have &lt;a href=&quot;http://sass-lang.com/tutorial.html&quot;&gt;Sass installed&lt;/a&gt; in order to compile the code.&lt;/p&gt;
&lt;p&gt;At present, &lt;strong&gt;inuit.css&lt;/strong&gt; has reached &lt;strong&gt;v5.0&lt;/strong&gt;, which considerably change the way you implement it regarding older versions.&lt;/p&gt;
&lt;p&gt;The idea was to &lt;a href=&quot;http://inuitcss.com/2013/03/inuit-css-v5.0/&quot;&gt;make it a module&lt;/a&gt; so you can update the core without disturb the project in which it’s implemented. All project specific configurations have been exported outside of the core, so you have no trouble in upgrading this one.&lt;/p&gt;
&lt;h3 id=&quot;method-1---with-git&quot;&gt;&lt;a href=&quot;#method-1---with-git&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Method 1 - With Git&lt;/h3&gt;
&lt;p&gt;For a new project, just clone the repo as follow:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git clone --recursive git@github.com:csswizardry/inuit.css-web-template.git your-project-folder
$ cd your-project-folder
$ ./go&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/csswizardry/inuit.css-web-template/blob/master/go&quot;&gt;The &lt;code class=&quot;language-text&quot;&gt;go&lt;/code&gt; script&lt;/a&gt; install the las version of &lt;code class=&quot;language-text&quot;&gt;inuit.css&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt; - If you want to install the framework in an existing project:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git submodule add git://github.com/csswizardry/inuit.css.git your-project-folder/inuit.css&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then you’ll need to organize your architecture regarding your needs, with the inpiration of the &lt;code class=&quot;language-text&quot;&gt;css/&lt;/code&gt; folder from the &lt;a href=&quot;https://github.com/csswizardry/inuit.css-web-template/tree/master/css&quot;&gt;web template&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In order to update the framework core, you just need to update the git submodule:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ git submodule update&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;method-2---without-git&quot;&gt;&lt;a href=&quot;#method-2---without-git&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Method 2 - Without Git&lt;/h3&gt;
&lt;p&gt;Downloas the &lt;a href=&quot;https://github.com/csswizardry/inuit.css-web-template/&quot;&gt;web template&lt;/a&gt; and then &lt;a href=&quot;https://github.com/csswizardry/inuit.css&quot;&gt;the framework core&lt;/a&gt;. Place the core under the &lt;code class=&quot;language-text&quot;&gt;css/&lt;/code&gt; folder of the web template. Then copy all of these in &lt;code class=&quot;language-text&quot;&gt;your-project-folder&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In order to update the framework core, you just need to replace the &lt;code class=&quot;language-text&quot;&gt;inuit.css&lt;/code&gt; folder with the most recent version.&lt;/p&gt;
&lt;h2 id=&quot;architecture-and-working&quot;&gt;&lt;a href=&quot;#architecture-and-working&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Architecture and working&lt;/h2&gt;
&lt;p&gt;Ideally, create a &lt;code class=&quot;language-text&quot;&gt;ui/&lt;/code&gt; folder beside the &lt;code class=&quot;language-text&quot;&gt;inuit.css/&lt;/code&gt; one to put every file which deals with the &lt;strong&gt;design&lt;/strong&gt; of your project.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
|-- inuit.css/         # Framework core - do not touch
|   |-- generic/       # Standards elements (clearfix, reset)
|   |-- base/          # Base elements (tables, forms, …)
|   |-- objects/       # Modular elements (grid, nav, …)
|   |-- _defaults.scss # Defaults variables
|   |-- _inuit.scss    # Main setup file of the core
|
|-- ui/                # Folder containing your Sass files
|-- _vars.scss         # Project specific variables
|-- _style.scss        # Main setup file of your project
|-- watch              # Script which watch for changes&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;inuit.css/&lt;/code&gt; folder contains the framework core. The trick is &lt;strong&gt;not to touche anything under&lt;/strong&gt;. Doing so, the framework can be updated without hassle nor risk for specific configuration override, which was not the cas in previous versions of inuit.css. As the framework doesn’t impact the design of elements, considering &lt;code class=&quot;language-text&quot;&gt;inuit.css/&lt;/code&gt; as a module you can update sounds relevant.&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;ui/&lt;/code&gt; folder ideally contains your own style files. It’s up to you: your rules, your code of conduct.&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;_vars.scss&lt;/code&gt; file should only contain the framework variables you’d like to override. You can find the list of existing variables in &lt;code class=&quot;language-text&quot;&gt;inuit.css/_defaults.scss&lt;/code&gt;. The suggested process is the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;copy the default variable in &lt;code class=&quot;language-text&quot;&gt;_vars.scss&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;change &lt;code class=&quot;language-text&quot;&gt;$var: defaultvalue!default;&lt;/code&gt; for &lt;code class=&quot;language-text&quot;&gt;$var: newvalue;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;that’s it&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You’ll also find in this file that you can activate or deactivate any of the &lt;code class=&quot;language-text&quot;&gt;objects/&lt;/code&gt; components of the framework, regarding your needs.&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;_style.scss&lt;/code&gt; file imports Sass files for the CSS compilation. It’s the great architect. It’s up to you to add files you’ll eventually create under &lt;code class=&quot;language-text&quot;&gt;ui/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;watch&lt;/code&gt; script allows Sass to watch for changes in order to do the compilation automatically. It’s not necessary, it depends on your personal workflow… It’s up to you (always)! You can customize it. It basically launch the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ sass --watch style.scss:style.min.css --style compressed&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But wait, you don’t have to remember this! Just execute the file and you’re done:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ ./watch&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;At the end, you’ll have a unique, compressed and optimized CSS file you just need to load from your HTML:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/your-css-folder/style.min.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;less-version-yes-sir&quot;&gt;&lt;a href=&quot;#less-version-yes-sir&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;LESS version? Yes sir!&lt;/h2&gt;
&lt;p&gt;For those who, just like me, use &lt;a href=&quot;http://lesscss.org/&quot;&gt;LESS&lt;/a&gt; instead of Sass: &lt;a href=&quot;https://github.com/peterwilsoncc/inuit.css&quot;&gt;a LESS port for inuit.css&lt;/a&gt; exists and is maintained by &lt;a href=&quot;http://twitter.com/pwcc&quot;&gt;Peter Wilson&lt;/a&gt; and myself.&lt;/p&gt;
&lt;p&gt;Indeed, LESS is a relevant alternative to Sass, even though Sass is more powerful. This preprocessor is easier to adopt at a first sight, IMHO. Futhermore, it works with Javascript, not Ruby.&lt;/p&gt;
&lt;p&gt;The only problem is that &lt;strong&gt;it’s not necessarily up-to-date&lt;/strong&gt; as inuit.css is already &lt;code class=&quot;language-text&quot;&gt;v5.0&lt;/code&gt; and the LESS port still correspond to the &lt;code class=&quot;language-text&quot;&gt;v4.3.7&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit 4/15&lt;/strong&gt; - Version is now up-to-date with &lt;code class=&quot;language-text&quot;&gt;v4.5&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;v5.0.0&lt;/code&gt; is coming!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit 5/23&lt;/strong&gt; - The current version is now &lt;code class=&quot;language-text&quot;&gt;v5.0.0&lt;/code&gt; coming with the &lt;a href=&quot;https://github.com/nicoespeon/inuit.css-web-template&quot;&gt;web template&lt;/a&gt; and &lt;a href=&quot;https://github.com/peterwilsoncc/inuit.css&quot;&gt;framework core&lt;/a&gt; (same principle, in LESS).&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;For those who’d eventually have some questions about the framework, don’t hesitate to put comments below.&lt;/p&gt;
&lt;p&gt;If you’re curious and want to discover what is &lt;em&gt;fuckingood&lt;/em&gt; CSS, give it a try!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[S'amuser avec les interactive playground]]></title><description><![CDATA[JSBin, jsFiddle, dabblet, … Si ces noms ne vous parlent pas, alors peut-être devriez-vous jeter un œil par ici et découvrir le principe de ces "terrains de jeu interactifs".]]></description><link>https://www.nicoespeon.com/fr/2013/04/samuser-avec-les-interactive-playground/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2013/04/samuser-avec-les-interactive-playground/</guid><pubDate>Wed, 10 Apr 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;interactive-playquoi-&quot;&gt;&lt;a href=&quot;#interactive-playquoi-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Interactive playquoi ?&lt;/h2&gt;
&lt;p&gt;Il s’agit en fait d’un IDE en ligne permettant de réaliser du développement front-end (HTML, CSS et JS bien souvent) et de visualiser le résultat.&lt;/p&gt;
&lt;p&gt;La plupart permettent également de sauvegarder le code et de le partager, ce qui mène à un certain nombre d’applications pratiques de ces outils à savoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;débogage de codes&lt;/strong&gt;, l’environnement permettant de reproduire un bug ou un effet non désiré et d’en isoler la cause, ce qui en fait &lt;a href=&quot;http://css-tricks.com/seriously-just-make-a-jsfiddle/&quot;&gt;un outil particulièrement apprécié des développeurs&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;création de snippets&lt;/strong&gt;, particulièrement utile pour répondre à une problème ou une question sur &lt;a href=&quot;http://stackoverflow.com/questions/210717/using-jquery-to-center-a-div-on-the-screen&quot;&gt;StackOverflow&lt;/a&gt; (par exemple) ou pour &lt;a href=&quot;http://dabblet.com/gist/3350582/&quot;&gt;réaliser des showcases&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;enseignement par mise en pratique&lt;/strong&gt; utilisé par des sites tels que &lt;a href=&quot;http://www.codeschool.com&quot;&gt;CodeSchool&lt;/a&gt;, produisant de véritables TP-live pour mettre en pratique ce qui vient d’être vu.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Voici donc, après cette petite mise en jambes, une petite présentation non-exhaustive des web playgrounds que je connais et que j’affectionne.&lt;/p&gt;
&lt;h2 id=&quot;jsbin&quot;&gt;&lt;a href=&quot;#jsbin&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;JSBin&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.jsbin.com&quot;&gt;JSBin&lt;/a&gt; est le premier que je connaisse. Un vieux de la vieille qui existe depuis 2008. Il dispose des 4 panels classiques pour éditer le &lt;strong&gt;HTML&lt;/strong&gt;, le &lt;strong&gt;CSS&lt;/strong&gt;, le &lt;strong&gt;Javascript&lt;/strong&gt; et constater le &lt;strong&gt;résultat&lt;/strong&gt;. Il dispose également d’un panel &lt;strong&gt;Console&lt;/strong&gt; qui tient le rôle de console javascript une fois le code interprété. Fait appréciable : les modifications apportées au code sont visibles en temps réel.&lt;/p&gt;
&lt;p&gt;Particulièrement abouti, il permet d’interpréter directement les Gist, ce qui est appréciable en soi pour les grands adeptes de la plateforme.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gist.github.com/&quot;&gt;Gist&lt;/a&gt; est un moyen rapide et efficace que propose Github pour partager des snippets de codes versionnés sous Git. JSBin permet donc de visualiser directement dans le navigateur le rendu du code, permettant de le modifier et de sauvegarder une nouvelle version du Gist.&lt;/p&gt;
&lt;p&gt;Il dispose également d’un certain nombre de features notables comme &lt;a href=&quot;http://jshint.com/&quot;&gt;JSHint&lt;/a&gt; (un linter qui vérifie que votre Javascript ne comporte pas d’erreur) ou encore la possibilité d’insérer le JS/CSS à un endroit spécifique du HTML avec &lt;code class=&quot;language-text&quot;&gt;%code%&lt;/code&gt;/&lt;code class=&quot;language-text&quot;&gt;%css&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;points-forts&quot;&gt;&lt;a href=&quot;#points-forts&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Points forts&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pas nécessaire d’être enregistré pour l’utiliser&lt;/li&gt;
&lt;li&gt;Visualisation du rendu en temps réel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?feature=player_embedded&amp;#x26;v=_GtjaW4Ma3c&quot;&gt;Intégration de Gists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Particulièrement riche en fonctionnalités (JSHint, Ajax, templates, ZenCoding, …)&lt;/li&gt;
&lt;li&gt;Les JSBin peuvent être intégrés et modifiés directement dans des sites web&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;jsfiddle&quot;&gt;&lt;a href=&quot;#jsfiddle&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;jsFiddle&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://jsfiddle.net&quot;&gt;jsFiddle&lt;/a&gt; fonctionne peu ou prou selon le même principe, avec une interface à l’ergonomie quelque peu différente.&lt;/p&gt;
&lt;p&gt;Les fonctionnalités sont sensiblement les mêmes à ceci près que jsFiddle permet toutefois de coder en &lt;a href=&quot;http://sass-lang.com/&quot;&gt;SASS&lt;/a&gt; plutôt qu’en CSS et en &lt;a href=&quot;http://coffeescript.org/&quot;&gt;CoffeeScript&lt;/a&gt; plutôt qu’en Javascript, ce qui peut être un argument pour les aficionados de ces pré-processeurs.&lt;/p&gt;
&lt;p&gt;Fait notable également : le HTML est épuré, il est inutile de renseigner les entêtes ou le doctype puisque le code du panel sera de facto intégré entre les balises &lt;code class=&quot;language-text&quot;&gt;&amp;lt;body&amp;gt;&lt;/code&gt;. En contrepartie, la configuration du doctype et des informations se fait sur le côté, via un panneau de configuration.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/csswizardry&quot;&gt;Harry Roberts&lt;/a&gt; utilise d’ailleurs jsFiddle pour présenter les fonctionnalités d’&lt;a href=&quot;http://jsfiddle.net/user/inuitcss/fiddles/&quot;&gt;&lt;em&gt;inuit.css&lt;/em&gt;&lt;/a&gt;, ce qui permet de se faire rapidement une idée de comment fonctionne le framework et de ses capacités sans même avoir à le télécharger.&lt;/p&gt;
&lt;h3 id=&quot;points-forts-1&quot;&gt;&lt;a href=&quot;#points-forts-1&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Points forts&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pas nécessaire d’être enregistré pour l’utiliser&lt;/li&gt;
&lt;li&gt;Intégration de Gists&lt;/li&gt;
&lt;li&gt;Particulièrement riche en fonctionnalités (TidyUp, JSHint, Ajax, ZenCoding, …)&lt;/li&gt;
&lt;li&gt;Possibilités d’utiliser des pré-processeurs CSS/JS&lt;/li&gt;
&lt;li&gt;Les fiddles peuvent être intégrés directement dans des sites web, mais pas modifiés&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;codepen&quot;&gt;&lt;a href=&quot;#codepen&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;CodePen&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://codepen.io&quot;&gt;Codepen&lt;/a&gt; est une autre version assez populaire, avec un style quelque peu différent et une stratégie économique établie. En effet, CodePen propose &lt;a href=&quot;http://codepen.io/pro/&quot;&gt;une version PRO&lt;/a&gt; permettant par exemple de dispenser un cours en temps réel, ou bien de coder à plusieurs collaborateurs, simultanément, en live.&lt;/p&gt;
&lt;p&gt;CodePen propose un certain nombre de features intéressantes, y compris l’usage de pré-processeurs. A noter qu’en se connectant avec son compte Github, les Pens que l’on crée se transforment automatiquement en Gists sur notre compte. Les modifications se font également en temps réel…&lt;/p&gt;
&lt;p&gt;En revanche &lt;strong&gt;il faut être connecté afin de pouvoir intégrer les Pens&lt;/strong&gt;, ce qui ne nécessite pas forcément de créer un compte si l’on dispose d’un compte Github. De nombreuses fonctionnalités de CodePen vont également bien plus loin que les précédents projets mais sont réservées à la version PRO (&lt;em&gt;business is business&lt;/em&gt;, ce qui est tout à fait compréhensible en soi).&lt;/p&gt;
&lt;h3 id=&quot;points-forts-2&quot;&gt;&lt;a href=&quot;#points-forts-2&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Points forts&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pas nécessaire d’être enregistré pour l’utiliser&lt;/li&gt;
&lt;li&gt;Visualisation du rendu en temps réel&lt;/li&gt;
&lt;li&gt;Sauvegarde des Pens en tant que Gists&lt;/li&gt;
&lt;li&gt;Particulièrement riche en fonctionnalités (JSHint, Ajax, ZenCoding, …), notamment avec un compte PRO&lt;/li&gt;
&lt;li&gt;Possibilités d’utiliser des pré-processeurs CSS/JS/HTML&lt;/li&gt;
&lt;li&gt;Les Pens peuvent être intégrés directement dans des sites web, mais pas modifiés&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;dabblet&quot;&gt;&lt;a href=&quot;#dabblet&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;dabblet&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://dabblet.com/&quot;&gt;dabblet&lt;/a&gt; est un peu particulier dans le genre. En effet, &lt;strong&gt;ce dernier s’oriente&lt;/strong&gt; non pas sur le Javascript (fer de lance de JSBin et jsFiddle, rien que par le nom) mais &lt;strong&gt;sur le CSS&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;L’idée de &lt;a href=&quot;https://twitter.com/LeaVerou&quot;&gt;Léa Verou&lt;/a&gt; était de produire une alternative qui ne s’embarassait pas de requêtes HTTP à chaque fois que l’on fait/code quelque chose dans l’éditeur. Si cela prend sens pour le Javascript, ce n’est d’aucun intérêt quand on ne cherche qu’à tester du HTML/CSS.&lt;/p&gt;
&lt;p&gt;Sous son apparence design, dabblet offre également tout un panel de fonctionnalités comme la visualisation du rendu en temps réel, des “inline previewers” particulièrement sympathiques sur toutes sortes de propriétés CSS (pour visualiser une longueur, une couleur, un effet, …) et même l’incorporation native de &lt;a href=&quot;http://leaverou.github.com/prefixfree/&quot;&gt;-prefix-free&lt;/a&gt;, luxe ultime pour tout développeur CSS. Ce dernier vous permet d’utiliser les propriétés CSS3 sans vous préoccuper des préfixes, il les ajoute en background quand c’est nécessaire.&lt;/p&gt;
&lt;p&gt;A noter cependant que, sous la demande, dabblet expérimente également la possibilité d’intégrer du Javascript. Mais il y a fort à parier que ce sera juste un possibilité offerte et non pas le fer de lance de cet environnement, bien au contraire !&lt;/p&gt;
&lt;h3 id=&quot;points-forts-3&quot;&gt;&lt;a href=&quot;#points-forts-3&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Points forts&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pas nécessaire d’être enregistré pour l’utiliser&lt;/li&gt;
&lt;li&gt;Visualisation du rendu en temps réel&lt;/li&gt;
&lt;li&gt;Synchronisation totale avec les Gists (connecté sous Github)&lt;/li&gt;
&lt;li&gt;Inline previewers et utilisation native de -prefix-free pour le développement CSS&lt;/li&gt;
&lt;li&gt;Les dabblet peuvent être intégrés et modifiés directement dans des sites web&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;le-problème-cest-le-choix&quot;&gt;&lt;a href=&quot;#le-probl%C3%A8me-cest-le-choix&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le problème, c’est le choix&lt;/h2&gt;
&lt;p&gt;Il y a effectivement de quoi faire et suffisamment d’environnements pour que chacun s’y retrouve. Chaque développeur peut s’orienter vers la solution qui s’adapte le plus à ses besoins, qui lui convient le mieux, qui le séduit le plus. Et tout comme pour les IDE, rien n’interdit de passer d’un environnement à un autre, pour se faire une idée, au contraire.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Personnellement, j’utilise beaucoup &lt;strong&gt;jsFiddle&lt;/strong&gt; jusqu’à présent…&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;… je garde un oeil sur &lt;strong&gt;JSBin&lt;/strong&gt; mais je n’ai pas eu de grosse raison de changer d’environnement pour le moment…&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;… &lt;strong&gt;CodePen&lt;/strong&gt; ne me convient pas exactement, même si je le trouve cool dans l’esprit…&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;… et &lt;strong&gt;dabblet&lt;/strong&gt; est mon petit coup de coeur que j’ai découvert récemment. Il n’est pas encore aussi mature que les autres, mais il a des atouts indéniables qui justifient le détour.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Play around with interactive playgrounds]]></title><description><![CDATA[JSBin, jsFiddle, dabblet, … If that doesn't sound familiar to you, you may have a look here and discover what are these "playgrounds" about.]]></description><link>https://www.nicoespeon.com/en/2013/04/play-around-with-interactive-playgrounds/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2013/04/play-around-with-interactive-playgrounds/</guid><pubDate>Wed, 10 Apr 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;what-are-we-talking-about&quot;&gt;&lt;a href=&quot;#what-are-we-talking-about&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What are we talking about?&lt;/h2&gt;
&lt;p&gt;An interactive playground is basically an online IDE which allows you to do some front-end development (HTML, CSS and JS most of the time) and visualize the result.&lt;/p&gt;
&lt;p&gt;You can also save and share your code with most of them, which leads to a bunch of practical uses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;code debug&lt;/strong&gt;, as the environment allows you to reproduce a bug or non-desired effect and to isolate the root cause. That’s why such tools are &lt;a href=&quot;http://css-tricks.com/seriously-just-make-a-jsfiddle/&quot;&gt;specially appreciated by developers&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;snippets creation&lt;/strong&gt;, which is very useful to answer a problem or question on &lt;a href=&quot;http://stackoverflow.com/questions/210717/using-jquery-to-center-a-div-on-the-screen&quot;&gt;StackOverflow&lt;/a&gt; for instance. You can also easily &lt;a href=&quot;http://dabblet.com/gist/3350582/&quot;&gt;create showcases&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;teaching concretely&lt;/strong&gt;, which is used by websites such &lt;a href=&quot;http://www.codeschool.com&quot;&gt;CodeSchool&lt;/a&gt; as they developed powerful live challenges to put into practice what you just learned.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This was a nice way to get into the swing. Now let me present you a non-exhaustive overview of web playground I know and like so far.&lt;/p&gt;
&lt;h2 id=&quot;jsbin&quot;&gt;&lt;a href=&quot;#jsbin&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;JSBin&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.jsbin.com&quot;&gt;JSBin&lt;/a&gt; may be one of the very first which became popular. It exists since 2008. It has the classic 4 panels to edit &lt;strong&gt;HTML&lt;/strong&gt;, &lt;strong&gt;CSS&lt;/strong&gt;, &lt;strong&gt;Javascript&lt;/strong&gt; and the &lt;strong&gt;output&lt;/strong&gt;. It also disposes of a &lt;strong&gt;Console&lt;/strong&gt; panel which stands for a Javascript console after the code being interpreted. Significantly, modifications you made are instantly visible on the output.&lt;/p&gt;
&lt;p&gt;Very elaborated, it can interpret Gist directly which is particularly nice for those who use it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gist.github.com/&quot;&gt;Gist&lt;/a&gt; is a quick and efficient way that Github proposes to share git versionned code snippets. JSBin can show you directly in your browser the code output so you can modify and save a new version of the Gist.&lt;/p&gt;
&lt;p&gt;It finally has a bunch of nice features such as &lt;a href=&quot;http://jshint.com/&quot;&gt;JSHint&lt;/a&gt; (a Javascript linter) or the possibility to input the JS/CSS code at a particular place in the HTML with &lt;code class=&quot;language-text&quot;&gt;%code%&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;%css&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;strengths&quot;&gt;&lt;a href=&quot;#strengths&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Strengths&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;No need to sign in to use it&lt;/li&gt;
&lt;li&gt;Real-time visualisation&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?feature=player_embedded&amp;#x26;v=_GtjaW4Ma3c&quot;&gt;Gists integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A lot of functionalities (JSHint, Ajax, templates, ZenCoding, …)&lt;/li&gt;
&lt;li&gt;Dabblets can be integrated directly into websites, and modified from there&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;jsfiddle&quot;&gt;&lt;a href=&quot;#jsfiddle&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;jsFiddle&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://jsfiddle.net&quot;&gt;jsFiddle&lt;/a&gt; works more or less with the same principles, witha bit different UI.&lt;/p&gt;
&lt;p&gt;Features are mostfully the same but jsFiddle allows you also to code in &lt;a href=&quot;http://sass-lang.com/&quot;&gt;SASS&lt;/a&gt; instead of CSS, and &lt;a href=&quot;http://coffeescript.org/&quot;&gt;CoffeeScript&lt;/a&gt; instead of Javascript. That could be an argument for preprocessors aficionados.&lt;/p&gt;
&lt;p&gt;Bonus point: HTML is reduced to the strict minimum, there is no need to specify the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; part, nor the doctype. Your code will directly be injected into the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;body&amp;gt;&lt;/code&gt;. You can still configure all of this on the different sections of the sidebar.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/csswizardry&quot;&gt;Harry Roberts&lt;/a&gt; currently uses jsFiddle as a showcase of &lt;a href=&quot;http://jsfiddle.net/user/inuitcss/fiddles/&quot;&gt;inuit.css&lt;/a&gt; features, so you can have a quick overview of the framework capacities before you decide to download it.&lt;/p&gt;
&lt;h3 id=&quot;strengths-1&quot;&gt;&lt;a href=&quot;#strengths-1&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Strengths&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;No need to sign in to use it&lt;/li&gt;
&lt;li&gt;Gists integration&lt;/li&gt;
&lt;li&gt;A lot of functionalities (TidyUp, JSHint, Ajax, ZenCoding, …)&lt;/li&gt;
&lt;li&gt;Possibility to use CSS/JS preprocessors&lt;/li&gt;
&lt;li&gt;Fiddles can be integrated directly into websites, but not modified from there&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;codepen&quot;&gt;&lt;a href=&quot;#codepen&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;CodePen&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://codepen.io&quot;&gt;Codepen&lt;/a&gt; is another popular example of interactive playgrounds. It comes with a different styling approach and a well-established business model. Indeed, CodePen has &lt;a href=&quot;http://codepen.io/pro/&quot;&gt;a PRO version&lt;/a&gt; which allows you for instance to give a real-time class or to code all together with collegues, simultaneously, in live.&lt;/p&gt;
&lt;p&gt;CodePen offers a bunch of interesting features, preprocessors use including. You should note that if you login with your Github account, your Pens will automatically be converted as Gists in your account. And, by the way, did I say that modification are visible in real-time?&lt;/p&gt;
&lt;p&gt;On the flip side, &lt;strong&gt;you must be connected if you want to integrate Pens into websites&lt;/strong&gt;, which doesn’t mean you have to create a CodePen account if you already have a Github one. A lot of CodePen features go far further projects I mentioned before, but they are PRO-features (&lt;em&gt;business is business&lt;/em&gt;, which is really understandable here).&lt;/p&gt;
&lt;h3 id=&quot;strengths-2&quot;&gt;&lt;a href=&quot;#strengths-2&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Strengths&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;No need to sign in to use it&lt;/li&gt;
&lt;li&gt;Real-time visualisation&lt;/li&gt;
&lt;li&gt;Save Pens as Gists&lt;/li&gt;
&lt;li&gt;A lot of functionalities (JSHint, Ajax, ZenCoding, …) and more with a PRO account&lt;/li&gt;
&lt;li&gt;Possibility to use CSS/JS/HTML preprocessors&lt;/li&gt;
&lt;li&gt;Pens can be integrated directly into websites, but not modified from there&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;dabblet&quot;&gt;&lt;a href=&quot;#dabblet&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;dabblet&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://dabblet.com/&quot;&gt;dabblet&lt;/a&gt; is a bit different of its kind. Indeed, &lt;strong&gt;this one is CSS focused&lt;/strong&gt; and not Javascript (you already have JSBin and jsFiddle for that dudes).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/LeaVerou&quot;&gt;Léa Verou&lt;/a&gt;’s idea was to give an alternative which doesn’t bother with HTTP request each time you do/code something in the editor. If that makes sense for Javascript, there is no need for these request when you just want to play arount with HTML/CSS.&lt;/p&gt;
&lt;p&gt;Under his nicely designed UI, dabblet also offers a bunch of features such as real-time visualisation, inline previewers which are definitely useful to visualize CSS properties (lengths, colors, effects, …) and the native use of &lt;a href=&quot;http://leaverou.github.com/prefixfree/&quot;&gt;-prefix-free&lt;/a&gt;, the ultimate luxury for any CSS developer. You can use CSS3 properties without thinking about prefixes issues as it deals with it when necessary.&lt;/p&gt;
&lt;p&gt;You might note that, under requests pressure, dabblet is experimenting the possibility to integrate Javascript. But there are good reasons to bet that it will just be an add-on and not the cutting edge of the platform.&lt;/p&gt;
&lt;h3 id=&quot;strengths-3&quot;&gt;&lt;a href=&quot;#strengths-3&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Strengths&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;No need to sign in to use it&lt;/li&gt;
&lt;li&gt;Real-time visualisation&lt;/li&gt;
&lt;li&gt;Total synchronisation with Gists&lt;/li&gt;
&lt;li&gt;Inline previewers and massive use of -prefix-free for CSS development&lt;/li&gt;
&lt;li&gt;Dabblets can be integrated directly into websites, and modified from there&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-problem-is-choice&quot;&gt;&lt;a href=&quot;#the-problem-is-choice&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The problem is choice&lt;/h2&gt;
&lt;p&gt;There’s tons to give enough environments to please anyone. Each developer can choose the solution which fits the most its needs, the one he likes and seduced him the most. Just like IDE, you can give each of them a try and decide by yourself which tool is the best for you.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I personnaly used &lt;strong&gt;jsFiddle&lt;/strong&gt; a lot until then…&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;… I keep an eye on &lt;strong&gt;JSBin&lt;/strong&gt;, but I never felt the need to change for it yet…&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;… &lt;strong&gt;CodePen&lt;/strong&gt; doesn’t fit my needs, even though I find it cool…&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;… and &lt;strong&gt;dabblet&lt;/strong&gt; is my coup de coeur I recently discovered. It’s not as mature as the others but already has remarkables assets which justify the try.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Faire son blog avec Jekyll]]></title><description><![CDATA[Pourquoi et comment créer son blog avec Jekyll plutôt qu'un bon vieux Wordpress des familles.]]></description><link>https://www.nicoespeon.com/fr/2013/04/faire-son-blog-avec-jekyll/</link><guid isPermaLink="false">https://www.nicoespeon.com/fr/2013/04/faire-son-blog-avec-jekyll/</guid><pubDate>Sun, 07 Apr 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;kesako-jekyll-&quot;&gt;&lt;a href=&quot;#kesako-jekyll-&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kesako Jekyll ?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/mojombo/jekyll&quot;&gt;Jekyll&lt;/a&gt; est un générateur de sites statiques, pensé pour les blogs, développé en &lt;em&gt;Ruby&lt;/em&gt;, simple à utiliser. Basiquement, une fois que vous avez construit vos templates &lt;code class=&quot;language-text&quot;&gt;.html&lt;/code&gt;, il ne vous reste qu’à rédiger vos articles sous le format qui vous sied le mieux (le &lt;em&gt;Markdown&lt;/em&gt; me convient tout à fait) et basta, le serveur fait le reste !&lt;/p&gt;
&lt;p&gt;C’est &lt;a href=&quot;http://tom.preston-werner.com/&quot;&gt;Tom Preston Werner&lt;/a&gt;, le co-fondateur de Github, qui l’a créé.&lt;/p&gt;
&lt;p&gt;D’ailleurs (et surtout), c’est ce qu’utilise &lt;a href=&quot;http://pages.github.com/&quot;&gt;Github Pages&lt;/a&gt; pour générer vos pages. Basiquement, il suffit de pusher le code sur Github pour l’avoir en ligne (c’est magico-magique).&lt;/p&gt;
&lt;p&gt;Le principe de fonctionnement est assez simple, l’architecture rapide à prendre en main. C’est vraiment pensé pour que vous vous concentriez sur le contenu plutôt que le contenant (tout en laissant le plaisir de créer ses templates de A à Z, bien que Github propose également de faire ça à votre place).&lt;/p&gt;
&lt;h2 id=&quot;jekyll-plutôt-que-wordpress&quot;&gt;&lt;a href=&quot;#jekyll-plut%C3%B4t-que-wordpress&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Jekyll plutôt que Wordpress&lt;/h2&gt;
&lt;p&gt;Quand j’ai finalement voulu créer mon blog, plusieurs options sont venues à moi. Les plus valides étant un site &lt;em&gt;Wordpress&lt;/em&gt; (ce CMS vaut vraiment le détour) ou bien en passant par &lt;em&gt;Jekyll&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Bien que le second ne soit pas aussi populaire que le premier, c’est vers cette solution que je me suis tourné pour les raisons suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Je n’ai pas besoin de base de données&lt;/strong&gt; et je ne voulais pas m’encombrer avec de la mise en place (ou de la maintenance) de BDD. Sérieusement, j’ai juste besoin de front-end. C’est du contenu statique, rien d’autre. Pas de brèche de sécurité back-end. Ma seule dépendance c’est mon hébergeur : Github (et encore, ce n’est qu’un dépôt Git comme un autre).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Je veux que mon blog se mette à jour dès que je push sur Github&lt;/strong&gt;. J’aurais évidemment pu faire un hook pour déployer cela ailleurs, mais cette solution me libère de cette contrainte.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Je n’ai besoin de rien à part ce que Jekyll propose&lt;/strong&gt;. Il est pensé pour les blogs. Il y a des templates, de la pagination, un peu de logique si besoin, de la configuration et c’est tout.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;J’aime suivre les nouvelles tendances&lt;/strong&gt; et Jekyll fait partie de ces projets innovants et solides qui voient le jour au rythme de l’évolution du web.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bien entendu il y a beaucoup du fait que, étant développeur, je n’avais pas envie d’utiliser un CMS &lt;em&gt;prêt-à-porter&lt;/em&gt; pour mon propre blog.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.wordpress-fr.net/&quot;&gt;Wordpress&lt;/a&gt; est un excellent CMS (que je recommande chaudement) qui est facile à prendre en main, dispose d’&lt;a href=&quot;http://www.wordpress-fr.net/support/&quot;&gt;une excellente communauté française&lt;/a&gt; et qui convient tout à fait à tout blog ou autre site vitrine pour quiconque ne souhaite pas s’embêter avec du code.&lt;/p&gt;
&lt;p&gt;Mais en ce qui me concerne, &lt;strong&gt;je veux être au coeur du code&lt;/strong&gt;. Je veux développer dans mon IDE. Mais je veux que ce soit simple. Que ça aille droit au but. C’est ce que fait Jekyll.&lt;/p&gt;
&lt;h2 id=&quot;mise-en-place-et-configuration&quot;&gt;&lt;a href=&quot;#mise-en-place-et-configuration&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Mise en place et configuration&lt;/h2&gt;
&lt;p&gt;La prise en main de Jekyll n’est pas très complexe, mais vous ne trouverez pas beaucoup de ressources en français (hé, &lt;em&gt;what did you expect?&lt;/em&gt;). Voici les étapes telles qu’elles sont décrites :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mojombo/jekyll/wiki/install&quot;&gt;Installez&lt;/a&gt; le gem (oui, c’est du Ruby).&lt;/li&gt;
&lt;li&gt;Jetez un coup d’oeil au &lt;a href=&quot;https://github.com/mojombo/jekyll/wiki/usage&quot;&gt;fonctionnement&lt;/a&gt; et à la &lt;a href=&quot;https://github.com/mojombo/jekyll/wiki/configuration&quot;&gt;configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Créez la structure de base de votre site (vos templates).&lt;/li&gt;
&lt;li&gt;Créez vos posts (&lt;a href=&quot;https://github.com/mojombo/jekyll/wiki/Blog-Migrations&quot;&gt;ou importez-les depuis votre précédente plateforme&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Lancez votre site en local pour voir le rendu&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mojombo/jekyll/wiki/Deployment&quot;&gt;Déployez&lt;/a&gt; le tout&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;structure-de-jekyll&quot;&gt;&lt;a href=&quot;#structure-de-jekyll&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Structure de Jekyll&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
|-- _includes/      # Bouts de codes à inclure ailleurs
|-- _layouts/       # Vos templates
|   |-- default.html
|   |-- post.html
|-- _plugins/       # Plugins (optionnel)
|-- _posts/         # Vos posts
|   |-- 2013-04-07-faire-son-blog-avec-jekyll.md
|
|-- index.html      # Fichiers html
|-- about.html
|-- (…)
|-- _config.yml     # Fichier de configuration&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Jekyll compile l’ensemble dans un dossier &lt;code class=&quot;language-text&quot;&gt;_site/&lt;/code&gt; contenant votre site statique final.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$ jekyll —server&lt;/code&gt; dans un terminal lancera le serveur. L’URL par défaut est donc &lt;code&gt;&lt;a href=&quot;http://localhost:4000/&quot;&gt;http://localhost:4000/&lt;/a&gt;&lt;/code&gt;, ce qui peut être modifié dans la configuration.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$ jekyll —no-server —no-auto&lt;/code&gt; compilera simplement le code source sans lancer le serveur (ça peut servir, dans le cadre d’un script de déploiement par exemple).&lt;/p&gt;
&lt;h3 id=&quot;créer-un-post&quot;&gt;&lt;a href=&quot;#cr%C3%A9er-un-post&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Créer un post&lt;/h3&gt;
&lt;p&gt;Basiquement, le code source de mes posts se présente ainsi :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; post
&lt;span class=&quot;token key atrule&quot;&gt;robots&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; index&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;follow
&lt;span class=&quot;token key atrule&quot;&gt;published&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;token key atrule&quot;&gt;tags&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;jekyll&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token key atrule&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Faire son blog avec Jekyll
&lt;span class=&quot;token key atrule&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Pourquoi et comment créer son blog avec Jekyll plutôt qu&apos;un bon vieux Wordpress des familles.
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;## Kesako Jekyll ?&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Jekyll&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;(https&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//github.com/mojombo/jekyll) est un générateur de sites statiques&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pensé pour les blogs&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; développé en _Ruby_&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; simple à utiliser.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette &lt;a href=&quot;https://github.com/mojombo/jekyll/wiki/YAML-Front-Matter&quot;&gt;entête YAML&lt;/a&gt; permet de configurer mes posts de manière à ce que Jekyll les interprète intelligemment. Ainsi je définis notamment le layout, l’état de publication de l’article, son titre et sa description… Jekyll fait le reste. La suite, c’est du &lt;em&gt;Markdown&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;lhébergement&quot;&gt;&lt;a href=&quot;#lh%C3%A9bergement&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;L’hébergement&lt;/h2&gt;
&lt;p&gt;En ce qui me concerne, j’ai choisi d’héberger mon site directement sur Github. &lt;a href=&quot;https://help.github.com/categories/20/articles&quot;&gt;Github Pages&lt;/a&gt; permet d’héberger son site statique gratuitement et facilement.&lt;/p&gt;
&lt;p&gt;Il suffit de créer un dépôt &lt;code class=&quot;language-text&quot;&gt;username.github.io&lt;/code&gt; (dans mon cas &lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io&quot;&gt;nicoespeon.github.io&lt;/a&gt;).
Le contenu de la branche &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; est utilisé pour le site statique.
Le site est disponible par l’URL &lt;code class=&quot;language-text&quot;&gt;http://username.github.io&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Il est également possible d’acheter un nom de domaine (sur OVH ou Gandhi par exemple) et de faire &lt;a href=&quot;https://help.github.com/articles/setting-up-a-custom-domain-with-pages&quot;&gt;une redirection DNS&lt;/a&gt; :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Créez un fichier &lt;code class=&quot;language-text&quot;&gt;CNAME&lt;/code&gt; à la racine du projet, contenant votre nom de domaine (&lt;code class=&quot;language-text&quot;&gt;nicoespeon.com&lt;/code&gt; par exemple)&lt;/li&gt;
&lt;li&gt;Faîtes pointer &lt;strong&gt;A&lt;/strong&gt; vers l’IP de Github &lt;code class=&quot;language-text&quot;&gt;204.232.175.78&lt;/code&gt; (dans les &lt;em&gt;Zones DNS&lt;/em&gt; chez OVH).&lt;/li&gt;
&lt;li&gt;Attendez quelques heures le temps que ça se synchronise&lt;/li&gt;
&lt;li&gt;Dégustez tant que c’est chaud&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;le-mot-de-la-fin&quot;&gt;&lt;a href=&quot;#le-mot-de-la-fin&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Le mot de la fin&lt;/h2&gt;
&lt;p&gt;C’est tout pour cette petite introduction à l’utilisation de Jekyll. Si l’anglais ne vous rebutte pas, vous trouverez votre bonheur sur Google. Je vous suggère notamment &lt;a href=&quot;http://csswizardry.com/2012/12/a-new-css-wizardry/&quot;&gt;cet article de Harry Roberts&lt;/a&gt; et &lt;a href=&quot;http://hugogiraudel.com/2013/02/21/jekyll/&quot;&gt;celui-ci de Hugo Giraudel&lt;/a&gt; (c’est un français !) qui m’ont inspiré et conforté dans mon choix.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Building a multilanguage Jekyll blog]]></title><description><![CDATA[As a first post, what about sharing the way I managed to build this blog? Having a both english and french Jekyll website is not that hard, but you have to care about some crucial points.]]></description><link>https://www.nicoespeon.com/en/2013/04/building-a-multinlingual-jekyll-blog/</link><guid isPermaLink="false">https://www.nicoespeon.com/en/2013/04/building-a-multinlingual-jekyll-blog/</guid><pubDate>Sun, 07 Apr 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;note-on-compatibility&quot;&gt;&lt;a href=&quot;#note-on-compatibility&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Note on compatibility&lt;/h2&gt;
&lt;p&gt;What follows consider the use of Jekyll &lt;code class=&quot;language-text&quot;&gt;v0.12.1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Looking for Jekyll &lt;code class=&quot;language-text&quot;&gt;v1.5&lt;/code&gt;? Go have a look &lt;a href=&quot;/en/2014/04/multilingual-blog-with-jekyll-1-5/&quot;&gt;to the one of April 2014&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please note that some major changes happened in Jekyll &lt;code class=&quot;language-text&quot;&gt;v1.0.0&lt;/code&gt; which made some of the following tricks not working anymore (I’m thinking about plugins). I’ll write a new post when upgrade my own Jekyll to v1.0+.&lt;/p&gt;
&lt;p&gt;If you wish, you can still install the old Jekyll version with the following command:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Install the old version of jekyll&lt;/span&gt;
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; gem &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; jekyll --version 0.12.1

&lt;span class=&quot;token comment&quot;&gt;# Uninstall your current version if you dowloaded it&lt;/span&gt;
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; gem uninstall jekyll --version &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;your current version&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;why-jekyll&quot;&gt;&lt;a href=&quot;#why-jekyll&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why Jekyll?&lt;/h2&gt;
&lt;p&gt;I won’t write a n-th post about the reason of choosing Jekyll as the static site generator for my blog. There are already &lt;a href=&quot;https://www.google.fr/search?q=moving+blog+to+jekyll&quot;&gt;plenty of them&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I’ll just sum it up with the following bullet-points :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;I don’t need to deal with a database&lt;/strong&gt;. I just want to Keep It Simple (Stupid) and front-end will just do it well.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I want to have my website updated when I push it to Github&lt;/strong&gt;. I could have done some hook to deal with that but I don’t have to, thanks to &lt;a href=&quot;https://help.github.com/categories/20/articles&quot;&gt;Github Pages&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I love keeping myself up-to-date with new trends&lt;/strong&gt;. And the Jekyll approach just sounds good to me.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I could recommend you &lt;a href=&quot;http://csswizardry.com/2012/12/a-new-css-wizardry/&quot;&gt;the post from Harry Roberts&lt;/a&gt; and &lt;a href=&quot;http://hugogiraudel.com/2013/02/21/jekyll&quot;&gt;the one from Hugo Giraudel&lt;/a&gt; which comforted me in my choice.&lt;/p&gt;
&lt;h2 id=&quot;what-about-multilingual&quot;&gt;&lt;a href=&quot;#what-about-multilingual&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What about multilingual?&lt;/h2&gt;
&lt;p&gt;The thing is, Jekyll is not actually build to support multinlingual blogs. The &lt;a href=&quot;http://liquid.rubyforge.org/classes/Liquid/StandardFilters.html#M000012&quot;&gt;Liquid &lt;code class=&quot;language-text&quot;&gt;date&lt;/code&gt; filter&lt;/a&gt; will display the english version of the date.
Futhermore, if you want to distinguish posts by their language, then you have to create a category per language. But the Jekyll &lt;code class=&quot;language-text&quot;&gt;.paginator&lt;/code&gt; is not build to deal with categories, which is kind of a problem.&lt;/p&gt;
&lt;p&gt;Nevertheless, I wanted to create my blog both in French and English for few reasons :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Most of the nicest websites treating about front-end development are in English&lt;/strong&gt;, which is fine but I would like to see few of them written in my native language for other French developers who may not be fluent in English (even if they should be).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I’m French and proud to be&lt;/strong&gt;. Although I love English, there’s no reason for me not to write some posts in my native language too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;This is a challenge&lt;/strong&gt; and I love challenges… as every developer does, right?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So here’s the strategy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;English is the default language, at the root level.&lt;/li&gt;
&lt;li&gt;Each language represents a category, which could be done thanks to the folders architecture.&lt;/li&gt;
&lt;li&gt;The French part should be under the &lt;code class=&quot;language-text&quot;&gt;/fr&lt;/code&gt; base url, which is fine with the previous statements.&lt;/li&gt;
&lt;li&gt;English posts should only display into &lt;code class=&quot;language-text&quot;&gt;/index.html&lt;/code&gt;, - French posts should only display into &lt;code class=&quot;language-text&quot;&gt;/fr/index.html&lt;/code&gt; (and the pagination should be done accordingly).&lt;/li&gt;
&lt;li&gt;It should Keep It Simple (Stupid).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let’s build the architecture for the source files:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
|-- _includes/      # Partials included in other files
|-- _layouts/       # Templates of the website
|-- _plugins/       # Plugins to override Jekyll workflow
|-- assets/         # LESS/CSS, JS, images, …
|-- fr/             # French category
|   |-- _posts/     # French posts
|   |-- index.html  # French html files
|   |-- about.html
|   |-- (…)
|
|-- en/             # English category
|   |-- _posts/     # English posts
|
|-- index.html      # Default html files (EN)
|-- about.html
|-- (…)
|-- _config.yml     # Jekyll configuration file&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When launched, Jekyll generates the static final website into the &lt;code class=&quot;language-text&quot;&gt;_site/&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;I use the &lt;code class=&quot;language-text&quot;&gt;_config.yml&lt;/code&gt; file to put some locale variables I could use in the main templates.&lt;/p&gt;
&lt;p&gt;This is definitely &lt;strong&gt;not the cleanest solution&lt;/strong&gt; in my humble opinion, but it’s quite easy to deal with and it works fine for the moment. It may change in the future in a smarter way to handle this.&lt;/p&gt;
&lt;h2 id=&quot;plugins-on-the-road&quot;&gt;&lt;a href=&quot;#plugins-on-the-road&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Plugins on the road&lt;/h2&gt;
&lt;p&gt;In order to solve the mentioned problems, I used 2 plugins to override the regular Jekyll workflow.&lt;/p&gt;
&lt;h4 id=&quot;1-pagination-per-category&quot;&gt;&lt;a href=&quot;#1-pagination-per-category&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Pagination per category&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/_plugins/category_pagination.rb&quot;&gt;category_pagination.rb&lt;/a&gt; has the paginator only considers posts of the current category in order to distinguish the two languages.&lt;/p&gt;
&lt;p&gt;I modified the original plugin to have the default category, at root level, set as the &lt;em&gt;English&lt;/em&gt; one instead of displaying all of the &lt;code class=&quot;language-text&quot;&gt;site.posts&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;2-i18n-filter&quot;&gt;&lt;a href=&quot;#2-i18n-filter&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. i18n Filter&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/_plugins/i18n_filter.rb&quot;&gt;i18n_filter.rb&lt;/a&gt; customizes the &lt;code class=&quot;language-text&quot;&gt;page.date&lt;/code&gt; treatment accordingly to the locale.&lt;/p&gt;
&lt;p&gt;I’ve had to add the &lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/_locales/fr.yml&quot;&gt;_locales/fr.yml&lt;/a&gt; file to create the &lt;code class=&quot;language-text&quot;&gt;localize&lt;/code&gt; function. It performs just as the &lt;code class=&quot;language-text&quot;&gt;date&lt;/code&gt; does, but it displays the French format for the date.&lt;/p&gt;
&lt;h2 id=&quot;the-github-thing&quot;&gt;&lt;a href=&quot;#the-github-thing&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Github thing&lt;/h2&gt;
&lt;p&gt;Plugins are set up, templates are built, design has been completed, the git workflow is ready and so is the remote repository on Github. &lt;em&gt;Let’s push!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://help.github.com/articles/setting-up-a-custom-domain-with-pages&quot;&gt;The DNS redirection for my custom domain&lt;/a&gt; just works fine but… wait. It doesn’t play as expected.
Damn it! I just notice that Github is running Jekyll in &lt;code class=&quot;language-text&quot;&gt;--safe&lt;/code&gt; mode, which means that plugins are disabled. And so are my category pagination and my i18n filter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For every problem, a solution&lt;/strong&gt;, with Google being your best friend. &lt;a href=&quot;http://charliepark.org/jekyll-with-plugins/&quot;&gt;I found inspiration&lt;/a&gt; to redesign my personal workflow in that way.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Let’s have a look to my branching model.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; branch correspond to the compiled website (the one generated into &lt;code class=&quot;language-text&quot;&gt;_site/&lt;/code&gt; directory) so that Github can deliver it directly as a static website, thanks to the &lt;code class=&quot;language-text&quot;&gt;.nojekyll&lt;/code&gt; file.
The &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; branch correspond to the source files, as I would like to keep them tracked and open-sourced. They would be compiled with Jekyll in order to proceed to deployment.
There’s no more merge from &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; into &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; as there’s only deployments from now. I just work on &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; and, when I’m ready, I deploy the whole site with a new commit on &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Of course I already pushed the first commits when I realized I was wrong. But instead of recreating the whole repo and rebase my git history, I decided to deal with it with just few commits to correct the situation. There’s no shame in doing mistakes after all.&lt;/p&gt;
&lt;p&gt;I just created a &lt;a href=&quot;https://github.com/nicoespeon/nicoespeon.github.io/blob/develop/Makefile&quot;&gt;Makefile&lt;/a&gt; in order to do all that stuff with a &lt;code class=&quot;language-text&quot;&gt;make deploy&lt;/code&gt; command. And voilà!&lt;/p&gt;
&lt;h2 id=&quot;and-here-we-go&quot;&gt;&lt;a href=&quot;#and-here-we-go&quot; aria-hidden=&quot;true&quot; class=&quot;anchor&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;And here we go&lt;/h2&gt;
&lt;p&gt;Here we are, it just works perfectly and I’m now ready to go with a both English and French, Jekyll-flavored, Github-hosted blog &lt;em&gt;\o/&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There is still enhancements I should take care of -such as deploying a Google Analytics and a comments system- but I’m satisfied with the result. The challenge is taken up and the journey has begun. &lt;strong&gt;Let’s transform these posts into a monster.&lt;/strong&gt;&lt;/p&gt;</content:encoded></item></channel></rss>