2016-05-03 2 views
4

マイserver.jsファイルはノードで書かれており、このようになりますされています。私の反応ルータコードルックスを含んどのように既存のアプリケーションを大幅に変更することなく、反応コンポーネントをサーバー上でレンダリングできますか?

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"> 
    <title>what ever</title> 
    <link href="https://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic" rel="stylesheet" type="text/css"> 
     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" media="screen" title="no title" charset="utf-8"> 
    </head> 
    <body> 
    <div id='root'/> 
    </body> 
    <script src="/bundle.js"></script> 
</html> 

マイindex.jsファイル:

var path = require('path'); 
var express = require('express'); 
var app = express(); 
var PORT = process.env.PORT || 8080 

// using webpack-dev-server and middleware in development environment 
if(process.env.NODE_ENV !== 'production') { 
    var webpackDevMiddleware = require('webpack-dev-middleware'); 
    var webpackHotMiddleware = require('webpack-hot-middleware'); 
    var webpack = require('webpack'); 
    var config = require('./webpack.config'); 
    var compiler = webpack(config); 

    app.use(webpackDevMiddleware(compiler, { noInfo: true, publicPath: config.output.publicPath })); 
    app.use(webpackHotMiddleware(compiler)); 
} 

app.use(express.static(path.join(__dirname, 'dist'))); 

app.get('*', function(request, response) { 
    response.sendFile(__dirname + '/dist/index.html') 
}); 

app.listen(PORT, function(error) { 
    if (error) { 
    console.error(error); 
    } else { 
    console.info("Listening on port %s", PORT); 
    } 
}); 

私のindex.htmlには、このようになります

import React from 'react'; 
import { render } from 'react-dom'; 
import { Router, Route, browserHistory, hashHistory } from 'react-router'; 

/*----------- STYLESHEETS -----------*/ 
require('./assets/stylesheets/base.scss'); 

let history = process.env.NODE_ENV === "production" ? browserHistory : hashHistory; 
/*----------- ROUTE COMPONENTS -----------*/ 
import Home from './components/home'; 
import Company from './components/company'; 
import Features from './components/features'; 
import Help from './components/help'; 
import SignUp from './components/signup'; 
import Work from './components/work'; 
render((
    <Router history={history}> 
    {/** ###### HOME ROUTE ###### */} 
    <Route path="/" component={Home} /> 
    <Route path="/company" component={Company} /> 
    <Route path="/help" component={Help} /> 
    <Route path="/features" component={Features} /> 
    <Route path="/signup" component={SignUp} /> 
    <Route path="/work" component={Work} /> 
    {/** ###### END HOME ROUTES ###### */} 
    </Router> 
), document.getElementById('root')); 

私はwebpackを使用して、sassやimagesなどのアセットを作成しています。 thisチュートリアルを使用してサーバー経由で1ページをレンダリングすることはできましたが、CSSと画像は表示されず、アプリの流れも完全には見えないように見えます。サーバ上でレンダリングする800000種類のライブラリを使用しない、軽量の単純なアプリケーションの例

+0

Reduxのから「ユニバーサル」たとえば、あなたを助けるかもしれない:https://github.com/reactjs/redux/tree/マスター/例/ユニバーサル。サーバーレンダリングを備えたシンプルなアプリケーションです。必要に応じて、redux部品を無視するのは簡単です。 –

答えて

0

私は似たようなことを探していて、このブログが役立っています。あなたもそれに従ってみてください。セットアップが簡単で始めることができます。 Server side rendering with react, node & express

1

主な問題は、Nodeがあなたの非js/jsonアセットを処理する方法を知らないことです。

Webpackによってボックスの外でサポートされている1つのソリューションは、ノードにrequiredの準備ができたバンドルを生成するtarget: 'node'output.libraryTarget: commonjs2を使用することです。

また、ExtractTextPluginを見て、CSSを別のファイルに抽出することもできます。そうしないと、JSがダウンロードされるまでHTMLが非スタイルにレンダリングされます。リアクトルータを使用する場合には、取得

はもう少し複雑ですが、いくつかの良いドキュメントがここにあります - https://github.com/reactjs/react-router/blob/master/docs/guides/ServerRendering.md

関連する問題