ESM下使用import.meta.url加载上级目录JSON文件报错如何解决?
问题原因
path.resolve仅支持处理无协议前缀的本地文件系统路径字符串,而import.meta.url返回的是带file://协议的标准URL格式字符串,两者直接混用会导致路径解析失败。同时URL构造函数要求第二个参数为合法URL格式值,传入path.resolve返回的本地路径自然会报错。
正确实现方案
方案1:直接使用URL原生相对路径(最简写法,无需额外依赖)
URL构造函数本身就支持相对路径解析,直接在第一个参数写../即可识别上级目录:
import fs from 'fs'; const result = fs.readFileSync( new URL("../abc.json", import.meta.url) );
如果需要拿到JSON对象,自行调用JSON.parse即可:
const jsonData = JSON.parse(result.toString());
方案2:结合path模块处理(适合复杂路径场景)
如果需要做多层路径计算等更复杂的逻辑,可以先把import.meta.url转换为本地文件路径再处理:
import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; // 将当前模块URL转换为本地绝对文件路径 const __filename = fileURLToPath(import.meta.url); // 获取当前模块所在的目录路径 const __dirname = path.dirname(__filename); // 拼接上级目录的abc.json路径 const targetPath = path.resolve(__dirname, '../abc.json'); const result = fs.readFileSync(targetPath);
补充优化
如果使用Node.js v17.1.0及以上版本,可以直接用ESM语法导入JSON文件,不需要手动读文件解析:
import abcConfig from '../abc.json' assert { type: 'json' };
导入的abcConfig直接就是解析完成的JS对象,无需额外处理。
内容的提问来源于stack exchange,提问作者Isaac
相关产品推荐
相关产品推荐

