Nodejs学习笔记

Nodejs

首先,在后端的JavaScript的运行环境是由C++编写的,同时,Google Chrome的V8引擎性能足够好,另外,Nodejs提供了很多系统级的API,如文件操作、网络编程等。

通过使用Nodejs,你可以编写系统级或者服务端的JavaScript代码。与Nodejs相比,浏览器的JavaScript代码,其在运行时会会受到各种安全性的限制,对客户系统的操作有限。

 

特点

1、基于事件驱动机制的异步I/O,异步编程

2、以单进程单线程模式运行

两相结合...流弊...

 

关键理解

模块机制

对于JavaScript,①没有模块系统,没有原生的支持密闭作用或依赖管理;②没有标准库,只有一些核心库,没有文件系统的API;🌂没有标准接口,没有Web Server或数据库统一接口;④没有有包管理系统,不能自动加载安装依赖。

根据CommonJS规范,引入了Nodejs

①实现require方法引入模块

②同时NPM实现依赖管理和模块自动安装等功能

网络模块

HTTP、DNS、NET、UDP、HTTPS、TLS等

文件模块

CommonJs规范以及Nodejs文件模块的实现原理

事件机制

Event I/O for V8 JavaScript(基于V8引擎实现的事件驱动I/O)

其实,事件机制的应用在前端编程中我们也已经见过了,比如Ajax异步请求机制:设置回调函数,处理返回的结果。

后端Nodejs统一了前后端JavaScript的编程模型,利用事件机制,充分利用异步I/O突破了单线程编程模型的性能瓶颈,使得JavaScript在后端达到实用价值。

备注1:阻塞I/O服务器之单线程服务器模型——最简单的服务器模型。在以往的服务器开发中,并发的请求处理是一个大问题,阻塞式的函数会导致资源浪费和时间延迟。

备注2:其实之前就有用JavaScript做后端的语言——rhino,但是摆脱不了同步执行的影响,所以无法同php等其他后端语言媲美。

异步I/O实现

异步I/O在分布式环境中极其重要,这也是众多云计算厂商对Nodejs青睐的根本原因。

理想的异步I/O模型:应用程序发起异步调用,而无需进行轮询,进而处理下一个任务,只需在I/O完成后通过信号或是回调函数将数据传递给应用程序即可。

Nodejs开发人员通过注册相应回调函数,异步执行,这意味着虽然在代码结构中,这些函数虽然依次注册,但是不依赖于其顺序,而是等待相应事件的触发。

 

模块机制中,为什么定义在exports对象上的方法经过require后可以随意调用

因为,require方法实际调用的时原生模块中load方法,load方法在载入、编译、缓存了.js模块文件后,返回一个可用的exports对象。

.js文件模块,会在内部被包装成另一种形式(使得文件中每一个变量天然形成在一个闭包里面,不会污染全局变量),该形式会自动将require等作为实参传入,所以require无需定义在app.js中

 

require查找策略

1、是否在文件模块缓存中,是返回exports对象,否则进行第2步

2、是否为原生模块,否则进行第3步,是则检查是否在原生模块缓冲区;是则返回exports对象,否则加载原生模块,加入缓存并返回exports对象

3、查找文件模块,根据扩展名载入文件模块,缓存文件模块,返回exports对象

 

备注:

在第1步中,加入不在文件模块缓存中时,并且,不是原生模块(第2步),则需要查找文件模块(第3步),

首先,从当前文件目录开始查找,然后其次进入父目录,类似原类型链查找和作用域查找;

如果require路径是绝对路径文件,则速度最快,查找时绝对不会比遍历node_modules目录

 

匿名函数和闭包,与Nodejs事件驱动的异步编程之间的关系

示例:

我们在事件end中处理某个变量responseHTML时,由于闭包特性,我们可以在事件begin事件end中的两个回调函数之外定义该变量var responseHTML = '',再在事件begin中对应回调函数里不断地修改其值,并最终在事件end中访问处理console.log(responseHTML)

 1 var hostRequest = http.request(requestOptions, function_response(){
 2 
 3   var responseHTML = '';
 4 
 5   response.on('begin', function(chunk){
 6 
 7     responseHTML = responseHTML + chunk;
 8 
 9   });
10 
11   response.on('end', function(){
12 
13     console.log(responseHTML);
14 
15   });
16 
17 });

 

部署

本地的项目,需要把静态文件、node_modules等上传到服务器,当有http请求发送到服务器,通过index.js(app.js/server.js)进行处理。

备注:由于node_modules比较大,可以在服务器进行包管理,即通过npm下载相应第三方包,与本地的node环境一致。

 

 

 

 

posted @ 2018-07-03 17:32  hoanfir  阅读(207)  评论(0编辑  收藏  举报