Setup
- First we need to install all the the necessary node modules
npm init
npm install react react-dom react-router-dom
npm install babel-core babel-loader babel-preset-env babel-preset-react css-loader extract-text-webpack-plugin file-loader node-sass raw-loader sass-loader style-loader url-loader webpack webpack-dev-server --save-dev
- start setting up project structure
touch index.html
mkdir src
mkdir config
touch .babelrc
cd config && touch webpack.config.js
cd src && touch index.js
- add
console.log("Hello, world!")
tosrc/index.js
- copy this into
webpack.config.js
:
const webpack = require('webpack');
const path = require('path');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const config = {
entry: {
'dist/app' : './src/index.js'
},
output: {
path: path.resolve(__dirname, '..'),
filename: "[name].bundle.js"
},
module: {
rules: [
{
test: /\.js|\.jsx/,
use: [
{
loader: 'babel-loader',
options: {
presets: ['react']
}
}
]
},
{
test: /\.css$/,
use: [
{
loader: 'style-loader'
},
{
loader: 'css-loader',
options: {
modules: true
}
}
]
},
{
test: /\.scss$/,
exclude: /node_modules/,
use: [
{
loader: "style-loader"
},
{
loader: "css-loader"
},
{
loader: "sass-loader"
}
]
},
{
test: /\.(png|jpe?g|gif|ico|svg)$/,
use: 'url-loader?limit=1000000&name=assets/images/[name].[ext]'
}
]
},
plugins: [
new ExtractTextPlugin("[name]")
],
watch: true
};
module.exports = config;
- walk through webpack config
- add this to .babelrc:
{
"presets": [
["env", {
"targets": {
"browsers": ["last 3 versions", "safari >= 7"],
"node": "6.10"
}
}]
]
}
-- set up build scripts in package.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack --config ./config/webpack.config.js",
"serve": "webpack-dev-server --port 2000 --inline --hot --host 0.0.0.0 --config ./config/webpack.config.js"
},
-- set up index.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>React SIJL</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
</head>
<body>
<app id="sijl"></app>
<script src="./dist/app.bundle.js"></script>
</body>
</html>
-
run using
npm run serve
- open localhost:2000 in browser and view console to see
Hello, world!
- open localhost:2000 in browser and view console to see
-
start setting up index.js with:
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import {
MemoryRouter as Router,
Route,
Switch,
Redirect,
Link
} from 'react-router-dom'
class Sijl extends Component {
render() {
return (
<h1>Hello, World!</h1>
);
}
}
ReactDOM.render(<Sijl />, document.getElementById('sijl'));
-
we've just build our first component
-
so how do we set up variables for a component?
-
modify index like so:
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import {
MemoryRouter as Router,
Route,
Switch,
Redirect,
Link
} from 'react-router-dom'
class Sijl extends Component {
constructor(props) {
super(props);
this.state = {
title: "Home"
};
}
render() {
return (
<h1>{this.state.title}</h1>
);
}
}
ReactDOM.render(<Sijl />, document.getElementById('sijl'));
-
Now that weve seen how variables work and are rendered in a component, lets set up our router
-
first we need to create som view components and a nav component
-
In
src/
mkdir components
mkdir views
-
In
src/components/
touch nav.js
touch nav.scss
-
In
src/views/
touch home.js
touch home.scss
touch test.js
touch test.scss
-
build nav.js first since we will be inserting that component above our router component
import React, { Component } from 'react';
class Nav extends Component {
render() {
return (
<div>
<button>Home</button>
<button>Test</button>
</div>
);
}
}
export default Nav;
- import the nav component into our index file and add to our sijl component
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import {
MemoryRouter as Router,
Route,
Switch,
Redirect,
Link
} from 'react-router-dom'
import Nav from './components/nav'
class Sijl extends Component {
constructor(props) {
super(props);
this.state = {
title: "Home"
};
}
render() {
return (
<div>
<Nav />
<h1>{this.state.title}</h1>
</div>
);
}
}
ReactDOM.render(<Sijl />, document.getElementById('sijl'));
- Now lets set up our basic views
- copy nav.js contents into both home.js and test.js
- Replace names where need
- example:
import React, { Component } from 'react';
class Home extends Component {
render() {
return (
<div>
<h1>Home</h1>
</div>
);
}
}
export default Home;
- import both of our view into index.js and lets set up our router
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import {
MemoryRouter as Router,
Route,
Switch,
Redirect,
Link
} from 'react-router-dom'
import Nav from './components/nav'
import Home from './views/home'
import Test from './views/test'
class Sijl extends Component {
render() {
return (
<Router>
<div>
<Nav />
<Switch>
<Route exact path="/" component={Home} />
<Route exact path="/test" component={Test} />
<Redirect to="/" />
</Switch>
</div>
</Router>
);
}
}
ReactDOM.render(<Sijl />, document.getElementById('sijl'));
- now all we should need to do is set up our links
- back in nav.js we need to
import { Link } from 'react-router-dom'
- we then need to wrap our buttons in
<Link>
tags:
- back in nav.js we need to
import React, { Component } from 'react';
import { Link } from 'react-router-dom'
class Nav extends Component {
render() {
return (
<div>
<Link to={"/"}><button>Home</button></Link>
<Link to={"/test"}><button>Test</button></Link>
</div>
);
}
}
export default Nav;
- can add styles if time permits