用webpack反应静态站点

时间:2016-04-29 04:40:05

标签: javascript reactjs webpack

我正在尝试按照本教程http://jxnblk.com/writing/posts/static-site-generation-with-react-and-webpack/

创建静态网站

我目前收到此错误:ReferenceError中的错误:文档未定义

这是我的app.jsx文件:

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)
}

路线:

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组件:

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;

和我的webpack.config.js文件:

/* 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',
};

希望有人可以帮我解决这个问题。我想最终以一种非自主的方式将这一切捆绑在一起,用React创建静态网页并在github上发布。

1 个答案:

答案 0 :(得分:0)

我猜这一行导致错误:

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

你正在使用一些Root组件,但是从你的代码得出的结论是没有定义的。此外,它在教程(您已经指出)中由此行定义:var Root = require('./components/Root.jsx')