HtmlWebpackPlugin 注入在加载非根网站路径时会中断的相对路径文件

IT技术 javascript express webpack react-router
2021-03-04 16:19:13

我正在使用 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 文件加载时,它会在 non-exist/items目录中查找 js 文件,因为 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>
3个回答

尝试在你的 webpack 配置中设置 publicPath:

output.publicPath = '/'

HtmlWebpackPlugin 使用 publicPath 来添加注入的 url。

另一种选择是在<head>您的 html 模板中设置 base href ,以指定文档中所有相关 url 的基本 url。

<base href="http://localhost:3000/">
您也可以简单<base href="/">使用以避免在 HTML 模板中对主机名进行硬编码,或者不必插入变量。
2021-04-22 16:19:13
我必须设置 publicPath = '' 并添加 <base href="~/dist/"> 因为我的站点是一个使用 IIS 和虚拟目录的 ASP.Net MVC 项目。
2021-05-09 16:19:13
谢谢,添加output.publicPath = '/'是解决方案。
2021-05-10 16:19:13
如果您在反向代理后面运行,这将不起作用。
2021-05-14 16:19:13
引导我走向正确的方向。设置publicPath""(空字符串)可以解决我的问题。
2021-05-17 16:19:13

事实上,我不得不说:

output.publicPath: './';

为了让它在非ROOT路径中工作。同时我正在注射:

   baseUrl: './'

进入

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

使用这两个参数集,它就像一个魅力。

这将URL在浏览器上显示https://localhost/myproject/%3C%=%20htmlWebpackPlugin.options.baseUrl%20%%3E#/project/1有没有办法解决这个问题?
2021-04-22 16:19:13
你在哪里设置baseUrl: '.'它在 HtmlWebpackPlugin 选项中?{ meta: { baseUrl: './' } }?
2021-04-24 16:19:13
@SomethingOn 我现在手头没有这个 webpack 项目,我认为自从我发布这个答案(包括默认值)以来,很多事情都发生了变化。所以是的,这当然是应该设置的地方,但'./'它是正确的值。
2021-04-28 16:19:13
愚蠢但非常有效的第二种方法。谢谢!
2021-05-10 16:19:13
现在它可以直接注入基础标签。注入基础标签
2021-05-20 16:19:13

在 webpack 配置中

config.output.publicPath = ''

在你的 index.html

<base href="/someurl/" />

这应该这样做。