2016-01-05 9 views
64

webpackとHtmlWebpackPluginを使用して、バンドルされたjsとcssをhtmlテンプレートファイルに挿入します。HtmlWebpackPluginは、ルート以外のWebサイトパスをロードするときに壊れる相対パスファイルを挿入します。

new HtmlWebpackPlugin({ 
    template: 'client/index.tpl.html', 
    inject: 'body', 
    filename: 'index.html' 
}), 

そして、次のhtmlファイルを生成します。

<!doctype html> 
<html lang="en"> 
    <head> 
    ... 
    <link href="main-295c5189923694ec44ac.min.css" rel="stylesheet"> 
    </head> 
    <body> 
    <div id="app"></div> 
    <script src="main-295c5189923694ec44ac.min.js"></script> 
    </body> 
</html> 

これはアプリlocalhost:3000/のルートを訪問したときに正常に動作しますが、私はバンドルファイルが絶対パスで注入されないので、例えば、別のURLからlocalhost:3000/items/1をアプリを訪問しようとすると失敗します。 htmlファイルがロードされると、react-routerがまだロードされていないので、存在しない/itemsディレクトリ内のjsファイルを探します。

HtmlWebpackPluginに絶対パスでファイルを注入するにはどうすればよいですか?expressは/distディレクトリのルートで、/dist/items/main-...min.jsではなくそれらを検索しますか?または、問題を回避するためにエクスプレスサーバーを変更することはできますか?

<script src="main...js"></script> 

はソースの先頭にスラッシュを持っている:

app.use(express.static(__dirname + '/../dist')); 

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

は基本的に、私はラインを取得する必要があります。

<script src="/main...js></script> 

答えて

104

あなたのWebPACKの設定でpublicPathを設定してみてください:

output.publicPath = '/' 

HtmlWebpackPlugin注入のURLを付加するpublicPathを使用しています。

もう1つの方法は、htmlテンプレートの<head>にベースhrefを設定して、ドキュメント内のすべての相対URLのベースURLを指定することです。

output.publicPath: './'; 

ために、それは非ルート・パスでの作業持っている:

<base href="http://localhost:3000/"> 
+3

ありがとうございます。 'output.publicPath ='/'が追加されました。 – aherriot

+3

リバースプロキシの背後で実行している場合、これは機能しません。 –

+0

HTMLテンプレートのホスト名をハードコードすることや、変数を補間することを避けるために、単純に ''を使うこともできます。 – Rafa

8

は実際に、私は入れていました。 は私が注入された。同時に:

baseUrl: './' 

<base href="<%= htmlWebpackPlugin.options.metadata.baseUrl %>"> 

に、両方のパラメータを設定すると、それが魅力のように働きました。

+0

これは 'https:// localhost/myproject /%3C%=%20htmlWebpackPlugin.options.baseUrl%20 %% 3E#/ project/1'というブラウザの' URL'を示しています。これを解決する方法はありますか? – NehaM