Node JS基础
进程和线程
进程:进程负责为程序的运行提供必备的环境。进程相当于工厂中的车间。
线程:线程是计算机中最小的计算单位。线程负责执行保存到进程中的程序。相当于工厂中的工人。
浏览器中的JS都是单线程的。
Node JS简介
Node JS是一种能够在服务器端运行JavaScript的开放源代码,跨平台的JavaScript运行环境。
Node采用的是Google开发的V8引擎运行JS代码。使用事件驱动,非阻塞和异步IO等技术来提高性能。可优化应用程序的传输量和规模。
Node服务器是单线程的,处理的请求也是单线程的,但是后台拥有一个I/O线程池。
CommonJS规范
ECMAScript的缺陷:
- 没有模块系统
- 标准库较少
- 没有标准接口
- 缺乏管理系统
模块化
如果程序设计的规模达到了一定的程度,则必须对其进行模块化。
模块化可以有多种形式,但至少能够将代码分为多个源文件的机制。
CommonJS的模块功能可以帮我们解决该问题。
CommonJS的提出主要是解决当前JavaScript没有标准的缺陷。CommonJS指定了一个美好的愿景,希望JS能在任何地方运行。
CommonJS对模块的定义十分简单:
- 模块引用
- 模块定义
- 模块标识
在Node中一个js文件就是一个模块。
模块化的好处:
- 降低耦合度
- 方便代码复用
在Node中通过require函数引入外部的模块。
使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块。
在Node中每一个JS文件的JS代码都是独立运行在函数中,而不是全局作用域。所以一个模块中的函数和变量在其它模块中无法访问。也就是说每个模块对于其它模块都是封闭的。
不要往全局作用域中写东西,因为那会污染全局命名空间。
模块标识
我们使用require引入外部模块时使用的就是模块标识。可以通过模块标识找到指定的模块。
模块分为两大类:
- 核心模块:Node引擎提供的模块。核心模块的标识就是模块的名字。
- 文件模块:由用户自己创建的模块。模块标识就是文件的路径,可以是绝对路径也可以是相对路径。
在node中有一个全局对象global,它的作用和网页中的window类似。
在全局中创建的变量都会作为global的属性保存。
在全局中创建的函数都会作为global的方法保存。
Node执行模块中的代码时,它会首先在代码的最顶部添加如下代码:
function(exports, require, module, _filename, _dirname) {
在代码的最底部添加如下代码
}
实际上模块中的代码都是包装在一个函数中执行的。在函数执行时,传入了五个实参。
exports:用于将内部变量函数暴露到外部。
require:函数用于引入外部的模块。
module:代表当前模块本身。exports是module的属性。
_filename:当前模块的完整路径的名字。
_dirname:当前模块所在文件夹的完整路径。