React/Node/Expressを使用するのがかなり新しいので、私はkytをボイラープレートとして選択しました。作業するファイルの基本セット。私はデフォルトのReactスターターkytを使用しています。JSONをReact/Node/Expressユニバーサルアプリケーションにロードしていますが、バンドルしていません
私の仕事は、CMSからダンプされたJSONの束を取ってそれをReactサイトにすることです。
これを行うには、このJSONファイルのデータを「経路」に取り込む必要があります。私は以下に掲載されたコードを使用しましたが、これは素晴らしいです。しかし、ここで問題となるのは、JSONの「インポート」は、データがwebpackによってバンドルにコンパイルされたことを意味します。これは、CMSがJSONファイルを更新するまで有効です。その時点でbundle.jsは更新されません(CMSのアップデートのたびにバンドルを再コンパイルするコードを書いていない限り、それは私のサウンドが気に入らない)古いものをレンダリングします。
私が必要とするのは、コンパイル時にではなく、実行時にJSONファイルをロードするコードです。
誰でも私をここに向けることができますか?私は、AJAX/axiosリクエストを含むたくさんのものを試しましたが、何も動作していないようです。私はWebpackの 'System.import'機能が私の試したことに役立つかもしれないが、コンパイルしたバンドルに自分のデータをバンドルすることも読んでいます。
import React from 'react';
import Route from 'react-router/lib/Route';
import IndexRoute from 'react-router/lib/IndexRoute';
import App from '../components/App.js';
import Home from '../components/Home.js';
import Standard from '../components/Standard.js';
import Listing from '../components/Listing.js';
import FourOhFour from '../components/FourOhFour.js';
// THIS IS THE PROBLEM - I don't want this to be bundled
import Model from '../app-json/model.json';
const componentRegistry = {
"Home": Home,
"Standard": Standard,
"Listing": Listing,
"FourOhFour": FourOhFour
}
function buildDynamicRoutes(config){
var routeJSX = [];
Object.keys(Model.posts).map((key) => {
var thisComponent = '';
if(Model.posts[key].template === 'page-listings.php'){
thisComponent = 'Listing';
} else if(Model.posts[key].template === ''){
thisComponent = 'Standard';
}
routeJSX.push(
<Route path={Model.posts[key].route} components={componentRegistry[thisComponent]} key={key} />
);
});
return routeJSX;
}
const routes = (
<Route path="/" component={App}>
<IndexRoute component={Home} />
{ buildDynamicRoutes() }
<Route path="*" component={FourOhFour}/>
</Route>
);
export default routes;
こんにちは、お返事ありがとうございます。クライアント側のReactにデータをロードすることは問題ではありません。これは、Express/Nodeが実行されるときにサーバー側にデータをロードすることに関連しています。サーバー側のレンダリングは私のプロジェクトにとって不可欠なので、私はこの答えを受け入れることができません。 – rorymorris89
@ rorymorris89あなたの質問に同形レンダリングの詳細がありません。 CMSに接続して最初のJSON以降のアップデートを取得したように、その内容を含めるように変更できますか?代わりに、これはOSSですか、githubリンクが役立ちます。 – hazardous
@Alex Andersonあなたの答えを更新していただきありがとうございます。 'request'や' http'や 'axios'を使うと動作しません。非同期なので、リクエストが終了する前に' export default routes'を含めて残りのファイルが実行されます。私は 'sync-request'を使うことができますが、それは悪いです(明らかに)。私はあなたが言及したように 'fs'を使って試してみました - しかし、これも、不愉快なことに、Webpackの' bundle.js'にバンドルされています(元の 'import'の仕組みと同じです)。 – rorymorris89