簡介§ 1
CommonJS 定義 模組格式。很不幸地,它在定義時並沒有給予瀏覽器與其他 JavaScript 環境同等的基礎。因此,CommonJS 規範提出 傳輸格式 和 非同步 require 的提案。
RequireJS 嘗試遵循 CommonJS 的精神,使用字串名稱來參照依賴關係,並避免模組定義全域物件,但仍允許編寫在瀏覽器中原生運作良好的模組格式。RequireJS 實作 非同步模組定義(以前稱為 Transport/C)提案。
如果您有使用傳統 CommonJS 模組格式的模組,那麼您可以輕鬆地將其轉換為與 RequireJS 一起使用。並非所有模組都能順利轉換為新格式。可能無法順利轉換的模組類型
- 使用條件式程式碼來執行 require 呼叫的模組,例如 if(someCondition) require('a1') else require('a2');
- 某些類型的循環依賴關係。
手動轉換§ 2
如果您只有少數幾個模組要轉換,那麼您只需要使用以下程式碼將模組包裝起來
define(function(require, exports, module) {
//Put traditional CommonJS module content here
});
重要:函式參數應始終列為 require, exports, module,名稱和順序必須完全相同,否則將會造成混亂。您可以從清單中省略 exports 和 module,但如果需要,則需要按照此處說明的順序指定它們。
轉換工具§ 3
如果您有許多模組要轉換,r.js 專案 已在 r.js 檔案中內建轉換工具。提供您要轉換的目錄路徑和輸出目錄
node r.js -convert path/to/commonjs/modules/ path/to/output
少數 CommonJS 模組無法作為 define()-包裝的模組順利運作。請參閱 r.js README
以取得更多資訊。設定匯出的值§ 4
有些 CommonJS 系統(主要是 Node)允許透過將匯出的值指定為 module.exports 來設定匯出的值。RequireJS 支援此慣用語,但還有另一種更簡單的方式,只要傳回傳遞給 define 的函式的值即可
define(function (require) {
var foo = require('foo');
//Define this module as exporting a function
return function () {
foo.doSomething();
};
});
採用此方法後,通常不需要 exports 和 module 函式引數,因此可以從模組定義中省略它們。
替代語法§ 5
除了使用 require() 來取得傳遞給 define() 的函式中的相依性之外,您也可以透過傳遞相依性陣列引數給 define() 來指定相依性。相依性陣列中名稱的順序與傳遞給傳遞給 define() 的定義函式的引數順序相符。因此,上述使用模組 foo 的範例
define(['foo'], function (foo) {
return function () {
foo.doSomething();
};
});
請參閱 API 文件 以取得有關該語法的更多資訊。
從 CommonJS 套件載入模組§ 6
透過設定 RequireJS 組態以了解位置和套件屬性,RequireJS 可以載入 CommonJS 套件中的模組。請參閱 套件 API 區段 以取得更多資訊。