webpack中的“publicPath”是做什么的?
Webpack文档声明output.publicPath
是:
来自JavaScript视图的output.path。
请您详细说明这实际上是什么意思?
我使用output.path
和output.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"
重写➡srcsrc="/assets/picture.jpg"
访问者:(
http://server/assets/picture.jpg
)
src="/img/picture.jpg"
重写➡srcsrc="/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.js
, webpack-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来引用图像和字体文件。