publicPath
配置选项在各种场景中非常有用。它允许您指定应用程序中所有资产的基路径。
在实际应用程序中,此功能在一些用例中变得特别有用。本质上,每个输出到 output.path
目录的文件都将从 output.publicPath
位置引用。这包括子块(通过 代码拆分 创建)以及依赖图的一部分的任何其他资产(例如图像、字体等)。
例如,在开发中,我们可能有一个 assets/
文件夹,它位于索引页面的同一级别。这很好,但如果我们想在生产中将所有这些静态资产托管在 CDN 上呢?
为了解决这个问题,您可以轻松地使用一个老式的环境变量。假设我们有一个变量 ASSET_PATH
import webpack from 'webpack';
// Try the environment variable, otherwise use root
const ASSET_PATH = process.env.ASSET_PATH || '/';
export default {
output: {
publicPath: ASSET_PATH,
},
plugins: [
// This makes it possible for us to safely use env vars on our code
new webpack.DefinePlugin({
'process.env.ASSET_PATH': JSON.stringify(ASSET_PATH),
}),
],
};
另一个可能的用例是动态设置 publicPath
。Webpack 公开了名为 __webpack_public_path__
的全局变量,允许您这样做。在应用程序的入口点,您可以这样做
__webpack_public_path__ = process.env.ASSET_PATH;
这就是您所需要的。由于我们已经在配置中使用 DefinePlugin
,因此 process.env.ASSET_PATH
将始终被定义,因此我们可以安全地执行此操作。
// entry.js
import './public-path';
import './app';
您可能不知道 publicPath 将是什么,Webpack 可以通过从 import.meta.url
、document.currentScript
、script.src
或 self.location
等变量中确定公共路径来自动为您处理它。您需要将 output.publicPath
设置为 'auto'
webpack.config.js
module.exports = {
output: {
publicPath: 'auto',
},
};
请注意,在 document.currentScript
不支持的情况下,例如 IE 浏览器,您需要包含一个 polyfill,例如 currentScript Polyfill
。