公共路径

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

您可能不知道 publicPath 将是什么,Webpack 可以通过从 import.meta.urldocument.currentScriptscript.srcself.location 等变量中确定公共路径来自动为您处理它。您需要将 output.publicPath 设置为 'auto'

webpack.config.js

module.exports = {
  output: {
    publicPath: 'auto',
  },
};

请注意,在 document.currentScript 不支持的情况下,例如 IE 浏览器,您需要包含一个 polyfill,例如 currentScript Polyfill

4 位贡献者

rafaelrinaldichrisVillanuevagonzoyumochenxsan