import.meta.url 是获取当前模块路径的唯一标准方式,它返回 file:// 开头的 URL 字符串(Node.js)或实际资源 URL(浏览器);规范未定义 import.meta.path,故不可用;Node 中需用 fileURLToPath 转换为文件路径,浏览器中仅能通过 new URL 构造相对资源 URL。

import.meta.url 是获取当前模块文件路径的唯一标准方式,它返回一个以 file:// 开头的完整 URL 字符串(在 Node.js 中)或浏览器中对应资源的实际 URL。
为什么不能直接用 import.meta.path?
ES Module 规范只定义了 import.meta.url,没有 import.meta.path。Node.js 和浏览器都遵循这一规范,所以不存在跨环境通用的 .path 属性。
在 Node.js 中提取当前文件的绝对路径
由于 import.meta.url 是 URL 字符串,需借助 URL 构造函数和 fileURLToPath(Node.js 专用)转换为文件路径:
- 使用
new URL(import.meta.url)解析出当前模块的 URL 对象 - 调用
fileURLToPath(import.meta.url)(推荐,更简洁)直接得到/full/path/to/your/file.js - 若需目录路径,再用
dirname(fileURLToPath(import.meta.url))
示例:
立即学习“Java免费学习笔记(深入)”;
import { dirname, resolve } from 'node:path';import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
console.log(__filename); // /home/user/project/src/index.js
console.log(__dirname); // /home/user/project/src
在浏览器中获取当前脚本 URL(无法获取本地文件系统路径)
浏览器环境下 import.meta.url 返回的是该模块实际加载的 URL(如 https://site.com/js/module.js 或 file:///path/to/module.js),但出于安全限制,无法访问真实文件系统路径:
- 可通过
new URL('.', import.meta.url).href获取当前模块所在目录的基准 URL - 可用
new URL('./assets/img.png', import.meta.url)构造相对资源路径,这是推荐做法 - 注意:
file://协议下部分功能受限(如 fetch 跨域限制),开发建议用本地服务器
跨平台兼容写法(Node + 浏览器共存场景)
如果模块需同时运行在两端,避免直接依赖 fileURLToPath,可封装判断逻辑:
- 检测是否为 Node.js 环境:
typeof process !== 'undefined' && process.release?.name === 'node' - 是则用
fileURLToPath;否则保留import.meta.url作为资源定位依据 - 路径拼接统一用
new URL('./relative', import.meta.url),天然兼容两者
例如加载 JSON 配置:
const configUrl = new URL('./config.json', import.meta.url);const config = await fetch(configUrl).then(r => r.json());


















