path.resolve([...paths])
path.resolve() 方法将路径或路径片段的序列解析为绝对路径。
给定的路径序列从右到左进行处理,每个后续的 path 前置,直到构造出一个绝对路径。 例如,给定的路径片段序列:/foo、 /bar、 baz,调用 path.resolve('/foo', '/bar', 'baz') 将返回 /bar/baz。
如果在处理完所有给定的 path 片段之后还未生成绝对路径,则再加上当前工作目录。
生成的路径已规范化,并且除非将路径解析为根目录,否则将删除尾部斜杠。
零长度的 path 片段会被忽略。
如果没有传入 path 片段,则 path.resolve() 将返回当前工作目录的绝对路径。
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/myself/node,
// 则返回 '/home/myself/node/wwwroot/static_files/gif/image.gif'
require.resolve
简单的说,在 Node.js 中使用 fs 读取文件的时候,经常碰到要拼一个文件的绝对路径的问题 (fs 处理相对路径均以进程执行目录为准)。
之前一直的方法都是,使用 path 模块以及 __dirname 变量 。
代码如下所示:
1
fs.readFileSync(path.join(__dirname, './assets/some-file.txt'));
使用 require.resolve 可以简化这一过程
示例代码:
1
fs.readFileSync(require.resolve('./assets/some-file.txt'));
此外, require.resolve 还会在拼接好路径之后检查该路径是否存在, 如果 resolve 的目标路径不存在, 就会抛出 Cannot find module './some-file.txt' 的异常. 省略了一道检查文件是否存在的工序 (fs.exists).
这个报错并不会加重你的检查负担, 毕竟使用 fs 去操作文件时, 如果发现文件不存在也会抛出异常. 反之, 通过 require.resovle 可以在提前在文件中作为常量定义, 那么在应用启动时就可以抛异常, 而不是等到具体操作文件的时候才抛异常.
__dirname
当前模块的目录名。 与 __filename 的 path.dirname() 相同。
示例,从 /Users/mjr 运行 node example.js:
console.log(__dirname);
// 打印: /Users/mjr
console.log(path.dirname(__filename));
// 打印: /Users/mjr
__filename
当前模块的文件名。 这是当前的模块文件的绝对路径(符号链接会被解析)。
对于主程序,这不一定与命令行中使用的文件名相同。
有关当前模块的目录名,参阅 __dirname。
示例:
从 /Users/mjr 运行 node example.js:
console.log(__filename);
// 打印: /Users/mjr/example.js
console.log(__dirname);
// 打印: /Users/mjr
给定两个模块:a 和 b,其中 b 是 a 的依赖文件,且目录结构如下:
/Users/mjr/app/a.js
/Users/mjr/app/node_modules/b/b.js
b.js 中的 __filename 的引用会返回 /Users/mjr/app/node_modules/b/b.js,而 a.js 中的 __filename 的引用会返回 /Users/mjr/app/a.js。