v512.16.0
Jxnblk

Blog

Zero-Configuration React Static Site Generator

2/15/2016
#react
#static-site-generator

React is a great way to generate static HTML with a component-based UI. One of the biggest hurdles to working with React is the amount of boilerplate and build configuration it takes to get going. I wanted to make it dead-simple to start building static pages with React and without the need to install tons of npm modules and configure webpack.

That’s where static-react comes in. Here’s out to get started.

Update: As of version 3.2.0, static-react includes Babel presets and they do not need to be installed separately. This post has been updated to reflect those changes.

1. Install Dependencies

npm i -D react static-react

The Babel presets are optional, but make working with React much nicer, in my opinion.

2. Add a Run Script

Add the following run script to package.json.

"scripts": {
  "start": "static-react components/Root.js > index.html"
}

3. Configure Babel (Optional) *

Add the following to package.json.

4. Add Components

Create a components directory and a Root.js React component.

// Root.js
import React from 'react'

class Root extends React.Component {
  render () {
    return <h1>Hello</h1>
  }
}

export default Root

5. Build

npm start

Open index.html and you should see the rendered Root component.

Building Out a Page

You'll certainly want more than just a heading in the final page. Build out some more components and run npm start to rebuild.

Here is an example set of starter components:

// Root.js
import React from 'react'
import Head from './Head'
import Header from './Header'
import Main from './Main'
import Footer from './Footer'

class Root extends React.Component {
  render () {
    return (
      <html>
        <Head title='Static React Demo' />
        <body className='px3'>
          <Header title='Hello' />
          <Main />
          <Footer />
        </body>
      </html>
    )
  }
}

export default Root
// Head.js
import React from 'react'

const Head = ({ title }) => (
  <head>
    <meta charSet='utf-8' />
    <title>{title}</title>
    <link href='https://npmcdn.com/basscss-basic@1.0.0/index.css' rel='stylesheet' />
    <link href='https://npmcdn.com/basscss@8.0.0/css/basscss.min.css' rel='stylesheet' />
    <meta name='viewport' content='width=device-width, initial-scale=1' />
  </head>
)

export default Head
// Header.js
import React from 'react'

const Header = ({ title }) => (
  <header className='py3'>
    <h1>{title}</h1>
  </header>
)

export default Header
// Main.js
import React from 'react'

const Main = () => (
  <main className='py4'>
    <img src='http://lorempixel.com/256/256/cats/'
      alt='Kitten' />
  </main>
)

export default Main
// Footer.js
import React from 'react'

const Footer = () => (
  <footer className='py3'>
    <p>© 2016 Brent Jackson</p>
  </footer>
)

export default Footer

If you have any thoughts on or issues with the static-react module, please check out the repo on GitHub.

* Technically, I guess this post should be titled Near-Zero-Configuration, but using Babel is completely optional.

Novantica game screenshot with protagonist on hoverboard

I'm currently working on Novantica, a sci-fi adventure game.

Wishlist on Steam