2016-02-21 6 views
6

私は、ノードバックエンドサーバーを持つAngular2アプリ用のWebpackベースのフローを設定しようとしています。何時間も頭を悩まして、クライアントを幸せに育てることができましたが、サーバービルドの統合方法を理解できません。私のサーバはジェネレータを使用しているので、ES6をターゲットにする必要があり、別の入力ファイル(browser.d.tsではなくmain.d.ts)を指す必要があります。クライアント/サーバーノードをセットアップしたWebpack?

ソースツリーは次のようになります。

/ 
-- client/ 
-- -- <all my angular2 bits> (*.ts) 
-- server/ 
-- -- <all my node/express bits> (*.ts) 
-- webpack.config.js 
-- typings/ 
-- -- browser.d.ts 
-- -- main.d.ts 

私は、クライアントとサーバーのフォルダ内だけtsconfig.jsonが働くだろう、おそらく思っていないが、そこには運。また、私のサーババンドルを無視してindex.htmlに挿入しないhtml-webpack-pluginを入手する方法も見つけられません。私の現在のtsconfigとwebpackは以下の通りですが、誰もwebpackを使ってこのような設定をバンドルすることに成功しましたか?どんな指針も大変ありがとうございます。

{ 
    "compilerOptions": { 
     "target": "es5", 
     "module": "commonjs", 
     "moduleResolution": "node", 
     "sourceMap": true, 
     "declaration": false, 
     "removeComments": true, 
     "noEmitHelpers": false, 
     "emitDecoratorMetadata": true, 
     "experimentalDecorators": true 
    }, 
    "files": [ 
     "typings/browser.d.ts", 
     "client/app.ts", 
     "client/bootstrap.ts", 
     "client/polyfills.ts" 
    ] 
} 

と私のwebpack.config.js;

var Webpack = require('webpack'); 
var HtmlWebpackPlugin = require('html-webpack-plugin'); 
var Path = require('path'); 

module.exports = { 
    entry: { 
    'polyfills': Path.join(__dirname, 'client', 'polyfills.ts'), 
    'client': Path.join(__dirname, 'client', 'bootstrap.ts') 
    }, 
    output: { 
    path:  Path.join(__dirname, 'dist'), 
    filename: '[name].bundle.js' 
    }, 
    resolve: { 
    extensions: ['', '.js', '.json', '.ts'] 
    }, 
    module: { 
    loaders: [ 
     { 
     test: /\.ts$/, 
     loader: 'ts-loader', 
     query: { 
      ignoreDiagnostics: [ 
      2403, // 2403 -> Subsequent variable declarations 
      2300, // 2300 -> Duplicate identifier 
      2374, // 2374 -> Duplicate number index signature 
      2375, // 2375 -> Duplicate string index signature 
      ] 
     } 
     }, 
     { test: /\.json$/, loader: 'raw' }, 
     { test: /\.html$/, loader: 'raw' }, 
     { test: /\.css$/, loader: 'raw!postcss' }, 
     { test: /\.less$/, loSWE: 'raw!postcss!less' } 
    ] 
    }, 
    plugins: [ 
    new HtmlWebpackPlugin({ template: 'client/index.html', filename: 'index.html' }), 
    new Webpack.optimize.CommonsChunkPlugin('common', 'common.bundle.js') 
    ] 
}; 

答えて

7

は個人的に、私はと活字体で私の角度2アプリ(ノードで利用できるようになりましたES2015のほとんどで)平野JSの私のサーバー側のコードを記述する傾向があるので、この問題が出てくることはありません。しかし、これをWebpackで動作させることができます。

まず、クライアントサイドコード用とサーバー側用の2つのWebpack設定が必要です。 1つの設定でそれを行うことは可能かもしれませんが、たとえそれがあったとしても、それは価値があるよりも面倒です。サーバー側の設定にtarget: 'node'を設定してください(target: 'web'はクライアント側で自動的に設定されています)。そして、サーバー側のファイルにはentryポイントを設定してください(上記のファイルは表示されませんが、最終的には別の設定で使用します)。

第2に、複数のtsconfigファイルが必要です。既定では、ts-loaderはルートディレクトリのtsconfig.jsonを検索します。ただし、you can tell specify another fileは、オプションオブジェクトまたはクエリ文字列/オブジェクトにconfigFileName: 'path/to/tsconfig'を設定します。

しかし、これは別の問題につながる可能性があります。あなたのIDEはあなたのルートディレクトリにあなたのtsconfig.jsonファイルも探します。別々のファイルが2つある場合は、どのファイルにどのファイルを使用するかをIDEに指示する方法が必要です。これに対する解決方法はIDEによって異なります。個人的には、私はatom-typescriptとAtomを使用します。これは素晴らしいですが、複数のtsconfigファイルのように見えます。still being worked onです。ありがたいことに私はこの問題を心配する必要はありませんでした。

html-webpack-pluginの問題については、サーバー側の設定にプラグインを含めないため、気にする必要はありません。ただし、参考のためにexcludeChunks: ['someChunkName']omit certain chunksに渡すことはスクリプトタグに含まれないようにすることができます。

+0

ありがとうございました!私はこれが実際に実行可能かもしれないと思う、唯一の質問は..どのようにWebpackを起動して(nodemon)サーバー側にし、webpack --watchを使うときに変更時に再起動するのですか? – XeroxDucati

+0

私は問題を理解しているかどうかはわかりません。 nodemonを使用している場合は、メイン出力ファイル(例: 'nodemon。/ build/server.js'です。サーバー側の出力ファイルに対するすべてのファイルの変更時に再起動する必要があります。 'webpack ... --watch'を使うと、入力ファイルが変わるたびに出力ファイルが変わります。言い換えれば、webpackはあなたのサーバを再起動する責任を負いません。ノーデモン意志。それは動作しませんか? – McMath

+1

私はちょうど何かを考えました。サーバーサイドのビルドにwebpackが必要な場合は、考慮しましたか?私はちょうど 'tsc -p ./server -w'のようなものを使う方が簡単かもしれないと思っていました。/ server'にはサーバ側コードと 'tsconfig.json'ファイルが含まれています。 – McMath