什么是路径
路径就是”地址”
路径(Path)就是描述”资源在哪里”的方式。
就像现实生活中的地址:
- 北京市朝阳区某某路 88 号 = 绝对地址
- 往前走第二个路口左转 = 相对地址
在计算机和 Web 开发中,路径用来描述文件在哪里或者资源在哪里。
为什么路径容易搞混
路径的四种场景
在 Web 开发中,我们经常遇到四種不同的路径:
| 场景 | 说明 | 示例 |
|---|---|---|
| 文件系统路径 | 硬盘上的文件位置 | /home/user/project/api/like.ts |
| URL 路径 | 网络上的资源地址 | https://example.com/api/like |
| 模块路径 | JavaScript 引入模块 | import { xxx } from '@/utils/xxx' |
// 模块路径示例import { useState } from 'react'; // 从 node_modules 导入import MyComponent from '@/components/MyComponent'; // 使用别名导入(@ 指向前 src 目录)import api from '../utils/api'; // 相对导入| 路由路径 | 框架定义的 URL 映射 | app.get('/api/users', ...) |
它们看起来很像,但完全不是一回事!
文件系统路径
什么是文件系统
文件系统是操作系统管理硬盘的方式,帮你找到存储在磁盘上的文件。
Windows vs Mac/Linux 的路径差异
# Windows:从盘符开始D:\project\blog\api\like.tsC:\Users\admin\Desktop\notes.md
# Mac/Linux:从根目录开始(/)/home/user/project/api/like.ts/etc/nginx/nginx.conf/usr/local/bin/node关键区别:
- Windows 用反斜杠
\(\) - Mac/Linux 用正斜杠
/(/) - Windows 有盘符(C:, D:),Unix 没有
开发提示:在 Node.js 和 JavaScript 中,即使在 Windows 系统上,也通常使用正斜杠
/作为路径分隔符,因为 Node.js 会自动处理。例如,'C:/Users/admin/project'在 Windows 上同样有效。
路径的基本概念
/home/user/project/src/components/Button.ts^^^^^^ ^^^ ^^^^ ^^^^^^ ^^^^^^^^^^ ^^^^^^^根目录 用户 项目 源码 组件 文件URL 路径
URL 的结构
https://example.com:443/api/users?id=1#section^^^^^^^^ ^^^^://^^^ ^^^^/^^ ^^^^^^ ^^=^ ^^^^^^ | | | | | | | 协议 域名 端口 路径 查询参数 锚点URL 路径 vs 文件系统路径
相似之处:都使用 / 分隔层级
本质区别:
| 属性 | 文件系统路径 | URL 路径 |
|---|---|---|
| 分隔符 | Windows \ 或 Unix / | 始终 / |
| 根目录 | 硬盘根或用户目录 | 域名根 |
| 访问方式 | 通过操作系统读取 | 通过 HTTP 请求 |
| 存在位置 | 磁盘上(物理文件) | 服务器上的映射(虚拟地址) |
URL 路径的层级
https://example.com/blog/posts/dns-guide ^^^^^^^^^^^^^^ 路径层级绝对路径
什么是绝对路径
绝对路径是从”根”开始的完整地址,在任何地方都能找到。
文件系统的绝对路径
# Linux/Mac:从根目录 / 开始/etc/nginx/nginx.conf/home/user/project/src/index.ts/var/log/nginx/access.log
# Windows:从盘符开始D:\project\blog\api\like.tsC:\Users\admin\Desktop\notes.mdURL 的绝对路径
<!-- 完整的绝对 URL(带协议) --><a href="https://example.com/api/users">链接</a>
<!-- 根相对路径(从域名根开始,不带协议) --><a href="/api/users">链接</a><a href="/images/logo.png">图片</a>/ 在 URL 中永远代表域名根目录,不是当前页面所在位置。
相对路径
什么是相对路径
相对路径是相对于”我现在在哪里”的位置。
文件系统的相对路径
假设当前目录是 /home/user/project/:
# 当前目录.
# 当前目录下的 srcsrc/
# 当前目录下的 src/index.tssrc/index.ts
# 上一级目录..
# 上上级目录../..
# 上一级的 config 文件夹../config/
# 上一级的 config/settings.json../config/settings.jsonURL 的相对路径
假设当前页面是 https://example.com/blog/posts/:
| 相对路径 | 解析后的 URL |
|---|---|
./ | https://example.com/blog/posts/ |
style.css | https://example.com/blog/posts/style.css |
../ | https://example.com/blog/ |
../images/photo.png | https://example.com/blog/images/photo.png |
/static/logo.png | https://example.com/static/logo.png |
. 和 .. 的区别
. 当前目录.. 上一级(父)目录相对路径的风险
相对路径在不同场景下可能出问题:
<!-- 在 https://example.com/blog/ 中 --><a href="posts/dns-guide">文章</a><!-- 链接到 https://example.com/blog/posts/dns-guide ✓ -->
<!-- 在 https://example.com/ 中 --><a href="posts/dns-guide">文章</a><!-- 链接到 https://example.com/posts/dns-guide ✓ -->同一个相对路径,在不同页面可能指向不同位置。
经验之谈:在生产环境中,尽量使用绝对路径(以 / 开头),避免相对路径的歧义。
框架的路由定义
我的真实经历
最开始用的是 Node.js + Express 框架:
app.get('/api/like', (req, res) => res.json({ count: 42 }));app.get('/', (req, res) => res.send('首页'));我以为访问根路径 / 就能调用 API:
错误想法:API 放在 api/ 文件夹里,访问 https://xxx.com/ 就应该能调用。
实际情况:
| 路由定义 | 访问地址 |
|---|---|
app.get('/api/like', ...) | https://xxx.com/api/like |
app.get('/', ...) | https://xxx.com/ |
根路径 / 对应的是首页,不是 API。
核心要点
在 Express(以及 Koa、Nest 等 Node.js 框架)中:
- 每个 URL 必须在代码里明确定义
- 文件夹名 ≠ 路由路径
- 你写什么路径,就只能访问什么路径
// ❌ 错误:以为会自动映射// API 在 api/like.js,就以为能访问 /api/like
// ✅ 正确:必须明确定义路由app.get('/api/like', (req, res) => { ... });app.post('/api/like', (req, res) => { ... });Express vs 约定式路由对比
| 特性 | Express(代码定义路由) | Next.js(约定式路由) |
|---|---|---|
| 路由定义方式 | 在代码中用 app.get('/path', ...) 明确定义 | 由文件系统结构自动映射 |
| 文件夹与路由关系 | 无关。文件夹仅用于组织代码 | 强相关。pages/api/users.ts → /api/users |
| 灵活性 | 高,可自定义任意路径 | 低,路径由文件位置决定 |
| 开发心智模型 | ”我定义什么,用户就能访问什么" | "文件放哪里,用户就访问哪里” |
核心区别:Express 中,路由是显式声明的;Next.js 中,路由是隐式约定的。
Express 路由的完整示例
const express = require('express');const app = express();
// 首页app.get('/', (req, res) => { res.send('这是首页');});
// 获取点赞数app.get('/api/like', (req, res) => { res.json({ count: 42 });});
// 增加点赞app.post('/api/like', (req, res) => { // 增加点赞逻辑 res.json({ count: 43 });});
// 获取用户列表app.get('/api/users', (req, res) => { res.json([{ name: 'Alice' }, { name: 'Bob' }]);});
// 获取单个用户app.get('/api/users/:id', (req, res) => { const { id } = req.params; res.json({ id, name: 'User ' + id });});对应的 URL:
| 路由 | URL |
|---|---|
app.get('/', ...) | / |
app.get('/api/like', ...) | /api/like |
app.post('/api/like', ...) | /api/like (POST) |
app.get('/api/users/:id', ...) | /api/users/123 |
常见问题
Q:文件夹叫 api,URL 就是 /api 吗?
不一定! 取决于框架:
| 框架 | 路由定义方式 |
|---|---|
| Express/Koa | 代码里写 app.get('/api/xxx', ...) |
| Next.js | 文件在 pages/api/xxx.ts → 自动映射到 /api/xxx |
| Nuxt | 文件在 server/api/xxx.ts → 自动映射到 /api/xxx |
Q:相对路径和绝对路径哪个更好?
在生产环境中,尽量用绝对路径:
<!-- 绝对路径(推荐) --><link href="/css/style.css"><a href="/api/users">用户</a><img src="/images/logo.png">
<!-- 相对路径(有风险) --><link href="../css/style.css"><a href="users">用户</a>Q:路径最后要不要加 /?
✅ /about/ → 明确是 about 目录✅ /about → 服务器通常会自动重定向到 /about/⚠️ /about → 取决于服务器配置总结
要点回顾
- 文件系统路径和 URL 路径是两回事
- 绝对路径从根开始,相对路径从当前位置算
- URL 中的
/代表域名根目录 - Express 路由:代码定义路由,写什么路径就是什么路径
- 文件夹名 ≠ 路由路径,必须在代码里明确定义(除约定式路由框架外)
一句话记住
Express 中,路由必须明确定义。你写
/api/like才能访问/api/like,不是文件夹叫什么路径就是什么。
快速对照表
| 类型 | 示例 | 特点 |
|---|---|---|
| 文件系统绝对路径 | /home/user/file.ts | 从根目录算 |
| URL 绝对路径 | https://example.com/api | 完整 URL |
| URL 根相对路径 | /api/like | 从域名根算 |
| 文件系统相对路径 | ./../file.ts | 从当前目录算 |
| URL 相对路径 | ./users | 从当前页面算 |
| 场景 | 路由/路径 | 访问地址 |
|---|---|---|
| Express 首页 | app.get('/', ...) | / |
| Express API | app.get('/api/like', ...) | /api/like |
| Express 用户 | app.get('/api/users', ...) | /api/users |
EOF
部分信息可能已经过时









