Node常用内置模块之path模块

1、path.basename()

作用返回 path 的最后一部分(获取路径最后一部内容),一般用它来获取文件名称

说明:path.basename(path[, suffix])

【注意】:如果 path 不是字符串,或者如果给定 suffix 并且不是字符串,则抛出 TypeError

用法

path.basename('/foo/bar/baz/asdf/quux.html');
// Returns: 'quux.html'

path.basename('/foo/bar/baz/asdf/quux.html', '.html');
// Returns: 'quux' 拷贝

尽管 Windows 通常以不区分大小写的方式处理文件名(包括文件扩展名),但此函数不会。 例如,C:\foo.html 和 C:\foo.HTML 指的是同一个文件,但 basename 将扩展名视为区分大小写的字符串:

path.win32.basename('C:\\foo.html', '.html');
// Returns: 'foo'

path.win32.basename('C:\\foo.HTML', '.html');
// Returns: 'foo.HTML' 

2、path.dirname(path)

作用:方法返回 path 的目录名,类似于 __dirname 命令。路径最后分隔符部分被忽略

【注意】:如果 path 不是字符串,则抛出 TypeError。

path.dirname('c:/a/b/c/d.html')
//return :  'c:/a/b/c'
已知当前文件路径 '/Users/cpf/Desktop/demo/node/01hello.js'

path.dirname(__filename)
//return: '/Users/cpf/Desktop/demo/node'
path.dirname(__dirname)
//return:  '/Users/cpf/Desktop/demo'

3、path.extname()

作用:返回 path 的扩展名(获取路径中文件扩展名(后缀)),即 path 的最后一部分中从最后一次出现的 .(句点)字符到字符串的结尾。

【注意】:如果 path 的最后一部分中没有 .,或者除了 path 的基本名称(参见 path.basename())的第一个字符之外没有 . 个字符,则返回空字符串

【注意】:如果 path 不是字符串,则抛出 TypeError。

path.extname('index.html');
// Returns: '.html'

path.extname('index.coffee.md');
// Returns: '.md'

path.extname('index.');
// Returns: '.'

path.extname('index');
// Returns: ''

path.extname('.index');
// Returns: ''

path.extname('.index.md');
// Returns: '.md' 

4、path.join()

作用:path.join()该方法是用分隔符将所有给定的 path 片段连接在一起,然后规范化生成的路径。

说明:path.join([path1][, path2][, …])

【注意】:如果任何参数不是字符串,则抛出 TypeError。

用法

1、当path路径为无或空时,得到的结果是" . ",只有传入__dirname的时候,才能得到绝对路径

// 引入path模块
const path = require('path');
 
// 此处直接打印
console.log(path.join());
console.log(path.join(''));
console.log(path.join(__dirname));
// 输出:.
// 输出:.
// 输出:E:\Berlin-Case\path

2、以 ./ /或 没有字符,则正常拼接前面路径

加不加.//都不影响路径的拼接,跟path.resolve()不同;
因为path.join()只会单纯的去拼接你写入的"path"路径,而不会像path.resolve()那样用cd去运作;

// 引入path模块
const path = require('path');
 
// 此处直接打印
console.log(path.join());
console.log(path.join('a'));
console.log(path.join('a','b'));
console.log(path.join('c','b','a'));
console.log(path.join('./a'));
console.log(path.join('a','./b'));
console.log(path.join('./c','b','./a'));
console.log(path.join('/a'));
console.log(path.join('a','/b'));
console.log(path.join('/c','b','/a'));
// 输出:.
// 输出:a
// 输出:a\b
// 输出:c\b\a
// 输出:a
// 输出:a\b
// 输出:c\b\a
// 输出:\a
// 输出:a\b
// 输出:\c\b\a

3、以../开头,从右到左去拼接的来覆盖掉;

// 引入path模块
const path = require('path');
 
// 此处直接打印
console.log(path.join());
console.log(path.join('../'));
console.log(path.join('../a'));
console.log(path.join('../a','b'));
console.log(path.join('a','../b'));
console.log(path.join('c','b','../a'));
console.log(path.join('../c','b','a'));
 
// 输出:.
// 输出:..\
// 输出:..\a
// 输出:..\a\b
// 输出:b
// 输出:c\a
// 输出:..\c\b\a

path.join()和__dirname一起使用

// 引入path模块
const path = require('path');
 
// 此处直接打印
console.log(path.join(__dirname,'/a'));
console.log(path.join(__dirname,'./a'));
console.log(path.join(__dirname,'../'));
console.log(path.join(__dirname,'../a'));
console.log(path.join(__dirname,'../a','b'));
 
// 输出:E:\Berlin-Case\path\a
// 输出:E:\Berlin-Case\path\a
// 输出:E:\Berlin-Case\
// 输出:E:\Berlin-Case\a
// 输出:E:\Berlin-Case\a\b

以上示例可以看出,‘/’ ‘./’ 这两个字符在path.join()的方法中是不起作用的,不加也是一样的效果,只有 '…/ ’ 才有返回上级目录的作用,所以使用path.join()时,加个__dirname,拼上你要的"path"路径即可;

5、path.resolve()

作用:path.resolve() 该方法将一些的 路径/路径段 解析为 绝对路径

	path.resolve总是返回一个以相对于当前的工作目录(working directory)的绝对路径。
	 
	给定的路径序列从右到左处理,每个后续的 path 会被追加到前面,直到构建绝对路径,
	
	相当于:每一个参数都理解为一个cd命令。最终cd到哪个路径。返回该绝对路径。

语法:path.resolve( [from…],to )

说明:将参数to位置的字符解析到一个绝对路径里,[from … ]为选填项,路径源;

【注意】:如果任何参数不是字符串,则抛出 TypeError。

用法

1、如果以 / 开头,不会拼接到前面的路径:

path.resolve('/foo/bar', '/baz') 

结果: '/baz'
 
因为 '/baz' 已经是一个绝对路径,故不会再向前拼接.
// 引入path模块
const path = require('path');
 
// 此处直接打印
console.log(path.resolve());
console.log(path.resolve('/a'));
console.log(path.resolve('/a','b','c'));
console.log(path.resolve('a','/b','c'));
console.log(path.resolve('c','b','/a'));
// 输出:E:\Berlin-Case\path
// 输出:E:\a
// 输出:E:\a\b\c
// 输出:E:\b\c
// 输出:E:\a

2、如果以 ./ 开头 或者没有符号,则正常拼接前面路径:

path.resolve('/foo/bar', './baz')  

结果:'/foo/bar/baz'
// 引入path模块
const path = require('path');
 
// 此处直接打印
console.log(path.resolve());
console.log(path.resolve('a'));
console.log(path.resolve('a','b'));
console.log(path.resolve('c','b','a'));
console.log(path.resolve('./a'));
console.log(path.resolve('a','./b'));
console.log(path.resolve('./c','b','./a'));
// 输出:E:\Berlin-Case\path
// 输出:E:\Berlin-Case\path\a
// 输出:E:\Berlin-Case\path\a\b
// 输出:E:\Berlin-Case\path\c\b\a
// 输出:E:\Berlin-Case\path\a
// 输出:E:\Berlin-Case\path\a\b
// 输出:E:\Berlin-Case\path\c\b\a

3、如果以 ../ 开头,拼接前面的路径,不含最后一节路径:

path.resolve('/foo/bar', '../baz')  

结果: '/foo/baz' 

拼接前面路径  '/foo/bar' ,但是不包含前面路径最后 '/bar' 这部分

4、如果没有传入 path 片段,则 path.resolve() 将返回当前工作目录的绝对路径,类似于__dirname

//假设该文件的路径问为 /Users/kk/Desktop/my/node_koa/abc.js

const path = require('path');
let res = path.resolve();
console.log(res)
 
结果:/Users/kk/Desktop/my/node_koa 
 
/Users/kk/Desktop/my/node_koa  为该文件的根目录
// 此处直接打印
console.log(path.resolve());
console.log(path.resolve(''));
console.log(path.resolve(__dirname);
// 输出:E:\Berlin-Case\path
// 输出:E:\Berlin-Case\path
// 输出:E:\Berlin-Case\path

例子:

path.resolve('/foo/bar', './baz')
// 输出结果为
'/foo/bar/baz'
path.resolve('/foo/bar', '/tmp/file/')
// 输出结果为
'/tmp/file'

path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif')
// 当前的工作路径是 /home/itbilu/node,则输出结果为
'/home/itbilu/node/wwwroot/static_files/gif/image.gif' 

path.resolve()搭配__dirname一起使用

// 引入path模块
const path = require('path');
 
// 此处直接打印
console.log(path.resolve(__dirname,'a'));
console.log(path.resolve('a','b',__dirname));
console.log(path.resolve(__dirname,'./a','b'));
console.log(path.resolve(__dirname,'/a','b'));
console.log(path.resolve(__dirname,'../a','b'));
console.log(path.resolve(__dirname,'a','../b'));
console.log(path.resolve('a','/b',__dirname));
 
// 输出:E:\Berlin-Case\path\a
// 输出:E:\Berlin-Case\path
// 输出:E:\Berlin-Case\path\a\b
// 输出:E:\a\b
// 输出:E:\Berlin-Case\a\b
// 输出:E:\Berlin-Case\path\b
// 输出:E:\Berlin-Case\path

从案例五例子可以看出,__dirname变量需放在第一个,否则会覆盖在它之前的’path’路径,包括斜杠’ / ‘,还有个要注意的点,__dirname之后也不能出现’ / ',不然也覆盖之前的路径;

path.join() 和 path.resolve() 的区别

  1. path.resolve()自带to参数,也就是当前输出文件的路径,而path.join()没有;
  2. path.resolve()遇到 ’ / ’ 则会跳转到根目录(E:),而path.join()则没效果;
  3. path.resove()搭配__dirname变量使用时,就算__dirname在最右边,resolve()会把左边的"path"路径给覆盖掉,形成正确的路径,而path.join()正常拼接,无论对错;

【参考文章】

  • 详解Node.js中path.resolve与path.join的区别与作用
  • Node中文网之path模块

你可能感兴趣的:(Node,前端,javascript,node.js)