import.meta
import.meta 元属性将上下文特定的元数据暴露给 JavaScript 模块。它包含有关模块的信息,例如模块的 URL。
语法
import.meta
值
import.meta 对象由宿主环境创建,是一个可扩展的null 原型对象,其中所有属性都是可写、可配置和可枚举的。规范没有指定在其上定义任何属性,但宿主通常会实现以下属性:
描述
import.meta 语法由关键字 import、一个点和标识符 meta 组成。由于 import 是一个保留字,而不是标识符,因此这并非属性访问器,而是一种特殊的表达式语法。
import.meta 元属性在 JavaScript 模块中可用;在模块之外使用 import.meta(包括模块内的直接 eval())是语法错误。
示例
传递查询参数
在 import 说明符中使用查询参数允许传递模块特定的参数,这可以作为从应用程序范围的 window.location(或在 Node.js 中通过 process.argv)读取参数的补充。例如,对于以下 HTML:
<script type="module">
import "./index.mjs?someURLInfo=5";
</script>
index.mjs 模块能够通过 import.meta 检索 someURLInfo 参数:
// index.mjs
new URL(import.meta.url).searchParams.get("someURLInfo"); // 5
当一个模块导入另一个模块时也适用:
// index.mjs
import "./index2.mjs?someURLInfo=5";
// index2.mjs
new URL(import.meta.url).searchParams.get("someURLInfo"); // 5
Node.js 中的 ES 模块实现支持解析包含查询参数(或哈希)的模块说明符,如后者示例所示。但是,当模块通过 CLI 命令指定时(例如 node index.mjs?someURLInfo=5),您不能使用查询或哈希,因为 CLI 入口点使用更像 CommonJS 的解析模式,将路径视为文件路径而不是 URL。要将参数传递给入口点模块,请改用 CLI 参数并通过 process.argv 读取它们(例如 node index.mjs --someURLInfo=5)。
解析相对于当前文件的文件
在 Node.js CommonJS 模块中,有一个 __dirname 变量,它包含当前模块所在文件夹的绝对路径,这对于解析相对路径很有用。然而,ES 模块除了 import.meta 之外不能有上下文变量。因此,要解析相对文件,您可以使用 import.meta.url。请注意,这使用的是 URL 而不是文件系统路径。
之前 (CommonJS)
const fs = require("fs/promises");
const path = require("path");
const filePath = path.join(__dirname, "someFile.txt");
fs.readFile(filePath, "utf8").then(console.log);
之后 (ES 模块)
import fs from "node:fs/promises";
const fileURL = new URL("./someFile.txt", import.meta.url);
fs.readFile(fileURL, "utf8").then(console.log);
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # prod-ImportMeta |
浏览器兼容性
加载中…