关于node.js:Nodejs工程师养成计划15章完结fen享

31次阅读

共计 4419 个字符,预计需要花费 12 分钟才能阅读完成。

download:Node.js 工程师养成打算云盘无密

Node

为什么要学习 Nodejs

企业需要

具备服务端开发教训更好
全栈工程师
根本的网站开发能力

服务端
前端
运维部署相干工作

Node 是什么

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 应用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
目前稳固版本:14.15.1 LTS(Long Term Support) 长期反对版本
装置 node
官网下载 => 一键式装置, 点点点就能够进行装置。
ps:如果 windows 电脑的同学在装置时批改了装置门路,请自行去批改环境变量

当然当初 node 的最新版本是 14.15.1,大家能够当初下载最新版本进行装置

示意装置胜利
筹备工作

运行 node 程序
console.log(‘hello node’);
console.log(‘run my use:node 01-runnode’);
复制代码
运行:node 01-runnode.js

每次批改 js 文件须要从新执行才会失效, 装置 nodemon 能够监督文件改变, 主动重启
npm i -g nodemon

当前运行 用 nodemon 01-runnode.js

调式 node 程序:Debug-Start Debugging

REPL(交互式解释器)

表达式运算
应用变量
多行表达式
REPL 命令

ctrl + c – 退出以后终端。
ctrl + c 按下两次 – 退出 Node REPL。
ctrl + d – 退出 Node REPL.
向上 / 向下 键 – 查看输出的历史命令
tab 键 – 列出以后命令
.help – 列出应用命令
.break – 退出多行表达式
.clear – 退出多行表达式
.save filename – 保留以后的 Node REPL 会话到指定文件
.load filename – 载入以后 Node REPL 会话的文件内容。

回调函数
Node.js 异步编程的间接体现就是回调。
异步编程依靠于回调来实现,但不能说应用了回调后程序就异步化了。
回调函数在实现工作后就会被调用,Node 应用了大量的回调函数,Node 所有 API 都反对回调函数。
例如,咱们能够一边读取文件,一边执行其余命令,在文件读取实现后,咱们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或期待文件 I/O 操作。这就大大提高了 Node.js 的性能,能够解决大量的并发申请。
阻塞代码
// 阻塞式代码
const fs = require(‘fs’);
const data = fs.readFileSync(’01-runnode.js’);
console.log(data.toString());
复制代码
非阻塞代码
const fs = require(‘fs’);
fs.readFile(’01-runnode.j’,function(err,data) {

if(err){console.log(err.stack);
    return;
}
console.log(data.toString());

});
console.log(‘ 继续执行 ’);
复制代码
第一个实例在文件读取完后才执行完程序。第二个实例咱们不须要期待文件读取完,这样就能够在读取文件时同时执行接下来的代码,大大提高了程序的性能。
因而,阻塞按是按程序执行的,而非阻塞是不须要按程序的,所以如果须要解决回调函数的参数,咱们就须要写在回调函数内。
事件循环
Node.js 是单过程单线程应用程序,然而通过事件和回调反对并发,所以性能十分高。
Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,应用异步函数调用,并解决并发。
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
Node.js 单线程相似进入一个 while(true) 的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件产生就调用该回调函数.
事件驱动程序
Node.js 应用事件驱动模型,当 web server 接管到申请,就把它敞开而后进行解决,而后去服务下一个 web 申请。
当这个申请实现,它被放回解决队列,当达到队列结尾,这个后果被返回给用户。
这个模型十分高效可扩展性十分强,因为 webserver 始终承受申请而不期待任何读写操作。(这也被称之为非阻塞式 IO 或者事件驱动 IO)
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。

整个事件驱动的流程就是这么实现的,十分简洁。有点相似于观察者模式,事件相当于一个主题 (Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。
Node.js 有多个内置的事件,咱们能够通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:
创立 03-eventEmitter.js
// 引入 event 模块
const events = require(‘events’);

// 创立 eventEmitter 对象
const eventEmitter = new events.EventEmitter();

// 创立事件处理程序
const connectHandler = function connected() {

console.log('连贯胜利');
// 触发 data_received 事件
eventEmitter.emit('data_received');

}

// 绑定 connection 事件处理程序
eventEmitter.on(‘connection’, connectHandler);

// 应用匿名函数绑定 data_received 事件
eventEmitter.on(‘data_received’,function() {

console.log('数据接管胜利');

})

// 触发 connection 事件
eventEmitter.emit(‘connection’);
console.log(‘ 程序执行结束 ’);

复制代码
执行:
连贯胜利
数据接管胜利
程序执行结束
复制代码
Buffer(缓冲区)
JavaScript 语言本身只有字符串数据类型,没有二进制数据类型。
但在解决像 TCP 流或文件流时,必须应用到二进制数据。因而在 Node.js 中,定义了一个 Buffer 类,该类用来创立一个专门寄存二进制数据的缓存区。
在 Node.js 中,Buffer 类是随 Node 内核一起公布的外围库。Buffer 库为 Node.js 带来了一种存储原始数据的办法,能够让 Node.js 解决二进制数据,每当须要在 Node.js 中解决 I / O 操作中挪动的数据时,就有可能应用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 相似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。
// buffer: 八位字节组成数组, 能够无效的在 js 中存储二进制数据
// 创立
const buf1 = Buffer.alloc(10);
console.log(buf1);
// 通过数据创立
const buf2 = Buffer.from(‘hello world’);
console.log(buf2);

const buf3 = Buffer.from([1,2,3]);
console.log(buf3);

// 写入
buf1.write(‘hello buffer’);
console.log(buf1);

// 读取
console.log(buf2.toString());
console.log(buf2.toString(‘base64’));

// 合并
const buf4 = Buffer.concat([buf1,buf2]);
console.log(buf4.toString());
复制代码
Stream(流)
管道流
管道提供了一个输入流到输出流的机制。通常咱们用于从一个流中获取数据并将数据传递到另外一个流中。

如下面的图片所示,咱们把文件比作装水的桶,而水就是文件里的内容,咱们用一根管子 (pipe) 连贯两个桶使得水从一个桶流入另一个桶,这样就缓缓的实现了大文件的复制过程。
以下实例咱们通过读取一个文件内容并将内容写入到另外一个文件中。
const fs = require(‘fs’);
// 创立可读流
const readerStream = fs.createReadStream(‘./package.json’);
// 创立可写流
const writerStream = fs.createWriteStream(‘./test.txt’);
// 设置编码为 utf8
readerStream.pipe(writerStream);
console.log(‘ 执行结束 ’);
复制代码
链式流
链式是通过连贯输入流到另外一个流并创立多个流操作链的机制。链式流个别用于管道操作
接下来咱们就是用管道和链式来压缩和解压文件。
const fs = require(‘fs’);
const zlib = require(‘zlib’);
// 压缩 test.txt 为 test.zip
fs.createReadStream(‘./test.txt’).pipe(zlib.createGzip()).pipe(fs.createWriteStream(‘test.zip’));
console.log(‘ 文件压缩胜利 ’);
复制代码
模块零碎
为了让 Node.js 的文件能够互相调用,Node.js 提供了一个简略的模块零碎。
模块是 Node.js 应用程序的根本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是 JavaScript 代码、JSON 或者编译过的 C /C++ 扩大。
模块 CommonJS
在 Node.js 中, 创立一个模块非常简单, 创立 main.js
const Hello = require(‘./hello’);
hello.world();
复制代码
Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从内部获取一个模块的接口,即所获取模块的 exports 对象
接下来咱们就来创立 hello.js 文件,代码如下:
exports.world = function() {
console.log(‘hello world’);
}
复制代码
有时候咱们只是想把一个对象封装到模块中,格局如下
module.exports = function() {
// …
}
复制代码
例如:
function Hello() {

let name;
this.setName = function(myName) {name = myName}
this.sayHello = function() {console.log('hello', name);

}

}
module.exports = Hello;
复制代码
这样就能够间接取得这个对象了:
const hello = new Hello();
hello.setName(‘ 小马哥 ’);
hello.sayHello();

正文完
 0