内容简介:之前在做node中的路径大致分5类,通过代码对每个分类进行说明:
之前在做 webpack
配置时候多次用到路径相关内容,最近在写项目的时候,有一个文件需要上传到阿里云oss的功能,同时本地服务器也需要保留一个文件备份。多次用到了文件路径相关内容以及Node核心API的 path
模块,所以系统的学习了一下,整理了这篇文章。
node中的路径分类
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 复制代码
对比输出结果,暂时得到的结论是
- __dirname: 总是返回被执行的 js 所在文件夹的绝对路径
- __filename: 总是返回被执行的 js 的绝对路径
- process.cwd(): 总是返回运行 node 命令时所在的文件夹的绝对路径
- ./: 跟 process.cwd() 一样,返回 node 命令时所在的文件夹的绝对路径
为什么说上面是暂时得到的结论,因为是有错误的,再看一段代码: 我们在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
前面讲解了路径的相关比较,接下来单独聊聊path这个模块,这个模块在很多地方比较常用,所以,对于我们来说,掌握他,对我们以后的发展更有利,不用每次看webpack的配置文件还要去查询一下这个api是干什么用的,很影响我们的效率
这是api官网地址: nodejs.org/api/path.ht…
个人认为官网中的api没有必要都掌握,下面会对一些常用的api进行讲解,我经常用到的,或者作为一个前端开发工程师在webpack等工程配置的时候经常用到的。
path.normalize
举例说明
const path = require('path'); console.log(path.normalize('/koala/Desktop//程序员成长指北//代码pra/..')); 复制代码
规范后的结果
/koala/Desktop/程序员成长指北/代码pra 复制代码
作用总结
规范化路径,把不规范的路径规范化。
path.join
举例说明
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
系统是\
,那么你在两个系统下看到的返回结果就不一样。 -
如果返回的路径字符串长度为零,那么他会返回一个
.
,代表当前的文件夹。 - 如果传入的参数中有不是字符串的,那就直接会报错
path.parse
举例说明
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' } 复制代码
作用总结
他返回的是一个对象,那么我们来把这么几个名词熟悉一下:
- root:代表根目录
- dir:代表文件所在的文件夹
- base:代表整一个文件
- name:代表文件名
- ext: 代表文件的后缀名
path.basename
举例说明
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
(可选参数),当输入第二个参数的时候,打印结果不出现后缀名
path.dirname
举例说明
const path = require('path'); console.log(path.dirname('/koala/Desktop/程序员成长指北/代码pra/node核心API')); 复制代码
运行结果
/koala/Desktop/程序员成长指北/代码pra 复制代码
作用总结
返回文件的目录完整地址
path.extname
举例说明
const path = require('path'); path.extname('index.html'); path.extname('index.coffee.md'); path.extname('index.'); path.extname('index'); path.extname('.index'); 复制代码
运行结果
.html .md . '' '' 复制代码
作用总结
返回的是后缀名,但是最后两种情况返回'',大家注意一下。
path.resolve
举例说明
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 复制代码
path.relative
举例说明
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路径的相对路径。
边界:
- 如果from、to指向同个路径,那么,返回空字符串。
- 如果from、to中任一者为空,那么,返回当前工作路径。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
统计思维:程序员数学之概率统计
Allen B.Downey / 张建锋、陈钢 / 人民邮电出版社 / 2013-5 / 29.00元
代码跑出来的概率统计问题; 程序员的概率统计开心辞典; 开放数据集,全代码攻略。 现实工作中,人们常被要求用数据说话。可是,数据自己是不能说话的,只有对它进行可靠分析和深入挖掘才能找到有价值的信息。概率统计是数据分析的通用语言,是大数据时代预测未来的根基。 站在时代浪尖上的程序员只有具备统计思维才能掌握数据分析的必杀技。本书正是一本概率统计方面的入门图书,但视角极为独特,折......一起来看看 《统计思维:程序员数学之概率统计》 这本书的介绍吧!