global
JS在浏览器中的全局对象是window
对象。在Node.js环境中,全局对象则叫global
。我们可以用它来区分当前JavaScript的执行环境:
if(typeof(window)==='undefined'){
console.log('node.js');
}else{
console.log('browser');
}
process
process
是Node.js提供的一个对象,它代表当前Node.js的进程。
JavaScript程序是由事件驱动执行的单线程模型,Node.js也不例外。Node.js不断执行响应事件的JavaScript函数,直到没有任何响应事件的函数可以执行,Node就退出了。
nextTick方法
此方法可以在下一次事件响应中执行代码。
fs模块
fs模块是Node.js的内置模块,是负责处理读写文件的。它同时提供了异步和同步方法。
异步和同步
异步是在JS执行IO操作时,无需等待执行结果,而是传入回调函数后,继续执行下面的代码,以jQuery的getJSON()
为例:
$.getJSON('http://example.com/ajax',function(data){
console.log('IO结果返回后执行……');
});
console.log('不等待IO结果直接执行后续代码‘);
而同步则是线形的,需要等待IO操作返回结果后,再执行后续代码:var data=getJSONSync('http://example.com/ajax');
同步代码更少,但是异步在实际的用户体验更好。
异步读文件
以下是一个异步读取文本文件的实例:
‘use strict';
var fs=require('fs');
fs.readFile('sample.txt','utf-8',function(err,data){
if(err){
console.log(err);
}else{
console.log(data)
}
})
要注意的是,sample.txt
必须在当前的目录之下,且文件的编码格式为utf-8。
如果我们要读取的是二进制文件呢?下面是一个读取图片的例子:
'use strict';
var fs = require('fs');
fs.readFile('sample.png', function (err, data) {
if (err) {
console.log(err);
} else {
console.log(data);
console.log(data.length + ' bytes');
}
});
当读取二进制文件时,不传入文件编码(如utf-8)时,data会返回一个Buffer
对象。
这里提一下Buffer
对象,它是Node处理二进制数据的一个接口,也是Node原生的全局对象,可以直接使用,不需要require(‘buffer’)
。它的作用类似于数组。
同步读文件
同步读文件相比异步读文件,只是在readFile
上加了一个sync
,看下面的例子:
'use strict'
var fs=require('fs');
try{
var data=fs.readFileSync('sample.txt','utf-8');
console.log(data);
}
catch(err){
//错误信息
}
如果发生错误,只能通过try...catch
捕获。
写文件
通过fs.writeFile()
实现。
'use strict'
var fs=require('fs');
var data='Hello Node.js!';
fs.writeFile('output.txt',data,function(err){
if(err){
console.log(err);
}else{
console.log('ok');
}
});
和读文件相同,writeFile()
也有一个同步方法writeFileSync()
。
'use strict';
var fs=require('fs');
var data='hello Node.js';
fs.writeFileSync('output.txtx',data);
stat
可以通过fs.stat()
获取文件大小、创建时间等信息。它会返回一个stat对象,告诉我们文件的详细信息。
'use strict';
var fs=require('fs');
fs.stat('sample.txt',function(err,stat){
if(err){
console.log(err);
}else{
// 是否是文件:
console.log('isFile: ' + stat.isFile());
// 是否是目录:
console.log('isDirectory: ' + stat.isDirectory());
if (stat.isFile()) {
// 文件大小:
console.log('size: ' + stat.size);
// 创建时间, Date对象:
console.log('birth time: ' + stat.birthtime);
// 修改时间, Date对象:
console.log('modified time: ' + stat.mtime);
}
}
});
同样,它也有一个同步函数statSync()
。
'use strict';
var fs=require('fs');
var stats=fs.statSync('sample.txt');
console.log(stats.isFile()); //true