WebpackとHtmlWebpackPluginを使用して、バンドルされたjsとcssをhtmlテンプレートファイルに挿入します。
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
ディレクトリのルートでそれらを検索しますか?または、問題を回避するためにエクスプレスサーバーを変更できますか?
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>
ソースの先頭にスラッシュを付けます。
<script src="/main...js></script>
Webpack configでpublicPathを設定してみてください:
output.publicPath = '/'
HtmlWebpackPluginはpublicPathを使用して、注入のURLを付加します。
別のオプションは、HTMLテンプレートの<head>
にベースhrefを設定し、ドキュメント内のすべての相対URLのベースURLを指定することです。
<base href="http://localhost:3000/">
実際には、私は置く必要がありました:
output.publicPath: './';
非ROOTパスで機能させるために。同時に私は注入していました:
baseUrl: './'
に
<base href="<%= htmlWebpackPlugin.options.metadata.baseUrl %>">
両方のパラメータを設定すると、それは魅力のように機能しました。
webpack configで
config.output.publicPath = ''
あなたのindex.htmlで
<base href="/someurl/" />
これでうまくいくはずです。