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

什么是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.js
REPL环境

在命令行键入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属性。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值