import.meta 是 ES Modules 中只读的模块元信息对象,核心用途是访问模块加载环境信息,最常用的是 import.meta.url 获取当前模块绝对 URL,Node.js 还支持实验性 import.meta.resolve。

import.meta 是 ES Modules 中专用于获取当前模块元信息的只读对象,它在每个模块作用域内自动存在,无需导入或声明。它的核心用途是访问与模块加载环境相关的信息,最常见的是 import.meta.url 和 import.meta.resolve(部分环境支持)。
获取当前模块的完整 URL(最常用)
在浏览器和 Node.js(v12.20+ / v14.14+)中,import.meta.url 返回模块文件的绝对 URL(浏览器中为 file:// 或 https://,Node.js 中为 file:// 协议路径)。
- 可用于动态构造资源路径,比如加载同目录下的 JSON 或图片:
<!-- 在 ./src/utils/logger.js 中 -->
const configPath = new URL('./config.json', import.meta.url);
fetch(configPath).then(r => r.json());
- 替代老旧的
__dirname和__filename(Node.js CommonJS):
// Node.js ESM 中无法使用 __dirname
import { dirname, join } from 'path';
import { fileURLToPath } from 'url';
const __dirname = dirname(fileURLToPath(import.meta.url));
const dbPath = join(__dirname, 'data.db');
立即学习“Java免费学习笔记(深入)”;
判断运行环境(浏览器 or Node.js)
import.meta 本身不直接暴露环境标识,但可通过其属性是否存在来安全判断:
- 浏览器中
import.meta.url以http://、https://或file://开头;Node.js 中始终为file://(且含系统路径分隔符如\或/) - 更稳妥方式:检查全局对象或特定属性
const isBrowser = typeof window !== 'undefined' && window.document;
const isNode = typeof process !== 'undefined' && process.versions && process.versions.node;
// 注意:import.meta 没有标准的 .env 或 .platform 属性,勿依赖未定义字段
使用 import.meta.resolve(实验性,需环境支持)
Node.js(v20.6+ 默认启用,v18.20+/v20.2+ 需 --experimental-import-meta-resolve)支持 import.meta.resolve(specifier, parent),用于同步解析模块说明符(类似 require.resolve):
- 返回解析后的完整 URL 字符串
-
parent参数可省略,默认为当前模块
// Node.js ESM 环境中
const resolved = import.meta.resolve('lodash'); // → 'file:///path/to/node_modules/lodash/index.js'
const local = import.meta.resolve('./utils.js'); // → 'file:///path/to/project/src/utils.js'
⚠️ 浏览器目前不支持 import.meta.resolve,不可跨平台使用。
注意事项与限制
-
import.meta只能在模块顶层作用域使用,不能在函数、类或eval中访问 - 不是所有环境都实现全部属性:仅
url是规范强制要求的;resolve是 Node.js 扩展,env、webpack等字段属于打包工具注入(非标准) - 不要给
import.meta赋值或添加属性——它是不可扩展、不可配置的只读对象


















