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каталогу, оскільки реакційний роутер ще не завантажений.

Як я можу змусити 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 у налаштуваннях вашого веб-пакету:

output.publicPath = '/'

HtmlWebpackPlugin використовує publicPath, щоб додати URL-адреси ін'єкцій.

Інший варіант - встановити базовий href у <head>вашому HTML-шаблоні, вказати базовий URL усіх відносних URL-адрес у вашому документі.

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

7
Дякую, output.publicPath = '/'рішення було додано.
aherriot

3
Це не спрацює, якщо ви працюєте за зворотним проксі.
t-мій

4
Ви також можете просто використовувати, <base href="https://stackoverflow.com/">щоб уникнути необхідності жорсткого кодування імені хоста у шаблоні HTML або необхідності інтерполяції змінних.
Рафа

Мені довелося встановити publicPath = '' та додати <base href = "~ / dist /">, оскільки мій сайт є проектом MVC ASP.Net з використанням IIS та віртуального каталогу.
більш терміновий жарт

16

Насправді мені довелося поставити:

output.publicPath: './';

для того, щоб він працював у не-ROOT шляху. Одночасно я вводив ін'єкцію:

   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 У мене зараз немає проекту веб-упаковки, і я думаю, що багато речей змінилося з моменту опублікування цієї відповіді (включаючи значення за замовчуванням). Так, так, це, безумовно, слід встановити, але './'це правильне значення.
Кевін ФОНТАЙН

1
Тепер він може вводити базовий тег безпосередньо. inject base tag
Лян

2

в конфігурації веб-упаковки

config.output.publicPath = ''

у вашому index.html

<base href="/someurl/" />

це має робити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.