Node.js分享

image.png

1. 我们身边的Node.js

以前 html+css+js 写前端页面的时候,NodeJs基本上用不到,现在前端都是工程化了,我们一般都是脚手架搭建工程,通常会在本地开启一个服务器,例如vue-cli(npm run serve -> vue-cli-service serve -> webpack-dev-server -> express -> node -> http),本质是 node 调用 http 模块启用了一个web服务器;再比如我们经常用到的 npm(node package manager),这些都与NodeJs息息相关。

2. Node.js 是什么?

官网解释:Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。
个人理解:它并不是一门新的语言,本质是一个环境,能够让 JavaScript 独立运行的这么一个环境,将前端开发带入到了服务器领域,底层由 C/C++ 开发。
下面是一些关于 Node.js 的介绍
先看一张大致的结构图:

image.png

Node.js 发布于2009年5月,由 Ryan Dahl 开发,实质是对 V8 引擎进行了封装, V8 引擎是目前速度最快的 Javascript引擎,chrome浏览器就是用的V8解析javascript,在Node中,同样也采用了V8解析javascript。 libuv 和一些其他库拓展了js在前端没有实现的功能,libuv是nodejs的底层支撑,包括事件循环,文件IO,网络IO,定时器等实现。代码的结构是(从上往下)nodejs内置js模块,比如http,net,fs,然后内置的js模块是调用c++层的代码,比如net模块调用tcp_wrap.cc,然后c++层调用libuv层的代码,libuv完成任务后,再往回调。

特点

  1. 部署简单方便
  2. 事件驱动
  3. 单线程(参考链接:Node.js真的是单线程吗?)
  4. 异步
  5. 非阻塞 I/O

3. Node.js 能做什么?

设想这么一个场景:我们在餐厅排队点餐,一种排队方式是多条队伍点餐(多线程,每个线程需要分配内存),每个客户需要在那等着厨师做好菜才到下一个客户(同步阻塞),这个方法无疑会增加店内的人力资源消耗(需要维护每个连接,增加了内存开销);另一种方式是只有一条队伍(单线程,减少了内存开销),但是我们点完餐后拿到了一个号码,拿到号码,我们往往会在位置上等待,而在我们后面的请求会继续得到处理,收银员能一直进行处理(非阻塞)。

等到饭菜做好了,会喊号码,我们拿到了自己的饭菜,进行后续的处理(吃饭)。这个喊号码的动作在NodeJS中叫做回调(Callback),能在事件(烧菜,I/O)处理完成后继续执行后面的逻辑(吃饭),这体现了NodeJS的显著特点,异步机制、事件驱动整个过程没有阻塞新用户的连接(点餐),也不需要维护已经点餐的用户与厨师的连接。

基于这样的机制,理论上陆续有用户请求连接,NodeJS都可以进行响应,因此NodeJS能支持比Java、PHP程序更高的并发量,虽然维护事件队列也需要成本,再由于NodeJS是单线程,事件队列越长,得到响应的时间就越长,并发量上去还是会力不从心。

单线程为什么能够实现高并发?参考:Nodejs探秘:深入理解单线程实现高并发原理

4. Node.js部分内置模块

  • os:
    os 模块提供了与操作系统相关的实用方法和属性
  • process:
    process 对象是一个全局变量,提供了有关当前 Node.js 进程的信息并对其进行控制。 作为全局变量,它始终可供 Node.js 应用程序使用,无需使用 require() 。 它也可以使用 require() 显式地访问:
const process = require('process');
  • fs:
    fs 模块可用于与文件系统进行交互。
    要使用此模块:
const fs = require('fs');

所有的文件系统操作都具有同步的、回调的、以及基于 promise 的形式。

  • stream:
    流(stream)是 Node.js 中处理流式数据的抽象接口。 stream 模块用于构建实现了流接口的对象。
    Node.js 提供了多种流对象。 例如,HTTP 服务器的请求和 process.stdout 都是流的实例。
    流可以是可读的、可写的、或者可读可写的。
    nodeJS中的流最大的作用是:读取大文件的过程中,不会一次性的读入到内存中。每次只会读取数据源的一个数据块。
    然后后续过程中可以立即处理该数据块(数据处理完成后会进入垃圾回收机制)。而不用等待所有的数据。
    访问 stream 模块:
const stream = require('stream');

尽管理解流的工作方式很重要,但是 stream 模块主要用于开发者创建新类型的流实例。 对于以消费流对象为主的开发者,极少需要直接使用 stream 模块。

  • net:
    net 模块用于创建基于流的 TCP 或 IPC 的服务器(net.createServer())与客户端(net.createConnection())。
    使用方法如下:
const net = require('net');
net.createConnection(); // 别名 net.connect(); 客户端创建连接
net.createServer(); 创建服务器
  • http、http2、https:
    若要使用 HTTP 服务器和客户端,则可以 require('http')
    Node.js 中的 HTTP 接口旨在支持许多传统上难以使用的协议的特性。 特别是,大块的(且可能是块编码的)消息。 接口永远不会缓冲整个请求或响应,所以用户可以流式地传输数据。

5. Express框架

基于 Node.js 平台,快速、开放、极简的 Web 开发框架

6. 使用Node.js + Express + Mysql 实现简单的登录注册

详见附件demo
注意:(使用pm2[https://www.cnblogs.com/panpanwelcome/p/12720384.html], pm2 list, pm2 monit, 启动: pm2 start xxx.js[id] --watch[监控文件改变并且重启应用],
pm2 stop all/name/id, pm2 delete xxx.js[id])。
pm2 serve <--name xxx> <--watch> (开启一个文件服务器)

NodeJS服务总是崩溃的解决办法:参考https://www.pianshen.com/article/2219160701/

7. Node.js使用场景

参考链接:有了Node.js,我们是不是可以放弃其他服务器语言?

你可能感兴趣的:(Node.js分享)