<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<title> - React</title>
	<link href="https://www.fullstackstanley.com/tags/react/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="https://www.fullstackstanley.com"/>
	<generator uri="https://www.getzola.org/">Zola</generator>
	<updated>2020-03-10T00:00:00+00:00</updated>
	<id>https://www.fullstackstanley.com/tags/react/atom.xml</id>
	<entry xml:lang="en">
		<title>Lessons learned and notes from my first ReasonML&#x2F;ReasonReact app</title>
		<published>2020-03-10T00:00:00+00:00</published>
		<updated>2020-03-10T00:00:00+00:00</updated>
		<link href="https://www.fullstackstanley.com/articles/lessons-learned-and-notes-from-my-first-reasonml-reasonreact-app/" type="text/html"/>
		<id>https://www.fullstackstanley.com/articles/lessons-learned-and-notes-from-my-first-reasonml-reasonreact-app/</id>
		<content type="html">&lt;p&gt;I recently released a side project, &lt;a href=&quot;https:&#x2F;&#x2F;rsync.snipline.io&quot;&gt;RSync Command Generator&lt;&#x2F;a&gt;. This is a simple GUI for generating &lt;code&gt;rsync&lt;&#x2F;code&gt; commands for the command line.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;res.cloudinary.com&#x2F;snipline&#x2F;image&#x2F;upload&#x2F;v1583931806&#x2F;preview-v2_ntrdzu.png&quot; alt=&quot;Preview of the Rsync Command Generator&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I’ve been casually learning ReasonML for a while and thought this would be a great project to try it out on. My main goal for ReasonML is to create native apps with ReveryUI, however, I thought I’d give ReasonReact a try first as there’s more resources out there. So here’s my initial thoughts, impressions, and tips to new comers.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;not-knowing-react-is-a-disadvantage&quot;&gt;Not knowing React is a disadvantage&lt;&#x2F;h2&gt;
&lt;p&gt;I’ve used React once about 4 years ago. &lt;&#x2F;p&gt;
&lt;p&gt;I mostly stick with VueJS, EmberJS, or StimulusJS. These 3 frameworks have covered most of my use-cases. I would love it if I could use any of these frameworks with ReasonML. Unfortunately, I’m not confident enough in my ReasonML knowledge to make my own bindings so ReasonReact or  Bucklescript-TEA are my options.&lt;&#x2F;p&gt;
&lt;p&gt;The ReasonReact docs are fairly good to get started but they do require base knowledge of React. I had to go and learn about hooks and reducers from various React tutorials. I’m still not sure how to use &lt;code&gt;useEffect&lt;&#x2F;code&gt; but hey, I know it exists.&lt;&#x2F;p&gt;
&lt;p&gt;Even without this understanding of &lt;code&gt;useEffect&lt;&#x2F;code&gt;, this has not stopped me from creating an app in ReasonReact. There are plenty of resources out there that can be used to get going.&lt;&#x2F;p&gt;
&lt;p&gt;One of which is the react-hooks starter template for ReasonReact. This has some great examples which I referred to many times.&lt;&#x2F;p&gt;
&lt;p&gt;If you’re building an SPA, I’d recommend checking these for a reference but using &lt;code&gt;spin&lt;&#x2F;code&gt; (see below) for the actual project structure.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-i-like-about-reasonml&quot;&gt;What I Like about ReasonML&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Inferred types.&lt;&#x2F;li&gt;
&lt;li&gt;Changing state with actions.&lt;&#x2F;li&gt;
&lt;li&gt;Immutability.&lt;&#x2F;li&gt;
&lt;li&gt;Being able to fall back to JS when needed.&lt;&#x2F;li&gt;
&lt;li&gt;Fast compilation and decent compiler feedback.&lt;&#x2F;li&gt;
&lt;li&gt;The syntax (With some minor exceptions).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre data-lang=&quot;re&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-re &quot;&gt;&lt;code class=&quot;language-re&quot; data-lang=&quot;re&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; A small glimpse into the structure
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;type&lt;&#x2F;span&gt;&lt;span&gt; state = {
&lt;&#x2F;span&gt;&lt;span&gt;	preferShortFlags: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;};
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;type&lt;&#x2F;span&gt;&lt;span&gt; action =
&lt;&#x2F;span&gt;&lt;span&gt;	| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;TogglePreferShortFlags&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; initialState = {
&lt;&#x2F;span&gt;&lt;span&gt;	preferShortFlags: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;false
&lt;&#x2F;span&gt;&lt;span&gt;};
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; reducer = (state, action) =&amp;gt; {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;switch &lt;&#x2F;span&gt;&lt;span&gt;(action) {
&lt;&#x2F;span&gt;&lt;span&gt;  | &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;TogglePreferShortFlags &lt;&#x2F;span&gt;&lt;span&gt;=&amp;gt; {...state, preferShortFlags: !state.preferShortFlags}
&lt;&#x2F;span&gt;&lt;span&gt;  };
&lt;&#x2F;span&gt;&lt;span&gt;};
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;@react&lt;&#x2F;span&gt;&lt;span&gt;.component]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; make = () =&amp;gt; {
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let &lt;&#x2F;span&gt;&lt;span&gt;(state, dispatch) = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;React&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;useReducer&lt;&#x2F;span&gt;&lt;span&gt;(reducer, initialState);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Container&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Header&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;* ... *&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Container&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;;
&lt;&#x2F;span&gt;&lt;span&gt;};
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;what-i-dont-like&quot;&gt;What I Dont&#x27; Like&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Some parts of the language are annoying. Having to use &lt;code&gt;type_&lt;&#x2F;code&gt; instead of &lt;code&gt;type&lt;&#x2F;code&gt; often caught me out. Raw JS syntax is a bit strange as well.&lt;&#x2F;li&gt;
&lt;li&gt;Having to use &lt;code&gt;className&lt;&#x2F;code&gt; instead of &lt;code&gt;class&lt;&#x2F;code&gt; - a similar bane to &lt;code&gt;type_&lt;&#x2F;code&gt; although I think this is a JS issue rather than because of a Reason keyword.&lt;&#x2F;li&gt;
&lt;li&gt;The documentation is good but I need more of it!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;My initial reaction to some of the syntax was an subconscious &amp;quot;nope&amp;quot;. Things like &lt;code&gt;+.&lt;&#x2F;code&gt; for adding floats. These quirks of the language have started to grow on me, though. I think learning more about OCaml, what ReasonML transpiles to, has helped me appreciate these things more.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;reaching-for-javascript-when-you-need-to&quot;&gt;Reaching for Javascript When You Need To&lt;&#x2F;h2&gt;
&lt;p&gt;I only reached for native JS once and that was to copy to clipboard. There is at least one BuckleScript library for this but I could not get it working. The JS ended up looking like this (Not my finest code).&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;re&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-re &quot;&gt;&lt;code class=&quot;language-re&quot; data-lang=&quot;re&quot;&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; copy = (dispatch, showEvent, hideEvent) =&amp;gt; {
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; copyJs = [%bs.raw 
&lt;&#x2F;span&gt;&lt;span&gt;			{| 
&lt;&#x2F;span&gt;&lt;span&gt;			&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;(text, showEvent, hideEvent) {
&lt;&#x2F;span&gt;&lt;span&gt;			&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;(window.clipboardData &amp;amp;&amp;amp; window.clipboardData.setData) {
&lt;&#x2F;span&gt;&lt;span&gt;				&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;dispatch&lt;&#x2F;span&gt;&lt;span&gt;(showEvent);
&lt;&#x2F;span&gt;&lt;span&gt;				window.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;setTimeout&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;() { &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;dispatch&lt;&#x2F;span&gt;&lt;span&gt;(hideEvent)}, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;1500&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;				&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span&gt; clipboardData.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;setData&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;Text&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, text); 
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;			} 
&lt;&#x2F;span&gt;&lt;span&gt;			&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;else if &lt;&#x2F;span&gt;&lt;span&gt;(document.queryCommandSupported &amp;amp;&amp;amp; document.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;queryCommandSupported&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;copy&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)) {
&lt;&#x2F;span&gt;&lt;span&gt;				var textarea = document.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;createElement&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;textarea&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;				textarea.textContent = text;
&lt;&#x2F;span&gt;&lt;span&gt;				textarea.style.position = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;fixed&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;				document.body.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;appendChild&lt;&#x2F;span&gt;&lt;span&gt;(textarea);
&lt;&#x2F;span&gt;&lt;span&gt;				textarea.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;select&lt;&#x2F;span&gt;&lt;span&gt;();
&lt;&#x2F;span&gt;&lt;span&gt;				try {
&lt;&#x2F;span&gt;&lt;span&gt;					&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;dispatch&lt;&#x2F;span&gt;&lt;span&gt;(showEvent);
&lt;&#x2F;span&gt;&lt;span&gt;					window.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;setTimeout&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;() {&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;dispatch&lt;&#x2F;span&gt;&lt;span&gt;(hideEvent)}, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;1500&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;					&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;return&lt;&#x2F;span&gt;&lt;span&gt; document.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;execCommand&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;copy&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;span&gt;				} catch (ex) {
&lt;&#x2F;span&gt;&lt;span&gt;					console.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;warn&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;Copy to clipboard failed.&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, ex);
&lt;&#x2F;span&gt;&lt;span&gt;					&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;				} finally {
&lt;&#x2F;span&gt;&lt;span&gt;					document.body.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;removeChild&lt;&#x2F;span&gt;&lt;span&gt;(textarea);
&lt;&#x2F;span&gt;&lt;span&gt;				}
&lt;&#x2F;span&gt;&lt;span&gt;			}
&lt;&#x2F;span&gt;&lt;span&gt;			}
&lt;&#x2F;span&gt;&lt;span&gt;		|}
&lt;&#x2F;span&gt;&lt;span&gt;		];
&lt;&#x2F;span&gt;&lt;span&gt;		&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;copyJs&lt;&#x2F;span&gt;&lt;span&gt;(command, showEvent, hideEvent);
&lt;&#x2F;span&gt;&lt;span&gt;	};
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It can then be called like this&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;re&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-re &quot;&gt;&lt;code class=&quot;language-re&quot; data-lang=&quot;re&quot;&gt;&lt;span&gt;&amp;lt;button role=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;button&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; ariaLabel=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;Copy to Clipboard&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; onClick={_event =&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;copy&lt;&#x2F;span&gt;&lt;span&gt;(dispatch, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;DisplayNotice&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;HideNotice&lt;&#x2F;span&gt;&lt;span&gt;)} className=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;ml-4&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;* ... *&#x2F;
&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;button&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With this code I passed in actions so that I could toggle showing feedback to the user. It&#x27;s a bit hacky, but hey, it works!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;f002.backblazeb2.com&#x2F;file&#x2F;snipline&#x2F;Screenshot%202020-03-06%20at%2014.55.46.png&quot; alt=&quot;Copying to clipboard&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;deployment-with-zeit-now&quot;&gt;Deployment with Zeit Now&lt;&#x2F;h2&gt;
&lt;p&gt;I deployed the project with &lt;a href=&quot;https:&#x2F;&#x2F;zeit.co&quot;&gt;Zeit Now&lt;&#x2F;a&gt;. One thing I noticed was that non-root URLs don’t work out of the box. It’s pretty simple to configure them to work with a &lt;code&gt;now.json&lt;&#x2F;code&gt; file.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;	  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;routes&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span&gt;			{ &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;src&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;dest&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&#x2F;index.html&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; },
&lt;&#x2F;span&gt;&lt;span&gt;			{ &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;src&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&#x2F;common&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;dest&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&#x2F;index.html&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; }
&lt;&#x2F;span&gt;&lt;span&gt;		]
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For dynamic URLs &lt;a href=&quot;https:&#x2F;&#x2F;zeit.co&#x2F;docs&#x2F;configuration#project&#x2F;routes&quot;&gt;check the documentation&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;useful-links&quot;&gt;Useful links&lt;&#x2F;h2&gt;
&lt;p&gt;The &lt;a href=&quot;https:&#x2F;&#x2F;reasonml.github.io&#x2F;reason-react&#x2F;docs&#x2F;en&#x2F;simple&quot;&gt;Reason React Documentation Examples&lt;&#x2F;a&gt; are great for understanding how to communicate between components and using state.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.rockyourcode.com&#x2F;learning-reason-react-step-by-step-part-0&#x2F;&quot;&gt;Rock Your Code&lt;&#x2F;a&gt; (&lt;a href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;hisophiabrandt&quot;&gt;@hisophiabrandt&lt;&#x2F;a&gt;) has a great series on ReasonReact which I very much enjoyed reading through. Includes some great external resources, too.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tmattio&#x2F;spin&quot;&gt;spin&lt;&#x2F;a&gt; - Project scaffolding tool. I wish I knew about this from the start. It has an excellent starter template for ReasonReact which includes Router setup and an option for using TailwindCSS.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;reasonml-community&#x2F;reason-react-hacker-news&quot;&gt;Reason React Hacker News&lt;&#x2F;a&gt; - Great project for referencing how to do things.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;dev.realworldocaml.org&#x2F;&quot;&gt;Real World OCaml&lt;&#x2F;a&gt; - Great for giving  context to how ReasonML works.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;pragprog.com&#x2F;book&#x2F;reasonml&#x2F;web-development-with-reasonml&quot;&gt;Web Development with ReasonML&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;would-i-use-it-again&quot;&gt;Would I use it again?&lt;&#x2F;h2&gt;
&lt;p&gt;Absolutely. Overall, I really like ReasonML, and I hope its popularity grows. &lt;&#x2F;p&gt;
&lt;p&gt;I think for now I will continue to use this for smaller projects while I get to grips with it. Hopefully I’ll get confident enough to release a native ReveryUI app in the near future.&lt;&#x2F;p&gt;
</content>
	</entry>
</feed>
