近一年来接触到的一些项目中,有的涉及到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对象及其所有属性(即全局变量)都可以在程序的任何地方访问,不需要导入
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/