Node.js实战(第二版)读书笔记01-非阻塞io,轮询,自带工具,主流程序,功能的组织及重用,exports模块的创建,moudles重用模块,异步编程,回调处理一次性事件,事件发生器处理重复事件
第一章Node基础知识介绍1、非阻塞I/Onode使用三种技术来解决io阻塞的问题事件异步API非阻塞I/O非阻塞I/O:完成一个耗时操作(网络访问)后,就运行一个回调函数来处理这个操作的结果2、轮询(event loop)node内置http服务器库,即核心模块http.server,负责用流,事件、http请求解析器的组合来处理请求。express web应用库添加的回调函数,也是由它触发。这
第一章Node基础知识介绍
1、非阻塞I/O
node使用三种技术来解决io阻塞的问题
- 事件
- 异步API
- 非阻塞I/O
非阻塞I/O:完成一个耗时操作(网络访问)后,就运行一个回调函数来处理这个操作的结果
2、轮询(event loop)
node内置http服务器库,即核心模块http.server,负责用流,事件、http请求解析器的组合来处理请求。express web应用库添加的回调函数,也是由它触发。这个回调函数又触发数据库查询语句,发送json响应。
使用了三个非阻塞网络调用:
请求
数据库
响应。
大体是计时器开始运作(settimeout或setinterval),然后调用io回调,触发回调函数,eventloop会去安排回调。
3、ES6,node和v8一些新特性
es6可以使用默认参数,剩余参数,spread操作符,for of循环,模板字符串,结构,生成器等新特性。
箭头函数不再需要that=this这样对于全局变量的操作
4、node自带的工具
- npm包管理器
- 核心JavaScript模块
- 调试器
1、npm
npm要求node目录下有个package.json的文件,每安装一个包就会,就会自动更新这个文件
npm init -y
这里使用-y表示不出现提示(即所有提示问题都用y回答)
–save本项目安装包(尽可能选择本地安装)
–global全局安装包
2、js核心模块
文件系统库:fs,path
tcp客户端和服务端库:net,http,https
域名解析库:dns
测试用的断言库:assert
3、调试器
支持但不执行和repl(读取-计算-输出-循环)
5、node主流程序
三类:
web应用程序,现在主要学习或应用的事web应用程序
命令行工具和后台程序
桌面程序
1、web应用程序
node web主要是用express这样的框架写的
const express=require('express')
const app=express()
app.get('/test',(req,res)=>{
res.end('hello nodejs')
})
app.listen(3000,()=>{
console.log('servering')
})
使用express创建的服务器
第二章Node编程基础
用模块组织代码 用回调处理一次性时间 用事件发射器处理重复性时间 实现串行和并行的流程控制 使用流程控制工具
6、Node功能的组织及重用
node模块打包代码是为了重用,但他们不会改变全局作用域。
node模块允许被引入文件中选择要暴露给程序的函数和变量。如果要暴露多个,使用exports对象的属性来指定。如果暴露一个,则设定module.exports
- 1、创建模块
模块既可以是一个文件,也可以是包含一个或多个文件的目录。如果模块是一个目录,node通常在这个目录下找一个叫index.js的文件作为模块的入口
使用自定义的模块需要使用require函数,查找顺序是先查找核心模块,然后是当前模块,最后是node_modules
dance.js
let gender='female'
let height='168'
let age=25
function dance(){
console.log('the girl is dancing')
}
exports.gender=gender
exports.height=height
exports.age=age
exports.dance=dance
入口文件app.js
const http = require('http')
const url=require('url')
const server = http.createServer()
const my_model_dancer = require('./js/dancer')
const my_model_singer = require('./js/singer')
server.on('request', function (request, response) {
let {pathname}=url.parse(request.url,true)
if (request.url == '/mytest') {
console.log(pathname)
}else{
console.log('it is not my favorite')
}
response.end()
})
server.listen(3000, () => {
console.log('servering...')
})
- require通常是用在同步操作中,一般都是在文件顶端引入
- 在io密集的地方尽量不用require,因为耗时操作会造成io阻塞。
- require和其他同步操作通常放在程序最初加载的地方。
7、module.exports微调模块的创建
node不允许重写exports,也就是不能给exports赋值(exports=xxxx)
exports和moudule.exports不可以同时使用,如果同时使用exports会被忽略掉
exports.xxx是module.exports.xxx的简写
8、modules重用模块
模块的查找机制。
node可以不必知道模块在文件系统中的具体位置,这个机制就是使用node_modules目录
node查找模块的机制(顺序)如下
注意事项
1、如果模块是目录,在模块目录中定义模块的文件必须被命名为index.js。当然也可以在package.json中定义别的文件(这样做显然没太大意义),具体的查找机制如下
2、如果两个文件导入了同一个模块,则第一次导入的文件及数据会被缓存,并被第二个文件使用。避免了重复导入
9、异步编程技术
node使用两种响应逻辑管理方式:回调和事件监听
- 回调通常用来定义一次性响应的逻辑。(如数据库查询),表现为使用一个回调函数
- 事件监听器本质也是一个回调,但它和一个概念实体(事件)关联,(说白了就是重复性响应)
例如http服务器,发出一个request事件,监听这个事件并添加响应逻辑。如EventEmitter.prototype.on绑定一个监听器。然后服务器调用相应的回调函数
server.on(‘request’,handleRequest)
一个node Http服务器实例实际就是:一个事件发射器,一个可以继承、调价事件发射及处理的类(EventEmitter)。
10、使用回调处理一次性事件
回调是一个函数,当它被当作参数传给异步函数,用来描述异步操作完成之后要做什么
异步回调的惯例:node中的大部分内置模块在使用回调时都会带两个参数:第一个用来放可能会发生的错误,第二个用来放结果,错误参数通常缩写为err。如(err,data)=>{ }
11、使用事件发射器处理重复性事件
监听器是和事件向关联的,当有事件出现时就会被触发的回调函数。如node中的tcp socket,她有一个data事件,每当socket中有新数据就会触发
socket.on(‘data’,handledata)
这里on是事件监听器,data是监听的事件,handledata是回调函数
const net=require('net')
const server=net.createServer(socket => {
socket.on('data', data => {
socket.write(data)
})
})
server.listen(3000,()=>{
console.log('servering...')
})
12、响应只发生一次的时间
虽然事件监听是反应重复事件的,但也可以被定义为响应一次。如使用.once来进行监听
const net=require('net')
const server=net.createServer(socket => {
socket.once('data', data => {
socket.write(data)
})
})
server.listen(3000,()=>{
console.log('servering...')
})
13、创建事件发生器自定义事件
需要导入EventEmiitter模块
const EventEmitter=require('events'.EventEmitter)//导入事件发射器模块
const myevent=EventEmitter() //生成了一个myevent事件发射器对象
myevent.on('join',()=>{ //创建了 一个join自定义事件
console.log('我是join事件触发的回调函数')
})
//如果要使事件生效,必须将事件发射出去
myevent.emit('join')
14、异步逻辑顺序化
串行任务:一个接一个执行任务,有严格先后顺序,前一个执行完,后一个才执行
并行任务:同时执行且不分先后
串行任务如果有一个出错,则,整个流程终止执行
并行任务通常使用async模块,需要require(‘async’)
更多推荐
所有评论(0)