2012-08-25 32 views
2

例如:是否有任何理由不在不同的源文件中提供相同的模塊?

// a.js 
goog.provide('mypackage.a'); 
goog.provide('mypackage.commands'); 

mypackage.a.somevar = 1; 

mypackage.commands.save = function(...) {...}; 

// b.js 
goog.provide('mypackage.b'); 
goog.provide('mypackage.commands'); 

mypackage.b.somevar = 1; 

mypackage.commands.read = function(...) {...}; 

// mypackage/commands.js 
goog.provide('mypackage.commands'); 

mypackage.commands.runCommand = function(commandText, args) { 
    return mypackage.commands[commandText](args); 
} 

這是爲了提供一個可擴展的命令集的一個很好的方式,或者是有什麼,可以使這個複雜的,我不是想什麼呢?

回答

1

沒有理由不能或不應該在不同的源文件中提供相同的模塊。如果它對您的源代碼組織方案有意義,那麼這是一件非常好的事情。我們有goog.provide()的主要原因之一是,可以在幾個不同的地方使用相同的符號,但是在無論哪個文件碰巧首先運行的地方都可以定義。

如果我正確理解goog.provide(),它所要做的就是確保聲明一個對象。所以,goog.provide('mypackage.commands ) makes sure that mypackage.commands`在全局範圍內聲明

所以goog.provide('mypackage.commands');剛剛完成類似這樣:

window.mypackage = window.mypackage || {}; 
window.mypackage.commands = window.mypackage.commands || {}; 

你只需要做到這一點,當你因此,如果多個源文件都將新項目添加到mypackage.commands,那麼每個源文件都會執行goog.provide('mypackage.commands)來確保聲明正確的全局變量結構。

這似乎是你在你的代碼示例中做什麼,這是一個非常好的事情。這取決於你自己的代碼組織是否最好有多個源文件都貢獻給同一個對象(就像你有),或者你是否應該組織你的源文件,使得與一個特定名稱空間有關的所有代碼都是相同的文件。這真的取決於你,你認爲最好是組織你的源代碼 - 除了應該有組織的背後的原因和原因之外,沒有正確或錯誤的答案。

有益的參考文章:https://developers.google.com/closure/library/docs/tutorial

1

使用goog.provide()定義在多個文件中相同的命名空間將不會覆蓋命名空間,因爲命名空間的每一級都檢查是否存在由左到右。但是,Closure Library遵循約定,即每個命名空間僅在一個文件中提供。

Closure: The Definitive Guide第49頁:

Every JavaScript file in the Closure Library starts with at least one call to goog.provide().All elements added to the namespace being provided are added in that file. Like Java, files live in a directory structure that parallels the namespace, though this is not required for Closure as it is for Java. This convention does make it easier to find the file responsible for a given namespace, however. It is recommended that you follow this convention in your own JavaScript projects that use Closure.

此外,在使用時Closure Builder管理的依賴關係,當同一個命名空間是由多個文件提供生成以下錯誤。

depstree.MultipleProvideError: Namespace "your.namespace" provided more than once in sources

但是,如果您仍想提供在多個文件中相同的命名空間,您可以管理使用Closure Compiler標誌--only_closure_dependencies沒有錯誤的依賴關係。

相關問題