2019-09-05
JiangRen Mr
之前在做webpack
配置时候多次用到路径相关内容,最近在写项目的时候,有一个文件需要上传到阿里云oss的功能,同时本地服务器也需要保留一个文件备份。多次用到了文件路径相关内容以及Node核心API的path
模块,所以系统的学习了一下,整理了这篇文章。
node中的路径大致分5类,dirname
,filename
,process.cwd()
,./
,../
,其中dirname
,filename
,process.cwd()
绝对路径
通过代码对每个分类进行说明:
文件目录结构如下:
代码pra/
- node核心API/
- fs.js
- path.js
path.js中的代码
const path = require('path');
console.log(__dirname);
console.log(__filename);
console.log(process.cwd());
console.log(path.resolve('./'));
在代码pra目录下运行命令 node node核心API/path.js
,我们可以看到结果如下:
/koala/Desktop/程序员成长指北/代码pra/node核心API
/koala/Desktop/程序员成长指北/代码pra/node核心API/path.js
/koala/Desktop/程序员成长指北/代码pra
/koala/Desktop/程序员成长指北/代码pra
然后我们有可以在node核心API目录下
运行这个文件,node path.js
,运行结果如下:
/koala/Desktop/程序员成长指北/代码pra/node核心API
/koala/Desktop/程序员成长指北/代码pra/node核心API/path.js
/koala/Desktop/程序员成长指北/代码pra/node核心API
/koala/Desktop/程序员成长指北/代码pra/node核心API
对比输出结果,暂时得到的结论是
为什么说上面是暂时得到的结论,因为是有错误的,再看一段代码:
我们在path.js中加上这句代码
exports.A = 1;
之前直接通过readFile读取文件路径报错,
fs.readFile('./path.js',function(err,data){
});
现在在刚才报错的fs.js里面加这两句代码看看:
const test = require('./path.js');
console.log(test)
在代码pra/
目录下运行node node核心API/fs.js
,最后查看结果,说明是可以访问到的:
{ A: 1 }
那么关于 ./
正确的结论是:
在 require()
中使用是跟 __dirname
的效果相同,不会因为启动脚本的目录不一样而改变,在其他情况下跟 process.cwd()
效果相同,是相对于启动脚本所在目录的路径。
__dirname
: 获得当前执行文件所在目录的完整目录名__filename
: 获得当前执行文件的带有完整绝对路径的文件名process.cwd()
:获得当前执行node命令时候的文件夹目录名./
: 不使用require时候,./
与process.cwd()
一样,使用require
时候,与__dirname
一样只有在 require() 时才使用相对路径(./, ../) 的写法,其他地方一律使用绝对路径,如下:
// 当前目录下
path.dirname(__filename) + '/path.js';
// 相邻目录下
path.resolve(__dirname, '../regx/regx.js');
前面讲解了路径的相关比较,接下来单独聊聊path这个模块,这个模块在很多地方比较常用,所以,对于我们来说,掌握他,对我们以后的发展更有利,不用每次看webpack的配置文件还要去查询一下这个api是干什么用的,很影响我们的效率
这是api官网地址:https://nodejs.org/api/path.html
个人认为官网中的api没有必要都掌握,下面会对一些常用的api进行讲解,我经常用到的,或者作为一个前端开发工程师在webpack等工程配置的时候经常用到的。
举例说明
const path = require('path');
console.log(path.normalize('/koala/Desktop//程序员成长指北//代码pra/..'));
规范后的结果
/koala/Desktop/程序员成长指北/代码pra
作用总结
规范化路径,把不规范的路径规范化。
举例说明
const path = require('path');
console.log(path.join('src', 'task.js'));
const path = require('path');
console.log(path.join(''));
转化后的结果
src/task.js
.
作用总结
path.join([...paths])
Unix
系统是/
,Windows
系统是\
,那么你在两个系统下看到的返回结果就不一样。.
,代表当前的文件夹。举例说明
const path = require('path');
console.log(path.parse('/koala/Desktop/程序员成长指北/代码pra/node核心API'));
运行结果
{ root: '/',
dir: '/koala/Desktop/程序员成长指北/代码pra',
base: 'node核心API',
ext: '',
name: 'node核心API'
}
作用总结
他返回的是一个对象,那么我们来把这么几个名词熟悉一下:
举例说明
const path = require('path');
console.log(path.basename('/koala/Desktop/程序员成长指北/代码pra/node核心API'));
console.log(path.basename('/koala/Desktop/程序员成长指北/代码pra/node核心API/path.js', '.js'));
运行结果
看了上面代码的例子,我想应该知道了basename结果,嘿嘿。
node核心API
path
作用总结
basename接收两个参数,第一个是path
,第二个是ext
(可选参数),当输入第二个参数的时候,打印结果不出现后缀名
举例说明
const path = require('path');
console.log(path.dirname('/koala/Desktop/程序员成长指北/代码pra/node核心API'));
运行结果
/koala/Desktop/程序员成长指北/代码pra
作用总结
返回文件的目录完整地址
举例说明
const path = require('path');
path.extname('index.html');
path.extname('index.coffee.md');
path.extname('index.');
path.extname('index');
path.extname('.index');
运行结果
.html
.md
.
''
''
作用总结
返回的是后缀名,但是最后两种情况返回'',大家注意一下。
举例说明
const path = require('path');
console.log(path.resolve('/foo/bar', '/bar/faa', '..', 'a/../c'));
输出结果
/bar/c
作用总结
path.resolve([...paths])
path.resolve就相当于是shell下面的cd
操作,从左到右运行一遍cd path
命令,最终获取的绝对路径/文件名,这个接口所返回的结果了。但是resolve
操作和cd
操作还是有区别的,resolve
的路径可以没有,而且最后进入的可以是文件。具体cd
步骤如下
cd /foo/bar/ //这是第一步, 现在的位置是/foo/bar/
cd /bar/faa //这是第二步,这里和第一步有区别,他是从/进入的,也就时候根目录,现在的位置是/bar/faa
cd .. //第三步,从faa退出来,现在的位置是 /bar
cd a/../c //第四步,进入a,然后在推出,在进入c,最后位置是/bar/c
举例说明
const path = require('path');
console.log(path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb'));
console.log(path.relative('/data/demo', '/data/demo'));
console.log(path.relative('/data/demo', ''));
运行结果
../../impl/bbb
""
../../koala/Desktop/程序员成长指北/代码pra/node核心API
作用总结
path.relative(from, to)
描述:从from路径,到to路径的相对路径。
边界:
本篇文章关于路径的知识就说到这里,基础很重要的,既能节约开发时间,又能减少报错。
本文章转载自SegmentFault。
IT Support 训练营01期
2025/11/10 06:13 (Sydney)
CCNA考证班01期
2025/09/06 08:37 (Sydney)
商业数据分析实战班第17期
2025/03/15 06:13 (Sydney)
地址
Level 10b, 144 Edward Street, Brisbane CBD(Headquarter)Level 2, 171 La Trobe St, Melbourne VIC 3000四川省成都市武侯区桂溪街道天府大道中段500号D5东方希望天祥广场B座45A13号Business Hub, 155 Waymouth St, Adelaide SA 5000Disclaimer
JR Academy acknowledges Traditional Owners of Country throughout Australia and recognises the continuing connection to lands, waters and communities. We pay our respect to Aboriginal and Torres Strait Islander cultures; and to Elders past and present. Aboriginal and Torres Strait Islander peoples should be aware that this website may contain images or names of people who have since passed away.
匠人学院网站上的所有内容,包括课程材料、徽标和匠人学院网站上提供的信息,均受澳大利亚政府知识产权法的保护。严禁未经授权使用、销售、分发、复制或修改。违规行为可能会导致法律诉讼。通过访问我们的网站,您同意尊重我们的知识产权。 JR Academy Pty Ltd 保留所有权利,包括专利、商标和版权。任何侵权行为都将受到法律追究。查看用户协议
© 2017-2024 JR Academy Pty Ltd. All rights reserved.
ABN 26621887572