এইচটিএমএল ওয়েবপ্যাক প্লাগইন আপেক্ষিক পাথ ফাইলগুলিতে ইনজেকশন দেয় যা নন-রুট ওয়েবসাইটের পাথ লোড করার সময় ব্রেক হয়


114

আমি ওয়েবপ্যাক এবং এইচটিএমএল ওয়েবপ্যাকপ্লাগইনটি এইচটিএমএল টেমপ্লেট ফাইলে বান্ডিল্ড জেএস এবং সিএসএস ইনজেক্ট করতে ব্যবহার করছি।

new HtmlWebpackPlugin({
   template: 'client/index.tpl.html',
   inject: 'body',
   filename: 'index.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/, তবে আমি অন্য ইউআরএল থেকে অ্যাপটি দেখার চেষ্টা করার পরে ব্যর্থ হয়েছি, উদাহরণস্বরূপ, localhost:3000/items/1কারণ বান্ডিলযুক্ত ফাইলগুলি পরম পাথ দিয়ে ইনজেকশনের নয়। এইচটিএমএল ফাইলটি লোড হয়ে গেলে, এটি অস্তিত্বহীন /itemsডিরেক্টরিতে থাকা জেএস ফাইলের সন্ধান করবে কারণ প্রতিক্রিয়া-রাউটারটি এখনও লোড হয়নি।

আমি কীভাবে এইচটিএমএল ওয়েবপ্যাকপ্লাগিন পেতে পারি যাতে পরম পাথ দিয়ে ফাইলগুলি ইনজেক্ট করতে হয়, তাই এক্সপ্রেসগুলি আমার /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

আপনার ওয়েবপ্যাক কনফিগারেশনে সর্বজনীনপথটি সেট করার চেষ্টা করুন:

output.publicPath = '/'

এইচটিএমএল ওয়েবপ্যাক প্লাগইন ইনজেকশনের ইউআরএলগুলি চালিত করতে পাবলিকপথ ব্যবহার করে।

আরেকটি বিকল্প হ'ল বেস href সেট করা <head> আপনার এইচটিএমএল টেমপ্লেটের , আপনার নথিতে সমস্ত আপেক্ষিক url এর বেস url নির্দিষ্ট করতে।

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

7
ধন্যবাদ, যোগ output.publicPath = '/'করার সমাধান ছিল।
এহেরিয়ট

3
যদি আপনি বিপরীত প্রক্সি পিছনে ছুটে চলে তবে এটি কাজ করবে না।
t-আমার

4
আপনি <base href="https://stackoverflow.com/">এইচটিএমএল টেমপ্লেটে হোস্টের নামটি হার্ডকোড করা বা ভেরিয়েবলগুলি ইন্টারপোলেট করতে এড়াতে সহজভাবে ব্যবহার করতে পারেন ।
রাফা

আমার পাবলিকপথ = '' সেট করতে হয়েছিল এবং <বেস href = "~ / dist /"> যোগ করতে হয়েছিল যেহেতু আমার সাইটটি একটি এএসপি et নেট আইভিএস এবং ভার্চুয়াল ডিরেক্টরি ব্যবহার করে নেট এমভিসি প্রকল্প।
আরও জরুরি জেস্ট

16

আসলে, আমাকে এই কথাটি লিখতে হয়েছিল:

output.publicPath: './';

এটি কোনও অ-রুট পথে কাজ করার জন্য। একই সাথে আমি ইনজেকশন দিচ্ছিলাম:

   baseUrl: './'

মধ্যে

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

উভয় প্যারামিটার সেট সহ, এটি একটি কবজির মতো কাজ করেছে।


এটি URLব্রাউজারে যেমনটি দেখায় https://localhost/myproject/%3C%=%20htmlWebpackPlugin.options.baseUrl%20%%3E#/project/1। এটি সমাধান করার কোনও উপায় আছে?
NehaM

আপনি baseUrl: '.'এটি কোথায় সেট করছেন এইচটিএমএল ওয়েবপ্যাকপ্লাগিন বিকল্পগুলিতে? { meta: { baseUrl: './' } }?
কিছু কিছু

@ কিছু কিছু করার জন্য এখনই আমার হাতে এই ওয়েবপ্যাক প্রকল্পটি নেই এবং আমি এই উত্তর পোস্ট করার পরে (ডিফল্ট মান সহ) অনেক কিছুই পরিবর্তিত হয়েছে বলে আমি মনে করি। সুতরাং হ্যাঁ, এটি অবশ্যই এটি সেট করা উচিত, তবে './'এটি সঠিক মান।
কেভিন

1
এখন এটি সরাসরি বেস ট্যাগ ইনজেক্ট করতে পারে। বেস ট্যাগটি ইনজেক্ট করুন
লিয়াং

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.