Skip to content

franciscop/server-react

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

React for server.js

Highly experimental plugin for server.js:

Renders React both server-side and browser-side by using next underneath. Write React for managing your views and make your website faster as a SPA.

Install

npm install server @server/react

Usage

First thing in your index.js file:

const server = require('server');
server.plugins.push(require('@server/react'));

server(...);

Then you can add routes to it. See the example from this project's repository in the index.js:

const server = require('server');
server.plugins.push(require('@server/react'));
const { get } = server.router;
const { render } = server.reply;

// Will automatically serve this and any page in 'pages'
server(
  get('/b/:subreddit', ctx => render('handler.js')),
);

Each page that you create under the pages folder will be automatically linked, and here we are also handling any subreddit manually with handler.js.

Pages examples

For our main page, pages/index.js:

// pages/index.js
import React from 'react';
import Link from 'next/link';

import Nav from './Nav.js';

export default props => (
  <main>
    <Nav>Main page</Nav>
    <h1>Hello {props.user}</h1>
    <p>I am working quite nicely</p>
    <Link href="/about">About me</Link>
  </main>
);

For more information about us:

import React from 'react';

import Link from 'next/link';
import Head from 'next/head';

export default class About extends React.Component {
  static async getInitialProps ({ req }) {
    return {
      server: !!req
    };
  }
  render () {
    return (
      <div>
        <style jsx>{`button { background: red; }`}</style>
        <Head>
          <title>Hello {this.props.server ? 'server' : 'client'}</title>
        </Head>
        Hi {this.props.server ? 'server' : 'client'}
        <Link href="/">
          <button>Homepage</button>
        </Link>
      </div>
    );
  }
}

For dynamic routes in pages/handler.js:

import React from 'react';
import Nav from './Nav.js';

export default props => (
  <div>
    <Nav>Sub!</Nav>
    <p>Subpage {props.url.query.subreddit}</p>
  </div>
);