HtmlWebpackPlugin chèn các tệp đường dẫn tương đối bị hỏng khi tải các đường dẫn trang web không phải gốc


115

Tôi đang sử dụng webpack và HtmlWebpackPlugin để đưa js và css đi kèm vào tệp mẫu html.

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

Và nó tạo ra tệp html sau.

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

Điều này hoạt động tốt khi truy cập vào thư mục gốc của ứng dụng localhost:3000/, nhưng không thành công khi tôi cố gắng truy cập ứng dụng từ một URL khác, chẳng hạn như localhost:3000/items/1vì các tệp đi kèm không được đưa vào đường dẫn tuyệt đối. Khi tệp html được tải, nó sẽ tìm tệp js bên trong thư mục không tồn tại /itemsvì react-router chưa được tải.

Làm cách nào để HtmlWebpackPlugin đưa các tệp vào một đường dẫn tuyệt đối, vì vậy express sẽ tìm kiếm chúng ở thư mục gốc của tôi /distchứ không phải tại /dist/items/main-...min.js? Hoặc có thể tôi có thể thay đổi máy chủ express của mình để khắc phục sự cố?

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

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

Về cơ bản, tôi chỉ cần lấy dòng:

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

để có một dấu gạch chéo ở đầu nguồn.

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

Câu trả lời:


199

Thử đặt publicPath trong cấu hình webpack của bạn:

output.publicPath = '/'

HtmlWebpackPlugin sử dụng publicPath để thêm trước các url của các lần tiêm.

Một tùy chọn khác là đặt href cơ sở trong <head>mẫu html của bạn, để chỉ định url cơ sở của tất cả các url tương đối trong tài liệu của bạn.

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

7
Cảm ơn bạn, thêm output.publicPath = '/'là giải pháp.
aherriot

3
Điều này sẽ không hoạt động nếu bạn đang chạy phía sau proxy ngược.
t-my

4
Bạn cũng có thể sử dụng đơn giản <base href="https://stackoverflow.com/">để tránh phải mã hóa tên máy chủ lưu trữ trong mẫu HTML hoặc phải nội suy các biến.
Rafa

Tôi phải đặt publicPath = '' và thêm <base href = "~ / dist /"> vì trang web của tôi là một dự án ASP.Net MVC sử dụng IIS và một thư mục ảo.
khẩn cấp hơn jest

16

Trên thực tế, tôi phải đặt:

output.publicPath: './';

để làm cho nó hoạt động trong một đường dẫn không ROOT. Cùng lúc đó tôi đã tiêm:

   baseUrl: './'

thành

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

Với cả hai thông số được thiết lập, nó hoạt động như một sự quyến rũ.


Điều này cho thấy URLtrên trình duyệt là https://localhost/myproject/%3C%=%20htmlWebpackPlugin.options.baseUrl%20%%3E#/project/1. Có cách nào để giải quyết điều này?
NehaM

Bạn đang đặt baseUrl: '.'nó ở đâu trong các tùy chọn HtmlWebpackPlugin? { meta: { baseUrl: './' } }?
SomethingOn

@SomethingOn Hiện tại, tôi không có dự án webpack này và tôi nghĩ rằng có rất nhiều thứ đã thay đổi kể từ khi tôi đăng câu trả lời này (bao gồm cả giá trị mặc định). Vì vậy, có, đây chắc chắn là nơi nó nên được đặt, nhưng './'là giá trị chính xác.
Kevin KHÔNG DÙNG ĐƯỢC

1
Bây giờ Nó có thể tiêm thẻ cơ sở trực tiếp. tiêm thẻ cơ sở
Liang

2

trong cấu hình webpack

config.output.publicPath = ''

trong index.html của bạn

<base href="/someurl/" />

điều này nên làm điều đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.