Skip to content

Instantly share code, notes, and snippets.

@okamuuu
Last active January 13, 2017 05:50
Show Gist options
  • Save okamuuu/f9c9af2c99bb0ed7838bc700ec573316 to your computer and use it in GitHub Desktop.
Save okamuuu/f9c9af2c99bb0ed7838bc700ec573316 to your computer and use it in GitHub Desktop.

spa-boilerplate.react-hot-replace

mkdir practice-react && cd $_
mkdir src www
touch .babelrc webpack.config.js devServer.js src/index.js src/Root.js www/index.html
npm init -y
npm install --save-dev browser-sync webpack webpack-dev-middleware webpack-hot-middleware
npm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-stage-0 babel-preset-react babel-plugin-react-hot
npm install --save-dev style-loader file-loader css-loader url-loader react-hot-loader
npm install --save jquery bootstrap
npm install --save babel-polyfill react react-dom

create .babelrc

{
  "presets": ["es2015", "stage-0", "react"]
}

create webpack.config.js

const path = require('path')
const webpack = require('webpack')

module.exports = {
  debug: true,
  devtool: 'inline-source-map',
  entry: [
    'webpack/hot/dev-server',
    'webpack-hot-middleware/client',
    './src/index.js'
  ],
  output: {
    publicPath: "/",
    path: path.resolve('www'),
    filename: "bundle.js",
  },
  plugins: [
    new webpack.optimize.OccurenceOrderPlugin(),
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoErrorsPlugin(),
    new webpack.ProvidePlugin({
      jQuery: 'jquery',
      $: "jquery"
    })
  ],
  resolve: {
    extensions: ['', '.js'],
  },
  module: {
    loaders:[
      { test: /\.jsx?$/, exclude: /node_modules/, loaders: ['babel'] },
      { test: /\.css$/, loader: "style-loader!css-loader" },
      { test: /\.svg$/, loader: 'url-loader?mimetype=image/svg+xml' },
      { test: /\.woff$/, loader: 'url-loader?mimetype=application/font-woff' },
      { test: /\.woff2$/, loader: 'url-loader?mimetype=application/font-woff' },
      { test: /\.eot$/, loader: 'url-loader?mimetype=application/font-woff' },
      { test: /\.ttf$/, loader: 'url-loader?mimetype=application/font-woff' }
    ]
  }
}

create devServer.js

const webpack = require('webpack')
const browserSync = require('browser-sync')
const webpackDevMiddleware = require('webpack-dev-middleware')
const webpackHotMiddleware = require('webpack-hot-middleware')
const historyApiFallback = require('connect-history-api-fallback')

const config = require('./webpack.config')
const bundler = webpack(config)

browserSync({
  open: false,
  server: {
    baseDir: config.output.path,
    index: "index.html",
    middleware: [
      webpackDevMiddleware(bundler, {
        publicPath: config.output.publicPath,
        stats: { colors: true }
      }),
      webpackHotMiddleware(bundler),
      historyApiFallback()
    ]
  },
  files: [
    'www/*.html'
  ]
})

create src/index.js

import React from 'react'
import { render } from 'react-dom'
import Root from './Root'

render(
  <Root />, 
  document.getElementById('root')
)

if (module.hot) {
  module.hot.accept('./Root.js', function() {
    const NextApp = require('./Root').default
    render(<NextApp/>, document.getElementById('root'))
  })  
}

create src/Root.js

import 'babel-polyfill'
import 'bootstrap'
import 'bootstrap/dist/css/bootstrap.css'
import React from 'react'

export default (props) => (
  <div className="container">
    <h1>React boilerplate</h1>
    <p>test</p>
  </div>
)

create www/index/html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  </head>
  <body>
    <div id="root"></div>
    <script src="bundle.js"></script>
  </body>
</html>

implement it

node devServer.js
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment