概念(东拼西凑,慢慢品)
简单的说 Node.js 就是运行在服务端的 JavaScript。
Node.js是一个事件驱动I/O服务端JavaScript环境,
基于Google的V8引擎
Node.js,或者Node,是一个可以让JavaScript 运行在服务器端的平台。
它可以让JavaScript 脱离浏览器的束缚运行在一般的服务器环境下,就像运行Python、Perl、PHP、Ruby程序一样。
你可以用Node.js 轻松地进行服务器端应用开发,Python、Perl、PHP、Ruby 能做的事情Node.js 几乎都能做,而可以做得更好。
Node.js采用C++语言编写而成,浏览器内核V8做为执行引擎
Node不是JS应用、而是一个Javascript的运行环境
Node保留了前端浏览器js的接口,没有改写语言本身的任何特性,依旧基于作用域和原型链
Node.js 是基于V8引擎的javascript运行环境
Node.js 具有事件驱动, 非阻塞I/O等特点
结合Node API, Node.js 具有网络编程, 文件系统等服务端的功能, Node.js用libuv库进行异步事件处理.
nodeJS特点
1、一个Javascript运行环境
2、依赖于Chrome V8引擎进行代码解释
3、事件驱动
4、非阻塞I/O
5、轻量、可伸缩,适于实时数据交互应用
6、单进程,单线程
理解node.js与其他服务器主要区别
可以进行一个类比:
项目要求的业务强度 =》单位时间内需要满足的食客
服务器 =》一家餐馆
服务器内存 =》 餐馆运营成本
用户请求 =》食客
线程 =》 餐厅服务员
以多线程服务器为例:
- 每一个食客都有一名自己专属的服务员
- 餐馆在运营开支一定的情况下,聘请服务员数量是有限的
- 所有服务员均分运营开支
所以为了满足单位时间内食客们的吃饭需求(目标)
需要不断的增加餐馆数量
来完成这个(目标)
以node.js为例
- 餐厅内的食客共同使用一名服务员
- 餐厅只招聘一名服务员
- 这一名服务员独享所有可使用的运营开支
所以为了满足单位时间内食客们的吃饭需求(目标)
需要将工作优先级
交给这一名服务员即可
如图差异所示,
一个node服务器可以实现多台传统服务器相同的效果
表象来看,node服务器是单线程,服务器开销小,同时这个单线程还还可以做更多的事情
更加深入,可以看出这个线程不简单
得益于事件驱动,非阻塞IO
首先来说阻塞操作有什么,仍以餐厅为例
在如上情况,阻塞阶段(思考点餐、餐饮烹饪),在服务器中对应的是(I/O操作、数据库查询、网络通信等 )
- nodejs非阻塞操作
在nodejs中,类似阻塞操作,通过函数异步回调,无需等待其结束,去处理其他的请求,
- 事件驱动 [EventEmitter]
在数据阻塞操作结果出来后,会将之前阻塞对应的事件,插入到事件队列最前面,放下任何操作,优先处理
这便得益于事件驱动机制
通过非阻塞和事件驱动,这个单线程会异常厉害
回到例子
nodejs中的这一个唯一的服务员,会按照任务优先级处理工作,在食客点餐思考阶段和厨房制作成品美食的真空期,去做其他的工作,一旦上述耗时任务有反馈,会从任务清单中,将对应的食客的工作优先处理,将所有任务井井有条的完成
这是nodejs中这个单线程这么厉害的原因
优劣不足
好处:
传统服务器,一个用户请求,就需要一个线程;所以用户访问请求和线程消耗是等比增加的
nodejs是单线程, 对性能消耗少,基于非阻塞I/O和事件驱动,处理更多请求
团队项目,硬件(金钱成本)开销小
小团队,没资金,优先考虑
不足:
单线程,也就是一旦线程错误,那么所有的用户都会受到波及
不足以撼动传统后台语言,不够健壮,安全,性能稳定(银行、金融、证券)
大型企业对其使用,谨慎态度
擅长于:
任务调度I/O (用户表单收集)、也善于websocket长链接操作(视频直播)
不善于:
大量计算操作,计算也会阻塞
nodeJS 与 javascript 的异同
同:
1.基于ECMAscript语法
异:
1.JS有window对象
node.js的架构
V8引擎 / 引擎的概念
JavaScript引擎是一个专门处理JavaScript,一般会附带在网页浏览器之中
JavaScript解释器的作用,是执行JavaScript源码
1.词法分析器(Lexical Analyser)
2.句法解析器(Syntax Parser)
3.字节码生成器(Bytecode generator)
4.字节码解释器(Bytecode interpreter)
V8引擎
V8是被设计用来提高网页浏览器内部JavaScript执行的性能
v8会把js代码转换为高效的机器码,而不在是依赖于解释器去执行
v8引入了JIT在运行时把js代码进行转换为机器码
NodeJs执行模型: 单线程Event Loop
当应用请求发生时,首先进入V8引擎,然后进入到事件队列,可以理解为他们在不断地在循环,看是否有任务,产生任务就去执行。
简单来说,通过事件轮循操作,实现单线程JS不能做到的事件并发处理
node.JS必须懂的一些地方
一 什么是模块?
模块是Node.js应用程序的基本组成部分,文件和模块是一一对应的。
换句话说,一个Node.js文件就是一个模块,这个文件可能是JavaScript代码,JSON或者编译过的C/C++扩展。
var http= require('http'),其中http是Node.js的一个核心模块,其内部是用C++实现的,外部用Javascript封装。
我们通过require函数获取这个模块 ,从而才能使用其中的对象。
二 如何创建并加载模块?
在Node.js,创建一个模块非常简单,因为一个文件就是一个模块
Node.js提供了exports和require俩个对象,其中exports是模块公开的接口,require用于从外部获取一个模块的接口
创建模块
```
//module.js
var name;
exports.setName = function(thyName){
name = thyName;
}
exports.sayHello = function() {
console.log('hello' + name)
}
```
引入模块
var myModule = require('./module');
myModule.setName('zhangsan');
myModule.sayHello();
【注】:require 不会重复加载模块,重复调用同一个模块的方法,方法会覆盖,只会执行1次
三 如何创建一个包?
包是在模块基础上更深一步的抽象,Node.js的包类型与C/C++的函数库或者Java/.Net的类库.将某个独立的功能封装起来,用于发布
更新,依赖管理和版本控制.Node.js根据CommonJS规范实现了包机制,开发了npm来解决包发布和获取;
node.js的包就是一个目录,包含一个JSON格式的包说明文件package.json.
package.json必须在包的顶层目录下,其他遵循CommonJS的规范不是特别严格
四 如何使用包管理?
node.js包管理,即npm是Node.js官方提供的包管理工具,它已经成为了Node.js包的标准发布平台,npm提供了命令行工具,你可以很方便去下载 安装 升级 删除包!
//下载的格式 本地模式 末尾加-g (--global) 就是全局模式
npm install(i) xxx
//删除的格式 末尾加-g (--global) 就是全局模式
npm uninstall xxx
五 删除NODE
如果重装,需要先卸载,再安装
1.删除node
2.删除node文件夹内的node_modules
3.删除C盘users下个人账户下的node_modules