2016-01-08 7 views
8

私は同形の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)で見てきた

ガイドは、サーバ側のレンダリングが行われる様子は全く素晴らしいですが、それらのどれもが本当にすべて必要とし、その他もろもろ解決する方法について話していません。

+0

ここにいくつかの質問があるように聞こえる:サーバー側を実行している場合(a)はどのように私はエイリアスを使用しないと、(b)どのように私は、サーバー上のスタイルシートなどの付属リソースを処理しますが。 1つの解決策は、webpackを通じてサーバーコードを実行することです。あなたの設定で 'target:node'を使うことができます。ビルド時にnodeに対して最適化されます(つまり、ノードincludeをバンドルしません)。私はBabelを使用するコードでこれを行うことがあります。ビルドを行うのが短く、間違いなく別名を使用しないでください。どんな解決策も最高でハッキリです。 –

+0

エイリアスを使用しないのはなぜですか? – barndog

+0

webpackを使って* build *を実行しているときに別名を付けても問題ありません。あなたの問題は、Webpackビルドでエイリアスを使用しており、同じコードをWebpackビルド外で*動作させるためです。私の指摘は、エイリアスを使用するには、サーバーコードを作成する必要があります(エイリアスが正常に動作するようになります)。ビルドがなければ、エイリアスを動作させる唯一の方法は、あなたの問題がどこにあるかを一緒にハックすることです。ハックは悪いので、エイリアスを使用してサーバーコードを作成するか、エイリアスを放棄してください。 –

答えて

1

あなたが本当にそれらを望むなら、babelを通してサーバー側のコードを実行し、このプラグインを使用してください:https://www.npmjs.com/package/babel-plugin-module-aliasこれはwebpackと同じことをさせるでしょう。

編集:この1つはかなり良く動作します。https://github.com/jagrem/babel-resolve-relative-moduleそれは複数のパス

+0

それらを使用しない理由は何ですか? – barndog

+0

ちょうど問題を引き起こすように思えますし、サーバ上のプラグインを最低限必要とし、おそらくあなたのコードベース全体をBabelから実行しなければなりません。私が推測しているのはうまくいきますが、あなたがバベルを引き出す唯一の理由がエイリアスのためであれば、多くの仕事のようです。 – zackify

+0

バベルのプラグインにリンクしてくれてありがとうございます!私はエイリアシングのために物事のバベル側を見ることを考えなかった。これは私をたくさん助けました! – Kevin

1

NODE_PATHを使用してみてくださいことができます。ノードは、必要なコール中に常にこのパスのモジュールを探します。それはあなたが望むように、あなたの相対的なパスを短くカットすることができます。

// turn this 
import {Widget} from '../../components'; 

// into this 
import {Widget} from 'components'; 

詳細については、Node.js docsを参照してください。

P.S.この物は非常に敏感ですので、注意深く使用してください。コードは環境に密接に依存し、どこかで壊れる可能性があります。

2

この問題で2日間戦った後、私はbabel-plugin-webpack-aliasで解決しました。それにパスを解決するための What you need to doは次のとおりです。

  1. $ npm install --save-dev babel-plugin-webpack-alias
  2. あなた.babelrcにプラグインを追加するには、WebPACKのにエイリアスを追加します。設定(あなたがpath.join()を使用してください)あなたは、私が試した他のオプションはuniversal-webpackた問題ロードスタイル

を持っている場合

  • this postを参照してくださいが、私はそれは少し冗長であることが判明。おおよそのサーバーサイドローディングがどのように機能するかを確認するには、this videoをチェックしてください。