import.meta 是 ES2020 引入的模块专用只读对象,仅在 ESM 中可用;其标准属性 import.meta.url 返回当前模块绝对 URL,Node.js 扩展了 dirname、filename 和 resolve 等非标但实用属性。

import.meta 是 ECMAScript 2020(ES11)引入的内置对象,用于在模块(module)中访问当前模块的元信息。它只在 模块作用域 中可用(即 type="module" 的脚本或 .mjs / import 加载的文件中),在普通 script 或 CommonJS 中不可用,访问会报错。
import.meta 的基本结构和常用属性
目前规范中唯一强制要求实现的属性是 import.meta.url,它返回当前模块的完整 URL(浏览器中为 file:// 或 https://;Node.js 中为 file:// 协议的绝对路径)。其他属性(如 import.meta.dirname、import.meta.filename)是运行时环境扩展,非标准但广泛支持:
-
import.meta.url:当前模块的绝对 URL。可用于构造相对路径资源,替代__dirname+path.join的组合(尤其在 ESM 环境中)。 -
import.meta.dirname(Node.js v20.6+ 默认启用,v18.12+ 需--experimental-import-meta-resolve):当前模块所在目录的绝对路径(不含尾部斜杠),等价于fileURLToPath(import.meta.url)后取path.dirname。 -
import.meta.filename(Node.js v21.7+ 实验性支持):当前模块文件的绝对路径,类似 CommonJS 的__filename。 -
import.meta.resolve(Node.js v20.6+):一个异步函数,用于解析模块说明符(specifier)到绝对 URL,不执行加载,仅做路径解析。
在浏览器中获取当前模块路径
浏览器不支持 import.meta.dirname 或 import.meta.filename,但可通过 import.meta.url 手动推导:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 提取当前模块所在目录:
new URL('.', import.meta.url).href(返回目录 URL,末尾带/) - 拼接同目录下资源:
new URL('./data.json', import.meta.url).href→ 安全生成绝对 URL,避免相对路径解析错误 - 注意:
import.meta.url在浏览器中始终是https://或file://开头,不能直接用path模块处理
在 Node.js 中替代 __dirname 和 __filename
ESM 模块中无法使用 __dirname 和 __filename,推荐用以下方式安全替代:
- 获取当前模块目录:
import { dirname } from 'path'; import { fileURLToPath } from 'url'; const __dirname = dirname(fileURLToPath(import.meta.url)); - Node.js v20.6+ 可直接用:
import.meta.dirname(更简洁,且与fileURLToPath行为一致) - 读取同目录文件:
await fs.readFile(new URL('./config.json', import.meta.url), 'utf8')—— 推荐,无需手动拼路径
注意事项和常见误区
import.meta 是只读对象,不能赋值或添加自定义属性(虽然某些环境允许,但不符合规范)。它不可枚举、不可配置、不可写。另外:
- 不能在动态
import()内部使用import.meta获取被导入模块的信息 —— 它始终指向 调用处 的模块,不是被加载模块 - 在 TypeScript 中需确保
compilerOptions.module设置为ES2020或更高,并启用moduleResolution: "node"(Node.js)或"bundler"(打包工具) - Vite、Webpack 等构建工具通常透传
import.meta.env(自定义环境变量),但这属于工具扩展,不是标准import.meta的一部分

















