简介
nodejs是一个js解析器,类似Python,可以直接运行js文件或者在交互命令中运行js代码,安装好了nodejs之后只要运行node.exe就能进入交互式环境
模块
require,require类似Python里面的import,用于将一个模块导入到当前模块,但是require的使用形式类似函数,使用如下:
main.js
//这一行代码引入相同路径下的tt.js作为一个模块,赋值给变量a
var a=required('./tt');
a.helllo();//输出hello
console.log(a==a.ex);//输出true
tt.js
//exports对象是一个模块的导出对象,上面main.js里面的
exports.hello=function(){
console.log('hello');
}
exports.ex=function(){
return exports;
}
module,module对象可以在本模块内部访问到,里面包含模块的一些信息,可以通过设置module模块来设置这些信息,例如替换模块的exports:
module对象实例
Module {
id: 'D:\\workspace\\softwares\\node\\hello.js',
exports: { hello: [Function], md: [Circular] },
parent:
Module {
id: '<repl>',
exports: {},
parent: undefined,
filename: null,
loaded: false,
children: [ [Circular] ],
paths:
[ 'D:\\workspace\\softwares\\node\\repl\\node_modules',
'D:\\workspace\\softwares\\node\\node_modules',
'D:\\workspace\\softwares\\node_modules',
'D:\\workspace\\node_modules',
'D:\\node_modules',
'C:\\Users\\Administrator\\.node_modules',
'C:\\Users\\Administrator\\.node_libraries',
'D:\\workspace\\softwares\\lib\\node' ] },
filename: 'D:\\workspace\\softwares\\node\\hello.js',
loaded: true,
children: [],
paths:
[ 'D:\\workspace\\softwares\\node\\node_modules',
'D:\\workspace\\softwares\\node_modules',
'D:\\workspace\\node_modules',
'D:\\node_modules' ] }
NODE_PATH环境变量,可以通过指定NODE_PATH环境编辑指定包加载的路径,类似CLASSPATH环境变量。
包和入口模块,通常会将一个文件夹称为一个包,并且使用包来管理模块,为每一个包设置一个入口模块,在入口模块里面返回包里的所有模块:
模块1
exports.create=function(){
return exports;
}
模块2
exports.create=function(){
return exports;
}
入口模块
var m1=require('./m1');
var m2=require('./m2');
var name='module name';
exports.create=function(){
return{
name:name,
m1:m1.create(),
m2:m2.create()
}
}
需要使用的时候只用使用main模块的create方法获取所有模块的引用就可以了
index.js ,当文件名为index.js的时候require不用写模块名,下面两条语句等价
var c= require('/home/user/lib/cat');
var c= require('/home/user/lib/cat/index');
package.json,package.json是定义当前路径的模块路径的配置文件,假如在/path/package.json
里面写了这样的代码:
package.json
{
"name":"path",
"main":"./lib/main.js"
}
那么`require(‘path’)就会导入path/lib/main.js这个文件,package.json字段全解
node.js可以使用read/writeFileSync(path)读取文件或写文件,这样会将整个文件都放到内存中间去,node.js使用createRead/WriteStream(path)创建文件的读写流。
读取的内容可以使用toString()方法转换成字符串。
node.js和java一样,使用引用控制实例,两个引用指向同一个实例的时候修改会同时应用到两个实例。
事件回调机制
nodejs使用events模块实现事件回调,即为某一个事件绑定一个handler函数,手动触发事件调用事件处理函数。实现的功能很像c#里面的时间委托。
//导入模块
var events=require("events");
//建立时间发射器
var eventEmitter=new events.EventEmitter();
//声明事件处理函数
var eventHandler=function(){
console.log("test");
}
//绑定处理函数
eventEmitter.on('test',eventHandler);
//可以绑定多个处理函数
eventEmitter.on('test',function(){
console.log('tet');
});
//触发事件
eventEmitter.emit('test');
利用events实现任务定时调度
//导入模块
var events=require("events");
//建立时间发射器
var eventEmitter=new events.EventEmitter();
//声明事件处理函数
var eventHandler=function(){
console.log("test");
}
//绑定处理函数
eventEmitter.on('test',eventHandler);
//可以绑定多个处理函数
eventEmitter.on('test',function(){
console.log('tet');
});
//1000秒触发事件
function run(){
setTimeout(function(){
eventEmitter.emit('test');
run();
},1000);
}
run();
路径解析
nodejs的路径解析模式不是总是在当前目录搜索,当前目录搜索不到的话会一直向上搜索,如在/dir1/dir2/test.js
里面使用如下代码require('module')
,则搜索路径依次是:
/dir1/dir2/node_modules/module
/dir1/node_modules/module
/node_modules/module
也就是只要上层目录里面有node_modules目录里面有这个模块就行