nodejs的理解
nodejs的由来?
Node.js是一个Javascript运行环境(runtime environment),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。
优点
借助JavaScript天生的事件驱动机制加V8高性能引擎,使编写高性能Web服务轻而易举
请先下载源文件,一边操作一遍执行。地址:https://github.com/yb81312043/node-summary
事件驱动机制(单线程多进程)
node 事件驱动.js
看输出不是1,2,3。原因是代码经过2的时候把事件丢进事件队列中,等待1s后回调输出2,并不影响3的执行输出。
传统的架构是多线程模型,也就是为每个业务逻辑提供一个系统线程,通过系统线程切换来弥补同步式 I/O 调用时的时间开销。
Node.js 使用的是单线程模型,对于所有 I/O 都采用异步式的请求方式,避免了频繁的上下文切换。Node.js 在执行的过程中会维护一个事件队列,程序在执行时进入事件循环等待下一个事件到来,每个异步式 I/O 请求完成后会被推送到事件队列,等待程序进程进行处理。
学习
如果有模块找不到,可以使用npm install 模块名 安装
使用node启动js文件
node 1.js
执行了一下js,输出
认识一下基本的模块
http
node http.js
http createServer启动一个服务。reqq是request请求体,res是response相应体。
node http1.js
new http.Server()也可以创建一个服务,request表示服务端收到请求,connection代表建立了连接,close代表关闭服务
node http2.js
服务端发送了一个请求,可以看到返回页面信息,可以利用在数据抓取上
node httpRouter.js
实现简单得路由
还有很多事件:
http.IncomingMessage http请求信息
http.ServerResponse 客户端响应得信息
http.get 是http.request得简化版
...
http模块是C++语言开发得node基础模块,效率非常高,构建也非常简单
url
node url.js
对应三个方法:
url.parse解析url
urk.formatzu组装url
url.resolve拼合url
utl模块其实就是封装了一些简化url操作得方法
querystring
node querystring.js
对应四个方法:
querystring.parse 解析请求参数
querystring.stringify 格式化成字符串
querystring.escape 对请求字符串进行编码
querystring.unescape 对编码字符串进行解码
querystring模块是封装了一些简化参数解析得方法
mysql
node mysql.js
简单得连接数据库,sql操作数据
crypto
node crypto.js
在这个数据增长惊人得互联网时代,网络安全问题层出不穷。crypto是node核心模块之一,提供安全相关的功能。
path
node path.js
path模块用于处理文件与目录的路径,还有很多方法我没有写,用到路径方面的自己去查api
fs
node fs,js
访问:http://127.0.0.1:8080/http.js,http://127.0.0.1:8080/1.js访问相对应的文件
node fsReadFile.js
使用fs.readFile读取文件,可以看到读出的数据事buffer格式.
node fsWriteFile.js
使用fs.fsWriteFile写入文件
node fsPipe.js
使用pipe()一边接入输入流,一边接入输出流,实现管道传输。
fs还有很多对应的方法:
fs.open 打卡文件
fs.mkdir 创建目录
fs.readdir 读取目录
fs.exists 查看文件是否存在
...
使用fs模块操作文件系统的api
zlib
node zlib.js
开启gzip压缩,网站反应速递提升很多。
events
node events.js
on() 监听,emit()触发,跟jq的绑定事件差不多
node eventsOne.js
once绑定一次监听事件
还有更多的事件操作方法:
emitter.addListener emitter.on别名
emitter.eventNames 返回监听的事件名数组
emitter.getMaxListeners 当前监听器最大限制数值
...
events模块管理所有的异步 I/O 操作的事件队列
缓冲区
buffer
node buffer.js
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。
Buffer对象占用的内存空间是不计算在Node.js进程内存空间限制上的,因此,我们也常常会使用Buffer来存储需要占用大量内存的数据:
koa的核心代码
promise
在JavaScript的世界中,所有代码都是单线程执行的。由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。异步执行可以用回调函数实现:
node callBack.js
pomise是es6中统一规范,需要浏览器直接支持
node pomise1.js
resolve表示成功触发then回调函数,reject表示失败触发catch回调函数
node pomise2.js
串行的pomise方式解决了异步回调嵌套的问题
node pomiseAll.js
all简化了连续.then,最后获得的results是resolve返回值的集合
pomise简化了异步回调多层嵌套的问题,使代码变得很清晰
generator
node generator.js
generator是es6的新特性,通过yield关键字,可以让函数的执行流挂起
next方法会执行函数体,直到遇到第一个yield语句,然后挂起函数执行,等待后续调用。但是next会返回一个对象,这个对象有2个key,value表示yield语句后面的表达式的值,done是个布尔值,表示函数体是否已经执行结束。再次调用g。next时,执行流在挂起的地方继续执行,直到遇到第2个yield,依次类推。
promise+generator
node koa原理.js
现在asysc替换generator函数得*,await替换了yield
中间件
中间件得作用是在请求处理之前一层过滤,集中处理非常得方便
cookie-parser
node cookieParser.js
cookie-parser模块是对cookie得解析
我们自己写个中间件
node customConnect.js
在响应头中统一添加header
常用得中间件
body-parser POST
、PUT
和PATCH
三种请求方法中包含请求体,body-parser
是一个HTTP请求体解析中间件
static 静态文件服务器
limit 帮助过滤巨型请求
query GET请求解析
logger 日志中间件,可以定制日志
favicon 网站小图标
...
node环境中得变量有哪些?
node global.js
node环境中有个global对象,类似与浏览器环境下得windows对象。像env一些默认得
剩下得全局变量方法:https://www.cnblogs.com/gpzhen/p/7216004.html
框架推荐
thinkjs3.0
优点:thinkjs致力于集成项目最佳实践,规范项目让企业级团队开发变得更加简单,更加高效。底层基于 koa 2.x 实现,兼容 koa 的所有功能。该框架借鉴了很多 ThinkPHP 的特性,同时结合Node.js的特性,使用了 ES6 Promise,让异步编程更加简单、方便。
thinkjs官网:https://thinkjs.org/
快速安装:https://thinkjs.org/zh-cn/doc/3.0/create_project.html
了解一下cli生成得项目结构:
src>>config>>adapter.js 这个文件是整个项目得配置文件
写一个简单得接口试试
src>>config>>controller是整个项目得控制器文件
项目重启一下,chrome访问一下
这就是一个简单得接口啦
模板语言ejs
配置一下ejs:https://thinkjs.org/zh-cn/doc/3.0/adapter.html
使用assign像页面输出模板变量,使用display返回html页面
创建页面文件,使用ejs输出返回变量
访问页面:
跟其他模板语言大同小异,学习一下:https://www.cnblogs.com/DCL1314/p/7732696.html
连接数据库
在adapter.js里面配置mysql:https://thinkjs.org/zh-cn/doc/3.0/relation_model.html
连接上数据库后写一个简单得接口
访问一下
可以看到,要是异步事件同步操作得话需要async/await配合使用
总结:
优点:高并发(最大优点),适合I/O密集型应用。
缺点:可靠性低,一旦代码某个环节崩溃,整个系统都崩溃
原因:单进程,单线程
解决方案:(1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端口;
只支持单核CPU,不能充分利用CPU,不适合CPU密集型应用
nodejs跟其他后台语言,也就是说其他语言能做的事情nodejs也能干,只是干得效率得问题,是不是适当得问题而已。
nodejs对前端来说是友好得,语言就是js,所以学习起来比较容易,入门也相当得快。
现在nodejs是前端得基石,可能在人们生活中得使用还是比较少,但是了解服务端对前端得发展也非常有意义。
学习参考
nodejs中文网:http://nodejs.cn/
nodejs中文社区:https://cnodejs.org/
npm淘宝镜像:https://npm.taobao.org/
thinkjs框架官网:https://thinkjs.org/
express框架官网:http://www.expressjs.com.cn/
koa框架官网:https://koa.bootcss.com/#
egg框架官网:https://eggjs.org/zh-cn/