A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

因为地区市场不同,南京附近周边前端学员在就业时很少有遇到对node有要求的企业,偶尔有那么一家两家出现导致很多去面试的学员对于node很难说出一些基本的门道来,如果连基本的门道都说不出来,对方肯定没有兴趣再听你对express的使用心得


一、Node.js是什么?

这个问题很简单,随便百度就有很多解释,最直白的一句话:Node.js是一个Javascript运行环境(runtime).
但是跟Java学员不同,你跟我们前端的学员聊runtime??
大家都知道,在黑马前端学员中零基础的学员比重非常大。很多时候几乎90%以上都不是计算机专业,如果是这样解释,那么跟没有解释是一样的。
什么是runtime?什么是Javascript的runtime?
首先,大家都知道在我们之前的课程学习中,js都是如何运行的?没事,在编辑器中右键点击‘open in browser’需要打开浏览器依靠浏览器去运行我们的js,如果我们没有打开浏览器,我们也就不可能看到我们之前写的js如何去运行,也就是说js的运行是需要条件的 是需要一个执行它的载体的,以前我们运行我们js代码的载体是浏览器,那么如果脱离了浏览器我们如何让js运行?
此时,我们抛开了浏览器,那么我们就需要另一个可以运行js的载体,我们把这个载体称为runtime运行时,直白的讲 就是一个软件 这个软件一旦运行了,就可以帮我们去解释执行我们的js代码,而node.js就是这样的一个runtime 一个运行js的平台。


二、Node.js特点
Node.js具有以下特点:
①是一个javascript运行环境或者平台
②依赖于Chrome V8引擎进行代码解释
③基于事件驱动
④异步式I/O(非阻塞I/O)
⑤单进程、单线程
⑥轻量、可伸缩,适用于实时数据交互应用
即,Node.js是用异步式I/O和事件驱动,依赖于Chrome的V8引擎进行代码解释的javascript运行环境;
这里我们又遇到了一些新的名词,一些没有后端基础很难理解的名词
Chrome V8引擎
这是什么玩意?我们基础班学习浏览器引擎的时候 不是说Chrome浏览器的引擎是Blink么?
这里不需要太纠结,浏览器内核(引擎)决定了浏览器如何显示网页的内容以及页面的格式信息,而V8是JavaScript引擎。
基于事件驱动
这里涉及的概念比较多,很多同学在学node的时候大概都有一个模糊的概念 node干啥的 往往得到的回答是“做后端的”,既然提到了后端,避不开的一个话题就是服务器,这里事件驱动其实是服务器相关的一个概念。
通常,程序员写服务器处理模型的程序时,有以下几种模型:
(1)每收到一个请求,创建一个新的线程,来处理该请求;
(2)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求
关于第一种,由于要涉及到线程的同步,有可能会面临死锁等问题,而且一个进程之中能开启的线程也是有限的虽然不少 但是对于一些大型网站动则几十万,上百万的请求量,还是会发生阻塞甚至死锁。
阻塞又是什么意思呢?就是你在排队上厕所,你前面的人问题不解决完 你就只能干等着
死锁是什么意思呢?
竞争可消耗资源引起死锁有p1,p2,p3三个进程,p1向p2发送消息并接受p3发送的消息,p2向p3发送消息并接受p2的消息,p3向p1发送消息并接受p2的消息,如果设置是先接到消息后发送消息,则所有的消息都不能发送,这就造成死锁。
进程推进顺序不当引起死锁
有进程p1,p2,都需要资源A,B,本来可以p1运行A --> p1运行B --> p2运行A --> p2运行B,但是顺序换了,p1运行A时p2运行B,容易发生第一种死锁。互相抢占资源。


简单的举个例子解释一下,联合国有一个《武器贸易条约》 只有中美国没签,美国说“俄罗斯不签 我就不签” 俄罗斯说 “中国不签 我就不签” 中国说 “美国不签 我就不签”


主进程通过非阻塞I/O方式来处理请求
这个是什么意思呢,简单的来讲呢就是使用异步的方式处理请求 因为是单线程 所以也就不存在死锁的情况,比较直白的解释就是 你过来一堆请求,我服务器这边全接了然后你去旁边等着 哪一个先处理好了 谁先结束
举个例子,你去肯德基点餐 大家都是先排队 然后给服务器报上你要吃的 然后你就去旁边等着了 但是谁的餐 先好 这不一定 先做好的 就先吃



Node.js的异步式I/O由回调函数完成,事件的回调函数在遇到I/O请求并且当I/O操作完成时,会发送一个事件
到事件队列,而Node.js的事件循环机制会检查队列中有没有未处理的事件,直到程序结束,所以可以说,
Node.js程序由事件循环开始,到事件循环结束。


三、Node.js的用途
Node.js适合应用在高并发、I/O密集、少量业务逻辑的场景

善于I/O,不善于计算。因为Node.js最擅长的就是任务调度,如果你的业务有很多的CPU计算,实际上也相当于这个计算阻塞了这个单线程,就不适合Node开发。
即所谓的CPU密集型和I/O密集型,node.js偏向I/O密集型 大量的输入/输出 少量的计算。
当应用程序需要处理大量并发的I/O,而在向客户端发出响应之前,应用程序内部并不需要进行非常复杂的处理的时候,Node.js非常适合。Node.js也非常适合与web socket配合,开发长连接的实时交互应用程序。
比如:
● 用户表单收集
● 考试系统
● 聊天室
● 图文直播
● 提供JSON的API(为前台Angular使用)

不适合的场景:
1.计算密集型应用
2.单用户多任务的程序
3.逻辑十分复杂的事务
4.unicode与国际化

node主要应用场景是在大前端,阿里的思路是比较合适的,但是必须要注意,绝对不能让node做太多的业务逻辑,他只适合接受人家生成好的数据,然后或渲染后,或直接发送到客户端。如果让node做复杂的业务逻辑,那会得不偿失的。
天猫这么干,主要出发点可能还在于让前端工程师使用最擅长的javascript负责“全栈”javascript工作来提高团队整体工作效率。至于后端接口,可能都是一些java写的已经稳定的功能,谁也不可能决策再用Node.js去全部改造,因此在Node和java间才有了那一层接口层。这样,用Node.js去实现一层完全配置化的适配HTTP/SOAP/…协议的具有缓存策略的接口路由,再通过配置或少量代码实现接口调用聚合即可完成功能,这些工作前端工程师就能干了,完全不需要后端参与。前后端的交互就在”接口文档”,不需要会议、语言、IM来沟通。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马