import.meta

**import.meta** 元属性向 JavaScript 模块公开上下文特定的元数据。它包含有关模块的信息,例如模块的 URL。

语法

js
import.meta

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

url

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

resolve

使用当前模块的 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 语言规范
# prod-ImportMeta
HTML 标准
# hostgetimportmetaproperties

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参见