HtmlWebpackPlugin, kök olmayan web sitesi yollarını yüklerken kopan göreceli yol dosyalarını enjekte eder


116

Paketlenmiş js ve css'yi bir html şablon dosyasına enjekte etmek için webpack ve HtmlWebpackPlugin kullanıyorum.

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

Ve aşağıdaki html dosyasını üretir.

<!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>

Bu, uygulamanın kökünü ziyaret ederken iyi çalışıyor localhost:3000/, ancak uygulamayı başka bir URL'den ziyaret etmeye çalıştığımda başarısız oluyor, örneğin, localhost:3000/items/1paketlenen dosyalar mutlak bir yolla enjekte edilmediğinden. Html dosyası yüklendiğinde, /itemsreact-router henüz yüklenmediği için var olmayan dizinin içinde js dosyasını arayacaktır .

HtmlWebpackPlugin'in dosyaları mutlak bir yolla enjekte etmesini nasıl sağlayabilirim, bu yüzden express onları dizinimde /distdeğil dizinimin kökünde arayacaktır /dist/items/main-...min.js? Veya sorunu çözmek için ekspres sunucumu değiştirebilir miyim?

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

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

Esasen, şu satırı almam gerekiyor:

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

kaynağın başında bir eğik çizgi olması.

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

Yanıtlar:


201

PublicPath'i web paketi yapılandırmanızda ayarlamayı deneyin:

output.publicPath = '/'

HtmlWebpackPlugin, enjektelerin url'lerini başa eklemek için publicPath'i kullanır.

Diğer bir seçenek de <head>, belgenizdeki tüm göreli url'lerin temel url'sini belirtmek için html şablonunuzun temel href'ini ayarlamaktır .

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

7
Teşekkürler output.publicPath = '/', çözüm eklemek oldu.
aherriot

3
Ters proxy'nin arkasında çalışıyorsanız bu çalışmayacaktır.
t-my

4
Ayrıca <base href="https://stackoverflow.com/">, ana bilgisayar adını HTML şablonuna gömmek zorunda kalmamak veya değişkenleri enterpolasyon yapmak zorunda kalmamak için de kullanabilirsiniz.
Rafa

Sitem IIS ve sanal dizin kullanan bir ASP.Net MVC projesi olduğundan publicPath = '' ayarlamam ve <base href = "~ / dist /"> eklemem gerekiyordu.
daha acil jest

16

Aslında şunu koymak zorundaydım:

output.publicPath: './';

KÖK olmayan bir yolda çalışmasını sağlamak için. Aynı zamanda enjekte ediyordum:

   baseUrl: './'

içine

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

Her iki parametre setiyle bir cazibe gibi çalıştı.


Bu, URLtarayıcıda olarak gösterir https://localhost/myproject/%3C%=%20htmlWebpackPlugin.options.baseUrl%20%%3E#/project/1. Bunu çözmenin bir yolu var mı?
NehaM

Nerede ayarlıyorsunuz baseUrl: '.'o HtmlWebpackPlugin seçenekleri var? { meta: { baseUrl: './' } }?
SomethingOn

@SomethingOn Şu anda elimde bu web paketi projesi yok ve bu yanıtı yayınladığımdan bu yana pek çok şeyin değiştiğini düşünüyorum (varsayılan değer dahil). Yani evet, bu kesinlikle ayarlanması gereken yerdir, ancak './'doğru değerdir.
Kevin FONTAINE

1
Artık temel etiketi doğrudan enjekte edebilir. temel etiketi enjekte edin
Liang

2

web paketi yapılandırmasında

config.output.publicPath = ''

index.html'nizde

<base href="/someurl/" />

bunu yapmalı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.