Node.js 概述
Node.js 是一个能够在服务器端运行 JavaScript 的开放源代码、跨平台 JavaScript 运行环境。Node.js 由 Node.js 基金会持有和维护,并与 Linux 基金会有合作关系。Node.js 采用 Google 开发的 V8 运行代码,使用事件驱动、非阻塞和异步输入输出模型等技术来提高性能,可优化应用程序的传输量和规模。这些技术通常用于数据密集的即时应用程序。
这些名词很容易把人弄晕,我一个个浅显的解释一下.
传统的web客户端-服务器端的流程是,当浏览器给网站发了请求。服务器收到了请求然后开始搜寻被请求的资源。如果有需要,服务器还会查询一下数据库,最后把响应结果传回浏览器。
每一个请求都会让服务器创建一个新的进程来处理这个请求,返回全部的web内容并刷新,HTTP请求不是持续的连接,你请求一次,服务器响应一次,然后就完了。后来使用Ajax,每次只请求需要的部分页面信息就可以了,即让用户和服务器之间保持长轮询(long polling)。简单来说,当实时页面载入完毕,浏览器自动发送一个Ajax请求,要求服务器等待,实时页面更新时,如新添加了资讯消息等,服务器将当前页面动态更新的内容返回浏览器,浏览器刷新页面显示新页面,同时浏览器接着自动发送一个Ajax请求,在这个过程中,模拟出了持续连接的过程。
很显然,每个连接都得让服务器开一个新的进程,因为你要动态更新页面,就得一直保持连接,每开一个进程都消耗不小的内存,这并发量谁顶得住啊(又得吐槽一下学校的内网,每次选课直接就瘫了)。
这种情况怎么解决?解决方法就是刚才上边说的:非阻塞和事件驱动。
简单说一下阻塞与非阻塞。这些概念需要分层次理解,不同层的概念大相径庭。这里从并发的角度讲一讲,
阻塞:线程调用某个结果,结果返回之前,当前线程会被挂起(多个线程访问同一个资源,资源上锁了就排队)。调用线程只有在得到结果之后才会返回。
非阻塞:某个线程处理请求,在不能立刻得到结果之前,接着进行处理,结果返回时来个回调,告诉你处理完了,把结果响应回去。
事件驱动:服务器只在用户那边有事件发生的时候才响应,这就是事件驱动。业务逻辑上,你在网页上点了什么按钮,服务器响应相应的内容。
Node.js 大部分基本模块都用 JavaScript 语言编写。在 Node.js 出现之前,JavaScript 通常作为客户端程序设计语言使用,以 JavaScript 写出的程序常在用户的浏览器上运行。Node.js 的出现使 JavaScript 也能用于服务端编程。Node.js 含有一系列内置模块,使得程序可以脱离 Apache HTTP Server 或 IIS,作为独立服务器运行。
针对Node.js更具体的说
Node.js是一个 JavaScript 运行环境。javascript不仅仅可以在浏览器中的页面运行实现动态页面,它也可以运行在服务器端.
依赖于 Chrome V8 引擎进行代码解释。
事件驱动:在 Node 中,客户端请求建立连接,提交数据等行为,会触发相应的事件。在 Node 中,在一个时刻,只能执行一个事件回调函数,但是在执行一个事件回调函数的中途,可以转而处理其他事件,然后返回继续执行原事件的回调函数。
非阻塞 I/O:Node.js 中采用了非阻塞型 I/O 机制,在执行了访问数据库的代码之后,将立即转而执行其后面的代码,把数据库返回结果的处理代码放在回调函数中,从而提高了程序的执行效率。
Node.js是单线程:好处是减少内存开销,不用像多线程编程那样处处在意状态同步的问题。缺点是错误会引起整个应用退出。
NPM 介绍
NPM 是随同 Node.js 一起安装的包管理工具。因此当我们安装好 Node.js 的时候,也安装好了 NPM。NPM 是一个命令行工具,用于从 NPM Registry 中下载、安装 Node.js 程序,同时解决依赖问题
node只是一个运行环境,而在node上许多人发布了各式各样的包,包中的每一个js文件为一个模块,通过使用各式各样的模块,相当于使用类库编程
node.js中的全局变量
在 JavaScript 中全局对象通常是 window,而在 Node.js 中全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性,我们可以直接访问到 global 的属性。
全局变量
按照 ECMAScript 的定义,满足以下条 件的变量是全局变量:
-
在最外层定义的变量
-
全局对象的属性
-
隐式定义的变量(未定义直接赋值的变量)
注:当你定义一个全局变量的时候,这个变量同时也会成为全局对象的属性,反之亦然。在 Node.js 中你不可能在最外层定义变量,因为所有用户代码都是属于当前模块的,而模块本身不是最外层上下文。定义变量一定要使用 var 关键字,因为全局变量会污染命名空间。
node中的一些全局变量
1.__filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。如果在模块中,返回的值是模块文件的路径。
2.__dirname,表示当前执行脚本所在的目录。
node中的一些全局函数
1.setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb),只执行一次函数。
2.clearTimeout(t) 用于停止一个之前通过 setTimeout() 返回的对象。 参数 t 是通过 setTimeout() 函数创建的返回的对象。
3.setInterval(cb, ms) 与 setTimeout(cb, ms) 类似,不同的是这个方法会不停的执行函数。直到 clearInterval() 被调用或窗口被关闭,也可以按 Ctrl+C 停止。
4.console.log() 是个全局函数用于进行标准输出流的输出,即在控制台中显示一行字符串,和 JavaScript 中的使用一样。