Node.js简单入门前传


Posted in Javascript onAugust 21, 2017

1.什么是NodeJS

简单的说 Node.js 就是运行在服务端的 JavaScript。

Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。

Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎(Google的Chrome浏览器使用的JavaScript执行环境),

V8引擎执行Javascript的速度非常快,性能非常好。

2.为什么选择NodeJS

如果你是一个前端程序员,你不懂得像PHP、Python或Ruby等动态编程语言,然后你想创建自己的服务,那么Node.js是一个非常好的选择。

Node.js 是运行在服务端的 JavaScript,如果你熟悉Javascript,那么你将会很容易的学会Node.js。

当然,如果你是后端程序员,想部署一些高性能的服务,那么学习Node.js也是一个非常好的选择。

3.NodeJS的特点

我们先来看看NodeJS官网上的介绍:

Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

其特点为:

1. 它是一个Javascript运行环境

2. 依赖于Chrome V8引擎进行代码解释

3. 事件驱动

4. 非阻塞I/O

5. 轻量、可伸缩,适于实时数据交互应用

6. 单进程,单线程

异步、事件驱动模型

Node.js简单入门前传

       我们同样是要发起请求,等待服务器端响应;但是与银行例子不同的是,这次我们点完餐后拿到了一个号码,

拿到号码,我们往往会在位置上等待,而在我们后面的请求会继续得到处理,同样是拿了一个号码然后到一旁等待,接待员能一直进行处理。

等到饭菜做号了,会喊号码,我们拿到了自己的饭菜,进行后续的处理(吃饭)

这个喊号码的动作在NodeJS中叫做回调(Callback),能在事件(烧菜,I/O)处理完成后继续执行后面的逻辑(吃饭),

这体现了NodeJS的显著特点,异步机制、事件驱动

整个过程没有阻塞新用户的连接(点餐),也不需要维护已经点餐的用户与厨师的连接

       Node.Js使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

基于这样的机制,理论上陆续有用户请求连接,NodeJS都可以进行响应,因此NodeJS能支持比Java、PHP程序更高的并发量

虽然维护事件队列也需要成本,再由于NodeJS是单线程,事件队列越长,得到响应的时间就越长,并发量上去还是会力不从心

总结一下NodeJS是怎么解决并发连接这个问题的:

更改连接到服务器的方式,每个连接发射(emit)一个在NodeJS引擎进程中运行的事件(Event),放进事件队列当中,

而不是为每个连接生成一个新的OS线程(并为其分配一些配套内存)

I/O阻塞

NodeJS解决的另外一个问题是I/O阻塞,看看这样的业务场景:需要从多个数据源拉取数据,然后进行处理

(1)串行获取数据,这是我们一般的解决方案,以PHP为例

Node.js简单入门前传

假如获取profile和timeline操作各需要1S,那么串行获取就需要2S

(2)NodeJS非阻塞I/O,发射/监听事件来控制执行过程

Node.js简单入门前传

NodeJS遇到I/O事件会创建一个线程去执行,然后主线程会继续往下执行的,

因此,拿profile的动作触发一个I/O事件,马上就会执行拿timeline的动作,

两个动作并行执行,假如各需要1S,那么总的时间也就是1S

它们的I/O操作执行完成后,发射一个事件,profile和timeline,

事件代理接收后继续往下执行后面的逻辑,这就是NodeJS非阻塞I/O的特点

总结一下:

Java、PHP也有办法实现并行请求(子线程),但NodeJS通过回调函数(Callback)和异步机制会做得很自然

4. NodeJS的优缺点

优点:

1. 高并发(最重要的优点)

2. 适合I/O密集型应用

    缺点:

1. 不适合CPU密集型应用;CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起;

解决方案:分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起;

2. 只支持单核CPU,不能充分利用CPU

3. 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃

原因:单进程,单线程

解决方案:(1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端口;

 (2)开多个进程监听同一个端口,使用cluster模块;

4. 开源组件库质量参差不齐,更新快,向下不兼容

5. Debug不方便,错误没有stack trace

总结

以上所述是小编给大家介绍的Node.js简单入门前传,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
DHTML 中的绝对定位
Nov 26 Javascript
做网页的一些技巧
Feb 01 Javascript
JavaScript 开发规范要求(图文并茂)
Jun 11 Javascript
js+jquery常用知识点汇总
Mar 03 Javascript
javascript制作游戏开发碰撞检测的封装代码
Mar 31 Javascript
js+css实现超简洁的二级下拉菜单效果代码
Sep 07 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
Feb 08 Javascript
Javascript中Promise的四种常用方法总结
Jul 14 Javascript
vue组件编写之todolist组件实例详解
Jan 22 Javascript
在Express中提供静态文件的实现方法
Oct 17 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
Nov 04 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
Nov 16 Javascript
详解基于webpack2.x的vue2.x的多页面站点
Aug 21 #Javascript
Vue中的ref作用详解(实现DOM的联动操作)
Aug 21 #Javascript
jquery动态赋值id与动态取id方法示例
Aug 21 #jQuery
详解webpack的配置文件entry与output
Aug 21 #Javascript
jQuery模拟爆炸倒计时功能实例代码
Aug 21 #jQuery
原生JS 购物车及购物页面的cookie使用方法
Aug 21 #Javascript
webpack3+React 的配置全解
Aug 21 #Javascript
You might like
php 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
php摘要生成函数(无乱码)
2012/02/04 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
2016/08/08 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
php JWT在web端中的使用方法教程
2018/09/06 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
js window.event对象详尽解析
2009/02/17 Javascript
js如何获取file控件的完整路径具体实现代码
2013/05/15 Javascript
JavaScript对象反射用法实例
2015/04/17 Javascript
JavaScript构造函数详解
2015/12/27 Javascript
javascript cookie的简单应用
2016/02/24 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
2016/12/14 Javascript
JS中对数组元素进行增删改移的方法总结
2016/12/15 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
JavaScript数据结构之二叉树的遍历算法示例
2017/04/13 Javascript
理解 javascript 中的函数表达式与函数声明
2017/07/07 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python中pycurl库的用法实例
2014/09/30 Python
python实现linux下使用xcopy的方法
2015/06/28 Python
Python基于checksum计算文件是否相同的方法
2015/07/09 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
Python设计模式之外观模式实例详解
2019/01/17 Python
对Python中DataFrame选择某列值为XX的行实例详解
2019/01/29 Python
python函数的万能参数传参详解
2019/07/26 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
2021/01/29 Python
CSS3的RGBA中关于整数和百分比值的转换
2015/08/04 HTML / CSS
在求职信中如何凸显个人优势
2013/10/30 职场文书
护士2014年终工作总结
2014/11/11 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书