2012-05-29 29 views
1

我正在嘗試使用requirejs並加載外部供應商js並隱藏全局變量,如Backbone或Underscore。Require.js東西不明確

這裏是我的代碼:

<script data-main="./main" src="<?php echo $rootRequirejs?>/require.js"></script> 
<script type="text/javascript"> 
    require.config({ 
     baseUrl: "/web/js", 
     paths: { 
      "jquery": "/vendor/js/jquery-1.7.1.min", 
      'underscore': '/vendor/js/underscore-min', 
      'backbone': '/vendor/js/backbone-min' 
     } 
    }); 

這裏是我的問題:

1) 如果我去JavaScript控制檯和我寫的骨幹或下劃線它們被定義...。
我認爲它不應該從控制檯訪問,但只是從我的main.js文件。
他們爲什麼是全球性的?

+0

關於全局,直到你對它們使用'noConflict()'方法時,它們仍然是全局的。 IIRC,require.js允許你爲這些依賴定義一個函數,所以你可以返回類似於'Backbone.noConflict()'的東西。 –

+0

順便說一句,你看[Require.js 2.0](http://tagneto.blogspot.fr/2012/05/requirejs-20-released-onward-amd.html)嗎?它解決了你的問題。另外請看「升級require.js」指南,你會看到很多有用的東西。 –

+0

你是如何加載你的moudules的?你可以發佈你的main.js來看看如何聲明依賴關係嗎? –

回答

1

由於庫本身(主幹等)的寫法 - 它們明確使用全局空間(b/c,這就是js的工作原理),這些將默認爲全局。你有沒有試過這些庫的the AMD-forks

可能是一個更好的選擇,正如弗洛裏安注意到的,上面的評論是使用Require2.0,因爲它現在附帶了一個"shim" feature,它可以幫助您使用非AMD庫...雖然我不確定這會消除全局。除非你有明確的理由避免全局變量,否則他們通常並不是那麼重要。

+0

我正在嘗試使用墊片功能,但是我可以告訴requirejs已經定義了一個模塊嗎?如果是的話,怎麼樣?對於eaxmple墊片:{} {} {jquery'}它看起來在baseUrl中,但實際上它已經被Loaaded了。 – js999

+0

require不會嘗試加載它已經加載的模塊。如果你使用require來加載jquery,你應該沒問題。如果您通過require AND標準腳本標記加載jquery,那麼您最終可能會在頁面中出現兩個副本。我*認爲*如果你加載jQuery的第一要求會看到它已經被加載(技術上「定義」爲模塊),而不是嘗試再次加載它。 – busticated