Webpack 中的“publicPath”有什么作用?

IT技术 javascript webpack
2021-03-04 03:38:23

Webpack 文档指出output.publicPath

output.path与JavaScript的视图。

您能否详细说明这实际上意味着什么?

我使用output.pathoutput.filename来指定 Webpack 应该在何处输出结果,但我不确定要放入什么output.publicPath以及是否需要。

module.exports = {
  output: {
    path: path.resolve("./examples/dist"),
    filename: "app.js",
    publicPath: "What should I put here?"   
  } 
}
6个回答

output.path

用于存储所有输出文件的本地磁盘目录(绝对路径)

例子: path.join(__dirname, "build/")

Webpack 会将所有内容输出到 localdisk/path-to-your-project/build/


output.publicPath

您上传捆绑文件的位置。(绝对路径,或相对于主 HTML 文件)

例子: /assets/

假设您在服务器 root 部署了应用程序http://server/

通过使用/assets/,应用程序将在以下位置找到 webpack 资产:http://server/assets/在后台,webpack 遇到的每个 url 都将被重写为以“ /assets/开头

src="picture.jpg" 重写 ➡ src="/assets/picture.jpg"

访问者: ( http://server/assets/picture.jpg)


src="/img/picture.jpg" 重写 ➡ src="/assets/img/picture.jpg"

访问者: ( http://server/assets/img/picture.jpg)

output.publicPath有一个'auto'选项。-但是除了燃烧额外的 CPU 周期以获得与普通'''./'具有相同的效果之外,它还能做什么没有线索。谁知道
2021-05-11 03:38:23

在浏览器中执行时,webpack 需要知道您将在哪里托管生成的包。因此,它能够请求额外的块(当使用代码拆分时)或分别通过file-loaderurl-loader 加载的引用文件

例如:如果您将 http 服务器配置为托管生成的包,/assets/您应该编写:publicPath: "/assets/"

你能告诉我资产文件夹在哪里吗?我想查看资产文件夹中的文件 谢谢。
2021-04-26 03:38:23

publicPath 仅用于开发目的,我第一次看到这个配置属性时很困惑,但是现在我已经使用 webpack 一段时间了

假设你把你所有的JS源文件下的src文件夹,并且配置你的WebPack源文件建立到dist文件夹output.path

但是您希望在更有意义的位置下提供静态资产,例如webroot/public/assets,这次您可以使用out.publicPath='/webroot/public/assets',以便在您的 html 中,您可以使用<script src="/webroot/public/assets/bundle.js"></script>.

当您请求webroot/public/assets/bundle.jswebpack-dev-server会发现dist文件夹下的JS

更新:

感谢查理马丁纠正我的答案

原文:publicPath 仅用于开发目的,这不仅仅是用于开发目的

不,这个选项在开发服务器中很有用,但它的目的是在生产中异步加载脚本包。假设您有一个非常大的单页应用程序(例如 Facebook)。Facebook 不希望每次加载主页时都提供其所有 javascript,因此它只提供主页上需要的内容。然后,当您转到您的个人资料时,它会使用 ajax 为该页面加载更多 javascript。此选项告诉它从服务器上的何处加载该包

确切地说,在您的生产环境中,您将用于webpack -p构建资产,并且您的资产应该由您的应用程序服务器或 nginx 服务器提供服务,而不是由 webpack 服务器或 webpack 中间件提供,因此此配置在生产环境中不再有用,对吗? ?
2021-04-18 03:38:23
这不仅仅是为了开发目的,@jhnns 的回答解释了它如何影响加载器输出。
2021-05-03 03:38:23
从这个webpack.github.io/docs/configuration.html#output-publicpath看来,这个选项告诉 webpack 在生成的文件中填写正确的 url 或资产路径,而不仅仅是中间件。在运行开发服务器时,我认为中间件publichPath会劫持请求并返回内存中的文件。
2021-05-07 03:38:23
是一样的不是吗?这个属性告诉你的加载器和你的中间件在哪里可以找到真正的资产,希望你不会在你的生产环境中使用 webpackmiddleware 或 webpack-dev-server,所以我认为这只是用于开发环境,请参考webpack.github .io/docs/webpack-dev-server.html
2021-05-11 03:38:23
不,这个选项在开发服务器中很有用,但它的目的是在生产中异步加载脚本包。假设您有一个非常大的单页应用程序(例如 Facebook)。Facebook 不希望每次加载主页时都提供其所有 javascript,因此它只提供主页上需要的内容。然后,当您转到您的个人资料时,它会使用 ajax 为该页面加载更多 javascript。此选项告诉它从服务器上的何处加载该包
2021-05-12 03:38:23

filename指定文件名称,您的所有捆绑代码在完成构建步骤后将累积到该文件中

路径指定输出目录,其中app.js(文件名)是会得到保存在磁盘上。如果没有输出目录,webpack 会为你创建那个目录。例如:

module.exports = {
  output: {
    path: path.resolve("./examples/dist"),
    filename: "app.js"
  } 
}

这将创建一个目录myproject/examples/dist并在该目录下创建app.js/myproject/examples/dist/app.js构建完成后,您可以浏览到myproject/examples/dist/app.js来查看捆绑的代码

publicPath:“我应该在这里放什么?”

publicPath指定web 服务器中的虚拟目录,从那里捆绑文件 app.js 将被提供。请记住,使用 publicPath 时的服务器一词可以是 webpack-dev-server 或 express server 或其他可以与 webpack 一起使用的服务器。

例如

module.exports = {
  output: {
    path: path.resolve("./examples/dist"),
    filename: "app.js",
    publicPath: path.resolve("/public/assets/js")   
  } 
}

此配置告诉 webpack 将所有 js 文件捆绑到examples/dist/app.js并写入该文件。

publicPath告诉 webpack-dev-server 或 express 服务器服务器中指定的虚拟位置(即 /public/assets/js)提供这个捆绑文件,即examples/dist/app.js因此,在您的 html 文件中,您必须将此文件引用为

<script src="public/assets/js/app.js"></script>

因此,在总结,publicPath像之间的映射virtual directory在你的服务器,并output directory通过output.path配置,只要对文件请求指定的公共/资产/ JS / app.js来,/examples/dist/app.js文件将被送达

很好解释!
2021-04-27 03:38:23
没有绒毛的最佳答案。
2021-04-30 03:38:23

您可以使用 publicPath 指向您希望 webpack-dev-server 为其“虚拟”文件提供服务的位置。publicPath 选项将是 webpack-dev-server 的 content-build 选项的相同位置。 webpack-dev-server创建虚拟文件,当您启动它时将使用这些文件。这些虚拟文件类似于 webpack 创建的实际捆绑文件。基本上,您会希望 --content-base 选项指向您的 index.html 所在的目录。这是一个示例设置:

//application directory structure
/app/
/build/
/build/index.html
/webpack.config.js


//webpack.config.js
var path = require("path");
module.exports = {
...
  output: {
    path: path.resolve(__dirname, "build"),
    publicPath: "/assets/",
    filename: "bundle.js"
  }
};  


//index.html
<!DOCTYPE>
<html>
...
<script src="assets/bundle.js"></script>
</html>

//starting a webpack-dev-server from the command line
$ webpack-dev-server --content-base build 

webpack-dev-server 已经创建了一个虚拟资产文件夹以及它所引用的虚拟 bundle.js 文件。您可以通过转到 localhost:8080/assets/bundle.js 来测试它,然后在您的应用程序中检查这些文件。它们仅在您运行 webpack-dev-server 时生成。

这么好的解释,但是如果我转向生产或手动构建,/build/bundle.js我将不得不更改src我的index.html文件中的 ,对吗?
2021-04-28 03:38:23
回复晚了非常抱歉。您不必更改 src。无论您是在生产环境还是开发环境,webpack 都会在输出路径中创建一个 bundle.js。在上面的例子中,它将是 /build/bundle.js。
2021-05-11 03:38:23
谢谢,我问的src是 index.html 文件中那一行。现在它指向"assets/bundle.js"如果它转移到生产中,bundle 将在其中,"build/bundle.js"所以我必须在 html src 行中将其更改为src="build/bundle.js". 或者有没有更自动化的方法?
2021-05-14 03:38:23
我现在明白你的问题了。是的,您需要将 src 更改为 build/bundle.js 以进行生产。至于自动执行此操作的方法,我不确定。我见过其他人创建了 2 个不同的 webpack.config.js 文件,一个用于生产,一个用于开发。可能有一种语法上的方法,比如 if(ENV === production) 这样做......但我还没有尝试过。
2021-05-14 03:38:23
@ArchNoob 只是提醒一下我现在如何在生产中做到这一点。我没有更改 src 值,而是将 publicPath 值从 更改/assets//build这样我就不必更改我的 index.html。我还将我的 index.html 从构建文件夹中移到应用程序的根目录中。
2021-05-14 03:38:23