您的位置:首页 > Web前端 > Node.js

Node.js学习笔记(1、简介)

2014-01-29 14:27 211 查看

什么是Node.js

Node.js是JavaScript在服务器端的一个运行环境,也是一个工具库,用来与服务器端其他软件互动。

(1)安装与更新

访问官方网站nodejs.org了解安装细节。安装完成以后,运行下面的命令,查看是否能正常运行。node --version更新node.js版本,可以使用下面的命令。
sudo npm install n -g
sudo n stable
(2)运行脚本程序
运行node.js程序,就是使用node命令读取JavaScript脚本。

node file.jsREPL环境
在命令行键入node命令,后面没有文件名,就进入一个Node.js的REPL环境(Read–eval–print loop,"读取-求值-输出"循环),可以直接运行各种JavaScript命令。node
> 1+1
2如果使用参数 --use_strict,则REPL将在严格模式下运行。
node --use_strict


这个REPL是Node.js与用户互动的shell,各种基本的shell功能都可以在里面使用,比如使用上下方向键遍历曾经使用过的命令。特殊变量下划线(_)表示上一个命令的返回结果。
> 1+1
2
> _+1
3


在REPL中,如果运行一个表达式,会直接在命令行返回结果,如果运行一条语句则不会,因为它没有返回值。
> x = 1
1
> var x = 1


上面代码的第二条命令,没有显示任何结果。因为这是一条语句,不是表达式,所以没有返回值。

异步操作

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。约定俗成,callback的位置总是最后一个参数。值得注意的是,callback的格式也有约定。
var callback = function (error, value) {
if (error) {
return console.log(error);
}
console.log(value);
}


callback的第一个参数是一个Error对象,第二个参数才是真正的数据。如果没有发生错误,第一个参数就传入null。这种写法有一个很大的好处,就是说只要判断回调函数的第一个参数,就知道有没有出错,如果不是null,就肯定出错了。

全局对象

Node提供以下一些全局对象,它们是所有模块都可以调用的。

global:表示Node所在的全局环境,类似于浏览器中的window对象。

process:指向Node内置的process模块,允许开发者与当前进程互动。

console:指向Node内置的console模块,提供命令行环境中的标准输入、标准输出功能。

定时器函数:共有4个,分别是setTimeout(), clearTimeout(), setInterval(), clearInterval()。

require:用于加载模块。

_filename:指向当前运行的脚本文件名。

_dirname:指向当前运行的脚本所在的目录。

除此之外,还有一些对象实际上是模块内部的局部变量,指向的对象根据模块不同而不同,但是所有模块都适用,可以看作是伪全局变量,主要为module, module.exports, exports等。

模块化结构

Node.js采用模块化结构,按照CommonJS规范定义和使用模块。

require方法用于指定加载模块。var http = require('http');
var express = require('express');
var routes = require('./app/routes');

上面代码分别用require方法加载了三个模块。如果require方法的参数只是一个模块名,不带有路径,则表示该模块为核心模块或全局模块。比如,上面代码中的http为node.js自带的核心模块,express为npm命令安装的全局模块。如果require方法的参数带有路径,则表示该模块为项目自带的本地模块,必须告诉require该模块的路径,比如上面代码的routes模块的位置在项目的app子目录下。
加载模块以后,就可以调用模块中定义的方法了。

核心模块

Node.js自带一系列的核心模块,下面就是其中的一部分:

http:提供HTTP服务器功能。
url:解析URL。
fs:与文件系统交互。
querystring:解析URL的查询字符串。
child_process:新建子进程。
util:提供一系列实用小工具。
path:处理文件路径。
crypto:提供加密和解密功能,基本上是对OpenSSL的包装。
除了使用核心模块,还可以使用第三方模块,以及自定义模块。

自定义模块

Node.js模块采用CommonJS规范。只要符合这个规范,就可以自定义模块。

下面是一个最简单的模块,假定新建一个foo.js文件,写入以下内容。// foo.js

module.exports = function(x) {
console.log(x);
};

上面代码就是一个模块,它通过module.exports变量,对外输出一个方法。这个模块的使用方法如下。
// index.js

var m = require('./foo');

m("这是自定义模块");


上面代码通过require命令加载模块文件foo.js(后缀名省略),将模块的对外接口输出到变量m,然后调用m。这时,在命令行下运行index.js,屏幕上就会输出“这是自定义模块”。
node index
# 这是自定义模块


module变量是整个模块文件的顶层变量,它的exports属性就是模块向外输出的接口。如果直接输出一个函数(就像上面的foo.js),那么调用模块就是调用一个函数。但是,模块也可以输出一个对象。下面对foo.js进行改写。
// foo.js

var out = new Object();

function p(string) {
console.log(string);
}

out.print = p;

module.exports = out;


上面的代码表示模块输出out对象,该对象有一个print属性,指向一个函数。下面是这个模块的使用方法。
// index.js

var m = require('./foo');

m.print("这是自定义模块");


上面代码表示,由于具体的方法定义在模块的print属性上,所以必须显式调用print属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: