简体   繁体   中英

React static site with webpack

I'm trying to create a static site following this tutorial http://jxnblk.com/writing/posts/static-site-generation-with-react-and-webpack/

I'm currently getting this error: ERROR in ReferenceError: document is not defined

This is my app.jsx file:

import React from 'react';
import ReactDOM from 'react-dom';
import { Router } from 'react-router';
import routes from './config/routes';



class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
        }
    }
    render() {
        return (
            <Router>{routes}</Router>
        );
    }
}
export default App;
module.exports = function render(locals, callback) {
  var html = React.renderToStaticMarkup(React.createElement(App, locals))
  callback(null, '<!DOCTYPE html>' + html)
}

Routes:

import React from 'react';
import { Route, IndexRoute } from 'react-router';
import Layout from '../components/layout';
import Home from '../components/home';

export default (
  <Route path="/" component={Layout}>
    <IndexRoute component={Home} />
  </Route>
);

layout.jsx component:

import React from 'react';
import Nav from './nav';
import Footer from './footer';

import Styles from '../styles.scss';

class Layout extends React.Component {
  constructor(props) {
    super(props);
    this.state = {

    }
  }
  render() {
    return (
      <div id="layout" className={Styles.main}>
      <Nav />
      {this.props.children}
      <Footer />
      </div>
    )
  }

}

Layout.PropTypes = {
  children: React.PropTypes.object.isRequired
}



export default Layout;

and my webpack.config.js file:

/* eslint-disable */
var path              = require('path'),
    webpack           = require('webpack'),
    autoprefixer      = require('autoprefixer'),
    OpenBrowserPlugin = require('open-browser-webpack-plugin');
    StaticSiteGeneratorPlugin = require('static-site-generator-webpack-plugin');
    data = require('./data');

var configServe = {
    port: 9100,
};


module.exports = {
    devServer: {
        hot: true,
        inline: true,
        historyApiFallback: true,
        progress: true,
        port: configServe.port,
    },

    entry: [
        'webpack/hot/dev-server',
        'webpack-dev-server/client?http://localhost:' + configServe.port,
        path.resolve(__dirname, './src/app.jsx'),
    ],
    output: {
        path: __dirname,
        filename: './dist/bundle.js',
        libraryTarget: 'umd'
    },
    module: {
        loaders: [
            {
                // JSX files :
                test: /\.js[x]?$/,
                include: path.resolve(__dirname, 'src'),
                exclude: /node_modules/,
                loader: 'babel-loader?presets[]=es2015&presets[]=react',
            },
            {
                // CSS files :
                test: /\.css?$/,
                include: path.resolve(__dirname, 'src'),
                loader: 'style-loader!css-loader!postcss-loader',
            },
            {
                // SCSS files :
                test: /\.scss?$/,
                include: path.resolve(__dirname, 'src'),
                loader: 'style-loader!css-loader!postcss-loader!sass',
            },
            {
                test: /\.(png|jpg)$/,
                include: path.resolve(__dirname, 'src'),
                loader: 'file-loader'
            },
            {
                test: /\.svg$/,
        loader: 'svg-inline'
            }
        ],
    },
    postcss: [
        autoprefixer({ browsers: ['last 3 versions'] }),
    ],

    plugins: [
        // Avoid publishing files when compilation fails
        new StaticSiteGeneratorPlugin('./dist/bundle.js', data.routes, data),
        new webpack.NoErrorsPlugin(),
        new webpack.HotModuleReplacementPlugin(),
        new OpenBrowserPlugin({ url: 'http://localhost:' + configServe.port }),
    ],

    resolve: {
        extensions: ['', '.js', '.jsx'],
    },

    stats: {
        // Nice colored output
        colors: true,
    },

    // Create Sourcemaps for the bundle
    devtool: 'source-map',
};

Hopefully someone can help me figure this out. I'd like to eventually bundle this all in a non-opinionated way of creating static webpages with React and posting on github.

I guess this line is causing error:

var html = React.renderToStaticMarkup(React.createElement(Root, locals))

There you are using some Root component, but concluding from your code it is not defined. Also it is defined in tutorial (you have pointed out) by this line: var Root = require('./components/Root.jsx')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM