node.js学习笔记整理(一)

(1)node

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node与javaScript的区别在于,javaScript的顶层对象是window,而node是global

//这里使用的var声明的变量不是全局的,是当前模块下的,用global声明的表示是全局的
var s = 100;
global.s = 200;
//这里访问到的s是var生命的
console.log(s); //100
//这里访问到的才是全局变量
console.log(global.s); //200

模块:在node中,文件和模块是一一对应的,也就是一个文件就是一个模块;每个模块都有自己的作用域,我们通过var申明的变量并非全局而是该模块作用域下的。

(2)module模块

1、文件查找

1)首先按照加载的模块的文件名称进行查找,如果没有找到,则会带上 .js、.json 或 .node 拓展名在加载
2)以 '/' 为前缀的模块是文件的绝对路径。 例如,require('/home/marco/foo.js') 会加载 /home/marco/foo.js 文件。
3)以 './' 为前缀的模块是相对于调用 require() 的文件的。 也就是说,circle.js 必须和 foo.js 在同一目录下以便于 require('./circle') 找到它。
4)当没有以 '/'、'./' 或 '../' 开头来表示文件时,这个模块必须是一个核心模块或加载自 node_modules 目录。
5)如果给定的路径不存在,则 require() 会抛出一个 code 属性为 'MODULE_NOT_FOUND' 的 Error。

2、module 作用域

在一个模块中通过var定义的变量,其作用域范围是当前模块,外部不能够直接的访问,如果我们想一个模块能够访问另外一个模块中定义的变量,可以有一下两种方式:
1)把变量作为global对象的一个属性,但这样的做法是不推荐的
2)使用模块对象 module。module保存提供和当前模块有关的一些信息。
在这个module对象中有一个子对象exports对象,我们可以通过这个对象把一个模块中的局部变量对象进行提供访问。

//这个方法的返回值,其实就是被加载模块中的module.exports
require('./02.js');

3、__dirname:当前模块的目录名。

例子,在 /Users/mjr 目录下运行 node example.js:
console.log(__dirname);
// 输出: /Users/mjr
console.log(path.dirname(__filename));
// 输出: /Users/mjr

4、__filename:当前模块的文件名(处理后的绝对路径)。当前模块的目录名可以使用 __dirname 获取。

在 /Users/mjr 目录下运行 node example.js:

console.log(__filename);
// 输出: /Users/mjr/example.js
console.log(__dirname);
// 输出: /Users/mjr

(3)process(进程)

process 对象是一个全局变量,提供 Node.js 进程的有关信息以及控制进程。 因为是全局变量,所以无需使用 require()。

1、process.argv

返回进程启动时的命令行参数。第一个元素是process.execPath。第二个元素是当前执行的JavaScript文件的路径。剩余的元素都是额外的命令行参数。

console.log(process.argv);

打印结果:

2、process.execPath返回启动进程的可执行文件的绝对路径。

3、process.env 返回用户的环境信息。

在process.env中可以新增属性:

process.env.foo = 'bar';
console.log(process.env.foo);

可以通过delete删除属性:

delete process.env.foo;
console.log(process.env);

在Windows上,环境变量不区分大小写

4、process.pid 属性返回进程的PID。

5、process.platform属性返回字符串,标识Node.js进程运行其上的操作系统平台。

6、process.title 属性用于获取或设置当前进程在 ps 命令中显示的进程名字

7、process.uptime() 方法返回当前 Node.js 进程运行时间秒长

注意: 该返回值包含秒的分数。 使用 Math.floor() 来得到整秒钟。

8、process.versions属性返回一个对象,此对象列出了Node.js和其依赖的版本信息。

process.versions.modules表明了当前ABI版本,此版本会随着一个C++API变化而增加。 Node.js会拒绝加载模块,如果这些模块使用一个不同ABI版本的模块进行编译。

9、process对象-输入输出流


var a;
var b;
process.stdout.write('请输入a的值: ');
process.stdin.on('data', (chunk) => {
    if (!a) {
        a = Number(chunk);
        process.stdout.write('请输入b的值:');
    }else{
        b = Number(chunk);
        process.stdout.write('a+b的值:'+(a+b));
        process.exit();
    }
});

(4)Buffer缓冲器

Buffer类,一个用于更好的操作二进制数据的类,我们在操作文件或者网络数据的时候,其实操作的就是二进制数据流,Node为我们提供了一个更加方便的去操作这种数据流的类Buffer,他是一个全局的类

1、如何创建使用buffer

Buffer.from(array) 返回一个 Buffer,包含传入的字节数组的拷贝。
Buffer.from(arrayBuffer[, byteOffset [, length]]) 返回一个 Buffer,与传入的 ArrayBuffer 共享内存。
Buffer.from(buffer) 返回一个 Buffer,包含传入的 Buffer 的内容的拷贝。
Buffer.from(string[, encoding]) 返回一个 Buffer,包含传入的字符串的拷贝。
Buffer.alloc(size[, fill[, encoding]]) 返回一个指定大小且已初始化的 Buffer。 该方法比 Buffer.allocUnsafe(size) 慢,但能确保新创建的 Buffer 不会包含旧数据。
Buffer.allocUnsafe(size) 与 Buffer.allocUnsafeSlow(size) 返回一个指定大小但未初始化的 Buffer。 因为 Buffer 是未初始化的,可能包含旧数据。

// 创建一个长度为 10、且用 01 填充的 Buffer。
const buf1 = Buffer.alloc(10,1);
// 创建一个长度为 10、且未初始化的 Buffer。
// 这个方法比调用 Buffer.alloc() 更快,但返回的 Buffer 实例可能包含旧数据,因此需要使用 fill() 或 write() 重写。
const buf2 = Buffer.allocUnsafe(10);
const buf3 = Buffer.from([1, 2, 3]);
const buf4 = Buffer.from('tést');
console.log(buf1); //<Buffer 01 01 01 01 01 01 01 01 01 01>
console.log(buf2); //<Buffer 00 00 00 00 08 00 00 00 07 00>
console.log(buf3); //<Buffer 01 02 03>
console.log(buf4); //<Buffer 74 c3 a9 73 74>

2、Buffer对象提供的toString、JSON的使用

1)buf.toString(encoding,start,end)

var bf = Buffer.from('miaov');
console.log(bf.toString('utf-8',1,4)); //iaov
console.log(bf.toString('utf-8',0,5)); //miaov
console.log(bf.toString('utf-8',0,6)); //miaov

2)buf.write(string,offset,length,encoding)
string

var str = "miaov hello";
var bf = Buffer.from(str);
var bf2 = Buffer.alloc(8);
//从0开始写入5个
bf2.write(str,0,5);
console.log(bf);
console.log(bf2);

3)buf.toJSON()

const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);

console.log(json);
// 输出: {"type":"Buffer","data":[1,2,3,4,5]}

3、Buffer中静态方法的使用

1)Buffer.isEncoding(encoding) : 判断是否是Buffer支持的字符编码,是则返回true,不是则返回false

console.log(Buffer.isEncoding('utf-8')); //true

2)Buffer.isBuffer(obj) :如果 obj 是一个 Buffer,则返回 true,否则返回 false。

猜你喜欢

转载自www.cnblogs.com/fangnianqin/p/10174648.html