// File Name: hello.js
function greet() {/*......*/}
// 有下面这两种写法:
// 1.
module.exports = greet;
// 2.
module.exports = {
greet:greet
}它们的调用方式是不一样的
第一种是这样调用:
var greet = require('./hello');
greet(s);第二种是这样调用:
var hello = require('./hello');
hello.greet(s);总结:第二种更好。
var module = {
id: 'hello',
exports: {}
};
//load()函数最终返回module.exports:
var load = function (exports, module) {
// hello.js的文件内容
...
// load函数返回:
return module.exports;
};
var exported = load(module.exports, module);这个可以改变原始exports对象:
exports.foo = function () { return 'foo'; };而
exports = function () { return 'foo'; };只是改变了形参exports的引用(/指向),而实际的module.exports还是指向空对象{}
process.nextTick方法可以在当前"执行栈"的尾部----下一次Event Loop(主线程读取"任务队列")之前----触发回调函数。
setImmediate方法则是在当前"任务队列"的头部添加事件,也就是说,它指定的任务总是在下一次Event Loop时执行,这与setTimeout(fn, 0)很像。
'use strict';
var fs = require('fs');
// ======test1======
// fs.readFile('sample.txt', 'utf-8', function (err, data) {
// if (err) {
// console.log(err, data);
// } else {
// console.log(err, data);
// }
// });
// ======test1 end======
// ======test2======
fs.readFile('sample.png', function (err, data) {
if (err) {
console.log(err);
} else {
// ======test2.1======
// console.log(data);
// console.log(data.length + ' bytes');
// var text = data.toString('utf-8');
// console.log(text);
// console.log(text.length + ' bytes');
// ======test2.1 end======
// ======test2.2======
fs.writeFile('output.png', data, function (err) {
if (err) {
console.log(err);
} else {
console.log('ok.');
}
});
// ======test2.2 end======
}
});
// ======test2 end======'use strict';
var fs = require('fs');
// ===test1===
// 打开一个流:
// var rs = fs.createReadStream('sample.txt', 'utf-8');
// rs.on('data', function (chunk) {
// console.log('DATA:')
// console.log(chunk);
// });
// rs.on('end', function () {
// console.log('END');
// });
// rs.on('error', function (err) {
// console.log('ERROR: ' + err);
// });
// ===test1 end===
// ===test2===
var ws1 = fs.createWriteStream('output1.txt', 'utf-8');
ws1.write('使用Stream写入文本数据...\n');
ws1.write('END.');
ws1.end();
var ws2 = fs.createWriteStream('output2.txt');
ws2.write(new Buffer('使用Stream写入二进制数据...\n', 'utf-8'));
ws2.write(new Buffer('END.', 'utf-8'));
ws2.end();
// ===test2 end==='use strict';
var fs = require('fs');
var rs = fs.createReadStream('sample.txt');
var ws = fs.createWriteStream('copied.txt');
rs.pipe(ws);Node提供以下几个全局对象,它们是所有模块都可以调用的。
Node还提供一些全局函数。
Node提供两个全局变量,都以两个下划线开头。
除此之外,还有一些对象实际上是模块内部的局部变量,指向的对象根据模块不同而不同,但是所有模块都适用,可以看作是伪全局变量,主要为module, module.exports, exports等。
https://github.com/nodejs/node/blob/v1.x/lib/events.js#L244
源码第244行:
EventEmitter.prototype.on = EventEmitter.prototype.addListener;