Smashing Nodejs 讀書筆記(二)

了不得的Node.js:將JavaScript進行到底

書名:SMASHING Node.js : JavaScript Everywherejavascript

原做者:(美)勞奇 Rauch.Gcss

譯者:趙靜java

出版日期:2014.1node

Node中的JavaScript

1. global對象

在瀏覽器中,全局對象指的是window對象。在window對象上定義的全部內容(屬性和函數)均可以被全局訪問到。es6

setTimeout  === window.setTimeout
document  === window.document

Node中的2個全局對象:npm

  • global--相似window對象,global對象上的屬性均可以被全局訪問到
  • process-全部全局執行上下文中的內容都在preocess對象中。

2. 模塊系統

Node內置了不少實用的模塊做爲基礎工具,包括http、net、fs等。api

Node摒棄了採用定義一堆全局變量的方式,轉而引入了一個簡單卻強大無比的模塊系統,該模塊系統有3個核心的全局對象:requiremoduleexports瀏覽器

絕對模塊

絕對模塊是指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');

暴露API

暴露一個對象

在默認狀況下,每一個模塊都會暴露出一個空對象。能夠使用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等方法。

使用EventEmitter

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');

ES6繼承方式

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('an event occurred!');
});
myEmitter.emit('event');

3. 文件系統

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標準流。

  • stdin 標準輸入
  • stdout 標準輸出
  • stderr 標準錯誤

當前工做路徑

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文件並保存後,控制檯將輸出。

相關文章
相關標籤/搜索