在客戶端,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
,每一個模塊都有獨一無二的
id
。
exports
表示可使用它建立你的模塊,添加到這個對象的屬性能夠在外部訪問。
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.js
和app.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
官網查看學習。