import.meta
**import.meta
** 元属性向 JavaScript 模块公开上下文特定的元数据。它包含有关模块的信息,例如模块的 URL。
语法
js
import.meta
值
描述
示例
传递查询参数
在 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 表格仅在浏览器中加载