import.meta

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流浏览器均已支持。

import.meta 元属性将上下文特定的元数据暴露给 JavaScript 模块。它包含有关模块的信息,例如模块的 URL。

语法

js
import.meta

import.meta 对象由宿主环境创建,是一个可扩展的null 原型对象,其中所有属性都是可写、可配置和可枚举的。规范没有指定在其上定义任何属性,但宿主通常会实现以下属性:

url

模块的完整 URL,包括查询参数和/或哈希(位于 ?# 之后)。在浏览器中,这是获取脚本的 URL(对于外部脚本),或包含文档的 URL(对于内联脚本)。在 Node.js 中,这是文件路径(包括 file:// 协议)。

解析

使用当前模块的 URL 作为基础,将模块说明符解析为 URL。

描述

import.meta 语法由关键字 import、一个点和标识符 meta 组成。由于 import 是一个保留字,而不是标识符,因此这并非属性访问器,而是一种特殊的表达式语法。

import.meta 元属性在 JavaScript 模块中可用;在模块之外使用 import.meta(包括模块内的直接 eval())是语法错误。

示例

传递查询参数

import 说明符中使用查询参数允许传递模块特定的参数,这可以作为从应用程序范围的 window.location(或在 Node.js 中通过 process.argv)读取参数的补充。例如,对于以下 HTML:

html
<script type="module">
  import "./index.mjs?someURLInfo=5";
</script>

index.mjs 模块能够通过 import.meta 检索 someURLInfo 参数:

js
// index.mjs
new URL(import.meta.url).searchParams.get("someURLInfo"); // 5

当一个模块导入另一个模块时也适用:

js
// 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)

js
const fs = require("fs/promises");
const path = require("path");

const filePath = path.join(__dirname, "someFile.txt");
fs.readFile(filePath, "utf8").then(console.log);

之后 (ES 模块)

js
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

浏览器兼容性

另见