If you're looking at the articles I wrote at CSS-Tricks and subsequently this code, they are pretty old at this point.
- React Router is currently on v5 and is going to be v6 soon (at the time I wrote this note in Oct 2019). I wrote a more updated article on v4 after this series at CSS-Tricks back in 2017: https://css-tricks.com/react-router-4/. FYI, v4 and v5 are practically the same API (see why) so reading v4 is still pretty good if you're on v5
- Reading on Container Components (Smart vs Dumb Components) might give you some good ideas but in general that pattern isn't very popular these days.
- The Redux article is still pretty good and relevant.
This repo is for a CSS-Tricks series on React. The documentation in this repo will show you many things that weren't shown in the series, such as
- Steps for installing and running the code
- An explanation of the Webpack and Babel setup
- Extra Tips and Tricks
- New ES6 Syntax
Each series comes with its own guide in this repo. Each guide will have a README file for its specific documentation:
Each of the three guides needs to be npm-installed and ran separately. Start by cloning this repo and installing the first guide for React Router:
cd path/to/guide-1-react-router
npm install
gulp
The server will be available at localhost:3000
To run the code from the other guides, cd
to their folders and run the npm
steps again from their folder.
If you want to edit the React code, you'll have to re-build the public/js/bundle.js
file with Webpack. You'll probably want to open a new terminal tab so you can keep your server running. To rebuild with Webpack, type:
gulp watch
Also note that you'll need to globally install Gulp first if you haven't already
The articles at CSS-Tricks will be focused on their respective topics. They don't cover 100% of the concepts and implementation details of the code in the GitHub Guides. However, each guide will come with its own README.md file that tries to cover some of the implementation details, especially for ES6 concepts.
It should also be noted that the guides leave out many formalities like validation, security (XSS, CSRF) and organizational details to stay focused on the topics. These guides are trying to convey the "bigger picture" of how React can work in a Single Page Application. They do not necessarily serve as a "best-practices" starting point.
Each guide uses a very simple Express server which should take no configuration on your part to setup. The gulp
step will launch the server so you can visit localhost:3000 in the browser to see the guide. Type CTRL+C
to stop the server, and remember that only one guide can be ran at any given time since you'll cd
to each guide and run its server separately.
Webpack is a bundler that allows you to author multiple JavaScript files and have them bundled into one file for sending to the browser. If you're new to Webpack, here's a quick overview...
Your project (or in this case, each guide at this repo) will have a webpack.config.js
file. This file tells Webpack about which JavaScript file is your main entry point. That entry file will "include" other JavaScript files that it needs, which are it's "dependencies". In turn, those files can "include" even more dependencies. Webpack takes all the files in this process and bundles them into one output file. You can define where Wepback saves that file also in webpack.config.js
. These guides will bundle their code to /public/js/bundle.js
.
The bundle.js
file that Webpack creates will be the only JavaScript file sent to the browser. So the browser will start with all the JavaScript it needs for the application without making additional requests back to the server.
Webpack allows multiple ways to indicate dependencies in JavaScript files. One way you'll see commonly online uses require()
statements. That's a pattern called CommonJS. But more recently, JavaScript is in the process of adopting a new syntax called "ES6 modules" which use include
statements. The browser doesn't understand either of these approaches, so Webpack will convert code written with CommonJS or ES6 modules into ES5 which the browser does understand. But Webpack will need a third party tool called Babel to use ES6 modules -- which is what these guides use for the app.
If this all sounds chaotic and difficult to setup, don't worry, all the work is already done. All you need to do is run the npm install
and then the gulp
and/or gulp watch
commands from the install instructions.
Note that simply running gulp
will launch the Node server whereas gulp watch
takes care of the React/Webpack part. So you'll want to run these commands in two separate tabs if you want to have the server running and to be making React code changes.
Babel will tell Webpack how to convert ES6 (and even ES7) code to ES5. You might ask why we would want to write in future versions of JavaScript that aren't even fully supported? Well, there's new JavaScript syntax which is really nice to use. Plus, ES6 was finalized in 2015, which is why it's also called ES2015. So why should we have to wait for all browsers to catch up to a standard that's from 2015?
Many React guides use ES6, so getting familiar with it will also help you learn React. Also note that the a common way to use Babel is to put it's list of desired "presets" in a .babelrc
file. This is the strategy that we're using and this file is already created for you.
If you use Sublime Text Editor, you may notice the JSX syntax highlighting is weird in .js
files. That's because the JavaScript syntax highlighter isn't familiar with markup. You'll probably want to install the babel-sublime plugin which encourages you to use the JavaScript (Babel) syntax for your files over the JavaScript syntax.
You might also notice that Emmet shortcuts don't work in JSX. Wes Bos wrote a great guide for setting that up.
For myself, I prefer the React.createClass
way over the extends React.Component
way. Pete Hunt (former Facebook React team developer) once wrote:
"You may see some talk about ES6 classes being the preferred way to create React components. This is untrue. Most people (including Facebook) are using React.createClass()."
I'm not saying there's anything wrong with the ES6 way, I'm just saying you don't have to feel bad or behind if you do it the older React.createClass
way.
If you want to make more suggestions for this section that help beginners break through the hurdles, start a GitHub issue and perhaps we can add more tips here.