私は同形のReact/React-Router/Redux/Webpackアプリケーションを構築していますが、サーバー側のレンダリングを実装しようとしています。ノードJSのWebpackエイリアスサーバコード
私のディレクトリは次のようになります。私のWebPACKの設定では
/client
/actions
/components
/containers
/server
/server.js
、私はクライアント内のすべてのフォルダの設定エイリアスを持っている:
var path_base = path.resolve(__dirname, '..');
const resolve = path.resolve;
const base = function() {
var args = [path_base];
args.push.apply(args, arguments);
return resolve.apply(resolve,args);
};
const resolve_alias = base.bind(null, 'src/client');
const aliases = [
'actions',
'components',
'constants',
'containers',
'middleware',
'reducers',
'routes',
'store',
'styles',
'utils',
'validation'
];
コード内のWebPACKで束ねますそのように私はできます:
import { Widget } from 'components';
そしてインポートはwebpackによって解決されます。
私のサーバーコードでは、レンダリングを行うために、routes/index.js
のようなクライアントファイルの一部をインポートする必要があります。ルートファイルをインポートするときに実行している問題、別のファイルにwebpackエイリアスを使用している、つまりcomponents
またはcontainers
と言うように、ノードjsはシステムがそれを解決できないことを自然に要求します。
どうすれば修正できますか?私はthis questionを見て、基本的にはwebpackにある同じエイリアスをmock-requireで設定することについて話します。しかし、問題は、ルートファイルがすべてのコンポーネントをインポートし、スタイルシート、イメージなどのすべてをインポートすることになります。webpack-isomorphic-toolsのようなものを使用する必要がありますか?私は(例えばthis)で見てきた
ガイドは、サーバ側のレンダリングが行われる様子は全く素晴らしいですが、それらのどれもが本当にすべて必要とし、その他もろもろ解決する方法について話していません。
ここにいくつかの質問があるように聞こえる:サーバー側を実行している場合(a)はどのように私はエイリアスを使用しないと、(b)どのように私は、サーバー上のスタイルシートなどの付属リソースを処理しますが。 1つの解決策は、webpackを通じてサーバーコードを実行することです。あなたの設定で 'target:node'を使うことができます。ビルド時にnodeに対して最適化されます(つまり、ノードincludeをバンドルしません)。私はBabelを使用するコードでこれを行うことがあります。ビルドを行うのが短く、間違いなく別名を使用しないでください。どんな解決策も最高でハッキリです。 –
エイリアスを使用しないのはなぜですか? – barndog
webpackを使って* build *を実行しているときに別名を付けても問題ありません。あなたの問題は、Webpackビルドでエイリアスを使用しており、同じコードをWebpackビルド外で*動作させるためです。私の指摘は、エイリアスを使用するには、サーバーコードを作成する必要があります(エイリアスが正常に動作するようになります)。ビルドがなければ、エイリアスを動作させる唯一の方法は、あなたの問題がどこにあるかを一緒にハックすることです。ハックは悪いので、エイリアスを使用してサーバーコードを作成するか、エイリアスを放棄してください。 –