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启动一个服务。req是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.jshttp://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  POSTPUTPATCH三种请求方法中包含请求体,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配合使用

 

总结:

nodejs优点:高并发(最大优点),适合I/O密集型应用。

nodejs缺点:可靠性低,一旦代码某个环节崩溃,整个系统都崩溃

    原因:单进程,单线程

    解决方案:(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/

posted @ 2018-10-19 16:02  Daisylcj  阅读(297)  评论(0编辑  收藏  举报