为何express.static传入相对路径与拼接__dirname的路径效果一致
这两种写法效果一致,是因为你启动Node进程的工作目录刚好让二者解析出的目标路径完全相同,具体逻辑如下:
- 第一种
app.use(express.static('public'))的解析逻辑
当你给express.static传入相对路径时,Express会将该路径和*Node进程启动时的当前工作目录(CWD)*做拼接得到最终的静态资源目录。
你运行服务时大概率是在项目根目录(也就是public和src文件夹的父级目录)执行的启动命令,比如node src/app.js,此时进程的CWD就是项目根目录,拼接public后得到的路径就是根目录下的public文件夹,刚好是静态资源的正确存放位置。 - 第二种
app.use(express.static(path.join(__dirname, '..', 'public')))的解析逻辑
Node.js中__dirname是内置变量,它的值永远是当前执行的JS文件(这里就是src/app.js)所在目录的绝对路径。按你的目录结构,__dirname的值就是<项目根目录路径>/src,拼接..(上级目录)后回到项目根目录,再拼接public,最终得到的绝对路径同样是根目录下的public文件夹。
注意:第一种相对路径的写法是不稳定的。如果你切换启动目录,比如进入
src文件夹下执行node app.js,此时进程CWD是src目录,express.static('public')会尝试寻找src/public目录,该路径不存在,访问静态资源就会返回404。而第二种基于__dirname的绝对路径写法,不管你在哪个目录启动进程,都能正确定位到public文件夹,是生产环境更推荐的写法。
内容的提问来源于stack exchange,提问作者Ghost
相关产品推荐
相关产品推荐

