{"@attributes":{"version":"2.0"},"channel":{"title":"DEV Community: Truong Hoang Dung","description":"The latest articles on DEV Community by Truong Hoang Dung (@revskill10).","link":"https:\/\/dev.to\/revskill10","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%2F89054%2F9d7ed786-6b65-4790-a3ab-ad9198b07689.jpeg","title":"DEV Community: Truong Hoang Dung","link":"https:\/\/dev.to\/revskill10"},"language":"en","item":[{"title":"Serverless and SPA, a perfect match in heaven","pubDate":"Tue, 02 Apr 2019 08:43:14 +0000","link":"https:\/\/dev.to\/revskill10\/serverless-and-spa-a-perfect-match-in-heaven-omk","guid":"https:\/\/dev.to\/revskill10\/serverless-and-spa-a-perfect-match-in-heaven-omk","description":"<p>Recently, Next.JS V8 allows you to build each endpoint into a serverless function.<br>\nIt's one of the coolest thing that happens to frontend team.<\/p>\n\n<p>Now, they not only can split frontend in a SPA, they can split backends, too.<\/p>\n\n<p>NextJS was and is truly an inspiration. <\/p>\n\n<p>What can frameworks learn from it ?<\/p>\n\n<p>Now you know, let's just kill the big, monothlic backend server. And please, please seriously split it for fun and profit.<\/p>\n\n<p>2019 will be a big milestone in technology for us, universal developers.<\/p>\n\n<p>I'm happy for this transition, and how about you ?<\/p>\n\n","category":["serverless","spa","javascript"]},{"title":"A React Hook for universal routing","pubDate":"Wed, 13 Mar 2019 08:09:53 +0000","link":"https:\/\/dev.to\/revskill10\/a-react-hook-for-universal-routing-6dk","guid":"https:\/\/dev.to\/revskill10\/a-react-hook-for-universal-routing-6dk","description":"<p>I'm using <code>@reach\/router<\/code> and love its simplicity.<br>\nBut i love to use React Hook to get the page params and query string, so i make a simple hook for it.<\/p>\n\n<p>Firstly, we need a <code>pageContext<\/code> for page component.<\/p>\n\n<p><code>pageContext.ts<\/code>:<br>\n<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createContext<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">pageContext<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">createContext<\/span><span class=\"p\">({}<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">any<\/span><span class=\"p\">);<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">withPageContext<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">Component<\/span><span class=\"p\">:<\/span> <span class=\"nx\">any<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">:<\/span> <span class=\"nx\">any<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">pageContext<\/span><span class=\"p\">.<\/span><span class=\"nx\">Provider<\/span> <span class=\"nx\">value<\/span><span class=\"o\">=<\/span><span class=\"p\">{{...<\/span><span class=\"nx\">props<\/span><span class=\"p\">}}<\/span><span class=\"o\">&gt;<\/span>\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">Component<\/span> <span class=\"p\">{...<\/span><span class=\"nx\">props<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>    <span class=\"o\">&lt;<\/span><span class=\"sr\">\/pageContext.Provider<\/span><span class=\"err\">&gt;\n<\/span>  <span class=\"p\">);<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">pageContext<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre><\/div>\n\n\n\n<p>This also includes a HOC to inject <code>props<\/code> into pageComponent to be consumed with <code>useContext<\/code> hook later.<\/p>\n\n<p>Second, we need to wrap this <code>pageContext.Provider<\/code> to all Route component:<br>\n<code>Route.tsx<\/code>:<br>\n<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> \n  <span class=\"nx\">FunctionComponent<\/span> \n<span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> \n  <span class=\"nx\">RouteComponentProps<\/span> \n<span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@reach\/router<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">LoadableComponent<\/span>\n<span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@loadable\/component<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">withPageContext<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/pageContext<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"nx\">type<\/span> <span class=\"nx\">Props<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"na\">component<\/span><span class=\"p\">:<\/span> <span class=\"nx\">FunctionComponent<\/span> <span class=\"o\">|<\/span> <span class=\"nx\">LoadableComponent<\/span><span class=\"o\">&lt;<\/span><span class=\"p\">{}<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">}<\/span> <span class=\"o\">&amp;<\/span> <span class=\"nx\">RouteComponentProps<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">Route<\/span><span class=\"p\">:<\/span> <span class=\"nx\">FunctionComponent<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Props<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"p\">({<\/span> <span class=\"nx\">component<\/span><span class=\"p\">,<\/span> <span class=\"p\">...<\/span><span class=\"nx\">rest<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">Component<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">withPageContext<\/span><span class=\"p\">(<\/span><span class=\"nx\">component<\/span><span class=\"p\">);<\/span>\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">Component<\/span> <span class=\"p\">{...<\/span><span class=\"nx\">rest<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>  <span class=\"p\">);<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">Route<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre><\/div>\n\n\n\n<p>And lastly, the thing we need, a <code>useRouter<\/code> hook:<br>\n<code>useRouter.ts<\/code><br>\n<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">pageContext<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/pageContext<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useContext<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">parse<\/span><span class=\"p\">,<\/span> <span class=\"nx\">parseUrl<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">query-string<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">isServer<\/span> <span class=\"o\">=<\/span> <span class=\"k\">typeof<\/span><span class=\"p\">(<\/span><span class=\"nb\">window<\/span><span class=\"p\">)<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">undefined<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">useRouter<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">location<\/span><span class=\"p\">,<\/span> <span class=\"p\">...<\/span><span class=\"nx\">rest<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useContext<\/span><span class=\"p\">(<\/span><span class=\"nx\">pageContext<\/span><span class=\"p\">);<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">queryParams<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">isServer<\/span> <span class=\"p\">?<\/span>  \n    <span class=\"nx\">parseUrl<\/span><span class=\"p\">(<\/span><span class=\"nx\">location<\/span><span class=\"p\">.<\/span><span class=\"nx\">pathname<\/span><span class=\"p\">).<\/span><span class=\"nx\">query<\/span> <span class=\"p\">:<\/span> \n    <span class=\"nx\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">location<\/span><span class=\"p\">.<\/span><span class=\"nx\">search<\/span><span class=\"p\">);<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">query<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n    <span class=\"p\">...<\/span><span class=\"nx\">queryParams<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">...<\/span><span class=\"nx\">rest<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">};<\/span>\n\n  <span class=\"k\">return<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">query<\/span> <span class=\"p\">};<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">useRouter<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre><\/div>\n\n\n\n<p>Here, i mapped all <code>props<\/code> and <code>query string<\/code> into a <code>query<\/code> property returned by <code>useRouter<\/code> and we've done !<\/p>\n\n<h1>\n  \n  \n  Usage:\n<\/h1>\n\n<p>Firstly, declare your routes with our new <code>Route<\/code> component:<\/p>\n\n<p><code>App.tsx<\/code>:<br>\n<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">Route<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/Route<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> \n  <span class=\"nx\">Router<\/span> \n<span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@reach\/router<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">loadable<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@loadable\/component<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">User<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">loadable<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">components\/User<\/span><span class=\"dl\">'<\/span><span class=\"p\">));<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">App<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">Router<\/span><span class=\"o\">&gt;<\/span>      \n      <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">component<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">User<\/span><span class=\"p\">}<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/users\/:userId<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">\/&gt;<\/span>\n    <span class=\"o\">&lt;<\/span><span class=\"sr\">\/Router<\/span><span class=\"err\">&gt;\n<\/span>  <span class=\"p\">);<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">App<\/span><span class=\"p\">;<\/span>\n\n<\/code><\/pre><\/div>\n\n\n\n<p>Secondly, use <code>useRouter<\/code> in our <code>User<\/code> component:<\/p>\n\n<p><code>User.tsx<\/code>:<br>\n<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">User<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">query<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useRouter<\/span><span class=\"p\">();<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">userId<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">query<\/span><span class=\"p\">;<\/span>\n  <span class=\"k\">return<\/span> <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span><span class=\"o\">&gt;<\/span><span class=\"nx\">You<\/span> <span class=\"nx\">requested<\/span> <span class=\"p\">{<\/span><span class=\"nx\">userId<\/span><span class=\"p\">}<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/div&gt;<\/span><span class=\"err\">;\n<\/span><span class=\"p\">};<\/span>\n<\/code><\/pre><\/div>\n\n\n\n<h2>\n  \n  \n  Inspiration:\n<\/h2>\n\n<p>This is inspired by <code>react-router<\/code> and <code>nextjs<\/code>.<\/p>\n\n","category":["react","hook"]},{"title":"What does a UI Component mean, finally ?","pubDate":"Thu, 07 Feb 2019 05:47:16 +0000","link":"https:\/\/dev.to\/revskill10\/what-does-a-ui-component-mean-finally--13nl","guid":"https:\/\/dev.to\/revskill10\/what-does-a-ui-component-mean-finally--13nl","description":"<p>I need to clarify myself some terminologies that i found too ambigous, or useless to apply in daily programming, some of them is: UI, Component, Behaviour, View, Model.<\/p>\n\n<p>I could describe a <code>Component<\/code> as:<br>\n<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><span class=\"nx\">Component<\/span> <span class=\"o\">=<\/span> <span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">behavior<\/span><span class=\"p\">,<\/span> <span class=\"nx\">view<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre><\/div>\n\n\n\n<p>What does <code>behavior<\/code> mean ?<br>\n<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><span class=\"nx\">behavior<\/span> <span class=\"o\">=<\/span> <span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nx\">model<\/span>\n<\/code><\/pre><\/div>\n\n\n\n<p>Yes, a <code>behavior<\/code> is a function, which receives <code>props<\/code> as input, and return a <code>model<\/code><\/p>\n\n<p>A <code>model<\/code> in this case is just any data structure.<\/p>\n\n<p>What does a <code>view<\/code> mean ?<br>\n<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><span class=\"nx\">view<\/span> <span class=\"o\">=<\/span> <span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">model<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nx\">UI<\/span>\n<\/code><\/pre><\/div>\n\n\n\n<p>A <code>view<\/code> is a function which receives a <code>model<\/code> and returns a <code>UI<\/code> .<\/p>\n\n<p><code>UI<\/code> means User Interface, is what a user could see, feel and interact with.<\/p>\n\n<h2>\n  \n  \n  Example:\n<\/h2>\n\n<p>Let's make a <code>Counter<\/code> component with React and Hooks !<\/p>\n\n<p>This is the <code>makeComponent<\/code>, which receives a <code>behavior<\/code>, a <code>view<\/code> and returns a <code>Component<\/code><br>\n<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">Component<\/span> <span class=\"o\">=<\/span> <span class=\"p\">({<\/span><span class=\"nx\">behavior<\/span><span class=\"p\">,<\/span> <span class=\"nx\">view<\/span><span class=\"p\">,<\/span> <span class=\"p\">...<\/span><span class=\"nx\">rest<\/span><span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">props<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">behavior<\/span><span class=\"p\">(<\/span><span class=\"nx\">rest<\/span><span class=\"p\">)<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">View<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">view<\/span>\n  <span class=\"k\">return<\/span> <span class=\"o\">&lt;<\/span><span class=\"nx\">View<\/span> <span class=\"p\">{...<\/span><span class=\"nx\">props<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span><span class=\"p\">}<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">makeComponent<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">behavior<\/span><span class=\"p\">,<\/span> <span class=\"nx\">view<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"o\">&lt;<\/span><span class=\"nx\">Component<\/span> <span class=\"p\">{...<\/span><span class=\"nx\">props<\/span><span class=\"p\">}<\/span> <span class=\"nx\">behaviour<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">behaviour<\/span><span class=\"p\">}<\/span> <span class=\"nx\">view<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">view<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span><span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">makeComponent<\/span>\n<\/code><\/pre><\/div>\n\n\n\n<p>The <code>Counter<\/code> behavior:<br>\n<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span><span class=\"nx\">useState<\/span><span class=\"p\">,<\/span> <span class=\"nx\">useCallback<\/span><span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">behavior<\/span> <span class=\"o\">=<\/span> <span class=\"p\">({<\/span><span class=\"nx\">initialCount<\/span><span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">count<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setCount<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">(<\/span><span class=\"nx\">initialCount<\/span><span class=\"p\">)<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">increment<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useCallback<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">setCount<\/span><span class=\"p\">(<\/span><span class=\"nx\">count<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">))<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">decrement<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useCallback<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">setCount<\/span><span class=\"p\">(<\/span><span class=\"nx\">count<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"p\">))<\/span>\n  <span class=\"k\">return<\/span> <span class=\"p\">{<\/span><span class=\"nx\">initialCount<\/span><span class=\"p\">,<\/span> <span class=\"nx\">count<\/span><span class=\"p\">,<\/span> <span class=\"nx\">increment<\/span><span class=\"p\">,<\/span> <span class=\"nx\">decrement<\/span><span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre><\/div>\n\n\n\n<p>The <code>Counter<\/code> view:<br>\n<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">view<\/span> <span class=\"o\">=<\/span> <span class=\"p\">({<\/span><span class=\"nx\">initialCount<\/span><span class=\"p\">,<\/span> <span class=\"nx\">count<\/span><span class=\"p\">,<\/span> <span class=\"nx\">increment<\/span><span class=\"p\">,<\/span> <span class=\"nx\">decrement<\/span><span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span><span class=\"o\">&gt;<\/span>\n        <span class=\"o\">&lt;<\/span><span class=\"nx\">button<\/span> <span class=\"nx\">onClick<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">increment<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;+&lt;<\/span><span class=\"sr\">\/button<\/span><span class=\"err\">&gt;\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span><span class=\"o\">&gt;<\/span><span class=\"nx\">Current<\/span> <span class=\"na\">count<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span><span class=\"nx\">count<\/span><span class=\"p\">}<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"nx\">button<\/span> <span class=\"nx\">onClick<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">decrement<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;-&lt;<\/span><span class=\"sr\">\/button<\/span><span class=\"err\">&gt;\n<\/span>    <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>  <span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre><\/div>\n\n\n\n<p>Finally, let's make a <code>Counter<\/code> component:<br>\n<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">Counter<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">makeComponent<\/span><span class=\"p\">(<\/span><span class=\"nx\">behavior<\/span><span class=\"p\">,<\/span> <span class=\"nx\">view<\/span><span class=\"p\">)<\/span>\n\n<span class=\"nx\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">render<\/span><span class=\"p\">(<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Counter<\/span> <span class=\"nx\">initialCount<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"mi\">0<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/&gt;, body<\/span><span class=\"err\">)\n<\/span><\/code><\/pre><\/div>\n\n\n\n<p>Voilla, i got a clean React component !<\/p>\n\n<h2>\n  \n  \n  But, is this <code>MVC<\/code> ?\n<\/h2>\n\n<p>Yes ! The <code>behavior<\/code> is exactly what does a <code>controller<\/code> mean.<\/p>\n\n<h2>\n  \n  \n  So, is a <code>Component<\/code> the same as <code>MVC<\/code> ?\n<\/h2>\n\n<p>No ! <code>Component<\/code> has only two arguments: The V and the C, there's no M.<\/p>\n\n","category":["react","javascript","ui"]},{"title":"First-class testing","pubDate":"Sun, 27 Jan 2019 06:51:41 +0000","link":"https:\/\/dev.to\/revskill10\/first-class-testing-48fk","guid":"https:\/\/dev.to\/revskill10\/first-class-testing-48fk","description":"<p>Some years ago, i saw some frameworks like Ruby on Rails trying to put <code>tests<\/code> folder in the same folder with dev codebase.<\/p>\n\n<p>What's wrong with this approach ?<\/p>\n\n<ul>\n<li>Gemfile is becoming a mess with testing , dev and production dependencies.<\/li>\n<li>Discourage dependencies de-coupling, which means we're encourage to put everthing in the same place for the ease of \"directory traversing\"<\/li>\n<li>The codebase now is easier to \"break\", because for some reason, both tests code and dev code live in the same place, so they must please each other.<\/li>\n<\/ul>\n\n<p>The main disadvantage with this approach, is that: Testers are afraid to write tests ! They're touching the main codebase!<\/p>\n\n<p>I see the same problem with many frameworks in other languages also.<\/p>\n\n<p>\"Stop putting tests folder in the same codebase with dev folder\"<\/p>\n\n<p>So what does \"First class testing\" mean ?<\/p>\n\n<p>Treat your tests folder the same role as dev folder, with its own dependencies, team ownership, development (tests is code), deployment (tests is code, so it could be compiled for deployment)<\/p>\n\n<p>I'm happy with this approach and i found testing is easier to verify some weird behaviour in the main codebase.<\/p>\n\n<p>What's your favorite testing strategy ? <\/p>\n\n<p>Edit: My project structure:<\/p>\n\n<p><a href=\"https:\/\/res.cloudinary.com\/practicaldev\/image\/fetch\/s--LsIIq8nV--\/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880\/https:\/\/thepracticaldev.s3.amazonaws.com\/i\/jrd2cz3gdsejn7vgmcwk.png\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/res.cloudinary.com\/practicaldev\/image\/fetch\/s--LsIIq8nV--\/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880\/https:\/\/thepracticaldev.s3.amazonaws.com\/i\/jrd2cz3gdsejn7vgmcwk.png\" alt=\"\"><\/a><\/p>\n\n","category":"testing"},{"title":"Why i won't use React Hooks","pubDate":"Mon, 21 Jan 2019 03:29:42 +0000","link":"https:\/\/dev.to\/revskill10\/why-i-wont-use-react-hooks-i38","guid":"https:\/\/dev.to\/revskill10\/why-i-wont-use-react-hooks-i38","description":"<p>I'm passionate about ReactJS, because of its declarative programming model.<\/p>\n\n<p>That means, in React,<br>\n<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight plaintext\"><code>view = function(state)\n<\/code><\/pre><\/div>\n\n\n\n<p>That's why i never mess React Component with side-effects, like ajax request or state.<\/p>\n\n<p>With separate function for behaviour, you can easily reuse, unit test, and package it.<\/p>\n\n<p>With React Hooks, what i have to do is to mess side-effects within the component.<\/p>\n\n<p>It's not good to me.<br>\nIt's not simple to debug.<br>\nIt's not simple to reuse the behaviour.<br>\nIt's not easy to unit test the behaviour.<\/p>\n\n<p>That's why i would say NO to React hooks, because i prefer simplicity to magic.<br>\nI'm a simple developer, not a magician trying to understand wtf is going on with my production code.<\/p>\n\n","category":["javascript","react"]},{"title":"Simple way to do code splitting for Redux","pubDate":"Tue, 08 Jan 2019 21:41:05 +0000","link":"https:\/\/dev.to\/revskill10\/simple-way-to-do-code-splitting-for-redux-p7d","guid":"https:\/\/dev.to\/revskill10\/simple-way-to-do-code-splitting-for-redux-p7d","description":"<p>Most of documentation, tutorials, youtube videos taught you how to create your own Redux Store. It's sweet. But let's make it better.<\/p>\n\n<p>How about you want to do code splitting with your Redux store ?<\/p>\n\n<p>By code splitting Redux store, i mean, in some cases, you don't want to import all of your Redux actions to be used in a React component, for example, on <code>\/login<\/code> page, you just want to import <code>login<\/code> action only.<\/p>\n\n<p>The solution is dead simple !<\/p>\n\n<p>Just use the old school <code>window.REDUX_STORE_LOGIN<\/code> for <code>\/login<\/code> route.<br>\n<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight plaintext\"><code>window.REDUX_STORE_LOGIN = createStore(...)\n<\/code><\/pre><\/div>\n\n\n\n<p>Do this when user is accessing <code>\/login<\/code> route.<\/p>\n\n<p>And do the same for all of your routes to split your Redux store to the max.<\/p>\n\n<p>Happy reduxing!<\/p>\n\n","category":["javascript","redux"]},{"title":"NextJS and its genius ideas","pubDate":"Thu, 03 Jan 2019 13:55:41 +0000","link":"https:\/\/dev.to\/revskill10\/nextjs-and-its-genius-ideas-5bda","guid":"https:\/\/dev.to\/revskill10\/nextjs-and-its-genius-ideas-5bda","description":"<p>Everyone loves ReactJS.<\/p>\n\n<p>JS frameworks blow the world out there with each new framework each week.<br>\nBut when we talk about a server-side-rendering framework, there're still limited choices.<\/p>\n\n<p>I've played around with VueJS, FusionJS and NextJS and some other \"smaller\" SSR frameworks, my pick is NextJS, here's why.<\/p>\n\n<ol>\n<li>File-based routing.<\/li>\n<\/ol>\n\n<p>Aha, i don't need to code anything to make my React application routable ! Even more, it's not only client-side routing, it's server-side routing , too.<br>\nI call it old-but-genius idea about how routing should be done.<\/p>\n\n<p>The benefit here is, you'll get route-based code splitting for FREE !<\/p>\n\n<ol>\n<li>getInitialProps<\/li>\n<\/ol>\n\n<p>In old versions of ReactJS, we have <code>getInitialState<\/code>, i'm sure React developers will miss it very much.<br>\nAnd NextJS \"steals\" that idea to make our React component got its initial data server-side rendered !<\/p>\n\n<p>If you still not use NextJS yet, try it out today !<\/p>\n\n","category":["javascript","nextjs","react"]},{"title":"The Git interface that i want to use","pubDate":"Tue, 27 Nov 2018 13:37:50 +0000","link":"https:\/\/dev.to\/revskill10\/the-git-interface-that-i-want-to-use-3716","guid":"https:\/\/dev.to\/revskill10\/the-git-interface-that-i-want-to-use-3716","description":"<p>This is purely an idea, but i think it's potential to make programming fun again with <code>git<\/code>.<\/p>\n\n<p>Imagine we have a command <code>enter-git-mode<\/code><\/p>\n\n<p>Our terminal turns into <code>git mode<\/code>. What can it do ?<\/p>\n\n<ul>\n<li>Making new folder.<\/li>\n<\/ul>\n\n<p>Behind the scene, git will create new branch for us, so that whenever we want to enter, <code>cd foo\/<\/code>, we're inside the <code>foo<\/code> branch.<\/p>\n\n<ul>\n<li>Moving files.<\/li>\n<\/ul>\n\n<p>Now after you edited the code, you want to commit it to a branch, just use the famous: <code>mv file foo\/<\/code>, git will commit the saved <code>file<\/code> to <code>foo<\/code> branch.<\/p>\n\n<p>In general, we need a <code>git mode<\/code> that will map our folder commands to git command.<\/p>\n\n<p>Hope this's an idea for a fun hacking weekends for everyone.<\/p>\n\n","category":"git"},{"title":"Back to the basics, you're gonna NOT need hypes to drive you crazy","pubDate":"Mon, 10 Sep 2018 04:37:49 +0000","link":"https:\/\/dev.to\/revskill10\/back-to-the-basic-youre-gonna-not-need-hypes-to-drive-you-crazy-145e","guid":"https:\/\/dev.to\/revskill10\/back-to-the-basic-youre-gonna-not-need-hypes-to-drive-you-crazy-145e","description":"<p>For all of us, want to master the real fundamentals of frontend development, just learn from <a href=\"https:\/\/www.w3schools.com\/howto\/default.asp\">this<\/a> is more than enough.<\/p>\n\n<p>Stop chasing for hypes, courses, frameworks, library, articles, blogs, twitters, or ebooks, focus on it and you'll get very far. Seriously.<\/p>\n\n","category":["css","javascript","html"]},{"title":"What's the most important factor to determine quality of an OSS Project ?","pubDate":"Fri, 07 Sep 2018 06:41:26 +0000","link":"https:\/\/dev.to\/revskill10\/whats-the-most-important-factor-to-determine-quality-of-an-oss-project--kbi","guid":"https:\/\/dev.to\/revskill10\/whats-the-most-important-factor-to-determine-quality-of-an-oss-project--kbi","description":"<p>When i look at a github project, i consider the number of closed Pull Requests to know if it's qualified or not for me to use or try it.<\/p>\n\n<p>What about yours ?<\/p>\n\n","category":"discuss"},{"title":"The use cases and benefits of a RDBMS","pubDate":"Tue, 21 Aug 2018 12:12:20 +0000","link":"https:\/\/dev.to\/revskill10\/the-use-cases-and-benefits-of-a-rdbms-33cm","guid":"https:\/\/dev.to\/revskill10\/the-use-cases-and-benefits-of-a-rdbms-33cm","description":"<p>Use cases:<\/p>\n\n<ul>\n<li>You want to keep your business invariants OUT of your codebase.<\/li>\n<li>You don't need a JOIN to get a relational data out of your database.<\/li>\n<li>You want transactional action on your data<\/li>\n<li>You want a strong query language to get efficiently whatever data you have.<\/li>\n<li>You want to take benefit of a RDBMS to manage all security issues.<\/li>\n<\/ul>\n\n<p>Let me clarify on these use cases and benefits you can get.<\/p>\n\n<h2>\n  \n  \n  1. Business invariants:\n<\/h2>\n\n<p>For example, you're developing a microservice to manage your users. It'll handle new users registration. One obvious business invariant here is:<br>\nEmail must be unique<br>\nSo, you started to write test, write code to validate it in your code, right\u00a0?<br>\nI would say, in this case, you can get benefit of a RDBMS (PostgreSQL) in this case, by using a sql statement to enforce this rule OUT of your code base:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"n\">unique_email_policy_records<\/span> <span class=\"p\">(<\/span>\n<span class=\"n\">id<\/span> <span class=\"nb\">serial<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span><span class=\"p\">,<\/span>\n<span class=\"n\">email<\/span> <span class=\"nb\">character<\/span> <span class=\"nb\">varying<\/span> <span class=\"k\">not<\/span> <span class=\"k\">null<\/span><span class=\"p\">,<\/span>\n<span class=\"k\">CONSTRAINT<\/span> <span class=\"n\">unique_email_policy_records_pkey<\/span> <span class=\"k\">PRIMARY<\/span> <span class=\"k\">KEY<\/span> <span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">);<\/span>\n<span class=\"k\">CREATE<\/span> <span class=\"k\">UNIQUE<\/span> <span class=\"k\">INDEX<\/span> <span class=\"n\">unique_email_policy_records_keys<\/span> <span class=\"k\">ON<\/span> <span class=\"n\">unique_email_policy_records<\/span> <span class=\"k\">USING<\/span> <span class=\"n\">btree<\/span> <span class=\"p\">(<\/span><span class=\"n\">email<\/span><span class=\"p\">);<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>This sql script will enforce that, when you want to insert new user into your database, it must not contain duplicate email. No need in your code to enforce this.<\/p>\n\n<h2>\n  \n  \n  2. You don't need a JOIN to get a relational data out of your database.\n<\/h2>\n\n<p>So, after you already insert your user in your database, you'll want to query the users that you have.<br>\nThere're many ways to achive this. You can use a sql trigger, so that whenever a user is registered, it'll insert into new table, which is for querying.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"n\">user_records<\/span><span class=\"o\">%<\/span><span class=\"n\">SUFFIX<\/span><span class=\"o\">%<\/span> <span class=\"p\">(<\/span>\n<span class=\"n\">id<\/span> <span class=\"nb\">serial<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span><span class=\"p\">,<\/span>\n<span class=\"n\">email<\/span> <span class=\"nb\">character<\/span> <span class=\"nb\">varying<\/span> <span class=\"k\">not<\/span> <span class=\"k\">null<\/span><span class=\"p\">,<\/span>\n<span class=\"n\">encrypted_password<\/span> <span class=\"nb\">character<\/span> <span class=\"nb\">varying<\/span> <span class=\"k\">not<\/span> <span class=\"k\">null<\/span><span class=\"p\">,<\/span>\n<span class=\"n\">created_at<\/span> <span class=\"nb\">TIMESTAMP<\/span> <span class=\"k\">not<\/span> <span class=\"k\">null<\/span><span class=\"p\">,<\/span>\n<span class=\"n\">updated_at<\/span> <span class=\"nb\">TIMESTAMP<\/span><span class=\"p\">,<\/span>\n<span class=\"k\">CONSTRAINT<\/span> <span class=\"n\">user_records_pkey<\/span><span class=\"o\">%<\/span><span class=\"n\">SUFFIX<\/span><span class=\"o\">%<\/span> <span class=\"k\">PRIMARY<\/span> <span class=\"k\">KEY<\/span> <span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">);<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>This script will auto refresh with any new valid user registration. So you query this table to get your users out of database\u00a0!<\/p>\n\n<h2>\n  \n  \n  3. You want transactional actions on your data\n<\/h2>\n\n<p>I don't know much about NoSQL, but when i handle my write, i want it to be atomic. That means, whenever any error happens, no new write to my database at all.<br>\nAll or Nothing<br>\nRDBMS will help you achieve this\u00a0, simple and efficient\u00a0!<\/p>\n\n<h2>\n  \n  \n  4. You want a strong query language to get efficiently whatever data you have.\n<\/h2>\n\n<p>So now, you have your users table to query. You want to deliver it to client, to your users, your customers.<br>\nYou should use GraphQL for that purpose\u00a0! More specifically, there're many frameworks out there could help you <code>GraphQLify<\/code> your database for querying. One example is Hasura\u00a0, all you need to do is run hasura and point it to your RDBMS (PostgreSQL in this case)<br>\nNo more codebase needed to achieve that<br>\nThe nice thing is that, your client can now use GraphQL query language to query your data out of your RDBMS\u00a0!<\/p>\n\n<h2>\n  \n  \n  5. You want to take benefit of a RDBMS to manage all security issues.\n<\/h2>\n\n<p>After you already deliver your data to users, the last thing to do, is security.<br>\nWith Hasura (or any other framework like that), it'll allow us to enforce permission rule on your database in a very flexible way\u00a0!<br>\nNo need to put it in your code base\u00a0!<br>\nI've heard many dramas about RDBMS, everything is a tradeoff, the most important things you could do as a developer, is choosing the right tool for the job. No silver bullet here.<br>\nHappy coding\u00a0!<\/p>\n\n","category":["rdbms","nosql","graphql"]}]}}