在我的网站www.trailbehind.com上,我们有一组属于所有页面的JavaScript文件。然后一些页面包含额外的库。
对于所有页面使用的JS文件(有几十个文件),我们连接它们并在构建时缩小它们。
在我们的设置文件中有一个标志,表示是否使用串联的JavaScript或构建中的单独文件。这很关键,以便您可以在dev上调试javascript,但在生产中使用小的单一文件JavaScript。
这里是我们的Python代码合并和缩小:
import os
import thetrailbehind.lib.jsmin as jsmin
JS_FILES = [ 'lib/json2.js',
'lib/markermanager.js',
'lib/labeledmarker.js',
'lib/rsh/rsh.js',
'lib/showdown.js',
'lib/yui.js',
'lib/dragzoom.js',
'gen/attribute_data.js',
'gen/national-parks.js',
'Widgets/CommentsWidget.js',
'Widgets/Search.js',
'Widgets/MenuWidget.js',
'Widgets/PhotoWidget.js',
'Widgets/ReportList.js',
'Widgets/help.js',
'attributes.js',
'rsh.js',
'map.js',
'mapcontrols.js',
'markers.js',
'amazon.js',
'plan_trip.js',
'init.js',]
def concat(files, base_path, all_file, all_file_min):
if os.path.exists(base_path + all_file):
lasttime = os.path.getmtime(base_path + all_file)
else:
lasttime = 0
out_of_date = False
for file in files:
if os.path.getmtime(base_path + file) > lasttime:
out_of_date = True
break
if out_of_date:
outfile = open(base_path + all_file, 'w')
for file in files:
outfile.write(open(base_path + file).read())
outfile.write("\n")
outfile.close()
alljs = open(base_path + all_file)
allminjs = open(base_path + all_file_min, "w+")
jsmin.JavascriptMinify().minify(alljs, allminjs)
alljs.close()
allminjs.close()
def main():
concat(JS_FILES, '/home/wibge/thetrailbehind/media/javascript/', 'gen/all.js', 'gen/all.min.js')
if __name__ == "__main__":
main()
而且这里是我们切换Django的/ HTML模板:
{% if use_all_js %}
script type=text/javascript src=/site_media/javascript/gen/all.min.js>
{% else %}
script type="text/javascript" src="/site_media/javascript/rsh.js">
script type="text/javascript" src="/site_media/javascript/amazon.js">
script type="text/javascript" src="/site_media/javascript/map.js">
A BUNCH OF SEPARATE INCLUDES...etc
{% endif %}
我把它们放在那里,因为我是只使用部分一次。如果我使用了两次,我会把它移开。如果我没有多次使用它,则不需要构建多次使用。 – 2009-05-26 22:05:31
@Scott,你将他们移动到哪里?我想这确实是个问题。如果你在所有的视图页面上都不需要它们,那么将它们包含在母版页上看起来很浪费。 – 2010-08-22 20:13:05