2013-08-31 56 views
3

我看到很多這方面的文章和文章。它們中的一些,
Developing Modular Backbonejs Applications
TodoMVC with requireJS
Stack Overflow post with most upvotesRequireJS - 爲什麼我應該像jquery,骨幹等shim libs

所以對我來說,模塊化的jQuery,backbonejs和其他圖書館沒有問題。我的問題是爲什麼我應該這樣做?因爲在每個js文件中我們要使用jquery和backbonejs,並且在每個文件上添加下面的代碼似乎給我帶來額外的負擔。

define([ 
    'jquery', 
    'underscore', 
    'backbone', 
    'myFile1', 'myFile1' 
], function ($, _, Backbone, module1, module2) { 

爲什麼我在包含requireJS之前不要直接將它們包含到html文件中?

<script src="../lib/client/jquery.js"></script> 
<script src="../lib/client/underscore.js"></script> 
<script src="../lib/client/backbone.js"></script> 
<script data-main="client/main" src="../lib/client/require.js"></script> 

在這種情況下,我不需要在每個js文件上定義jquery或backbonejs。我可以單獨模塊化我自己的js文件,如下所示。

define([ 
    'myFile1', 'myFile1' 
], function (module1, module2) { 

這種方法有什麼缺點?這是正確的方法嗎?我打破了任何requirejs規則嗎?

回答

5

因爲像jQuery和Backbone這樣的模塊在RequireJS模型中不起作用。沒有define(語句來定義它們,因此它們必須直接與真正的Require模塊一起工作。

是的,你所說的(只是將它們傾倒在全局命名空間中)起作用,你不會違反任何「規則」。當你添加一個腳本標記時,它所做的就是將代碼轉儲到全局命名空間中 - 所以你的所有模塊實際上都可以訪問上面例子中的Backbone和jQuery。

但是它有三個缺點:

  • 之一,我們有收穫的東西需要的是我們依賴是明確,每次一個模塊需要我們知道的東西 - 所以我們依賴管理是一個(我們知道什麼模塊依賴於jQuery,什麼不是例如 - 所以我們知道哪些是安全的,在沒有jQuery的新項目中使用)。另一件事是我們在我們的代碼中保持一致,我們繼續用完全相同的方式聲明每個依賴,並以完全相同的方式使用它。 RequireJS墊片讓我們繼續像jQuery或Backbone之類的庫那樣行事。

  • 因爲隱式依賴性的,如果你想重用代碼 - 後您RequireJS包括jQuery的模塊將是一個運行時錯誤,這並不總是微不足道的瞭解,不像需要它會告訴你,這無法加載模塊jQuery(並沒有像$沒有定義,或更糟糕的「[對象對象]不是一個函數」或類似的東西

+1

HTML導入的另一個實際問題是,他們必須爲每個HTML文件重複使用一個JS特性(由一組JS文件實現)。這種重複的擔憂是很難保持的。 –

+0

一件令人高興的事情是,你確認,我沒有違反任何規則。感謝那。但對於我來說,在這種情況下,我看到jquery和骨幹一樣bootstrap。有沒有平均shim bootstrap。我的項目肯定需要jquery,骨幹才能成功運行。 – user10

+0

對我來說,我覺得很難在每個文件上定義jQuery,下劃線,主幹等。當我看着他們的模塊,我覺得,哦,人..我知道你需要jquery,下劃線,骨幹,你還需要什麼? :) – user10