Node second drive

19~49

JS是同步语言

  • 如何实现异步功能?

    在node环境global对象&浏览器环境window对象,我们可以编写像setTimeout这样的异步功能,这得益于libUV等部署于js核心功能的模块

process&&threads

  • CPU从一个线程切换到另一个线程进行并行;多核意味着每个核心可以单独负责一个线程
  • 线程相互独立,并排执行,允许我们异步执行代码
  • 多线程编程非常复杂,诸如死锁等问题;因此js是一个单线程编程语言

node如何实现js的异步?

  • node有一条main thread,执行事件循环,事件循环处理所有的回调事件
  • 同时保存了一些线程作为线程池,遇到文件读取等等异步操作时交给自己的某个线程单独处理;
  • 对于网络请求,则与操作系统交互,毕竟操作系统更擅长网络通信。

node的事件循环

image

  • 每个阶段都有自己的消息队列(回调队列)

node与其他语言

  • node擅长异步,不擅长复杂计算
  • 如果我们的代码在cpu或者gpu卡住,那么node就不能很好的工作
  • node在重度提供数据流,有大量的io时运行良好,例如netflix这样的视频流,主要是输入和输出

观察者设计模式

  • 设计模式用来解决在各种工程中反复出现的问题
  • 是React等前端框架的基础

EventEmitter

// P31.js
const EventEmitter = require('events');
const celebrity = new EventEmitter();

// Subcribe to celebrity for Observer1
celebrity.on('race', (result) => {
    if (result === 'win') {
        console.log('Congratulations!You are the best!')
    }
});

// Subcribe to celebrity for Observer2
celebrity.on('race', (result) => {
    console.log('Boo i can be the best!')
});

process.on('exit', (code) => {
    console.log('Process exit event with', code)
})

celebrity.emit('race', 'win');

// node P31.js
// Congratulations!You are the best!
// Boo i can be the best!
// Process exit event with 0

http

// P33.js
// 1
const http = require('http');

const req = http.request('http://www.baidu.com',(res) => {
 res.on('data',(chunk) => {
    console.log(`Data chunk: ${chunk}`);
 });
 res.on('end',() => {
     console.log('No more data');
 });
});

req.end();


// 2
// const {request} = require('https');
const {get} = require('https');

const req = get('https://www.baidu.com',(res) => {
 res.on('data',(chunk) => {
    console.log(`Data chunk:${chunk}`);
 });
 res.on('end',() => {
     console.log('No more data');
 });
});

// req.end();

模块

P34~38为模块导入导出。略

缓存

node会缓存加载的模块,不会重复加载

// P39
const { send } = require('./request');
const { read } = require('./response');
const { REQUEST_TIMEOUT } = require('./request');

// 第二次加载来自'./request'的函数时,不会重新加载,而是在缓存中寻找
console.log(require.cache)

index.js

使用index.js集成一个文件夹下的导出(这是node之父所反对使用的,理由是增加了复杂度、并增加混乱)

// P40 P41
module.exports = {
	...require('./request'),
	...require('./response')
}

module vs package

// P43
npm init -y 
// 初始化npm并全部选y。会得到package.json

Semantic Versioning 2.0.0

语义化版本 2.0.0 | Semantic Versioning (semver.org)

posted @ 2022-12-26 18:29  沧浪浊兮  阅读(11)  评论(0编辑  收藏  举报