如何在整個網站上組織大型JS/jQuery代碼庫?關於如何組織代碼,有很多很好的資源,但沒有關於如何將它們放在一起並將每個代碼組合到一起:側面廣泛的代碼組織,使用相同代碼的多個頁面,使用鬆散耦合保持DRY,等等。如何在整個網站上組織大型JS/jQuery代碼庫?
以下是我如何處理它。我從來沒有像我這樣習慣於組織代碼,因爲我覺得它很瑣碎,可能導致可維護性/擴展性問題,但我並不知道更好。
我意識到每個人都有自己的一套要求,沒有交鑰匙解決方案,但我很想聽聽我做錯的一些意見,爲什麼我做錯了,如何編寫更易維護的代碼。
我想我真正想要知道的:
你是如何處理的邏輯,你 需要在多個地方使用,在 多頁?
如何組織頁面特定的 代碼?將每個頁面命名爲 是一個好主意嗎?
那你從一開始就做 確保您不經常 重新寫你的組織 模式爲您的應用程序變得更大 和更大?我可能在我的第4個 迭代寫這個東西。
每個頁面接收主application.js文件。每個附加頁面都有自己的 application.pagename.js文件。我使用服務器端邏輯來包含這些文件(首先查看 是否存在頁面 - 有些頁面不需要JS),然後按順序初始化它們。
所以我的主頁看起來像:
<script src="js/application.js"></script>
<script src="js/application.index.js"></script>
<script>
MyApp.init();
MyApp.index.init();
</script>
我的網址約定/頁/子頁/ ID /。我有大約10頁和一大堆子頁面,每個子頁面都需要自己的邏輯。看到這篇文章的最後一個例子。
我的代碼大部分已經模塊化爲jQuery UI小部件或jQuery插件,所以我會說這些文件中的代碼的75%是require()'小部件並啓動它。
我使用requireJS來根據需要拉入小部件。
// application.js
var MyApp = {
init: function(){
var self = this;
// these widgets are available on every single page
// notice the call to jquery.deparam.js - i'll use this later to init subpage logic.
require(['js/widget1.js', 'js/widget2.js', 'js/widget3.js', 'js/jquery.deparam.js'], function(){
// deparam the query string. I'll use this later.
self.querystring = $.deparam.querystring();
// init widgets once the document is ready
$(function(){
$("#widget1").widget1();
$("#widget2").widget2();
// make these bindings available immediately as well.
self.rebindable();
});
});
},
// I use jQuery UI Dialog extensively as a window manager, and each dialog is loaded
// via an AJAX request. I'll call this method after each AJAX request to
// rebind some key widgets.
rebindable: function(){
$("#widget3").widget3();
}
};
// application.index.js
// home page specific stuff. this file is only included on the home page.
MyApp.index = {
// my convention is that init is automatically called after the script
// is included in a page, outside of a doc.ready statement.
init: function(){
var self = this;
require(['js/widget4.js'], function(){
$(function(){
self.widget4($("#foo"));
});
});
},
// passing elements to each method allows me to call this init code
// outside of the index page. I can require() this file, and only init
// widget4, and even use a different element.
widget4: function(element){
var config = {
something: "custom to the home page"
};
element.widget4(config);
}
};
// application.foo.js
// page "foo" stuff
MyApp.foo = {
init: function(){
var self = this;
// this page happens to use the same widget3 and configuration present
// in MyApp.index. this is where things can get sloppy and unmaintainable
// really quickly.
require(['js/application.index.js'], function(){
$(function(){
MyApp.index.widget3($("#bar"));
});
});
// page "foo" has three subpages (or actions) and require
// their own logic. url convention: /foo/subpage1/
// init whichever page we're on...
switch(self.querystring.subpage){
case "subpage1":
self.subpage1.init();
break;
case "subpage2":
self.subpage2.init();
break;
case "subpage3":
self.subpage3.init();
break;
}
},
subpage1: function(){
init: function(){
var self = this;
// once the DOM is ready init dialog.
$(function(){
self.dialog($("#openDialog"));
});
},
dialog: function(element){
element.bind("click", function(){
$('<div></div>').dialog({
open: function(){
// see what i'm doing here?
MyApp.rebindable();
// maybe more bindings specific to this
// dialog here
}
});
});
}
},
subpage2: function(){
init: function(){
}
},
subpage3: function(){
init: function(){
}
}
};
本週我正在考慮這個問題。我最近加入了一個項目團隊作爲主要的JavaScript編碼器。該項目已經進行了一年多了,所以他們已經在各地都有javascript了。他們已經積累了大量的JavaScript庫,並且努力使用命名空間,但是很多頁面都有自定義的javascript,不僅是用頁面和用戶控件編寫的,還有一些是基於頁面或用戶控制數據生成的。我有理解這一切的艱鉅任務,並試圖儘可能標準化。 – Silkster 2010-09-08 14:41:30
(續)你的方法是一個好的開始,但我可以看到它無法維護的地方。也許你可以設計一個配置頁面和控件的方法,以便不必使用許多switch語句。您也可以查看Claypool(http://www.claypooljs.com/),看看是否有幫助。 – Silkster 2010-09-08 14:46:40
@Silkster鏈接被破壞:http://http//www.claypooljs.com/ – 2011-05-19 11:38:29