知海

模块变量

webpackjsorg-mainAPI 参考

模块变量

本节涵盖了使用 webpack 编译的代码中可用的所有变量。通过 module 和其他变量,模块可以访问编译过程中的特定数据。

module.loaded (NodeJS)

如果模块当前正在执行,则为 false;如果同步执行已完成,则为 true

module.hot (webpack-specific)

指示是否启用了热模块替换,并提供对该过程的接口。有关详细信息,请参阅 HMR API 页面

module.id (CommonJS)

当前模块的 ID。

js 复制代码
console.log(import.meta.url);

export default

定义当消费方对该模块进行 import 调用时将返回的值(默认为新对象)。

js 复制代码
export default function doSomething() {
  // 做一些事情...
}

警告: 不能在异步函数中使用。

exports (CommonJS)

命名导出允许你从一个模块中导出多个变量、函数或对象。与默认导出不同,导入这些值时必须使用确切的名称。

js 复制代码
export const someValue = 42;
export const anObject = {
  x: 123,
};
export function doSomething() {
  // 做一些事情
}

global (NodeJS)

参见 node.js global

出于兼容性原因,webpack 默认会 polyfill global 变量。

__dirname (NodeJS)

根据配置选项 node.__dirname

如果在 Parser 解析的表达式内使用,则配置选项被视为 true

import.meta

import.meta 向 JavaScript 模块公开特定于上下文的元数据,例如模块的 URL。它仅在 ESM 中可用。

请注意,webpack 不支持直接访问 import.meta。相反,你应该访问其属性或使用解构赋值。例如:

js 复制代码
// webpack 将对此发出警告
Object.keys(import.meta);

// 可以安全使用
console.log(import.meta.url);
const { url } = import.meta;

import.meta.url

返回模块的绝对 file: URL。

src/index.js

js 复制代码
console.log(import.meta.url); // 输出类似 `file:///path/to/your/project/src/index.js`

import.meta.webpack

返回 webpack 版本。

src/index.js

js 复制代码
console.log(import.meta.webpack); // 对于 webpack 5,输出 `5`

import.meta.webpackHot

Webpack 特有。是 module.hot 的别名,但 import.meta.webpackHot 可以在严格 ESM 中使用,而 module.hot 不能。

import.meta.webpackContext

返回与 require.context 相同的值,但仅适用于 javascript/autojavascript/esm

  • 类型:

    ts 复制代码
    (
      request: string,
      options?: {
        recursive?: boolean;
        regExp?: RegExp;
        include?: RegExp;
        exclude?: RegExp;
        preload?: boolean | number;
        prefetch?: boolean | number;
        chunkName?: string;
        exports?: string | string[][];
        mode?: "sync" | "eager" | "weak" | "lazy" | "lazy-once";
      },
    ) => webpack.Context;
  • 可用:5.70.0+

  • 示例:

    js 复制代码
    const contextRequire = import.meta.webpackContext(".", {
      recursive: false,
      regExp: /two/,
      mode: "weak",
      exclude: /three/,
    });

import.meta.main

返回一个布尔值,指示当前模块是否为入口点。

src/index.js(入口点)

js 复制代码
console.log(import.meta.main); // true

src/utils.js(不是入口点)

js 复制代码
console.log(import.meta.main); // false

这对于仅应在入口模块中运行的条件逻辑非常有用,类似于 Node.js 的 require.main === module 检查。

import.meta.env

从多个来源访问环境变量。import.meta.env 是一个对象,其行为与 process.env 类似,允许你访问通过各种 webpack 插件和配置选项定义的环境变量。

webpack.config.js

js 复制代码
import webpack from "webpack";

export default {
  mode: "production", // NODE_ENV 自动设置为 "production"
  dotenv: {
    prefix: "WEBPACK_", // 仅暴露带有 WEBPACK_ 前缀的变量
  },
  plugins: [
    // EnvironmentPlugin 暴露 process.env 中的变量
    new webpack.EnvironmentPlugin({
      API_URL: "https://api.example.com",
    }),
    // DefinePlugin 允许自定义定义
    new webpack.DefinePlugin({
      "import.meta.env.CUSTOM_VAR": JSON.stringify("custom_value"),
    }),
  ],
};

src/index.js

js 复制代码
// 访问环境变量
console.log(import.meta.env.NODE_ENV); // "production"(来自 mode)
console.log(import.meta.env.API_URL); // 来自 EnvironmentPlugin 或 process.env 的值
console.log(import.meta.env.CUSTOM_VAR); // "custom_value"(来自 DefinePlugin)

// 类型检查
console.log(typeof import.meta.env); // "object"

// 真值检查
if (import.meta.env) {
  // import.meta.env 为真
}

// 访问不存在的属性返回 undefined
if (!import.meta.env.NOT_EXIST) {
  // NOT_EXIST 为 undefined/falsy
}

// 解构赋值
const { NODE_ENV, API_URL } = import.meta.env;

环境变量的来源:

  1. mode 选项:根据 webpack 模式(developmentproductionnone)自动设置 import.meta.env.NODE_ENV
  2. EnvironmentPlugin:暴露 process.env 中的变量或提供默认值。
  3. DotenvPlugin:从 .env 文件加载变量。仅暴露具有指定前缀(默认:WEBPACK_)的变量。
  4. DefinePlugin:允许使用 "import.meta.env.*" 模式进行自定义定义。

提示: 来自不同来源的变量会合并在一起。如果同一变量在多个来源中定义,其优先级顺序取决于插件执行顺序。

提示: import.meta.env 的行为类似于 process.env —— 它是一个对象,支持 typeof 检查,访问不存在的属性返回 undefined

自 webpack 5.109.0 起,默认定义以下常量(它们源自 optimization.nodeEnv,因此除非 optimization.nodeEnv: false,否则它们可用):

  • import.meta.env.MODEmode 的值(与 import.meta.env.NODE_ENV 相同)。
  • import.meta.env.DEV:在 development 模式下为 true,否则为 false
  • import.meta.env.PRODDEV 的否定值。
  • import.meta.env.SSR:仅服务器构建(不是浏览器目标的 Node.js 目标)为 true
  • import.meta.env.BASE_URLoutput.publicPath 的值,当 publicPath 为空或 'auto' 时回退为 '/'

import.meta.env 的求值可以使用 importMeta 解析器选项关闭(importMeta: { env: false })。

import.meta.resolve

将模块说明符解析为 URL,类似于原生的 import.meta.resolve。当说明符指向已打包的资源时,webpack 会在构建时使用生成的资源 URL 替换调用。

js 复制代码
const assetUrl = import.meta.resolve("./logo.png");

求值由 importMeta.resolve 解析器选项控制。

import.meta.glob

使用 glob 模式一次导入多个模块。它返回一个将每个匹配的文件路径映射到动态导入函数的对象;默认情况下,匹配的模块会被分割成按需 chunk。

js 复制代码
const modules = import.meta.glob("./pages/*.js");
// {
//   "./pages/about.js": () => import("./pages/about.js"),
//   "./pages/home.js": () => import("./pages/home.js"),
// }

for (const path in modules) {
  modules[path]().then((mod) => console.log(path, mod));
}

模式(字符串或字符串数组,支持以 ! 开头的负模式)和选项对象都必须是字面量。支持的选项:

  • eager (boolean = false):静态导入模块,而不是返回动态导入函数;值是模块命名空间本身。
  • import (string):从每个模块中挑选单个导出(例如 'default'),以实现更好的 tree shaking。
  • query (string | object):为每个请求追加查询,例如 { query: '?raw' }
  • base (string):根据不同的基准目录解析模式;结果对象的键相对于该目录。
  • exhaustive (boolean = false):同时匹配 node_modules 和隐藏目录中的文件。
  • caseSensitive (boolean = true):设置为 false 以不区分大小写匹配路径。
js 复制代码
const icons = import.meta.glob("./icons/*.svg", {
  eager: true,
  import: "default",
  query: "?url",
});

__filename (NodeJS)

根据配置选项 node.__filename

如果在 Parser 解析的表达式内使用,则配置选项被视为 true

__resourceQuery (webpack-specific)

当前模块的资源查询。如果进行了以下 import 调用,则查询字符串将在 file.js 中可用。

js 复制代码
import "file.js?test";

file.js

js 复制代码
__resourceQuery === "?test";

__webpack_public_path__ (webpack-specific)

等于配置选项 output.publicPath

__webpack_require__ (webpack-specific)

原始的 require 函数。此表达式不会被 Parser 解析为依赖项。

警告: 当 webpack 打包产物再次被打包时(例如,当先前打包的输出被用作输入时),CompatibilityPlugin 会将前一个打包产物中的 __webpack_require__ 重命名以避免冲突(例如,__nested_webpack_require_*)。在这种情况下,请改用 __webpack_global__,它确保你始终能够访问当前编译的 __webpack_require__ 函数。

__webpack_chunk_load__ (webpack-specific)

内部 chunk 加载函数。接受一个参数:

  • chunkId 要加载的 chunk 的 id。

示例:在一个 chunk 加载失败时,从备用 public path 加载 chunk:

js 复制代码
const originalLoad = __webpack_chunk_load__;
const publicPaths = ["a", "b", "c"];
__webpack_chunk_load__ = async (id) => {
  let error;
  for (const path of publicPaths) {
    __webpack_public_path__ = path;
    try {
      return await originalLoad(id);
    } catch (err) {
      error = err;
    }
  }
  throw error;
};
import("./module-a").then((moduleA) => {
  // 现在 webpack 将使用自定义的 __webpack_chunk_load__ 来加载 chunk
});

__webpack_module__ (webpack-specific)

它提供对当前 module 的访问。module 在严格 ESM 中不可用。

__webpack_module__.id (webpack-specific)

它提供对当前 module ID(module.id)的访问。module 在严格 ESM 中不可用。

__webpack_modules__ (webpack-specific)

访问所有模块的内部对象。

__webpack_hash__ (webpack-specific)

它提供对编译 hash 的访问。

__webpack_get_script_filename__ (webpack-specific)

function (chunkId)

它根据 chunk 的 id 提供 chunk 的文件名。

它是可赋值的,允许更改运行时代码使用的文件名。例如,可用于在加载 chunk 时确定最终路径。

js 复制代码
const oldFn = __webpack_get_script_filename__;

__webpack_get_script_filename__ = (chunkId) => {
  const filename = oldFn(chunkId);
  return `${filename}.changed`;
};

__non_webpack_require__ (webpack-specific)

生成一个不会被 webpack 解析的 require 函数。如果全局 require 函数可用,可用于做一些有趣的事情。

__webpack_global__ (webpack-specific)

__webpack_require__ 的别名。当 webpack 打包产物再次被打包时(例如,当先前打包的输出被用作输入时),CompatibilityPlugin 会将前一个打包产物中的 __webpack_require__ 重命名以避免冲突。__webpack_global__ 确保你始终能够访问当前编译的 __webpack_require__ 函数。

src/module.js

js 复制代码
__webpack_global__.myProperty = "value";

__webpack_exports_info__ (webpack-specific)

在模块中,__webpack_exports_info__ 可用于导出自省:

  • __webpack_exports_info__ 总是 true

  • __webpack_exports_info__.<exportName>.used:当已知导出未被使用时为 false,否则为 true

  • __webpack_exports_info__.<exportName>.useInfo

    • 当已知导出未被使用时为 false
    • 当已知导出被使用时为 true
    • 当导出使用可能取决于运行时条件时为 null
    • 当没有可用信息时为 undefined
  • __webpack_exports_info__.<exportName>.provideInfo

    • 当已知导出未被提供时为 false
    • 当已知导出被提供时为 true
    • 当导出提供可能取决于运行时条件时为 null
    • 当没有可用信息时为 undefined
  • 可以从嵌套导出访问信息:例如 __webpack_exports_info__.<exportName>.<exportName>.<exportName>.used

  • 使用 __webpack_exports_info__.<name>.canMangle 检查导出是否可以被重命名

__webpack_is_included__ (webpack-specific)

测试给定模块是否由 webpack 打包。

js 复制代码
if (__webpack_is_included__("./module-a.js")) {
  // 做一些事情
}

__webpack_base_uri__ (webpack-specific)

在运行时更改基础 URI。

  • 类型:string

  • 可用:5.21.0+

  • 示例:

    js 复制代码
    __webpack_base_uri__ = "https://example.com";

__webpack_runtime_id__

访问当前入口的 runtime id。

这是 webpack 特有功能,自 webpack 5.25.0 起可用。

src/index.js

js 复制代码
console.log(__webpack_runtime_id__ === "main");

DEBUG (webpack-specific)

等于配置选项 debug

帮助我们改进文档

发现翻译问题或内容错误?请告诉我们。