打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Node路径

原文地址:https://github.com/imsobear/blog/issues/48

一、挖坑 & 掉坑:

缘起一段这样的代码:

fs.readFile('./docs/use.md', function (err, buffer) {    if (err) {      return console.log('error: ', err);    }    console.log('OK');  });

本地运行时一切 OK,线上部署时却死活找不到 ./docs/use.md 这个文件,后来才发现是因为线上启动应用时不是从当前目录启动了,不过为什么启动脚本的位置也会影响这个路径呢,且往下看。

二、填坑:

Node 中的文件路径大概有 __dirname__filenameprocess.cwd()./ 或者 ../,前三个都是绝对路径,为了便于比较,./ 和 ../ 我们通过 path.resolve('./')来转换为绝对路径。

先看一个简单的栗子:

假如我们有这样的文件结构:

app/    -lib/        -common.js    -model        -task.js        -test.js

在 task.js 里编写如下的代码:

var path = require('path');console.log(__dirname);console.log(__filename);console.log(process.cwd());console.log(path.resolve('./'));

在 model 目录下运行 node task.js 得到的输出是:

/Users/guo/Sites/learn/app/model.js/Users/guo/Sites/learn/app/model.js/task.js/Users/guo/Sites/learn/app/model.js/Users/guo/Sites/learn/app/model.js

然后在 app 目录下运行 node model/task.js,得到的输出是:

/Users/guo/Sites/learn/app/model.js/Users/guo/Sites/learn/app/model.js/task.js/Users/guo/Sites/learn/app/Users/guo/Sites/learn/app

那么,不好意思不是问题来了~T_T,我们可以得出一些肤浅的结论了:

  • __dirname: 总是返回被执行的 js 所在文件夹的绝对路径
  • __filename: 总是返回被执行的 js 的绝对路径
  • process.cwd(): 总是返回运行 node 命令时所在的文件夹的绝对路径
  • ./: 跟 process.cwd() 一样、一样、一样的吗?

我明明记得在 require('../lib/common') 里一直都是各种相对路径写,也没见报什么错啊,我们还在再来个栗子吧,还是上面的结构,'model/task.js' 里的代码改成:

var fs = require('fs');var common = require('../lib/common');fs.readFile('../lib/common.js', function (err, data) {    if (err) return console.log(err);    console.log(data);});

在 model 目录下运行 node task.js,一切 Ok,没有报错。然后在 app 目录下运行 node model/task.js,然后很果断滴报错了:

那么这下问题真的都是来了,按照上面的理论,在 app 下运行时,../lib/common.js 会被转成/Users/guo/Sites/learn/lib/common.js,这个路径显然是不存在的,但是从运行结果可以看出require('../lib/common') 是 OK 的,只是 readFile 时报错了。

那么关于 ./ 正确的结论是:

在 require() 中使用是跟 __dirname 的效果相同,不会因为启动脚本的目录不一样而改变,在其他情况下跟 process.cwd() 效果相同,是相对于启动脚本所在目录的路径。

三、总结:

只有在 require() 时才使用相对路径(./, ../) 的写法,其他地方一律使用绝对路径,如下:

// 当前目录下path.dirname(__filename) + '/test.js';// 相邻目录下path.resolve(__dirname, '../lib/common.js');
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Node.js基础入门第五天
关于Node中Path路径的学习笔记
node 学习笔记
Node中的模块
webpack笔记-webpack之模块module、路径解析、resolve 配置(三)
转-webpack学习笔记--整体配置结构
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服