webpack中的“publicPath”是做什么的?

Webpack文档声明output.publicPath是:

来自JavaScript视图的output.path。

请您详细说明这实际上是什么意思?

我使用output.pathoutput.filename来指定webpack应该输出结果的位置,但我不知道要在output.publicPath放置什么以及是否需要。

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

在浏览器中执行时,webpack需要知道您将托pipe生成的包的位置。 因此,它可以请求额外的块(使用代码分割时 )或分别通过file-loader或url-loader加载的引用文件。

例如:如果您将http服务器configuration为托pipe/assets/下的生成包,则应写入: publicPath: "/assets/"

这是我发现的,希望它会帮助你们中的一些人。 (如有任何错误,请纠正我)

output.path

保存所有输出文件的本地磁盘目录(绝对path)

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

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


output.publicPath

你上传你的捆绑文件。 (相对于服务器根目录)

例如: /assets/

假定您在服务器根http://server/部署应用程序。

通过使用/assets/ ,应用程序将findwebpack资产: http://server/assets/ 。 在引擎盖下,webpack遇到的每个url将被重写为“ /assets/ ”。

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

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


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

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

重要

如果你使用的style-loader +加载style-loader启用了css sourceMap选项,你必须设置publicPath 。 将其设置为服务器地址的完整绝对path,例如http://server/assets/以便正确加载资源。

请参阅: https : //github.com/webpack/style-loader/issues/55

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

假设你把所有的js源文件放在src文件夹下,然后你将webpackconfiguration成使用output.path构build源文件到dist文件夹。

但是你想在一个更有意义的位置,像webroot/public/assets这样的服务你的静态资产,这次你可以使用out.publicPath='/webroot/public/assets' ,这样在你的html中,你可以引用你的js <script src="/webroot/public/assets/bundle.js"></script>

当你请求webroot/public/assets/bundle.jswebpack-dev-server会在dist文件夹下findjs

更新:

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

原来:publicPath只是用于开发目的, 这不仅仅是为了开发目的

不,这个选项在开发服务器上很有用,但是它的目的是在生产环境中asynchronous加载脚本包。 假设你有一个非常大的单页面应用程序(例如Facebook)。 Facebook不会在每次加载主页时都提供所有的javascript,所以它只能提供主页上需要的东西。 然后,当你去你的个人资料,它加载一些更多的JavaScript与该页面的Ajax。 这个选项告诉它在你的服务器上从哪里加载该bundle

在我的情况下,我有一个CDN,我将把我所有的处理静态文件(JS,IMG,字体…)放入我的CDN,假设url是http://my.cdn.com/

所以如果有一个js文件,这是原始的HTML引用url是'./js/my.js'它应该成为http://my.cdn.com/js/my.js在生产环境;

在这种情况下,我需要做的只是设置公共path等于http://my.cdn.com/和webpack将自动添加该前缀;

您可以使用publicPath指向您想让webpack-dev-server为其“虚拟”文件提供服务的位置。 publicPath选项将与webpack-dev-server的content-build选项位置相同。 webpack-dev-server会创build启动时使用的虚拟文件。 这些虚拟文件类似于webpack创build的实际捆绑文件。 基本上你会想要–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已经创build了一个虚拟资产文件夹以及它引用的一个虚拟bundle.js文件。 您可以通过转到localhost:8080 / assets / bundle.js来检查这些文件。 它们只在运行webpack-dev-server时生成。

webpack2文档以更简洁的方式解释了这一点: https ://webpack.js.org/guides/public-path/#use-cases

webpack具有非常有用的configuration,可让您指定应用程序上所有资产的基本path。 这叫做publicPath。

webpack使用publicPathreplacecss中定义的相对path来引用图像和字体文件。