2012-01-04 74 views
6

我是RequireJS noob。當我使用「require.config」並且包含一個名稱不同於jQuery的jQuery路徑時,結果與預期不符。在RequireJS中 - 不能在路徑中別名jQuery名稱

這裏有一個非常簡單的例子來幫助解釋我的問題。文件

結構

root 
├── Index.htm 
└── scripts 
    ├── libs 
    │   ├── jquery-1.7.1.js 
    │   └── require.js 
    ├── main.js 
    └── someModule.js 

的index.htm

<html> 
<head> 
    <title>BackboneJS Modular app with RequireJS</title> 
    <script data-main="scripts/main" src="scripts/libs/require.js"></script> 
</head> 
<body> 
    <h3>BackboneJS is awesome</h3> 
</body> 
</html> 

這裏腳本標記引用需要腳本/庫。當require運行時,腳本目錄中名爲main.js的JavaScript文件應該被執行。只要

main.js

require.config({ 
    "paths": { 
      "mod1": "someModule" 
    } 
}); 
require(["mod1"], function (sm) { 
    console.log(sm.someValue); 
}); 

在我的經驗,「MOD1」可以是任何東西,因爲它是引用在require.config路徑和需要方法相同。

someModule.js

define([], function() { 
    console.log(); 
    return { someValue: "abcd" }; 
}); 

只是爲了完整性我包括someModule.js

,當我有JQuery的發生感知世態炎涼。

在下面的main.js中,我將jQuery添加到了config和require方法中。

Main.js

require.config({ 
    "paths": { 
     "jquery": "libs/jquery-1.7.1" 
     ,"mod1": "someModule" 
    } 
}); 

require(["mod1", "jquery"], function (sm, $) { 
    console.log(sm.someValue); 
    console.log($); 
}); 

通過附加jQuery的一切似乎仍然有效。 「console.log($)」寫入jQuery函數。

現在踢球。在下面的代碼我改「jQuery的」到「jqueryA」在這兩個路徑,並要求

require.config({ 
    "paths": { 
     "jqueryA": "libs/jquery-1.7.1" 
     ,"mod1": "someModule" 
    } 
}); 

require(["mod1", "jqueryA"], function (sm, $) { 
    console.log(sm.someValue); 
    console.log($); 
}); 

現在「的console.log($)寫道:」零。

這應該是預期的嗎?有沒有理由爲什麼名稱必須是jQuery,但對於mod1它可以是任何東西?

我可以解決這個沒有問題,但這個問題似乎很奇怪。我知道我可以使用組合的RequireJS和jQuery文件,但是當jQuery有更新時,我不想依賴RequireJS來包含新的jQuery。

回答

9

在jQuery 1.7中,他們決定支持AMD加載。爲此,它定義了一個名爲'jquery'的模塊,它將對jQuery對象的引用返回。當你用另一個名字定義你的路徑(例如'jqueryA')時,事情並不像你想象的那樣完全破裂。

jquery腳本始終將自己定義爲名爲「jquery」的模塊,該模塊已在您的應用程序的require中註冊。當你命名你的路徑快捷方式'jquery'並且'jquery'被加載爲一個依賴時,require實際上是引用了由jquery-1.7.1.js定義的'jquery'模塊,它會傳回正確的引用。當你命名你的模塊快捷方式jqueryA時,你現在引用了一個未定義的引用,因爲除了通過名爲'jquery'的模塊,jquery腳本本身不傳回引用。這很愚蠢,我知道。

jquery腳本將模塊定義爲'jquery',並期望您將其簡單引用爲'jquery'。如果你想引用它的另一個名稱(和作爲獎金,防止其與其他加載的jQuery庫衝突的),使用此方法:

Use requirejs and jquery, without clobbering global jquery?

+0

感謝您的解釋!有了這些知識,我解決了我自己的jquery/requirejs問題。 – bunnyhero 2012-08-12 04:04:22

2

我相信我找到了我的問題的答案。

可選致電AMD定義()註冊模塊 https://github.com/documentcloud/underscore/pull/338#issuecomment-3253751

下面是從以前的鏈接的報價。儘管它與下劃線有關,但我相信它也與JQuery有關。

所有AMD裝載機允許映射模塊ID,以部分 路徑,通常的配置稱爲「路徑」,所以做你想要 :

requirejs.config({ 路徑: 下劃線:'js/libs/underscore-1.2.3.min' }}); require(['underscore'],function(){});由於下劃線由其他更高級別的模塊(如主幹)使用,因此需要使用通用依賴關係 來傳遞下劃線上的公共依賴關係,並且可以調用該依賴關係的下劃線。 路徑配置提供了一種方法來映射到您想要用於該依賴關係的特定URL。

這裏有一個很好的描述AMD和命名模塊問題的咆哮。

具有命名定義的AMD模塊。獲得什麼很多痛苦?從鏈接 http://dvdotsenko.blogspot.com/2011/12/amd-modules-with-named-defines-so-much.html

引用上述

如果正常消耗模塊的唯一辦法就是強制 端開發人員硬編碼它的名字再次在配置文件中,在 消費點,(在這方面)爲什麼浪費時間,精力和 硬編碼在模塊中的名字首先(更不用說導致 悲傷那些誰需要加載模塊在不同的 名稱/來自其他來源)?

在這篇文章中,James Burk建議不要使用名稱模塊。 https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon

通常情況下,你不應該註冊一個名爲模塊,而是註冊 爲匿名模塊:

這使你的代碼的用戶 您的圖書館命名爲適合他們的項目佈局的名稱。它還允許它們將映射到其他庫所使用的依賴項名稱。例如,可以將Zepto.js映射爲完成'jquery'模塊ID的 模塊職責。

有一些明顯的例外那些註冊爲一個模塊名字:

•jQuery的•強調

異常鬧心。例外情況使新手難以應付。

+0

看看我的答案。希望它能爲你解決問題。 – 2012-03-07 00:25:25

4

這裏是我的解決辦法的基礎上,我讀的實施Require.JS 2.1.0:

define.amd.jQuery = false; 

require.config({ 
    ... 

    shim: { 
     "jQuery-1.8.2": { 
      exports: "jQuery" 
     } 
    } 

    ... 
});