<?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>DEV Community: Gavin Chan</title>
    <description>The latest articles on DEV Community by Gavin Chan (@oh_jeez_rick).</description>
    <link>https://dev.to/oh_jeez_rick</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%2F330075%2F8c3c6d7a-5296-423e-b9b0-95bad0161039.jpg</url>
      <title>DEV Community: Gavin Chan</title>
      <link>https://dev.to/oh_jeez_rick</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oh_jeez_rick"/>
    <language>en</language>
    <item>
      <title>Build a Slim React starter from the ground up in 2020</title>
      <dc:creator>Gavin Chan</dc:creator>
      <pubDate>Thu, 20 Feb 2020 09:22:59 +0000</pubDate>
      <link>https://dev.to/oh_jeez_rick/build-a-slim-react-starter-from-the-ground-up-in-2020-1dkj</link>
      <guid>https://dev.to/oh_jeez_rick/build-a-slim-react-starter-from-the-ground-up-in-2020-1dkj</guid>
      <description>&lt;p&gt;Nowadays, React become the very most popular and powerful javascript library for building UI, surpassing Vue and Angular. I have switched from Angular to React for less than 1 month and was astonished by its flexible JSX syntax and strong render capability. &lt;/p&gt;

&lt;p&gt;Angular is a framework for building scalable enterprise-level apps with Typescript while React is focused on building View. At the very beginning, you guys may feel confused about how to configure a React starter for real web development. &lt;/p&gt;

&lt;p&gt;Actually, Create-react-app is great and well-designed but is not 100% suitable for your business case. So let’s configure a react starter and really learn a lot from it.&lt;/p&gt;

&lt;p&gt;In this article, you will go over the process to use &lt;strong&gt;React&lt;/strong&gt;, &lt;strong&gt;Webpack&lt;/strong&gt;, &lt;strong&gt;Babel&lt;/strong&gt;, &lt;strong&gt;Eslint&lt;/strong&gt;, &lt;strong&gt;Prettier&lt;/strong&gt; to build a development-ready react starter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisite
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yDEVqibH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dkurk0khbhj05uc4tq6k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yDEVqibH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dkurk0khbhj05uc4tq6k.png" alt="node &amp;amp; npm version"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  create project folder and package.json
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hnffk29C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vda4rdwkywd2nh63bp6k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hnffk29C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vda4rdwkywd2nh63bp6k.png" alt="create project folder and package.json"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  install webpack &amp;amp; webpack-cli
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;yarn add -D webpack webpack-cli&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: without installing webpack-cli, your webpack command will not work&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  create src, public, src/index.html, src/main.js, webpack.config.js
&lt;/h3&gt;

&lt;p&gt;as follows:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WFYTzKI8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/k0sujm6rwr97h39nzezl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WFYTzKI8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/k0sujm6rwr97h39nzezl.png" alt="project structure"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  let's have a test, and run this app
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;cd src folder, create a module named &lt;code&gt;Greeter.js&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rp8dJVWs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bccho4uezzdpyyw7glur.png" alt="Greeter Module"&gt;
&lt;/li&gt;
&lt;li&gt;import Greeter module, create a node, and append to &lt;code&gt;&amp;lt;div id="root"&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AGkd_0vr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t48yqokyoe6anmjxji8b.png" alt="consume Greeter module"&gt;
&lt;/li&gt;
&lt;li&gt;configure webpack in webpack.config.js (in development mode)
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wkjzGh_7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kyr3r2ksvda4lx795b6i.png" alt="webpack basic setup"&gt;
&lt;/li&gt;
&lt;li&gt;add &lt;code&gt;"build": "webpack"&lt;/code&gt; to npm scripts in package.json
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hVr576Ot--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9ly658e0qzeez1f1y03x.png" alt="add build script"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm run build&lt;/code&gt;, build output will be printed on Terminal console
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hmxEYYaU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7cysj28primylf0h2yoq.png" alt="build output"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  we should serve this project, not static html
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;yarn add -D webpack-dev-server&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;configure in webpack.config.js
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aynrEBx9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/czff2k8m5kuqy49r6ddc.png" alt="webpack dev server"&gt;
&lt;/li&gt;
&lt;li&gt;enable HMR as well&lt;/li&gt;
&lt;li&gt;add &lt;code&gt;"start:dev": "webpack-dev-server"&lt;/code&gt; to npm script&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm run start:dev&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wXcg52Wm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uz45f4dbus36mmfmruq7.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;what a mess!&lt;/strong&gt; we need silent webpack output by adding &lt;code&gt;stats: 'minimal'&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;before:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YIeFTXub--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3q0t9lv3cbh5c9oyntzs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YIeFTXub--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3q0t9lv3cbh5c9oyntzs.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;after:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UUvB3b5e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yvyair8vdwexnktqityk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UUvB3b5e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yvyair8vdwexnktqityk.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Okay, React is coming
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;yarn add react react-dom&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;yarn add -D @babel/core babel-loader @babel/preset-env @babel/preset-react&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;configure babel in .babelrc
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dTMdOPj---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yv8wo3vggw5tqzegirtp.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;use babel-loader
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--chBw9wQW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/h2mc3otra3jelbjw2fw2.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;clear main.js and remove Greeter.js, let's write a React Component
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bkMVFf_d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/a957hpazospk9mqusbtw.png" alt="A React Function Component"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  configure eslint
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;yarn add -D eslint eslint-plugin-import eslint-config-airbnb-base eslint-plugin-react&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./node_modules/.bin/eslint --init&lt;/code&gt; to generate eslint default configuration&lt;/li&gt;
&lt;li&gt;add &lt;code&gt;"extends": "airbnb-base"&lt;/code&gt; to .eslintrc&lt;/li&gt;
&lt;li&gt;add eslint plugin to code editor, for me, sublimeLinter and subimeLinter-eslint&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  formate your code with Prettier
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;yarn add husky lint-staged prettier&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;add the following fields to your package.json
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a8GJLjhc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vg8wkk4xqkppbj4srq3f.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"formate": "./node_modules/.bin/prettier --write 'src/**/*.{js,jsx,ts,tsx,json,css,scss,md}'"&lt;/code&gt; to your package.json&lt;/li&gt;
&lt;li&gt;add JsPrettier plugin to sublime&lt;/li&gt;
&lt;li&gt;give your first git commit, and Bingo!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;source code: &lt;a href="https://github.com/cnscorpions/react-slim-starter"&gt;https://github.com/cnscorpions/react-slim-starter&lt;/a&gt;&lt;br&gt;
My Blog: &lt;a href="https://oh-jeez-rick.netlify.com/"&gt;https://oh-jeez-rick.netlify.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to comment and share your opinion. &lt;/p&gt;

&lt;h3&gt;
  
  
  Reference:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://webpack.js.org/concepts/"&gt;Webpack doc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://segmentfault.com/a/1190000006178770"&gt;入门 Webpack，看这篇就够了&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.valentinog.com/blog/babel/"&gt;Tutorial: How to set up React, webpack, and Babel from scratch (2020)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb-base"&gt;airbnb eslint configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/eslint/eslint#installation-and-usage"&gt;eslint installation and usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/40271230/how-to-run-eslint-fix-from-npm-script"&gt;how to run eslint fix from npm script&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://create-react-app.dev/docs/setting-up-your-editor/"&gt;setting up your editor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/typicode/husky"&gt;husky&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/okonet/lint-staged"&gt;lint-staged&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>react</category>
      <category>babel</category>
      <category>webpack</category>
      <category>starter</category>
    </item>
  </channel>
</rss>
