node 罕用内置模块(一)
1.nodejs 的全局对象 global
全局对象可看做是全局变量的宿主(局部属性设置了不可枚举),不必点语法,可间接拜访
罕用全局变量:
__filename: 返回正在执行脚本文件的绝对路径
__dirname: 返回正在执行脚本文件所在目录
timer 类函数:执行程序与事件循环间的关系
process: 提供与以后过程互动的接口
require: 实现模块的加载
module、exports: 解决模块的导出
相似于,在执行.js 文件的时候,将 js 代码放在了一个立刻执行函数外面,并传入了这些变量,所以能够间接应用这些变量了。
// console.log(global);
console.log('fileName@',__filename);
console.log('dirName@',__dirname);
console.log('process.cwd@',process.cwd());
console.log('process.env@',process.env);
// 默认状况下 this 是空对象 和 global 不是一个对象
console.log('this@',this);
(function(){console.log('fun@',this===global); // true
})();
2.process 模块
获取过程信息:
// 1. 资源:console.log(process.memoryUsage()); // 内存
/*
{
rss: 20045824, // 常驻内存
heapTotal: 4476928, // 堆内存
heapUsed: 2686544, // 已应用堆内存
external: 889742, // 内部内存 应用的 C ++ 的罕用库
arrayBuffers: 9898 // 数组缓冲区大小
}
*/
console.log(process.cpuUsage()); // CPU 零碎与用户操作 cpu 工夫片的应用状况{user: 31000,system: 31000}
// 2 运行环境:console.log(process.cwd()); // 运行目录
console.log(process.version); // node 版本
console.log(process.versions); // node 环境(v8 版本、uv 版本、zlib 版本、openssl 版本、ares 版本、modules 版本)
console.log(process.env.NODE_ENV); // 判断是生产环境还是开发环境(undefined,在应用打包工具是,会主动配置)
console.log(process.env.PATH); // 环境变量
console.log(process.env.USERPROFILE); //(局部平台应用 HOME 获取)获取用户目录 写脚手架工具的时候,利用 cri 命令的时候能够应用
console.log(process.arch); // cpu 架构
console.log(process.platform); // 零碎平台
// 3. 运行状态:console.log(process.argv); // 启动参数
console.log(process.argv0); // 快捷获取参数的第一个参数 execArgv
console.log(process.pid); // 过程 ID ppid
console.log(process.uptime()); // 运行工夫
执行过程操作:
// 4. 事件 订阅、监听事件
process.on('beforeExit', (code) => {
// 能够写异步代码
console.log(`beforeExit:${code}`); // 失常退出 code=0
})
process.on('exit', (code) => {console.log(`exit:${code}`);
// 不可写异步代码
setTimeout(()=>{console.log('exit timeout');
},0);
})
console.log('代码执行完了');
process.exit() // 手动退出 不能触发 beforeExit 事件
// 5. 规范输入 谬误
console.log = function(data){
// process.stdout 返回一个流对象
process.stdout.write('--'+data+'\n');
}
console.log(1);
const fs = require('fs');
// 创立一个流对象 管道 规范输入流
fs.createReadStream('05-test.txt').pipe(process.stdout);
// 输出流
// process.stdin.pipe(process.stdout);
process.stdin.setEncoding('utf8');
process.stdin.on('readable',()=>{let chunk = process.stdin.read();
if(chunk !== null){process.stdout.write('data'+chunk);
}
})
3.path 模块
罕用 API:
basename() 获取门路中根底门路名称
dirname() 获取门路中目录名称
extname() 获取门路中扩大名称
isAbsoulute() 判断门路是否为绝对路径
join() 拼接多个门路片段
resolve() 返回一个绝对路径
parse() 解析门路
format() 序列化门路
normalize() 规范化门路
代码展现:
const path = require('path');
// 1. 获取门路中的根底名称
/**
* 01 返回的就是承受门路当中的最初一个局部
* 02 第二个参数示意拓展名,如果没有指定,默认返回残缺的文件名
* 03 第二个参数作为后缀时,如果没有在以后门路中匹配到,那么就会疏忽掉
* 04 解决目录门路时,如果结尾处有门路分隔符,则也会疏忽掉
*/
console.log(__filename); // D:\Users\ 小江 \Desktop\nodejs_test\06-path.js
console.log(path.basename(__filename)); // 06-path.js
console.log(path.basename(__filename, '.js')); // 06-path
console.log(path.basename(__filename, '.css')); // 06-path.js
console.log(path.basename('/a/b/c')); // c
console.log(path.basename('/a/b/c/')); // c
// 2. 获取门路中的目录名称
/**
* 01 返回的是门路中最初一个局部的上一层目录所在门路
*/
console.log(path.dirname(__filename)); // D:\Users\ 小江 \Desktop\nodejs_test
// 3. 获取门路中的拓展名
console.log(path.extname(__filename)); // .js
// 4. 解析门路
/**
* 01 返回一个对象,蕴含门路的根本信息,相对路径的 root 为 ' '
*/
const obj = path.parse(__filename);
console.log(obj);
/**
* {
* root: 'D:\\',
* dir: 'D:\\Users\\ 小江 \\Desktop\\nodejs_test',
* base: '06-path.js',
* ext: '.js',
* name: '06-path'
* }
*/
// 5. 序列化门路 解析门路的反向操作
console.log(path.format(obj));
// 6. 判断以后门路是否为绝对路径
console.log(path.isAbsolute(__filename)); // true
console.log(path.isAbsolute('/a/b/c')); // true
// 7. 门路拼接
/**
* 01 主动确定门路分隔符
* 02 能够判断相对路径(返回上一级, 当前目录)*/
console.log(path.join('/a/b/c', 'd', 'e.html')); // /a/b/c/d/e.html
console.log(path.join('/a/b/c', '../', 'e.html')); // /a/b/e.html
console.log(path.join(''))
// 8. 规范化门路
/**
* 规范化门路,去除门路中的多余的门路分隔符,批改成该平台下的门路分隔符
*/
console.log(path.normalize('/a\\b/c///d/e.html')); // /a/b/d/e.html
console.log(path.normalize('')) // .
// 9. 返回绝对路径
console.log(path.resolve('./'));
console.log(path.resolve('data.ts'));
4.buffer
buffer 简介:
01 毋庸 require 的一个全局变量
02 Nodejs 平台下的二进制数据操作
03 不占据 v8 堆内存大小的内存空间
04 内存的应用由 node 来管制,由 v8 的 GC 回收
05 个别配合 Stream 流应用,充当数据缓冲区
创立 Buffer:
// 1. alloc
const bu1 = Buffer.alloc(10) // allocate 调配
// 2. allocUnsafe
const bu2 = Buffer.allocUnsafe(10) // allocateUnsafeUnsafe 随机调配的内存,未被清理的内存,有初始值
console.log(bu1) // <Buffer 00 00 00 00 00 00 00 00 00 00>
console.log(bu2) // <Buffer 98 bf fc 2c c8 01 00 00 04 00>
// 3. from
// from 创立一个 Buffer 对象,能够传入一个数组或者字符串或 Buffer 对象
// from 创立的 Buffer 对象的大小与传入的参数所占空间无关
const bu3 = Buffer.from([1,2,'中'],'utf-8') // 数组中的汉字,默认不能辨认
console.log(bu3) // <Buffer 01 02 03>
console.log(Buffer.from('hello world','utf-8')) // <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>
const bu10 = Buffer.from('中');
console.log(bu10); //<Buffer e4 b8 ad>
console.log(Buffer.from([0xe4,0xb8,0xad])) // <Buffer e4 b8 ad> 这样能力将汉字存入 Buffer 对象中
const tempBu = Buffer.alloc(3);
const tempBu4 = Buffer.from(tempBu); // 并不会共享空间
tempBu[0] = 1;
console.log(tempBu,tempBu4);
Buffer 实例办法
let buf = Buffer.alloc(6);
// fill 应用指定的值填充缓冲区,填充到指定的范畴,顾头不顾尾
buf.fill('12345467589',1,5);
// buf.fill(123) // {
// wite 从缓冲区写入数据,写道指定的地位,长度
buf.write('123',2,4);
// toString 从缓冲区读取数据,读取指定的范畴,顾头不顾尾
buf = Buffer.from('江江学习');
console.log(buf.toString('utf-8',3,9));
// slice 截取缓冲区的一部分,返回一个新的缓冲区,顾头不顾尾,可写正数
buf = Buffer.from('江江学习');
let buf2 = buf.slice(3,9); // 留神汉字占 3 个字节
// indexOf 查找指定的字符串,返回第一个匹配的索引,没有返回 -1
buf = Buffer.from('江江学习');
buf2 = Buffer.from('学习');
// console.log(buf.indexOf(buf2));
console.log(buf.indexOf('江',1));
// copy 拷贝缓冲区,拷贝到指定的地位,顾头不顾尾
buf = Buffer.from('江江学习');
buf2 = Buffer.alloc(6);
buf.copy(buf2,0,3,9); // 写入的起始地位、源缓冲区的起始地位、源缓冲区的完结地位
console.log(buf2.toString());
Buffer 的罕用静态方法:
// concat // 拼接 buffer,设置缓冲区的长度(可不写)let b1 = Buffer.from('江江学习');
let b2 = Buffer.from('打游戏');
let b = Buffer.concat([b1,b2],18);
//isBuffer 判断是否是缓冲区
let b3 = Buffer.alloc(18);
console.log(Buffer.isBuffer(b3));
// 封装 split 办法
Buffer.prototype.split = function(sep){let sepLen = Buffer.from(sep).length;
let ret = [];
let start = 0;
let offset = 0;
while((offset = this.indexOf(sep,start)) !== -1 ){ret.push(this.slice(start,offset));
start = offset + sepLen;
}
ret.push(this.slice(start)); // 将最初一个宰割的后果放入数组中
return ret;
}
let buftest = Buffer.from('江江 c 学习 c 打游戏');
let arr = buftest.split('c');