什么是Node.js

Posted 开到荼蘼223's

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是Node.js相关的知识,希望对你有一定的参考价值。

什么是Node.js?

Node.js简称Node,是一个可以使javascript运行在服务器端的开发平台,JavaScript是一种Web前端语言,Node.js让JavaScript成为服务器端脚本语言。

Node.js选择JavaScript作为实现语言的原因:

  • JavaScript满足CommonJS标准,符合事件驱动,用户较多且门槛较低
  • Chrome的V8引擎具有出色的性能

Node.js运行时环境包含执行JavaScript程序所需的一切条件。该引擎会将JavaScript代码转换为更快的机器码。
Node.js进一步提升JavaScript的能力,使JavaScript可以访问文件、读取数据库、访问进程,从而胜任后端任务。
使用Node.js 的最大优点是开发人员可以在客户端服务器端
JavaScript,打通了前后端。
Node.js发展迅速,目前已成为JavaScript服务器端运行平台的事实标准。

Node.js将V8引擎封装起来,作为服务器运行平台,以执行JavasScript编写的后端脚本程序。

Node.js是跨平台的,能运行在Windows、macOS和Linux平台上。
Node.js除了自己的标准类库之外,还可使用大量的第三方模块系统来实现代码的分享和重用。
与其他后端脚本语言不同的是Node.js内置了处理网络请求和响应的函数库,也就是自备了HTTP服务器,所以不需要额外部署HTTP服务器。

Node.js特点

非阻塞I/O


非阻塞I/O又称异步式I/O,阻塞I/O是指线程在执行过程中遇到I/O操作时,操作系统会撤销该线程的CPU控制权,使其暂停执行,处于等待状态,同时将资源转让给其他线程。

非阻塞I/O是指当线程遇到I/O操作时,不会以阻塞方式等待I/O操作完成或数据返回,而只是将I/O请求转发给操作系统,继续执行下一条指令。非阻塞I/O是Node.js的重要特点。

事件驱动


事件驱动以事件为中心:Node.js将每一个任务都当成事件来处理

  • Node.js在执行过程中会维护一个事件队列,需执行的每个任务都会加入事件队列并提供一个包含处理结果的回调函数。
  • 在事件驱动模型中,会生成一个事件循环线程来监听事件,不断地检查是否有未处理的事件。
  • Node.js的异步机制是基于事件的,所有磁盘I/O、网络通信、数据库查询事件都以非阻塞的方式请求,返回的结果由事件循环线程来处理。

单线程

Node.js的应用程序是单进程、单线程的,但是通过事件和回调支持并发,性能变得非常高。

在阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须使用多线程。在非阻塞模式下,线程不会被I/O操作阻塞,该线程所使用的CPU核心利用率永远是100%,I/O操作以事件的方式通知操作系统。

Node.js在主线程中维护一个事件队列,当接收到请求后,就将该请求作为一个事件放入该队列中,然后继续接收其他请求。
Node.js内部通过线程池来完成非阻塞I/O操作,Node.js的单线程是指对JavaScript层面的任务处理是单线程的,而Node.js本身是一个多线程平台。

Node语法基础

  • 每条语句都以分号结束(注:也可没有";")
  • 一行代码可以包含多条语句(注:若一行有多条语句 每条语句都要以";"结束,建议一行只有一条语句)
  • 若一行语句太长可以使用 \\ 进行换行
  • 语句块 由多条语句组成 这些语句都在 {}中

注释:

  • 单行注释 // 快捷键 ctrl /
  • 多行注释 /* … */ 快捷键 ctrl shift /

变量

  • 可以是任意的数据类型
  • 变量名是由字母 数字 下划线 $组成的字符序列 但首字符不能是数字
  • JavaScripts是弱类型语言 在定义变量时不需要指定变量的类型 都可以使用var来声明
  • 可以再声明变量的同时赋值 也可以先声明变量然后再赋值
  • 变量可以反复的赋值

变量的提升

在ES5中变量可以在声明之间使用它的值是undefined,不建议使用
在ES6中使用let关键字声明变量,变量是不能在声明之前使用

变量值的泄露
在语句块中使用var关键字声明的变量会被提升为全局变量,这样就会造成局部变量值得泄露,防止变量值得泄露方法是使用let关键字声明局部变量

作用域
ES5中作用域只有全局作用域 函数作用域

  • 全局作用域:从声明的位置开始到源程序的结束均有效
  • 函数作用域:只在函数范围内有效

ES6中增加的块级作用域
在ES6中使用let关键字声明的变量只在它所在的块级作用域中有效

第一个Node程序

// 导入node的http模块(内置的http服务器模块)
const http = require('http');
// 创建一个http服务器
// req:request 是客户端的请求对象 用于向服务器端发送请求
// res:response 是服务器的响应对象 用于向客户端发送响应信息的格式
const httpSever = http.createServer(function(req,res){
    // 设置响应头信息 200是状态码 表示请求-响应成功
    res.writeHead(200,{'Content-Type':'text/plain'});
    // 向客户端发送字符串
    res.end('Hello World');
})
// 注册监听程序
httpSever.listen(8080,function (){
    console.log('服务器在8080端口上监听');
});

以上是关于什么是Node.js的主要内容,如果未能解决你的问题,请参考以下文章

初识 Node.js 丨path 路径模块

vscode代码片段建议bug

从Node.js Stream写入多个文件

你可能不知道的JavaScript代码片段和技巧(下)

你可能不知道的JavaScript代码片段和技巧(上)

19 条 Node.js 生产环境中的最佳实践