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环境一致。