第一章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’)

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐