簡介§ 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 區段 以取得更多資訊。

最佳化工具§ 7

RequireJS 有一個最佳化工具,可以將模組定義組合成最佳化的套件,以供瀏覽器傳送。它以命令列工具的形式運作,您可以將它用於程式碼部署的一部分。請參閱 最佳化文件 以取得更多資訊。