Node.js是一个基于Chrome强大的V8JS引擎的面向服务器的框架。虽然它是用C++编写的,但它及其应用程序运行在JS上。本文为开发者总结了4个Node.js要点。 1。非阻塞或异步I/O 因为Node.js是一个服务器端框架,它的主要工作之一就是处理浏览器请求。在传统的I/O系统中,每个请求都是在前一个请求到达之后发出的。所以这叫做阻塞I/O。服务器阻塞其他请求来处理当前请求,导致浏览器等待。 Node.js不以这种方式处理I/O。如果一个请求需要很长时间来处理,Node.js会将请求发送到一个事件循环(eventloop),然后在调用栈(callstack)中继续处理下一个请求。处理完延迟请求后,它会通知Node.js并且浏览器会响应反馈。 下面用一个例子来说明。 阻塞I/O//接受表1的订单并等待...varorder1=orderBlocking([`'Coke',``'IcedTea']);`//一旦订单准备就绪,将订单送回餐桌。服务订单(订单1);//订单交付后,转到另一张桌子。//接受表2的订单并等待...varorder2=orderBlocking([`'Coke',``'Water']);`//一旦订单准备就绪,将订单送回餐桌。服务订单(订单2);//订单交付后,转到另一张桌子。//接受表3的订单并等待...varorder3=orderBlocking([`'IcedTea',``'Water']);`//一旦订单准备就绪,将订单送回餐桌。服务订单(订单3);//订单送达后,转移到另一张桌子。 在这个餐厅的例子中,服务员收到菜单订单,等待食物被处理,然后在处理后将食物带到桌子上。服务员在等待处理餐点的过程中,会拒绝其他顾客的菜单点单。 非阻塞I/O//为表1排序并继续...});//接受表2的订单并继续...//接受表3的订单并继续...阻塞模式,服务器会通知厨师他收到的菜单订单,然后去接下一张桌子的订单。当第一桌食物加工完成后,他会为那一桌的客人服务,然后继续接受其他客人的指令。这样,服务员就不会因为阻塞指令而浪费时间。 2。原型(Prototype) 原型是JS中一个复杂的概念。在Java或C++等典型的继承机制语言中,为了实现代码重用,必须先创建一个类,然后通过它生成对象或者通过类扩展生成对象。但是JS中没有类似的类概念。在JS中创建对象后,需要扩展对象或者通过它创建新的对象。这称为原型继承。 每一个JS对象都连接到一个原型对象,并继承对象的属性。每个对象都与预定义的JSObject.prototype相关联。如果通过obj.propName或者obj['propName'>搜索对象属性但是搜索失败,可以尝试通过obj.hasOwnProperty('propName')搜索,JS运行时会在原型对象中查找属性.如果原型链中不存在该属性,则返回值undefined。让我们用一个例子来说明:if(`typeofObject.create!=='function'`){Object.create=function(o){varF=function(){};F.prototype=o;返回新的F();};varotherPerson=Object.create(person); 当你创建一个新的对象时,你必须根据原型选择一个对象。这里我们在对象函数中添加了一个create方法。create方法基于另一个对象创建一个对象,并将其作为参数传入。 当我们改变一个更新的对象时,它的原型保持不变。但是,当我们更改原型对象时,更改将影响所有基于原型的对象。 3。模块(Modules) 如果你用过Java中的包,Node.js的组件也是类似的。如果没有,别担心;组件只是实现特定功能的JS文件。组件模式的意义在于让你的工作更轻松。要使用组件,您必须像在Java中导入包一样导入JS文件。Node.js中有两种组件 核心模块-核心模块与Node.js库一起预编译。其目的是开放程序员经常使用的功能,避免重复工作。常见的核心组件包括HTTP、URL、EVENTS、FILESYSTEM等。 UserDefinedModules-UserDefinedModules是提供给用户实现特定功能的组件。当核心组件不足以满足程序员的需求时,自定义组件就可以派上用场。 组件是通过require函数提取出来的。如果这是核心组件,则参数是组件名称。如果这是一个用户自定义的组件,参数就是它在文件系统中的组件路径。例如://像这样提取一个核心模块varhttp=require(`'http);`//像这样提取用户定义的模块varsomething=require('`./folder1/folder2/folder3/something.js');` 4。回调(Callbacks) 在JS中,函数是一等对象。这意味着您可以像对常规对象一样对函数执行所有操作。示例包括将函数分配给变量,将它们作为参数传递给方法,将它们声明为对象的属性,甚至从函数返回它们。 回调是JS中的异步函数,可以作为参数传递给其他函数,也可以执行或从其他函数返回再执行。这是回调的基本概念。 当我们将回调函数作为参数传递给另一个函数时,传递的只是函数的定义;换句话说,我们不会知道回调函数的执行时间。这完全依赖于回调函数机制。它会在稍后的某个时间点进行回调调用。这是Node.js的非阻塞或异步行为的基本概念,可以通过以下示例说明:setTimeout(`function`(){console.log(`"world"`);},2000)console.log(`"你好"`); 这是最简单的调用。我们传递一个匿名函数作为参数来为setTimeout函数注册控制台输出记录。由于这只是一个函数定义,我们不知道函数什么时候会被执行。取决于setTimeout函数的第二个参数,也就是2S之后。 首先,第二条record语句记录输出到控制台,2秒后,回调函数中的record语句记录输出内容。//输出helloworld 写在最后 以上4点需要Node.js开发者彻底理解和掌握。建议多做了解这4点的含义。
