書名:SMASHING Node.js : JavaScript Everywherejavascript
原做者:(美)勞奇 Rauch.Gcss
譯者:趙靜java
出版日期:2014.1node
在瀏覽器中,全局對象指的是window
對象。在window對象上定義的全部內容(屬性和函數)均可以被全局訪問到。es6
setTimeout === window.setTimeout document === window.document
Node中的2個全局對象:npm
Node內置了不少實用的模塊做爲基礎工具,包括http、net、fs等。api
Node摒棄了採用定義一堆全局變量的方式,轉而引入了一個簡單卻強大無比的模塊系統,該模塊系統有3個核心的全局對象:require
、module
和exports
。瀏覽器
絕對模塊是指Node經過在其內部node_modules查找到的模塊,或者Node內置的如fs這樣的模塊。異步
require('http'); require('fs');
直接經過名字來require這個模塊,無須添加路徑名的,就是絕對模塊。async
對於使用npm來安裝的模塊,例如安裝colors模塊,當安裝完畢後,其路徑就變成了./node_modules/colors
能夠直接經過名稱來require。
require('colors);
這種狀況也是絕對模塊。
相對模塊是將require指向一個相對工做目錄中的js文件。例如
require('./src/module_a'); require('./src/module_b');
在默認狀況下,每一個模塊都會暴露出一個空對象。能夠使用exports來暴露對象的屬性和函數。
// module_a.js exports.name = 'john'; exports.data = 'this is some data'; var privateVar = 5; exports.getPrivate = function(){ return privateVar; }
在main.js 中調用
var a = require('./src/module_a'); console.log(a.name); //john console.log(a.data); // this is some data console.log(a.getPrivate()); // 5
person.js
module.exports = Person; // 對module.exports重寫 function Person(name){ this.name = name; } Person.prototype.talk = function(){ console.log('my name is' , this.name); }
main.js
var Person = require('./src/person'); var John = new Person('John'); John.talk(); // my name is John
在Node中事件的監聽和分發使用EventEmit
,定義了on 、 emit、once等方法。
var EventEmitter = require('events'); var a = new EventEmitter(); a.on('event', function(){ console.log('event called.'); }); a.emit('event');
讓自定義的類也能夠使用事件監聽,須要繼承自EventEmitter。
修改person.js
module.exports = Person; function Person(name){ this.name = name; } const EventEmitter = require('events'); Person.prototype = new EventEmitter; Person.prototype.talk = function(){ console.log('my name is' , this.name); }
在main.js中調用
var Person = require('./src/person'); var John = new Person('John'); John.talk(); John.on('sleeping', function(){ console.log('sleeping called.') }); John.emit('sleeping');
const EventEmitter = require('events'); class MyEmitter extends EventEmitter {} const myEmitter = new MyEmitter(); myEmitter.on('event', () => { console.log('an event occurred!'); }); myEmitter.emit('event');
Node中使用fs模塊操做文件。
var fs = require('fs'); // 同步獲取當前目錄的文件列表 console.log(fs.readdirSync('.'));
var fs = require('fs'); // 異步的方式 function async(err, files){ console.log(files); } fs.readdir(__dirname, async);
process全局對象中包含了3個流對象,分別對應3個Unix標準流。
process.cwd(); // or __dirname
使用fs.watchFile 或fs.watch監視文件變化
var fs = require('fs'); function callBackFiles(err, files){ files.forEach(function(file){ // 監聽後綴是css的文件 if(/\.css/.test(file)){ fs.watchFile(process.cwd() + '/' + file, function(){ console.log(' - ' + file + ' changed!'); }); } }); } var files = fs.readdir(process.cwd(), callBackFiles);
當修改index.css文件並保存後,控制檯將輸出。