Node的模塊化

在客戶端,JavaScript運行在瀏覽器中。當咱們定義一個變量,它的做用域是全局的。好比咱們在文件app.js中定義一個sayHello函數,它的做用域是全局,能夠經過window對象來訪問。node

/* app.js文件 */
let sayHello = function() {
    console.log('hello');
}
window.sayHello();
複製代碼

但這樣會產生一個問題,那就是在真實的編程中,咱們常常會將不一樣的代碼放到不一樣的文件中去。若是這時在2個文件中都有定義了同名的sayHello函數,被自動添加到了window對象當中,而最新的定義會覆蓋先前的定義。形成全局做用域的污染。因此在創建可信和可維護的應用時應避免定義全局變量和函數。這時候就要用到模塊化,建立小型的拼裝塊或是模塊來存放變量和函數。 編程

這樣不一樣模塊之間的同名變量和函數不會互相覆蓋,它們都被封裝到模塊裏了。 node的核心概念就是模塊,每一個 node中的文件都被看作模塊,每一個模塊中定義的變量和函數做用域僅在模塊內。以面向對象的觀點咱們稱之爲私有成員,在容器外,也就是模塊外是不可見的。若是你要在模塊外使用一個定義在模塊中的變量或函數,外賣須要明確的導出它爲公開成員。

每一個node工程至少要包含一個文件或者說一個模塊,這裏的app.js就是這個項目的主模塊。瀏覽器

刪除文件中的代碼,而後把module對象打印出來看下。 bash

這是一個 JSON對象,它包含了鍵值對,好比 id,每一個模塊都有獨一無二的 idexports表示可使用它建立你的模塊,添加到這個對象的屬性能夠在外部訪問。 parent表示最早引用該模塊的模塊。 filename也就是這個模塊的物理位置。 loader表示這個模塊是否被加載。 children表示被該模塊引用的模塊對象。 paths表示模塊的搜索路徑。

因此在node中,每一個文件都是模塊,模塊中定義的成員做用域只在模塊中,它們在模塊外是不可見的。那咱們如何建立模塊並加載模塊呢?app

首先咱們建立一個logger.js的新文件,假設咱們爲記錄信息建立一個模塊,在不少的地方會複用到這個模塊。有可能也會在其它應用裏用到這個模塊。 模塊化

在模塊中咱們假設要使用一個遠程日誌服務來記錄咱們的日誌,有個其它的網站能夠提供日誌服務,它提供了一個 URL,能夠經過給它發送 HTTP請求來記錄日誌。

/* logger.js文件 */
let url = 'http://mylogger.io/log';
function log(message) {
  //發送http請求
  console.log(message);
}
//在exports對象中添加log方法,將這裏的log函數賦值給它
module.exports.log = log;
複製代碼

爲了保持模塊的簡單使用,原則就是公開最小限度的成員。在logger模塊中,這個url是實現細節,其它的模塊不須要了解它,它們只須要調用log函數就能夠了。讓log變爲公開,而保持url私有。好的,如今logger模塊已經作好了,接下來就是要到app.js中使用它。函數

app.js中的代碼都刪除,加載模塊須要用到require函數,這是node纔有的函數,瀏覽器是沒有的。這個函數須要一個參數,也就是咱們想加載的模塊名稱。學習

/* app.js文件 */
//引入模塊
let logger = require('./logger');
console.log(logger);
複製代碼

咱們獲得了一個對象,對象中有一個單一的函數 log,這樣就能夠在 app.js中調用這個函數了。

/* app.js文件 */
//引入模塊,可不寫後綴名,node會自動補全
let logger = require('./logger');
logger.log('hello node');
複製代碼

這就是 node中模塊的工做方式,定義一個模塊,導出一個或多個成員。爲了使用模塊,咱們使用 require函數進行導入。最佳實踐的是將導入的模塊保存在常量中。使用 const。避免意外的將 logger從新賦值。

const logger = require('./logger');
複製代碼

有時候咱們不想導出一個對象,只是想導出一個簡單的函數,如上所示同樣。導出對象是在有多個屬性或者方法時才用獲得,因此改造下logger.jsapp.js的代碼。網站

/* logger.js文件 */
let url = 'http://mylogger.io/log';
function log(message) {
  //發送http請求
  console.log(message);
}
module.exports = log;
複製代碼
/* app.js文件 */
let log = require('./logger');

log('hello node');
複製代碼

因此在你的模塊中,你能夠導出對象或者單一函數。如今對模塊的建立和引用加載有了一些印象,固然 node包含了不少有用和經常使用的模塊。這個在實際編程中都會用到,具體的能夠從 nodejs官網查看學習。
相關文章
相關標籤/搜索