在介绍 NodeJS 的基础 API 前,先抛出 API 中文文档地址:http://nodejs.cn/api/
path
path 顾名思义就是与路径相关的一切,在 path 模块中提供了一些工具函数,用于处理文件与目录的路径。我们可以通过以下方式使用:
const path = require('path');
normalize – 该方法将我们传入的可能不太规范的路径转化成规范的路径
这么说可能还是太模糊,我们看几个例子就明白了
// 使用 ES6 的语法,相当于 const normalize = require('path').normalize</span>
const {
normalize} = require('path');
console.log(normalize('/user//local/bin'));
console.log(normalize('/user/local/../bin'));
输出的结果为:
显而易见,第一个将我们输入的不规范的 “//” 转化成了 “/”,第二个我们输入的 “…/” 代表的是上一级目录,在输出时给我们修改成了 “/user/bin”,删除了 “/local”
这就是 normalize 的作用,将我门输入的不规范的路径规范化
join – 顾名思义就是拼接的意思,它会将传入的路径进行拼接,其内部会调用 normalize 方法去处理不规范的路径
const {
join} = require('path');
console.log(join('/user/','/local/','/bin'));
console.log(join('/user','../local/..','/bin'));
输出结果为:
resolve – 将相对路径转化为绝对路径
const {
resolve } = require('path');
console.log(resolve ('./'));
其输出结果为:
输出的就是你当前项目所在的绝对目录
几个与名字相关 API
/*
* basename -- 文件名
* dirname -- 文件所在的目录
* extname -- 文件的扩展名
*/
const {
basename ,dirname ,extname} = require('path');
const path = "/user/local/bin/no.txt";
console.log(basename(path));
console.log(dirname(path));
console.log(extname(path));
输出的结果为:
parse – 返回一个包含 path 所有元素的对象
const {parse} = require('path'); const path = "/user/local/bin/no.txt"; console.log(parse(path));
其输出的结果为:
format – 从一个对象返回一个字符串,与 path.parse() 相反
先来看一个例子
const {
parse} = require('path');
const path = "/user/local/bin/no.txt";
const parsePath = parse(path);
// 将 parse 处理后的对象保存起来,通过 format 进行处理
console.log(format(parsePath));
其输出结果为:
除此之外,format 还有几个值得注意的特性:
当 format(pathObject) 中传入的属性有组合时,有些属性的优先级比其它的高:
- 如果提供了 pathObject.dir ,则 pathObject.root 将会被忽略
- 如果提供了 pathObject.base,则 pathObject.ext 和 pathObject.name 会被忽略
注:一般情况下,很少使用这个方法,但是当我们需要更改目录或文件时,用这种方法就相对简单
sep – 输出特定平台的路径片段的分隔符
const {
sep } = require('path');
console.log(sep);
其输出结果为:
这个是在 windows 系统下的路径片段的分隔符
delimiter – 输出特定平台路径分隔符
const {
delimiter } = require('path');
console.log(delimiter );
其输出结果为:
这个是在 windows 系统下的路径分隔符
win32 与 posix – 这两个属性使得 path 可以跨平台查看
win32 :可以强制当前系统使用 windows 的系统,使得 NodeJS 的 path 模块也遵循 windows 的风格
posix :可以强制当前系统使用 posix 的系统,使得 NodeJS 的 path 模块也遵循 posix 的风格
此时,我们就可以通过这两个命令来再次执行 exp 与 delimiter,来查看在 posix 下的路径段分隔符以及路径分隔符
我们上面看过 windows 环境下的 exp 与 delimiter,所以现在我们来看一下 posix 下的
const {
posix,sep,delimiter} = require('path');
console.log(posix.sep);
console.log(posix.delimiter);
其输出结果为:
小结:
现在我们知道和 path 相关的包括 “__dirname”,"__filename",“process.cwd()”,那么它们之间又有什么区别呢?
“__dirname”,"__filename" 总是返回文件的绝对路径,而 “process.cwd()” 则是返回执行 node 命令所在的文件夹的路径。
除了它们之外,"./" 以及 “…/” 在不同的情况下也会有不同的意思,在 require 方法中总是相对当前文件所在的文件夹,但是在其它地方则是和 “process.cwd()” 一样,相对于执行 node 命令所在的文件夹
Buffer
在介绍 Buffer API 之前,我们先来看几个 Buffer 的特点
- Buffer 用于处理二进制数据流
- 实例类似整数数组,大小固定
- 运用 C++ 代码在 V8 堆外分配物理内存
- 用于 Buffer 使用频率非常高,所以 NodeJS 将 Buffer 挂到了 global 上,我们可以直接使用
实例化 Buffer 的方法
Buffer.alloc(size[,fill[,encoding]])
- size – 新建的 Buffer 期望的长度(创建后长度无法改变
- fill – 用来填充新建的 Buffer 的值,默认:0
- encoding – 该值是它的字符编码,默认值:‘utf8’
// 创建一个长度为 10,且用 0 填充的 Buffer
const buf1 = Buffer.alloc(10);
console.log(buf1);
// 创建一个长度为 10,且用 0×1 填充的 Buffer (0× 表示 16 进制)
const buf2 = Buffer.alloc(10,1);
console.log(buf2);
// 创建一个长度为 10,用 'aGVsbG8gd29ybGQ=' 填充,以 base64 来编码的 Buffer
const buf3 = Buffer.alloc(10,'aGVsbG8gd29ybGQ=','base64');
其输出结果为:
Buffer.allocUnsafe(size)
- size – 新建的 Buffer 期望的长度
- 以此方法创建的 Buffer 实例的底层是未初始化的,所以新建的 Buffer 的内容是未知的,因此有可能暴露敏感数据,所以使用 allocUnsafe() 时需要使用 fill() 或 write() 重写(尽量不要使用 allocUnsafe())
// 创建一个长度为 10,未初始化的 Buffer
const buf4 = Buffer.allocUnsafe(10);
console.log(buf4);
其输出结果为:
可以看出新建的 Buffer 是未初始化的,里面的内容可能暴露敏感数据
Buffer.from()
- 根据给定的参数进行实例化
// 创建一个包含 [0×1,0×2,0×3] 的 Buffer
const buf5 = Buffer.from([1,2,3]);
console.log(buf5);
// 创建一个包含 UTF-8 字节的 Buffer
const buf6 = Buffer.from('test');
console.log(buf6);
// 创建一个包含 base64 字节的 Buffer