---恢复内容开始---

一、环境搭建与简介             

安装node.js环境:

方式一:nvm安装

方式二:直接安装

 

具体步骤见Node.JS windows环境配置

 

 

二、简介  

Node.js是一个平台,可以让JavaScript运行在非浏览器环境。

特点:

1、单线程,

Node.js是就是同一时刻只能执行一个任务,有多个任务就要排队。

和单线程对应的多线程,同一时刻可以执行多个任务。

2、非阻塞I/O,

I/O操作就是访问文件,网络,数据库等耗费时间的操作。传统的单线程是阻塞I/O,必须等待操作执行完毕,才能继续执行后面的操作。

非阻塞I/O,I/O操作不会被等待。而是直接执行后面的操作。

 

      之所以Node.js能够实现非阻塞I/O,是因为Node上层虽然运行的是JavaScript,是单线程的,但是,Node.js的底层是可以开辟多线程的C/C++。因此,当Js线程遇到I/O操作时,就会将任务交给底层的C/C++去做。

       虽然C/C++可以开辟多线程,但是计算机是不允许无线开辟线程的,毕竟内存大小有限。它们会在内部维护一个线程池,里面有固定数量的线程。线程会重复利用。只有当线程的数量不能满足需求时,才会重新开辟。

 

3、事件驱动

底层代码完成任务之后,会通过“事件”通知JavaScript线程,JavaScript就会执行回调函数。以便完成后续的操作。

 

Node.js内部任务原理图:

 

 

虽然I/O操作,会交给底层的C/C++执行,但是和计算相关的代码,JavaScript还是会亲自执行。因此,大量的计算仍然可能导致JavaScript线程阻塞

 

Node.js适合做I/O密集型操作。如网站服务器实时通信

不适合做CPU密集型(计算量大)操作。如图像,视频处理,深度学习等。

 

三、全局变量  

 

      JavaScript的全局对象是Global,它不能直接使用。

      它在不同的平台有不同的代理者:

      浏览器:window

      Node.js:global

 

window和global的区别:

 

  1. 在浏览器中,如果全局变量或函数不属于任何一个对象,那么就属于window
  2. 在Node.js中,var声明的变量不会属于global对象,不用var声明的全局变量属于global对象的。全局函数也不属于global对象
  3. Node函数中的this仍然指向的是调用者。如果一个函数没有明确的调用者,就用global调用。全局范围内的this指向的是{}对象。

 

 

global对象的一些方法和对象:

 

global.console

global.setInterval();

global.setTimeout();

global.clearInterval();

global.clearTimeout();

它们在使用时,可以省略global.

 

除了global对象的属性/对象可以直接使用以外,还有两种直接使用的全局对象

 

  1. JavaScript语言自带的全局对象

如Math,Date…

  1. Node.js平台提供的全局对象。

module, __dirname,__filename,require();

 

 

四、events模块

 

该模块是Node.js的核心模块,只有一种对象:

   

EventEmitter

 

引入模块:

var events = require(“events”);

创建对象:

    var emitter = new events.EventEmiter()

 

设置监听:

    emitter.addListener(), on(),  once()

移除监听:

    emitter.removeListener(Event,callback);

    emitter.removeAllListeners(Event);

发射事件:

    emitter.emit(event,arg1,arg2…argN);

 

开发中,该模块不会被直接使用,通常是其它模块通过原型链继承EventEmitter对象的功能。

 

五、http模块搭建服务器

http.createServrer(callback)方法用于创建服务器对象。传入一个回调函数,该函数会在客户端发起http请求时触发。

callback:

function(request,response){

}

response

该参数是server.Response的实例。

这个对象可以用于向客户端发送响应。

 

res.writeHeader();  写入响应头信息

res.write();              写入响应体信息。

res.end()                结束本次请求

 

响应的内容中如果有中文,可能会导致乱码问题。

我们应该在请求头中告诉浏览器应该用什么格式去解析数据。

 

Buffer对象:

 

JavaScript擅长处理的是字符串,但是对于需要占据大空间的文件的处理,用字符串是不行的。

 

Buffer是Node从C++引进来的一种保存大容量数据的对象。因为Buffer对象的空间不会计算在Node程序中,因此可以用来存放大容量数据,如视频,音频,文件等。

 

单个Buffer在Node中最大空间不超过:2147483647字节(32位最大整形数)。

 

在处理可能会占据大空间的操作时,Node默认会把数据存放在Buffer中。

 

request

该参数是IncomingMessage对象的实例,

这个对象包含了本次请求的所有信息。我们可以从该对象中取出有用的部分,来决定应该如何响应此次请求。

 

url模块

      用来处理url字符串

 

fs模块

    用于操作文件

 

mime模块

  用于给文件设置mime类型

---恢复内容结束---

posted on 2017-09-11 22:21  YC小杨  阅读(137)  评论(0编辑  收藏  举报