Windows下Node.js path.resolve处理POSIX路径时重复盘符问题
问题场景
项目目录位于 H:/Book/debug/TxbookHlstDebug/libNt/hlst-buildhtml-foredit/js/main/src(Windows + Node.js环境),调用 path.resolve(__dirname, 'aa') 时,预期结果为 H:\Book\debug\TxbookHlstDebug\libNt\hlst-buildhtml-foredit\js\main\src\aa 或 H:/Book/debug/TxbookHlstDebug/libNt/hlst-buildhtml-foredit/js/main/src/aa,但实际得到的是 H:\H:\Book\debug\TxbookHlstDebug\libNt\hlst-buildhtml-foredit\js\main\src\aa,出现盘符重复问题。
临时方案的隐患
曾用 path.resolve(__dirname.substring(1), 'aa') 临时解决,但这种方式存在安全隐患——若路径并非以盘符开头,截取第一个字符会破坏原有路径结构。
问题根源
项目使用ESM模块而非CommonJS,直接引用 __dirname 会报错。此前错误通过以下代码获取 __dirname:
const __filename = new URL(import.meta.url).pathname; const __dirname = path.dirname(__filename);
这种方式得到的路径开头会多一个 /(例如 /H:/Book/...),path.resolve 处理该路径时会将其识别为相对路径,最终导致盘符重复。
正确解决方案
使用Node.js内置的 url.fileURLToPath 方法处理 import.meta.url,正确获取 __filename 和 __dirname:
const __filename = url.fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename);
通过这种方式获取的路径符合Windows系统规范,调用 path.resolve(__dirname, 'aa') 可得到预期结果,彻底解决盘符重复问题。
内容的提问来源于stack exchange,提问作者Nor.Z

