Node.JS 的由来?
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/
快速安装:
了解一下 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:
连接上数据库后写一个简单得接口
访问一下
可以看到, 要是异步事件同步操作得话需要 async/await 配合使用
总结:
优点: 高并发 (最大优点), 适合 I/O 密集型应用.
缺点: 可靠性低, 一旦代码某个环节崩溃, 整个系统都崩溃
原因: 单进程, 单线程
解决方案:(1)Nnigx 反向代理, 负载均衡, 开多个进程, 绑定多个端口;
只支持单核 CPU, 不能充分利用 CPU, 不适合 CPU 密集型应用
Node.JS 跟其他后台语言, 也就是说其他语言能做的事情 Node.JS 也能干, 只是干得效率得问题, 是不是适当得问题而已.
Node.JS 对前端来说是友好得, 语言就是 JS, 所以学习起来比较容易, 入门也相当得快.
现在 Node.JS 是前端得基石, 可能在人们生活中得使用还是比较少, 但是了解服务端对前端得发展也非常有意义.
学习参考
Node.JS 中文网: http://nodejs.cn/
Node.JS 中文社区: https://cnodejs.org/
NPM 淘宝镜像: https://npm.taobao.org/
thinkjs 框架官网: https://thinkjs.org/
express 框架官网: http://www.expressjs.com.cn/
koa 框架官网: https://koa.bootCSS.com/# https://koa.bootcss.com/
egg 框架官网: https://eggjs.org/zh-cn/
来源: http://www.bubuko.com/infodetail-3004343.html