<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: maxime.io</title>
    <description>The latest articles on Forem by maxime.io (@devalnor).</description>
    <link>https://forem.com/devalnor</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F94338%2Fa535a479-66ff-415f-9603-86d4fdad6d91.jpeg</url>
      <title>Forem: maxime.io</title>
      <link>https://forem.com/devalnor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/devalnor"/>
    <language>en</language>
    <item>
      <title>(Quick tip) Easy debugging styled-component with CRA</title>
      <dc:creator>maxime.io</dc:creator>
      <pubDate>Thu, 30 Jul 2020 13:35:04 +0000</pubDate>
      <link>https://forem.com/devalnor/quick-tip-easy-debugging-styled-component-with-cra-5ggf</link>
      <guid>https://forem.com/devalnor/quick-tip-easy-debugging-styled-component-with-cra-5ggf</guid>
      <description>&lt;p&gt;&lt;em&gt;(This is a just quick tip not an elaborated post sorry)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks to Babel Macro, we don't need to eject our CRA project.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use &lt;code&gt;import styled from 'styled-components/macro'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Install &lt;code&gt;npm install babel-plugin-macros&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create &lt;code&gt;.babelrc&lt;/code&gt; in your project root&lt;/li&gt;
&lt;li&gt;Then add this to your .babelrc
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt; 
   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;plugins&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;babel-plugin-styled-components&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This option enhances the attached CSS class name on each component with richer output to help identify your components in the DOM without React DevTools.&lt;/p&gt;

&lt;p&gt;It also allows you to see the component's displayName in React DevTools.&lt;/p&gt;

&lt;p&gt;Voilà, enjoy!&lt;/p&gt;

&lt;p&gt;More info: &lt;a href="https://styled-components.com/docs/tooling#babel-macro"&gt;https://styled-components.com/docs/tooling#babel-macro&lt;/a&gt;&lt;/p&gt;

</description>
      <category>quicktip</category>
      <category>react</category>
      <category>babel</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Running JSX in your browser without Babel</title>
      <dc:creator>maxime.io</dc:creator>
      <pubDate>Tue, 03 Sep 2019 09:03:58 +0000</pubDate>
      <link>https://forem.com/devalnor/running-jsx-in-your-browser-without-babel-1agc</link>
      <guid>https://forem.com/devalnor/running-jsx-in-your-browser-without-babel-1agc</guid>
      <description>&lt;p&gt;Just for fun, I wondering if I could run React + JSX code directly in a &lt;strong&gt;modern&lt;/strong&gt; browser without transpilation and packaging.&lt;/p&gt;

&lt;p&gt;The answer is not rocket science and explained on &lt;a href="https://en.reactjs.org/docs/add-react-to-a-website.html"&gt;reactjs.org&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/react@16/umd/react.production.min.js"&lt;/span&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"&lt;/span&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And for JSX, we just have to add babel too&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/babel-standalone@6/babel.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Voilà! 🤗&lt;/p&gt;

&lt;h2&gt;
  
  
  But!
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;This approach is fine for learning and creating simple demos. However, it makes your website slow and isn’t suitable for production.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's right, your code is not optimized and loading Babel can be too heavy. &lt;/p&gt;

&lt;p&gt;Remember, it's for &lt;strong&gt;just for fun&lt;/strong&gt;. There is another (and probably better) way with &lt;a href="https://github.com/developit/htm"&gt;HTM&lt;/a&gt; (Hyperscript Tagged Markup) a JSX alternative using standard tagged templates made by  &lt;a class="comment-mentioned-user" href="https://dev.to/_developit"&gt;@_developit&lt;/a&gt;
, creator of Preact.&lt;/p&gt;

&lt;p&gt;The download weight difference is huge if we don't really need Babel.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lib&lt;/th&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Loading Size&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Babel&lt;/td&gt;
&lt;td&gt;6.26&lt;/td&gt;
&lt;td&gt;&amp;lt;195KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTM&lt;/td&gt;
&lt;td&gt;2.2.1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&amp;gt;1KB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/htm@2.2.1"&lt;/span&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// Bind htm with createElement&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;htm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  It's like JSX but also lit
&lt;/h3&gt;

&lt;p&gt;The syntax you write when using HTM is as close as possible to JSX:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spread props: &lt;code&gt;&amp;lt;div ...${props}&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Self-closing tags: &lt;code&gt;&amp;lt;div /&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Components: &lt;code&gt;&amp;lt;${Foo}&amp;gt;&lt;/code&gt; &lt;em&gt;(where &lt;code&gt;Foo&lt;/code&gt; is a component reference)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Boolean attributes: &lt;code&gt;&amp;lt;div draggable /&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Improvements over JSX
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;htm&lt;/code&gt; actually takes the JSX-style syntax a couple steps further!&lt;/p&gt;

&lt;p&gt;Here's some ergonomic features you get for free that aren't present in JSX:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No transpiler necessary&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;HTML's optional quotes: &lt;code&gt;&amp;lt;div class=foo&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Component end-tags: &lt;code&gt;&amp;lt;${Footer}&amp;gt;footer content&amp;lt;//&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Syntax highlighting and language support via the [lit-html VSCode extension] and [vim-jsx-pretty plugin].&lt;/li&gt;
&lt;li&gt;Multiple root element (fragments): &lt;code&gt;&amp;lt;div /&amp;gt;&amp;lt;div /&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Support for HTML-style comments: &lt;code&gt;&amp;lt;div&amp;gt;&amp;lt;!-- comment --&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Syntax differences
&lt;/h3&gt;

&lt;p&gt;There is few syntax differences by using tag function &lt;code&gt;html&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// JSX syntax&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;$&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;}&lt;/span&gt; 

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;    
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;World&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Hello, ${name}!"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// HTM syntax&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;h1&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/h1&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; 

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;World&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="s2"&gt;`
    &amp;lt;div&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; title="Hello, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!"/&amp;gt;
    &amp;lt;/div&amp;gt;
  `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Demo
&lt;/h3&gt;

&lt;p&gt;Knowing these differences, you are ready to have fun with React (or Preact of course) in your browser without any transpiler.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://jsfiddle.net/Devalnor/aeLupb4t/24/embedded/html,result//dark" width="100%" height="600"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Bonus (Preact with Hooks)
&lt;/h3&gt;

&lt;p&gt;If you want to use Hooks with Preact 10 (Currently in Release Candidate).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/preact@10.0.0-rc.1/dist/preact.umd.js"&lt;/span&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/preact@10.0.0-rc.1/hooks/dist/hooks.umd.js"&lt;/span&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;preactHooks&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;First post on &lt;strong&gt;dev.to&lt;/strong&gt;, if you enjoy it and want more don't forget to like ❤️&lt;/p&gt;

</description>
      <category>react</category>
      <category>jsx</category>
      <category>babel</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
