赞
踩
Node.js简称Node,是一个可以使JavaScript运行在服务器端的开发平台。
JavaScript本是一种Web前端语言,Node.js让JavaScript成为服务器端脚本语言。
i Node.js选择JavaScript作为实现语言的原因:
Node.js将V8引擎封装起来,作为服务器运行平台,以执行JavasScript编写的后端脚本程序。
NodeJS 是基于Chrome V8引擎的 JavaScript 运行环境。NodeJS使用事件驱动,非阻塞型I/O。NodeJS的包管理生态是 NPM,是现在世界上最大的开源程序包库。
【什么是JavaScript?】
JavaScript 是一种语言,JavaScript的标准是 ECMAScript。
【什么是 ECMAScript?】
我们说的 ES5,ES6……就是指的 ECMAScript 不同标准。ECMAScript 只是一个标准,而JavaScript是对这个标准的实现。
JavaScript是一门脚本语言,它需要一个运行环境。就好像PHP需要Apache,JSP需要Tomcat等等。 而NodeJS之前,JavaScript运行环境是浏览器,也就是JavaScript在网页中才能跑起来。NodeJS之后JavaScript又多了一个运行环境,就是NodeJS。
由于NodeJS的最底层是Chrome的V8引擎,然后libuv封装了一些I/O的线程池管理和网络的I/O操作,这部分是C/C++写的。简单来说NodeJS可以控制系统文件的读写,网络的输入输出。所以NodeJS又可以被单纯的认为是一个可以运行 JavaScript 的服务器。
这些工具的起源和诞生几乎浓缩了前端的发展历程,因为 NodeJS 可以读写文件,监听网络输入输出。所以 NodeJS 和 VueJS、ReactJS、AngularJS 有非常本质的区别。NodeJS 是可以运行 JavaScript 的环境,剩下三个是用 JavaScript 写的库
vue-cli,react-cli 和 ng-cli 都是运行在 NodeJS 环境下的脚手架。也就是说我们不可以直接在浏览器里运行 vue-cli。因为有了文件读写的能力,所以 vue-cli 可以帮我们集成(或者打包)vue核心模块,并将我们的代码转义,压缩。
所以 vue-cli 是 运行在 NodeJS 环境下 帮助我们开发 基于Vue框架的项目 的脚手架
平台独立性
Integrated Development Environment (IDE)
库
多线程处理
开发更快
可扩展性
速度
非阻塞I/O
非阻塞I/O,又称异步式I/O,是Node.js的重要特点。
阻塞I/O是指线程在执行过程中遇到I/O操作时,操作系统会撤销该线程的CPU控制权,使其暂停执行,处于等待状态,同时将资源转让给其他线程。
非阻塞I/O是指当线程遇到I/O操作时,不会以阻塞方式等待I/O操作完成或数据返回,而只是将I/O请求转发给操作系统,继续执行下一条指令。
事件驱动
非阻塞I/O是一种异步方式的I/O,与事件驱动密不可分。
事件驱动以事件为中心,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本身是一个多线程平台。
ps:
Node.js采用非阻塞I/O与事件驱动相结合的编程模式,与传统同步I/O线性编程思维有很大的不同,Node.js程序的控制很大程度要依靠事件和回调函数,这不符合开发人员的常规线性思路,需要将一个完整的逻辑拆分为若干单元(事件),从而增加了开发和调试的难度。
弥补方案
//导入http模块
const http = require('http');
const httpServer=http.createServer(function(req,res){
//设置响应头信息
res.writeHead(200,{'Content-type':'text/plain'});
//发送相应数据‘hello world’
res.end("Hello World!\n");
});
httpServer.listen(8080,function(){
//向终端输出如下信息
console.log('服务器正在8080端口上监听');
console.log('服务器正在8080端口上监听');
});
源代码 | 说明 |
---|---|
const http = require(‘http’); | 导入模块。导入Node.js自带的http模块,并将实例化的HTTP组件赋值给变量http。模块是Node.js程序组织可重用代码的方式,可使用require()方法来载入模块 |
const http = require(‘http’);const httpServer = http.createServer(function (req, res) {res.writeHead(200, {‘Content-Type’: ‘text/plain’});res.end(‘Hello World!\n’);}); | 创建HTTP服务器。调用http模块提供的http.createServer()方法创建服务器,使用一个回调函数作为参数,该回调函数又接受两个参数,分别是代表客户端的请求对象和向客户端发送的响应对象,所有请求和响应都由此回调函数处理 |
console.log(‘服务器正在8080端口上监听!’);}); | 启动HTTP服务器,并设置监听器的端口号。http.createServer()方法返回一个HTTP服务器对象,它使用listen()方法启动HTTP服务器以监听连接、指定端口号。该方法包含一个回调函数参数,用于设置启动HTTP服务器之后的操作 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。