1.1.1 nodejs简介
node是JavaScript语言的服务器运行环境。
所谓的‘运行环境’有两层意思:首先,JavaScript语言通过node在服务器上运行,在这个意义上,Node有点像JavaScript虚拟机;其次,Node提供大量工具库,使得JavaScript语言与操作系统互动(比如读写文件、新建子进程),在这个意义上,Node又是JavaScript的工具库。
Node内部采用Google公司的V8引擎,作为JavaScript语言解释器;通过自行开发的libuv库,调用操作系统资源。
1.1.2 安装与更新
nodejs官方网站 安装自行 google
安装完成以后,运行下面的命令,查看是否能正常运行:
$ node --version
# 或者
$ node -v
更新node.js版本,Linux和Mac可以通过node.js的 n模块(当然鼎鼎大名的 nvm 也很强)完成。
$ npm install -g n
$ n stable
上面代码通过n模块,将node.js更新为最新发布的稳定版。
window用户可以使用 nvm-window 来做版本管理。(使用起来很不方便故不做介绍)
1.1.3 基本用法
安装完成后,运行nodejs程序,就是使用node命令读取JavaScript脚本。
当前目录的demo.js脚本文件,可以这样执行。
$ node demo
#或者
$ node demo.js
1.1.4 异步操作
Node采用V8引擎处理JavaScript脚本,最大特点就是单线程运行,一次只能运行一个任务。这导致Node中大量采用异步操作(asynchronous opertion),即任务不是马上执行,而是插在任务队列的尾部,等到前面的任务运行完后再执行。
由于这种特性,某一个任务的后续操作,往往采用回调函数(callback)的形式进行定义。
var isTrue = function(value, callback) {
if(value === true) {
callback(null, 'Value was true');
}else {
callback(new Error('Value is not true!'));
}
}
上面代码就把进一步的处理,交给回调函数callback。
Node约定,如果某个函数需要回调函数作为参数,则回调函数是最后一个参数。另外,回调函数本身的第一个参数,约定为上一步传入的错误对象。就像下面这样:
var callback = function(error, value) {
if(error) {
return console.log(error);
}
console.log(value);
}
1.1.5 全局对象和全局变量
node提供以下几个全局对象,他们是所有模块都可以调用的。
- global: 表示node所在的全局环境,类似于浏览器的window对象。需要注意的是,在浏览器中声明一个全局变量,实际上是声明了一个window对象的属性:
var a = 1;,等同于window.a = 1;。而在node环境中并不是这样的,模块的全局变量都是该模块私有的。 - process: 该对象表示node所处的当前进程,允许开发者于该进程进行互动。
- console: 指向node内置的console模块,提供命令行环境中的标准输入、标准输出功能。
node还提供你了一些全局函数:
- setTimeout(): 用于在指定毫秒之后,运行回调函数。
- clearTimeout(): 用于终止一个setTimeout方法创建的定时器。
- setInterval(): 用于每隔一定毫秒调用回调函数。
- clearInterval(): 终止一个用setInterval方法创建的定时器。
- require(): 用于加载模块。
- Buffer(): 用于操作二进制数据。
node提供两个全局变量,都以下划线开头
- _filename: 指向当前运行的脚本的文件名。
- _dirname: 指向当前运行的脚本所在的目录。
1.1.6 模块化结构
nodejs采用模块化结构,按照CommonJS定义和使用模块。模块于文件是一一对应的关系,即加载一个模块,实际上就是加载对应的一个模块文件。
require命令用于指定加载模块,加载时可以省略脚本文件的后缀名。
var http = require('http');
var circle = require('./circle.js');
require方法的参数是模块文件的名字。它分成两种情况:第一种情况是参数中含有文件路径,这时路径是相对于当前脚本所在的目录,第二种情况是参数中不含有文件路径,这时Node会到模块的安装目录寻找已安装的模块。
核心模块: nodejs的用处在于,它本身还提供了一系列功能模块,与操作系统互动。这些核心的功能模块,不用安装就可以使用。
- http: 提供http服务器功能。
- url: 解析url。
- fs: 于文件系统交互。
- querystring: 解析url的查询字符串。
- child_process: 新建子进程。
- util: 提供一系列实用小工具。
- path: 处理文件路径。
- crypto: 提供加密和解密功能,基本上是对OpenSSL的包装。
核心模块总是有限加载的,如果你自己写了一个http模块,require('http')加载的还是核心模块。
1.1.7 异常处理
node是单线程运行环境,一旦抛出的异常没有被捕获,就会引起整个进程的崩溃。所以,node的异常处理对于保证系统的稳定运行非常重要。
一般来说,node有三种方法,传播一个错误:
- 使用throw语句抛出一个错误对象。
- 将错误对象传递给回调函数,由回调函数负责抛出错误。
- 通过EventEmitter接口,发出一个error事件。