一个 Node.js 文件就是一个模块,这个文件多是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。html
模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。node
在 Node.js 模块库中几种经常使用模块的使用:web
序号 | 模块名 & 描述 |
---|---|
1 | OS 模块 提供基本的系统操做函数。 |
2 | Path 模块 提供了处理和转换文件路径的工具。 |
3 | Net 模块 用于底层的网络通讯。提供了服务端和客户端的的操做。 |
4 | DNS 模块 用于解析域名。 |
5 | Domain 模块 简化异步代码的异常处理,能够捕捉处理try catch没法捕捉的。 |
调用函数正则表达式
定义一个对外的world功能:定义一个对外的函数。api
// hello.js
exports.world = function() { // world() 成为 exports 对象的成员函数 console.log('Hello World'); }
在 main.js 中经过 require('./hello') 加载这个模块,而后就能够直接访 问 hello.js 中 exports 对象的成员函数了。数组
var hello = require('./hello'); // var hello 表明了一个模块,也就是./hello这个文件表明的东西 hello.world();
定义一个对外的counter功能:定义一个函数,以后再使其对外。浏览器
Use this api (counter) here.缓存
调用类网络
//main.js var Hello = require('./hello'); hello = new Hello();
hello.setName('BYVoid'); hello.sayHello();
模块定义方法:dom
//hello.js function Hello() { var name; this.setName = function(thyName) { name = thyName; }; this.sayHello = function() { console.log('Hello ' + name); }; };
module.exports= Hello;
(1) 其实也是开放多个对外函数的一个tricky方法:
(2) 以上较为麻烦。咱们用类包裹多个函数,而后再导出该类,这样岂不是会轻便些。
var http = require("http");
当文件模块缓存中不存在,
并且不是原生模块的时候,
Node.js 会解析 require 方法传入的参数,并从文件系统中加载实际的文件
1 | http、fs、path等 | 原生模块 |
2 | ./mod 或 ../mod | 相对路径的文件模块 |
3 | /pathtomodule/mod | 绝对路径的文件模块 |
4 | mod | 非原生模块的文件模块 |
在路径 Y 下执行 require(X) 语句执行顺序,参见连接。
两种写法,推荐后者。
function sayHI() { ... } var Bye = function ([args]) { ... }
这么用的意义在于什么?
将"作什么"和"谁去作"分离开来,也就是将‘不变的事物’和‘可变的事物’分离开来。
好比:有这么一个类,它是功能和参数的粘合剂!
function execute(someFunction, value) { someFunction(value); }
function say(word) {
console.log(word);
}
execute(say, "Hello");
或者,匿名函数方式,看起来简洁一些。
function execute(someFunction, value) { someFunction(value); } execute(function(word){ console.log(word) }, "Hello");
全局对象(Global Object),它及其全部属性均可以在程序的任何地方访问,即全局变量。
在 Node.js 咱们能够直接访问到 global 的属性,而不须要在应用中包含它。
global 最根本的做用是做为全局变量的宿主。按照 ECMAScript 的定义,知足如下条 件的变量是全局变量:
当你定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦然。
须要注意的是,在 Node.js 中你不可能在最外层定义变量,由于全部用户代码都是属于当前模块的, 而模块自己不是最外层上下文。
// 输出全局变量 __filename 的值
console.log( __filename );
--------------------------------------
// 输出全局变量 __dirname 的值
console.log( __dirname );
--------------------------------------
function printHello(){ console.log( "Hello, World!"); } // 两秒后执行以上函数 setTimeout(printHello, 2000);
--------------------------------------
function printHello(){ console.log( "Hello, World!"); } // 两秒后执行以上函数 var t = setTimeout(printHello, 2000); // 清除定时器 clearTimeout(t);
--------------------------------------
function printHello(){ console.log( "Hello, World!"); } // 两秒后执行以上函数 setInterval(printHello, 2000);
console 方法
console 用于提供控制台标准输出,它是由 Internet Explorer 的 JScript 引擎提供的调试工具,后来逐渐成为浏览器的实施标准。
Node.js 沿用了这个标准,提供与习惯行为一致的 console 对象,用于向标准输出流(stdout)或 标准错误流(stderr)输出字符。
console.log('byvoid%diovyb'); console.log('byvoid%diovyb', 1991); // 有%d就看有没有匹配的变量,有则“替换”,无则“失效”
console.error():与console.log() 用法相同,只是向标准错误流输出。
console.exception()
是 console.error() 的别名;它们功能相同。
console.trace(); Trace: at Object.<anonymous> (/home/byvoid/consoletrace.js:1:71) at Module._compile (module.js:441:26) at Object..js (module.js:459:10) at Module.load (module.js:348:31) at Function._load (module.js:308:12) at Array.0 (module.js:479:10) at EventEmitter._tickCallback (node.js:192:40)
console.info("程序开始执行:"); console.time("获取数据"); // 表示计时开始 console.timeEnd('获取数据'); // 表示计时结束 console.info("程序执行完毕。")
参见:[Node.js] 06 - Multi-thread and process module
util 是一个Node.js 核心模块,提供经常使用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足。
util.inherits(constructor, superConstructor)是一个实现 对象间原型继承 的函数。
JavaScript 的面向对象特性是基于原型的,与常见的基于类的不一样。JavaScript 没有 提供对象继承的语言级别特性,而是经过原型复制来实现的。
在这里咱们只介绍util.inherits 的用法,示例以下:
var util = require('util');
function Base() { this.name = 'base'; this.base = 1991; this.sayHello = function() { console.log('Hello ' + this.name); }; }
Base.prototype.showName = function() { console.log(this.name); };
function Sub() { this.name = 'sub'; }
util.inherits(Sub, Base); // 继承的实现:继承自Base的Sub
var objBase = new Base(); objBase.showName(); objBase.sayHello(); console.log(objBase);
var objSub = new Sub(); objSub.showName(); //objSub.sayHello(); console.log(objSub);
Jeff: 关于js的类的设计问题,须要专题讲解。
将任意对象转换 为字符串的方法,一般用于调试和错误输出。
var util = require('util');
function Person() { this.name = 'byvoid'; this.toString = function() { return this.name; }; } var obj = new Person();
console.log(util.inspect(obj)); console.log(util.inspect(obj, true));
Result:
Person { name: 'byvoid', toString: [Function] } Person { name: 'byvoid', toString: { [Function] [length]: 0, [name]: '', [arguments]: null, [caller]: null, [prototype]: { [constructor]: [Circular] } } }
若是给定的参数 "object" 是一个数组返回true,不然返回false。
var util = require('util'); util.isArray([]) // true util.isArray(new Array) // true util.isArray({}) // false
若是给定的参数 "object" 是一个正则表达式返回true,不然返回false。
var util = require('util'); util.isRegExp(/some regexp/) // true util.isRegExp(new RegExp('another regexp')) // true util.isRegExp({}) // false
若是给定的参数 "object" 是一个日期返回true,不然返回false。
var util = require('util'); util.isDate(new Date()) // true util.isDate(Date()) // false (without 'new' returns a String) util.isDate({}) // false
若是给定的参数 "object" 是一个错误对象返回true,不然返回false。
var util = require('util'); util.isError(new Error()) // true util.isError(new TypeError()) // true util.isError({ name: 'Error', message: 'an error occurred' }) // false