The path module is a built-in module in nodejs for processing file/directory paths. It can be regarded as a toolbox, providing many methods for us to use, of course they are all related to path processing. related. At the same time, the path module appears frequently in front-end development, such as when configuring webpack. This article introduces some commonly used methods in this module. Let’s learn together. [Related tutorial recommendations: nodejs video tutorial, Programming teaching]
const path = require('path');
const path = require("path"); path.basename('./ext/test.js') //test.js path.basename('./ext/test.js','.js') //test (当后缀名与文件名匹配上时返回的文件名会省略文件后缀) path.basename('./ext/test.js','.html') //test.js (没有匹配上时返回文件全名) path.basename('./ext/foo/') // foo (尾部目录分隔符被忽略)
const path = require("path"); path.dirname('./foo/bar/baz'); //./foo/bar (相对路径/绝对路径均可) path.dirname('/foo/bar/baz/'); // /foo/bar (尾部目录分隔符被忽略) path.dirname('/foo/bar/baz/test.js'); // /foo/bar/baz
const path = require("path"); path.extname('foo/bar/baz/test.js'); // .js path.extname('foo/bar/baz');// '' (无扩展名返回 '') path.extname('foo/bar/baz/.'); // '' path.extname('foo/bar/baz/test.'); // '.' path.extname('foo/bar/baz/.test'); // '' path.extname('foo/bar/baz/.test.js'); // '.js'
┌──────────────────┬────────────┐ │ dir │ base │ ├──────┬ ├──────┬─────┤ │ root │ │ name │ ext │ " / foo/bar/baz/ index .js "
const path = require("path"); path.parse('/foo/bar/baz/index.js') // { // root: '/', // dir: '/foo/bar/baz', // base: 'index.js', // ext: '.js', // name: 'index' // } path.parse('/foo/bar/baz') //尾部目录分隔符省略 // { // root: '/', // dir: '/foo/bar', // base: 'baz', // ext: '', // name: 'baz' // } path.parse('./foo/bar/baz/index.js') //当路径为相对路径 ./ 或../时 解析结果中root(代表根目录,绝对路径才有值)为 '' // { // root: '', // dir: './foo/bar/baz', // base: 'index.js', // ext: '.js', // name: 'index' // }
path.format(pathObj) Serialization path path, just the opposite of path.parse()
Note:
const path = require("path"); path.isAbsolute('//foo'); // true path.isAbsolute('\\\\foo'); // true path.isAbsolute('C:/foo/..'); // true path.isAbsolute('C:\\foo\\..'); // true path.isAbsolute('./bar\\baz'); // false path.isAbsolute('../bar/baz'); // false path.isAbsolute('.'); // false path.isAbsolute(''); // false
const path = require("path"); path.join('') // '.' path.join('./') // '.\'path.join('../') // '..\'path.join('/foo/','bar','baz','../','index.js') // '\foo\bar\index.js'path.join('./bar','baz' ,'/','../','',index.js') // 'bar\index.js' path.join('foo', {}, 'bar'); // 'TypeError: Path must be a string. Received {}'
const path = require("path"); path.normalize('') // '.'path.normalize('temp//foo//bar//..//'); // temp\foo\path.normalize('C:////temp\\\\/\\/\\/foo/bar') // C:\temp\foo\barpath.normalize('..////foo//\bar/baz/') // ..\fooar\baz\ (转义字符出现)path.normalize('temp//foo/\bar') // temp\fooar (转义字符出现)
const path = require("path"); //当前工作目录为 \Stone\node\node\path_module path.relative('/foo/bar/baz','/foo/bar/dir/file.js') // ..\dir\file.js path.relative('/foo/bar/baz','/foo/bar/baz') // '' path.relative('/foo/bar/baz/files.js','') // ..\..\..\..\Stone\node\node\path_module path.relative('','/foo/bar/baz/files.js') // ..\..\..\..\foo\bar\baz\files.js path.relative('','./foo/bar/baz/files.js') // foo\bar\baz\files.js
这里针对 from 或 to 任何一方为空,则使用当前工作目录代替其空路径。
稍作说明下,
例如当前工作目录为 \Stone\node\node\path_module
,则可以看到 path.relative('/foo/bar/baz/files.js','')
的输出结果为..\..\..\..\Stone\node\node\path_module
,此时 to 为 \Stone\node\node\path_module
,
要输出 to 相对于 from 的相对路径,则 from 需要先 ../ 的形式 一层一层退出,来检索与 to 的公共父级目录,直到遇到公共父级目录或者到根目录停止,然后cd 进 to 目录。这是针对另一方为绝对路径,如果另一方为相对路径,则直接就是当前另一方路径。
const path = require("path"); //当前工作目录为 \Stone\node\node\path_module path.resolve('/foo/bar', './baz'); // '/foo/bar/baz' path.resolve('/foo/bar','', '/tmp/file/'); //'/tmp/file' path.resolve('root', 'foo/baz/', '../fun/bar') // '\Stone\node\node\path_module\root\foo\fun\bar' path.resolve() // '\Stone\node\node\path_module'
path.resolve 方法解析路径片段的时候会从右往左的顺序依次解析,直到构造出一个绝对路径,否则会将当前工作目录加在路径开头。所以,通过 resolve 解析生成的路径一定是绝对路径。这个方法使用的非常多,应该特眼熟,对,前端我们配置 webpack 的时候会高频率用到,并且往往还会结合 __dirname
使用。
我们先在 path_module
目录下运行 node test.js
命令
<!--当前执行文件的完整路径为\Stone\node\node\path_module\test.js--> const path = require("path"); console.log(__dirname); // \Stone\node\node\path_module console.log(__filename); // \Stone\node\node\path_module\test.js
然后我们在 \Stone\node\node
目录下运行 node path_module\test.js
,会发现输出结果同上,
所以这就是说明 __dirname 和 __filename 始终跟当前执行文件有关,跟启动脚本所在目录无关。
./
和 ../
我们都知道是相对路径的写法,但是使用的过程中配合 require() 使用与否的结果是不同的。
<!--当前启动脚本的执行命令所在目录 \Stone\node\node\fs_module\test.js--> const fs = require('fs') fs.readFileSync('./ext/test1.js',(err,data)=> { console.log('ok') })
会正常打印出 ok
<!--当前启动脚本的执行命令所在目录 \Stone\node\node--> const fs = require('fs') fs.readFile('./ext/test1.js',(err,data)=> { console.log('ok') })
运行会报错 no such file or directory, open './ext/test1.js'
这到底是为啥嘞,原因就是 './' 和 '../' 的路径表示意义需要分情况,当结合 require() 使用的时候相对于当前执行文件,如果不结合 require() 使用的情况下会相对于当前启动脚本的目录,因此只有在 require() 时才使用相对路径(./, ../) 的写法,其他地方一律使用绝对路径,这点一定要注意。
关于nodejs path 模块,我们今天就说到这里了,虽然 api 不是很多,但是 path 模块在前端的使用频率还是非常高的,所以觉得很值得学习了解一下的。由于认知有限,本文若有不准确之处还望路过的各位兄台及时指正,吃瓜,吃瓜。
更多node相关知识,请访问:nodejs 教程!
The above is the detailed content of An article to talk about the path module in node. For more information, please follow other related articles on the PHP Chinese website!