CommonJS對模塊的定義十分簡單,主要分為模塊引用、模塊定義和模塊標識三個部分。
## 1.模塊引用
模塊引用的示例代碼如下:
~~~
const math = require('math');
~~~
在CommonJS規范中,存在 require()方法,這個方法接受模塊標識符,以此引入一個模塊的API到當前上下文中。
## 2.模塊定義
在模塊中,上下文提供require()方法來引入外部模塊。對應引入的功能,上下文提供了exports 對象用于導出當前模塊的方法或者變量,并且它是唯一導出的入口。在模塊中,還存在一個module對象,它代表模塊自身,而exports是module的屬性。在Node中,一個文件就是一個模塊,將方法掛載在exports對象上作為屬性即可定義導出的方式:
~~~
//math.js
exports.add = function(){
let sum = 0,
i=0,
args = arguments,
l = args.length;
while(i<l){
sum += args[i++];
}
return sum;
};
~~~
在另一個文件中,我們通過require()方法引入模塊后,就能調用定義的屬性或者方法了:
~~~
"use strict";
//program.js
const math = require('./math');
console.log(math.add(1,2));
exports.increment = (val)=>{
return math.add(val, 1);
};
~~~
## 3.模塊標識
模塊標識其實就是傳遞給require()方法的參數,它必須是符合小駝峰命名的字符串,或者以.、..開頭的相對路徑、絕對路徑。可以沒有文件名后綴 .js 。
模塊的定義非常簡單,接口也十分簡潔。它的意義在于將類聚的方法和變量等限定在私有的作用域中,同時支持引入和導出功能以順暢的連接上下游的依賴。每個模塊都有獨立的空間,它們互不打擾,在引用時也顯得干凈利落,如圖:

CommonJS構建的這套模塊導出和引入機制使得用戶完全不必考慮變量污染,命名空間等方案與之相比相形見絀。
- 目錄
- 第1章 Node 簡介
- 1.1 Node 的誕生歷程
- 1.2 Node 的命名與起源
- 1.2.1 為什么是 JavaScript
- 1.2.2 為什么叫 Node
- 1.3 Node給JavaScript帶來的意義
- 1.4 Node 的特點
- 1.4.1 異步 I/O
- 1.4.2 事件與回調函數
- 1.4.3 單線程
- 1.4.4 跨平臺
- 1.5 Node 的應用場景
- 1.5.1 I/O 密集型
- 1.5.2 是否不擅長CPU密集型業務
- 1.5.3 與遺留系統和平共處
- 1.5.4 分布式應用
- 1.6 Node 的使用者
- 1.7 參考資源
- 第2章 模塊機制
- 2.1 CommonJS 規范
- 2.1.1 CommonJS 的出發點
- 2.1.2 CommonJS 的模塊規范
- 2.2 Node 的模塊實現
- 2.2.1 優先從緩存加載
- 2.2.2 路徑分析和文件定位
- 2.2.3 模塊編譯
- 2.3 核心模塊
- 2.3.1 JavaScript核心模塊的編譯過程
- 2.3.2 C/C++核心模塊的編譯過程
- 2.3.3 核心模塊的引入流程
- 2.3.4 編寫核心模塊
- 2.4 C/C++擴展模塊
- 2.4.1 前提條件
- 2.4.2 C/C++擴展模塊的編寫
- 2.4.3 C/C++擴展模塊的編譯
- 2.4.2 C/C++擴展模塊的加載
- 2.5 模塊調用棧
- 2.6 包與NPM
- 2.6.1 包結構
- 2.6.2 包描述文件與NPM
- 2.6.3 NPM常用功能
- 2.6.4 局域NPM
- 2.6.5 NPM潛在問題
- 2.7 前后端共用模塊
- 2.7.1 模塊的側重點
- 2.7.2 AMD規范
- 2.7.3 CMD規范
- 2.7.4 兼容多種模塊規范
- 2.8 總結
- 2.9 參考資源
- 第3章 異步I/O
- 3.1 為什么要異步I/O
- 3.1.1 用戶體驗
- 3.1.2 資源分配
- 3.2 異步I/O實現現狀
- 3.2.1 異步I/O與非阻塞I/O
- 3.2.2 理想的非阻塞異步I/O
- 3.2.3 現實的異步I/O
- 3.3 Node的異步I/O
- 3.3.1 事件循環
- 3.3.2 觀察者
- 3.3.3 請求對象
- 3.3.4 執行回調
- 3.3.5 小結
- 3.4 非I/O的異步API
- 3.4.1 定時器
- 3.5 事件驅動與高性能服務器