2017-01-11 6 views
2

シンプル・エクスプレス・サーバが提供するReactアプリケーションがあります。 Reactアプリケーションは、ルートディレクトリ(server.jsファイルもあります)のdistというディレクトリにwebpackです。 distフォルダにはindex.htmlエントリポイント、main.min.js JavaScriptバンドル、その他すべての静的アセット(CSS、画像など)が含まれます。レスキュー・ルータをExpressサーバと併用する

などのサイトのルートディレクトリにアクセスすると、index.htmlが配信され、JSバンドルが読み込まれ、他のすべてのアセットが正常に検出されます。アプリは、react-routerを使用して、ボタンのクリックによって細かくナビゲートし、localhost:3000/featureにつながるリンクが正常に機能します。

私は手動でlocalhost:3000/featureにアドレスバーや種類に入る場合は、サーバが期待通りindex.htmlを与えるが、またmain.min.jsの代わりにindex.htmlを提供しています。これは、高速サーバーのワイルドカード・ルートが、index.htmlを戻すようにマップされているためです。これは私がいくつかの記事でそれを見た方法ですが、このケースが考慮されているかどうかはわかりません。ここで

は、関連するサーバのコードの抜粋です:

app.use(express.static(path.join(__dirname))); 
app.get('*', function response(req, res) { 
    res.sendFile(path.join(__dirname, 'dist', 'index.html')); 
}); 

これは、サーバーのルーティングを定義するものです。これを行うより良い方法は、手動のアドレス変更を可能にするでしょうか?それは場合に役立ちます

は、ここに私のファイル構造です:index.html

|-root 
    |-server.js 
    |-webpack.config.js 
    |-dist/ 
    |-main.min.js 
    |-index.html 
    |-a2cea76fae187add3c974dcacf446eab.jpg 
    |-...etc 

内容:

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta http-equiv="x-ua-compatible" content="ie=edge"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
</head> 

<body> 
    <div id="root"><!-- React app --></div> 
    <script src="dist/main-631cea2c7e308b1dfb26.min.js"></script> 
</body> 
</html> 
+0

おそらくあなたは[この](https://github.com/ReactTraining/react-router/blob/master/docs/guides/ServerRendering.md) –

+0

@IslamIbakaevはこれが唯一の解決策である必要がありますか?私はできればサーバ側のレンダリング(今のところ)を避けたい。 –

+0

私は実際に "サーバー側の反応"を実行せずに反応ルータで設定したエクスプレス・マッチ・ルートを他のソリューションでは知りません –

答えて

2

相対パスを使用してスクリプトを参照しているためです。

たとえば、http://localhost:3000/featureの場合、ブラウザはスクリプトがhttp://localhost:3000/feature/dist/main-631cea2c7e308b1dfb26.min.jsには当然存在しないため、当然のことながら、express.staticミドルウェアはリクエストを次のミドルウェアに渡しています。

したがって、root relativeのパスとして定義する必要があります。

<script src="/dist/main-631cea2c7e308b1dfb26.min.js"></script> 
+1

@Alan Thomas - さらに、 'express.static'で' __dirname'を使うのは避けてください。さもなければ、サーバコードとwebpackの設定はブラウザからアクセスできます。あなたは 'path.join(__ dirname、 dist ') 'を実行し、スクリプトリファレンスを'/main-631cea2c7e308b1dfb26.min.js'に変更します。 – riscarrott

+0

相対パスが問題です。 webpackを使用している場合は、HtmlWebpackPluginを使用してchunkスクリプトタグをhtmlファイルに挿入できます。【 新しいHtmlWebpackPlugin({ テンプレート: 'ビュー/ index.htmlを' 注入: '本体'、 名: 'index.htmlを' }) ] 'これがデフォルト 'プラグインによって明示的なパスを設定します – bsyk

+0

@riscarrott相対パスを使ってスクリプトを参照するのはうまくいくようです。私はこれをテストするための基本的なアプリを作った。 https://react-express-alanqthomas.c9users.io/。ソース:https://ide.c9.io/alanqthomas/react-express。これは相対パスを使用しており、意図したとおりに動作します。 –

関連する問題