Node.js学习总结

1,296 阅读7分钟

近一年来接触到的一些项目中,有的涉及到Node.js技术,一开始的时候,对于JavaScript语言都不了解的我来讲,在实际开发中并没体会和理解到该技术的理念和设计初衷,也不了解node.js更多功能方法。
后来,因为项目中还涉及到其他的一些技术或者框架,比如koa、npm、webpack等,通过对它们一点点的学习和理解,才建立了对node项目的整体认知。本文作为学习Node.js的总结输出。

Node简介

Node的诞生

JavaScript最初是为浏览器创建的语言,执行环境是只能在客户端的浏览器中。然后,在浏览器中的 JavaScript 的能力是有限的,其中包括 网页中的 JavaScript 不能读、写、复制及执行用户磁盘上的文件或程序。即JS没有直接访问操作系统的功能。
因此,JavaScript语言是不适用于开发后端程序的。因为后端开发显然是要经常访问系统里的资源。

后来在2009年,美国程序员Ryan Dahl开源了一个Node项目。Node在后端为JavaScript创建了一个运行环境,即Node环境,能够让JavaScript脱离浏览器运行,可以和其他后端语言如PHP、Python、Ruby等一样在服务器上运行。

Node.js是什么

有了Node后,JS脚本就能在后端跑起来,那如何去访问系统里的资源、如何读写资源等,实现使用JavaScript语言开发高性能Web服务器应用呢?Node.js技术为此应运而生。 现在在后端开发中,越来越多的开发者选择Node.js技术来实现Web服务器应用了。

  • Node.js是一个开发平台(C++实现)
  • 该平台使用的编程语言是JavaScript
  • 使用Chrome V8引擎执行JS代码

Node.js的应用场景非常多。

  • 开发Web服务应用程序
  • 命令行辅助工具、控制台程序
  • 桌面程序
  • 组件、构建工具
  • 爬虫

Node.js的特点

  • 单线程(所有JS的执行都是在一个线程中完成的)
  • 事件驱动机制(当事件被触发时,执行传递过去的回调函数)
  • 非阻塞I/O模型(当执行I/O操作时不会阻塞线程) 在事件驱动模型中,会生成一个主循环来监听事件,然后每个事件对应的有一个回调函数。当检测到事件被触发时去回调函数。
    在非I/O阻塞模型中,可以一边读文件,一边执行其他的命令,等到文件操作完成后,在将文件内容作为回调参数的参数返回。这样一来就不会阻塞JS的运行。

Node.js的使用JavaScript进行编程,运行在JavaScript引擎上,所以运行机制跟JS运行机制是差不多的,具有天然的优势:JS引擎单线程、如事件驱动,异步编程,非阻塞式IO等等。Node.js不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了,就触发一个内部事件,通过非阻塞I/O、事件驱动机制,让Node.js程序宏观上也是并行的

node.js优势

  • 擅长I/O密集型计算,支持高并发 JavaScript本身语言的特性,如事件驱动,异步编程,非阻塞式IO等,使得支持高并发,从而编写高性能Web服务轻而易举
  • 部署简单,硬件成本低
  • 有强大的开源生态系统-npm,JavaScript流行程度与社区活跃度
  • 跨平台,开源
  • 使得项目前后端开发语言统一,技术栈统一
    客户端提出服务请求,服务器端负责处理请求并提供服务。而对于互联网来说,在Node.js之前JavaScript是一项完全的客户端技术,被用于浏览器中实现各种动画,对DOM的操作等等。而后端,即服务端则是由PHP、Python、Ruby、Java等等语言来实现。Node.js的出现,使得前后端使用同一种语言。同时硬件成本低,不用建设在任何服务器软件之上。

node.js劣势

不过,因为单线程的原因,在CPU密集型事务中Node.js会遇到瓶颈。并且一旦程序出现错误会导致整个程序崩溃。

安装Node环境

安装

为了要在后端运行JavaScript代码,所以首先必须是在本机安装Node环境。 假如是MAC电脑,使用 brew 命令来安装

brew install node

安装好了node后,使用"node -v"命令查看安装的node版本。
brew 安装的软件都存放在/usr/local/Cellar/目录下,进入该目录,可以找到node。

运行js代码

之前我们编写的JavaScript代码都是在浏览器中运行的,因此,我们需要在浏览器的调试面板console中敲js代码并运行。
现在有了Node环境,JavaScript代码将直接能在计算机上以命令行的方式运行,运行js代码有两种方式:

  • 命令行node交互环境执行js代码
    就像进行python终端交互一样,在终端直接输入node 命令,进入Node.js的交互环境后,我们可以输入js代码并立刻执行。
    要退出Node.js环境,连按两次Ctrl+C。

  • node命令执行js文件
    使用js语言编写代码,然后保存成xxx.js文件,然后终端执行node xxx.js即可执行js程序。
//require表示引包,引包就是引用自己的一个特殊功能
var http = require("http");
//创建服务器,参数是一个回调函数,表示如果有请求进来,要做什么
var server = http.createServer(function(req, res){
    //req表示请求,request;  
    //res表示响应,response
    //设置HTTP头部,状态码是200,文件类型是html,字符集是utf8
    res.writeHead(
        200,
        {"Content-type":"text/html;charset=UTF-8"});
    res.end("hello,node.js!");
});

//运行服务器,监听3000端口(端口号可以任改)
server.listen(3000,"127.0.0.1");

不要关闭命令提示符,打开浏览器,输入监听ip地址加端口号:http://127.0.0.1:3000/,网页会出现

开发环境搭建

在Chrome浏览器中有调试JavaScript的功能,我们希望在本地node.js开发中也有一个IDE集成开发环境,能够编码、运行和调试js代码,提高开发体验和效率。
组里基本都用的是Visual Studio Code和WebStorm。

  • 在Visual Studio Code里调试js代码 需要配置launch.json文件
  • 在WebStorm里调试js代码 需要配置JavaScript Debug

Node.js知识点

global全局对象

在浏览器中,JavaScript有唯一一个全局变量叫做window对象。 相同的,在Node环境中,JavaScript也有唯一一个全局变量,名称叫做global对象。

  • 在Node.js 中的全局对象是 global,所有全局变量都是 global 对象的属性
  • global对象及其所有属性(即全局变量)都可以在程序的任何地方访问,不需要导入

global对象的有些属性和方法和浏览器环境的window对象不同。所以 虽然有很多JavaScript代码既能在浏览器中执行,也能在Node环境执行,但是一旦涉及到需要判断运行环境的逻辑(比如在SSR场景中),我们常用的方式就是根据浏览器和Node环境提供的全局变量名称来判断:

if (typeof(window) === 'undefined') {
    console.log('node.js');
} else {
    console.log('browser');
}

process对象

Node.js提供了一个表示当前进程的对象process

// process.nextTick()将在下一轮事件循环中调用:
process.nextTick(function () {
    console.log('nextTick callback!');
});
console.log('nextTick was set!');

process.nextTick的执行时机类似于promise的执行时机,都是等同步任务执行完毕后再被执行。所以上面代码的执行结果是

nextTick was set!
nextTick callback!

内置模块

Node.js开发的目的就是为了用JavaScript编写Web服务器程序,服务器程序必须能接收网络请求,读写文件,处理二进制内容,所以,除了JavaScript本身支持的功能外,Node.js内置了一些常用模块,目的就是为了实现基本的服务器功能。这些模块在浏览器环境中是无法被执行的,因为它们的底层代码是用C/C++在Node.js运行环境中实现的。

  • path模块-本地文件目录模块,负责处理操作系统相关的文件路径

  • fs模块——文件系统模块,负责读写文件

  • http模块——网络请求模块,发送和接收网络请求

  • url模块——网络地址模块,解析和生成url对象

  • event模块——事件模块,监听和响应事件

  • stream模块——流模块,标准输入流和标准输出流
  • crypto模块-提供了通用的加密和哈希算法
  • 还有很多,可以参考官网API

参考文档

www.liaoxuefeng.com/wiki/102291…

官网api文档:nodejs.org/api/