[解決済み] HtmlWebpackPluginが相対パスファイルを注入し、非ルートのウェブサイトパスを読み込むと壊れる件
2022-06-04 21:41:30
質問
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 ファイルが読み込まれると、存在しない
/items
ディレクトリの中にあるjsファイルを探します。
HtmlWebpackPlugin に絶対パスでファイルを注入させるには、どうすればよいでしょうか。
/dist
ディレクトリではなく
/dist/items/main-...min.js
? または、私は問題を回避するために私のexpressサーバを変更することができますか?
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の設定にpublicPathを設定してみてください。
output.publicPath = '/'
HtmlWebpackPluginはpublicPathを使用して、注入するURLの前に追加します。
他の方法として、ベースとなる href を
<head>
で、ドキュメント内のすべての相対 URL のベースとなる URL を指定することです。
<base href="http://localhost:3000/">
関連
-
Vueの要素ツリーコントロールに破線を追加する説明
-
JavaScriptの配列共通メソッド解説
-
[解決済み] テスト
-
[解決済み】SyntaxError: JSONの位置1に予期しないトークンoがある。
-
[解決済み】"フォームが接続されていないため、フォームの送信がキャンセルされました "というエラーの取得について
-
[解決済み】Node.js Error: Cannot find module express
-
[解決済み】「X-Frame-Options」を「SAMEORIGIN」に設定したため、フレームでの表示を拒否された。
-
[解決済み] Web API エラー - このリクエストはブロックされました; コンテンツは HTTPS で提供されなければなりません
-
[解決済み】ExpressJS : res.redirect()が期待通りに動かない?
-
[解決済み】リクエストに失敗していないのに、「TypeError: failed to fetch」が表示される。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JSアレイループと効率解析の比較
-
vue+webrtc(Tencent cloud)ライブ機能の実践を実現するために
-
vue ディレクティブ v-html と v-text
-
Vueのフィルタの説明
-
Vueの一般的な組み込みディレクティブの説明
-
[解決済み] 配列の結合時に未定義のプロパティ 'push' を読み込むことができない
-
[解決済み] Web API エラー - このリクエストはブロックされました; コンテンツは HTTPS で提供されなければなりません
-
[解決済み】React - TypeError: 未定義のプロパティ 'props' を読み取ることができない。
-
[解決済み】JavaScriptエラー(Uncaught SyntaxError: Unexpected end of input)
-
Uncaught TypeError: null のプロパティ 'offsetHeight' を読み取れませんでした。