模块变量
模块变量
本节涵盖了使用 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:
false:未定义mock:等于'/'true:node.js __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/auto 和 javascript/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+
-
示例:
jsconst 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;
环境变量的来源:
mode选项:根据 webpack 模式(development、production或none)自动设置import.meta.env.NODE_ENV。EnvironmentPlugin:暴露process.env中的变量或提供默认值。DotenvPlugin:从.env文件加载变量。仅暴露具有指定前缀(默认:WEBPACK_)的变量。DefinePlugin:允许使用"import.meta.env.*"模式进行自定义定义。
提示: 来自不同来源的变量会合并在一起。如果同一变量在多个来源中定义,其优先级顺序取决于插件执行顺序。
提示:
import.meta.env的行为类似于process.env—— 它是一个对象,支持typeof检查,访问不存在的属性返回undefined。
自 webpack 5.109.0 起,默认定义以下常量(它们源自 optimization.nodeEnv,因此除非 optimization.nodeEnv: false,否则它们可用):
import.meta.env.MODE:mode的值(与import.meta.env.NODE_ENV相同)。import.meta.env.DEV:在development模式下为true,否则为false。import.meta.env.PROD:DEV的否定值。import.meta.env.SSR:仅服务器构建(不是浏览器目标的 Node.js 目标)为true。import.meta.env.BASE_URL:output.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:
false:未定义mock:等于'/index.js'true:node.js __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。
帮助我们改进文档
发现翻译问题或内容错误?请告诉我们。
