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))
示例:
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());
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











