HtmlWebpackPlugin ฉีดไฟล์พา ธ สัมพัทธ์ซึ่งแตกเมื่อโหลดเส้นทางเว็บไซต์ที่ไม่ใช่รูท


116

ฉันใช้ 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 ไฟล์จะค้นหาไฟล์ js ภายใน/itemsไดเร็กทอรีที่ไม่มีอยู่จริงเนื่องจาก react-router ยังไม่ได้โหลด

ฉันจะให้ 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>

คำตอบ:


199

ลองตั้งค่า publicPath ในการกำหนดค่า webpack ของคุณ:

output.publicPath = '/'

HtmlWebpackPlugin ใช้ publicPath เพื่อนำหน้า urls ของการแทรก

อีกทางเลือกหนึ่งคือการตั้งค่า href พื้นฐานใน<head>เทมเพลต html ของคุณเพื่อระบุ url พื้นฐานของ URL สัมพัทธ์ทั้งหมดในเอกสารของคุณ

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

7
ขอบคุณการเพิ่มoutput.publicPath = '/'เป็นทางออก
aherriot

3
วิธีนี้จะใช้ไม่ได้หากคุณใช้งานย้อนกลับพร็อกซี
t-my

4
นอกจากนี้คุณยังสามารถใช้<base href="https://stackoverflow.com/">เพื่อหลีกเลี่ยงการเข้ารหัสชื่อโฮสต์ในเทมเพลต HTML หรือต้องแก้ไขตัวแปร
Rafa

ฉันต้องตั้งค่า publicPath = '' และเพิ่ม <base href = "~ / dist /"> เนื่องจากไซต์ของฉันเป็นโครงการ ASP.Net MVC โดยใช้ IIS และไดเรกทอรีเสมือน
เรื่องด่วนเพิ่มเติม

16

อันที่จริงฉันต้องใส่:

output.publicPath: './';

เพื่อให้มันทำงานในเส้นทางที่ไม่ใช่รูท ในเวลาเดียวกันฉันกำลังฉีดยา:

   baseUrl: './'

เข้าไป

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

ด้วยการตั้งค่าพารามิเตอร์ทั้งสองชุดจึงทำงานได้อย่างมีเสน่ห์


การแสดงนี้บนเบราว์เซอร์เป็นURL https://localhost/myproject/%3C%=%20htmlWebpackPlugin.options.baseUrl%20%%3E#/project/1มีวิธีใดในการแก้ปัญหานี้หรือไม่?
NehaM

คุณตั้งค่าbaseUrl: '.'ไว้ที่ใดในตัวเลือก HtmlWebpackPlugin { meta: { baseUrl: './' } }?
SomethingOn

@SomethingOn ตอนนี้ฉันไม่มีโปรเจ็กต์ webpack และฉันคิดว่ามีหลายอย่างเปลี่ยนไปตั้งแต่ฉันโพสต์คำตอบนี้ (รวมถึงค่าเริ่มต้น) ใช่นี่คือจุดที่ควรตั้งค่า แต่'./'เป็นค่าที่ถูกต้อง
Kevin FONTAINE

1
ตอนนี้สามารถฉีดฐานแท็กได้โดยตรง ฉีดฐานแท็ก
เหลียง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.