Node.js中URL路径使用./前缀与不使用的区别
Node.js 中
./some-file-url与some-file-url路径的核心差异 二者解析逻辑完全不同,具体表现和调用的API场景强相关,没有通用等价关系,常见场景的差异如下:
- 模块加载场景(
require()/import引入模块)- 带
./前缀:属于本地相对路径标识,Node会以当前执行文件所在的目录为基准,拼接查找对应本地文件。比如在/code/project/src/index.js中写require('./tool.js'),最终查找路径为/code/project/src/tool.js;ESM规范下的import规则完全一致,只有./开头的路径才会被识别为本地文件,不会去依赖目录查找。 - 不带前缀的
some-file-url:属于模块标识符,Node不会按本地相对路径查找,优先匹配Node内置核心模块(比如fs、path),核心模块匹配不到时,会从当前目录向上逐层遍历node_modules目录查找对应第三方包,永远不会直接匹配当前目录下的同名文件。哪怕当前目录有个tool.js,直接写require('tool.js')只会抛出模块找不到的错误。
- 带
- 文件系统操作场景(
fs模块所有读写API)- 带
./前缀:解析基准是Node进程启动时的工作目录(即process.cwd()返回值),和当前执行文件所在目录无关。比如你在/code/project目录下执行node src/index.js,代码里写fs.readFileSync('./config.json'),实际查找的是/code/project/config.json,不是/code/project/src/config.json。 - 不带前缀的
some-file-url:解析逻辑和带./完全一致,同样以process.cwd()为基准拼接路径,fs.readFileSync('config.json')和fs.readFileSync('./config.json')效果完全等价,不会触发模块查找逻辑。
- 带
- URL构造与路由场景
- 带
./前缀:作为相对路径传入new URL()时,会以基础URL的当前路径层级为基准做替换,比如基础地址为https://test.com/a/b/page.html,new URL('./detail.html', base)最终得到的地址是https://test.com/a/b/detail.html。如果是在Express这类Web框架里写路由路径,./不会被特殊解析,会被当成普通字符串做路径匹配,实际开发几乎不会这么写。 - 不带前缀的路径:传入
new URL()做相对地址时,表现和./开头完全一致;如果是框架路由路径,就是普通的路径匹配规则,没有特殊含义。
- 带
常见踩坑提醒:不要搞混模块加载和fs API的路径基准差异,模块加载的
./基准是当前文件所在目录,fs的./基准是进程启动目录。如果要固定以当前文件所在目录为基准查找文件,建议用path.resolve(__dirname, '目标路径')(CommonJS)或path.resolve(import.meta.dirname, '目标路径')(ESM)拼接绝对路径,避免启动目录变化导致文件查找失败。
内容的提问来源于stack exchange,提问作者Agu
相关产品推荐
相关产品推荐

