Node.js学习笔记

74 阅读6分钟

一、Node.js是什么?

Node.js 是一个开源和跨平台的 JavaScript 运行时环境。 它几乎是任何类型项目的流行工具!

Node.js 可以在浏览器之外运行 V8 JavaScript 引擎(Google Chrome 的内核)。 这使得 Node.js 的性能非常好。V8引擎本身是使用了一些最新的编译技术。这使得用Javascript这类脚本语言编写出来的代码运行速度获得了极大提升,又节省了开发成本。对性能的苛求是Node的一个关键因素。 Javascript是一个事件驱动语言,Node利用了这个优点,编写出可扩展性高的服务器。Node采用了一个称为“事件循环(event loop)”的架构,使得编写可扩展性高的服务器变得既容易又安全。提高服务器性能的技巧有多种多样。Node选择了一种既能提高性能,又能减低开发复杂度的架构。这是一个非常重要的特性。并发编程通常很复杂且布满地雷。Node绕过了这些,但仍提供很好的性能

Node.js 应用程序在单个进程中运行,无需为每个请求创建新的线程。 Node.js 在其标准库中提供了一组异步的 I/O 原语,以防止 JavaScript 代码阻塞,通常,Node.js 中的库是使用非阻塞范式编写的,使得阻塞行为成为异常而不是常态。

当 Node.js 执行 I/O 操作时(比如从网络读取、访问数据库或文件系统),Node.js 将在响应返回时恢复操作(而不是阻塞线程和浪费 CPU 周期等待)。

这允许 Node.js 使用单个服务器处理数千个并发连接,而不会引入管理线程并发(这可能是错误的重要来源)的负担。 Node.js 具有独特的优势,因为数百万为浏览器编写 JavaScript 的前端开发者现在无需学习完全不同的语言,就可以编写除客户端代码之外的服务器端代码。

在 Node.js 中,可以毫无问题地使用新的 ECMAScript 标准,因为你不必等待所有用户更新他们的浏览器,你负责通过更改 Node.js 版本来决定使用哪个 ECMAScript 版本,你还可以通过运行带有标志的 Node.js 来启用特定的实验性功能。

在Node启动的很短时间内,社区就已经贡献了大量的扩展库(模块)。其中很多是连接数据库或是其他软件的驱动,但还有很多是凭他们的实力制作出来的非常有用的软件。

二、Node.js应用

1.前端工具链

image.png

2.npm

1,自有命令

用来管理npm包,执行node文件

2,npm包
特点:npm包整体是对一类有共同应用的代码抽象,包括了逻辑抽象,组件抽象,函数抽象

3.工程化相关

image.png 前端环境的建立是node.js在前端开发工作中最能体现价值的应用之一,node的出现使得前端开发从刀耕火种的时代进入了科技时代。前端工程化依赖于前面提到的webpack,gulp,babel,eslint等,完整的脚手架体系除了客户端能力,还包括自动构建(比如jenkins),命令行发布的功能

4.开发桌面应用

Node.js让使用js开发桌面应用成为了可能,electron是当前比较流行的桌面应用开发工具,它 nodejs和chromium的结合起来,让使用者可以调用node.js的函数,可以使用几乎所有的nodejs社区里的module。

5.前后端完全分离

①前端应用脱离服务端代码,独立部署在node.js提供的服务上

渲染方式有两种,一种是采用的常规渲染,在浏览器中生成html代码;

另一种是采用服务端渲染(ssr),这种渲染方式跟之前java生成html代码的方式类似,但是现在的ssr和真正的服务端并没有太多关系,ssr是在node端渲染的方式

②基于大型项目的全栈开发

在前端独立部署的基础上,node端加入了数据处理,接口代理,终端适配等逻辑代码,使得前端扩展性,性能大大增强。常见的全栈框架有egg,midway等

三、Node.js结构

image.png

四、Node.js特点

所谓的特点,就是Node.js是如何解决服务器高性能瓶颈的问题。总结一下Node的特点主要有以下4个:

  • 异步I/O
  • 事件与回调函数
  • 单线程
  • 跨平台

①异步

当我们尝试去访问数据库的时候就会向服务器发送请求,时间长短取决于网络和数据库的性能如何。假如我们没有异步的机制,那我们就必须等待结果返回,什么也做不了。这就是单线程的缺点,会阻塞后续代码的执行,降低了程序的效率。

现在异步的机制是当我么执行请求的时候,立即执行后面的代码而不需要等待,请求结果放在回调函数当中,提高了效率。当I/O操作执行完毕之后会以事件的形式通知执行I/O操作的线程,“你要的结果处理好了,快来拿吧!”。

由于会有很多这样的异步请求,那就必须要有先后的顺序,这就是Node中的事件循环机制,JavaScript的不同。事件循环机制依次检查是否还有没有处理的回调函数,依次执行。

②事件与回调函数

Node通过事件驱动的方式处理请求时,无需为每一个请求都创建一个线程,而是采用一个线程,以循环处理的方式进行。客户端每进行一个I/O操作,都会添加到事件队列当中,线程会留下一个处理结果的回调函数。线程循环处理队列上面的任务,知道全部处理完成。

③单线程

Node中的单线程操作,不用在意一些状态同步问题,也不会有死锁的存在,也没有线程上下文交换带来的性能开销。但是单线程也存在一些问题:

  • 无法利用多核CPU
  • 错误产生会引起整个程序退出
  • 繁重的计算会阻碍异步I/O

Node采用了HTML5标准定制的WebWorker 来解决单线程中大量计算的问题。可以通过将计算分发到各个子进程来计算,然后通过进程之间的事件消息来传递结果,保持了应用模型的简单与低依赖。

④跨平台

通过对Node架构层面的改动,建立了一层平台层架构,即libuv。通过良好的架构,Node的第三方C++模块可以借助libuv实现跨平台。