【问题标题】:React static site with webpack使用 webpack 响应静态站点
【发布时间】:2016-04-29 04:40:04
【问题描述】:

我正在尝试按照本教程创建一个静态站点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 上发布。

【问题讨论】:

  • 对我来说,问题是在调用 callback 之前导入的某些模块(创建文档)期望文档存在。

标签: javascript reactjs webpack


【解决方案1】:

我猜这行导致错误:

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

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

【讨论】:

  • 我更新了 app.jsx 以从我创建的 App 类中创建元素。我在上面更新了我的答案。但我仍然得到同样的错误。 ReferenceError 中的错误:文档未定义
  • 我认为这里callback(null, '&lt;!DOCTYPE html&gt;' + html) 变量html 需要是一个合法的html 标记,该函数创建document 对象。不是&lt;Router&gt;,而是&lt;html&gt;,我的意思是。并且更好地使用Router,因为它在教程中给出:Router.run(Routes, locals.path, function (Handler) { var html = React.renderToStaticMarkup(React.createElement(Handler, locals)) callback(null, '&lt;!DOCTYPE html&gt;' + html) })
猜你喜欢
  • 2019-01-05
  • 1970-01-01
  • 2017-01-02
  • 2017-07-12
  • 2014-10-10
  • 2015-01-27
  • 2021-10-01
  • 2016-10-13
  • 2016-05-21
相关资源
最近更新 更多