HtmlWebpackPlugin सापेक्ष पथ फ़ाइलों को इंजेक्ट करता है जो गैर-रूट वेबसाइट पथ लोड करते समय टूट जाती हैं


115

मैं एक html टेम्पलेट फ़ाइल में बंडल किए गए js और css को इंजेक्ट करने के लिए वेबपैक और HtmlWebpackPlugin का उपयोग कर रहा हूं।

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? या हो सकता है कि मैं मुद्दे के आसपास काम करने के लिए अपना एक्सप्रेस सर्वर बदल सकूं?

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>

जवाबों:


199

अपने वेबपैक कॉन्फ़िगरेशन में publicPath सेट करने का प्रयास करें:

output.publicPath = '/'

HtmlWebpackPlugin इंजेक्शन के url को रोकने के लिए publicPath का उपयोग करें।

एक अन्य विकल्प <head>अपने HTML टेम्पलेट के बेस href को सेट करना है , अपने दस्तावेज़ में सभी रिश्तेदार यूआरएल के आधार यूआरएल को निर्दिष्ट करना है।

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

7
धन्यवाद, जोड़ना output.publicPath = '/'समाधान था।
एहरीर

3
यदि आप रिवर्स प्रॉक्सी के पीछे भाग रहे हैं तो यह काम नहीं करेगा।
t-my

4
आप <base href="https://stackoverflow.com/">HTML टेम्पलेट में होस्ट नाम को हार्डकोड करने से रोकने के लिए, या चरों को प्रक्षेपित करने के लिए भी उपयोग कर सकते हैं ।
रफा

मुझे publicPath = '' सेट करना था और <आधार href = "~ / dist /" जोड़ना था क्योंकि मेरी साइट IIS और वर्चुअल निर्देशिका का उपयोग करके ASP.Net MVC प्रोजेक्ट है।
अधिक तत्काल जेस्ट

16

वास्तव में, मुझे लगाना था:

output.publicPath: './';

गैर-रूट पथ में काम करने के लिए। उसी समय मैं इंजेक्शन लगा रहा था:

   baseUrl: './'

में

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

दोनों पैरामीटर सेट के साथ, यह एक आकर्षण की तरह काम करता था।


यह URLब्राउज़र के रूप में दिखाता है https://localhost/myproject/%3C%=%20htmlWebpackPlugin.options.baseUrl%20%%3E#/project/1। क्या इसका हल करने का कोई तरीका है?
नेहा

आप baseUrl: '.'इसे कहां स्थापित कर रहे हैं यह HtmlWebpackPlugin विकल्पों में है? { meta: { baseUrl: './' } }?
SomethingOn

@SomethingOn मेरे पास इस वेबपैक प्रोजेक्ट को अभी हाथ में नहीं है, और मुझे लगता है कि मैंने इस उत्तर (डिफ़ॉल्ट मान सहित) को पोस्ट करने के बाद बहुत सारी चीजें बदल दी हैं। तो हां, यह निश्चित रूप से है जहां इसे सेट किया जाना चाहिए, लेकिन './'सही मूल्य है।
केविन फॉनटेन

1
अब यह सीधे आधार टैग को इंजेक्ट कर सकता है। बेस टैग इंजेक्ट करें
लियांग

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.