Node 中的文件路径大概有 __dirname, __filename, process.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 得到的输出是:
$ node task.js
C:\Users\jianting\Desktop\app\model
C:\Users\jianting\Desktop\app\model\task.js
C:\Users\jianting\Desktop\app\model
C:\Users\jianting\Desktop\app\model
然后在 app 目录下运行 node model/task.js,得到的输出是:
$ node model/task.js
C:\Users\jianting\Desktop\app\model
C:\Users\jianting\Desktop\app\model\task.js
C:\Users\jianting\Desktop\app
C:\Users\jianting\Desktop\app
另一种常用的resolve拼接地址的情况,在 test.js 里编写如下的代码:
var path = require('path');
console.log(path.resolve(__dirname, 'lib/common.js'));
console.log(path.resolve(__dirname, '/lib/common.js'));
console.log(path.resolve(__dirname, './lib/common.js'));
console.log(path.resolve(__dirname, '../lib/common.js'));
在 model 目录下运行 node test.js 得到的输出是:
$ node test.js
C:\Users\jianting\Desktop\app\model\lib\common.js
C:\lib\common.js
C:\Users\jianting\Desktop\app\model\lib\common.js
C:\Users\jianting\Desktop\app\lib\common.js
那么,我们可以得出一些肤浅的结论了:
1、__dirname: 总是返回被执行的 js 所在文件夹的绝对路径
2、__filename: 总是返回被执行的 js 的绝对路径
3、process.cwd(): 总是返回运行 node 命令时所在的文件夹的绝对路径
关于 . / 和 . ./ 正确的结论是:
在 require() 中使用是跟 __dirname 的效果相同,不会因为启动脚本的目录不一样而改变,在其他情况下跟 process.cwd() 效果相同,是相对于启动脚本所在目录的路径。
只有在 require() 时才使用相对路径(./, ../) 的写法,其他地方一律使用绝对路径,如下:
// 当前目录下
path.dirname(__filename) + '/test.js';// path.dirname:返回路径的所在的文件夹名称
// 相邻目录下
path.resolve(__dirname, '../lib/common.js');// path.resolve:相当于不断的调用系统的cd命令
path.join()和path.resolve()区别:
1、path.join
path.join():方法使用平台特定的分隔符把全部给定的 path 片段连接到一起,并规范化生成的路径。
例如:path.join('foo', 'baz', 'bar'); // 返回 'foo/baz/bar'
注:如果连接后的路径字符串是一个长度为零的字符串,则返回 '.',表示当前工作目录。
2、path.resolve
path.resolve:方法会把一个路径或路径片段的序列解析为一个绝对路径。
例如:
注: 当前工作目录为 /home/myself/node
1、path.resolve('/foo/bar', './baz');// 返回: '/foo/bar/baz'
2、path.resolve('/foo/bar', '/tmp/file/');// 返回: '/tmp/file'
3、path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif');// 如果当前工作目录为 /home/myself/node,// 则返回 '/home/myself/node/wwwroot/static_files/gif/image.gif'两者区别:
1、join是把各个path片段连接在一起, resolve把‘/’当成根目录
path.join('/a', '/b') // Outputs '/a/b'
path.resolve('/a', '/b') // Outputs '/b'
2、join直接拼接字段,resolve解析路径并返回
path.join("a", "b1", "..", "b2")
console打印会得到"a/b2"
path.resolve("a", "b1", "..", "b2")
console打印得到"/home/myself/node/a/b2"
详细内容的链接:请打开