由于webassets won't work on GAE动态压缩js / css,似乎最好的方法是在部署时执行此操作。
经过大量的谷歌搜索后,我想出了下面的脚本来实现这一目标。
起初我认为最好将javascript路径保留在base.html
中,并简单地压缩css / js。
cssmin压缩css并覆盖原始文件。 但是,闭包不允许覆盖原文,这个概念已经失败了。
第二个问题是,即使我关闭覆盖原始文件,缓存也会出现问题。因此,每个缩小的css / js的部署都应该带有文件名中的随机数,以便在新部署之后实际获取新版本。根据我提出的概念,虽然这是不可能的。
因此,实现此目标的唯一方法是使用base.html
或其他内容修改sed
。
在重新发明轮子之前,有没有更好的方法来做到这一点?非常感谢
import sys, os
import cssmin
def main():
if len(sys.argv) == 1:
return
appId = sys.argv[1]
print "appId", appId
cmd = r'java -jar compiler.jar --js=/src/application/static/f11/f11.js --js_output_file=/src/application/static/f11/f11.min.js'
os.system(cmd)
output = cssmin.cssmin(open('/src/application/static/f11/f11.css').read())
f = open('/src/application/static/f11/f11.css','w')
f.write(output)
# Perform appcfg.py to update GAE server
cmd = r'"\google_appengine\appcfg.py"'
os.system(cmd + " update . " + " -A %s"%appId)
if __name__ == "__main__":
main()
答案 0 :(得分:1)
您应该在实例启动时进行一次性检测,根据您的应用程序是否在开发服务器上运行,设置一些全局变量。您可以根据需要为资产生成所需的URL,并为每个资产提供一个版本列表。
python示例(full context):
JQUERY_VERSION = '1.7.2'
JQUERY_UI_VERSION = '1.8.20'
ANGULAR_VERSION = '1.0.2'
if os.environ['SERVER_SOFTWARE'].startswith('Google'):
JQUERY_URL = "//ajax.googleapis.com/ajax/libs/jquery/%(version)s/jquery.min.js" %{ 'version': JQUERY_VERSION }
JQUERY_UI_URL = "//ajax.googleapis.com/ajax/libs/jqueryui/%(version)s/jquery-ui.min.js" %{ 'version': JQUERY_UI_VERSION }
JQUERY_UI_CSS_URL = "//ajax.googleapis.com/ajax/libs/jqueryui/%(version)s/themes/base/jquery.ui.all.css" %{ 'version': JQUERY_UI_VERSION }
ANGULAR_URL = "//ajax.googleapis.com/ajax/libs/angularjs/%(version)s/angular.min.js" %{ 'version': ANGULAR_VERSION }
else:
JQUERY_URL = "/static/js/jquery-%(version)s.min.js" %{ 'version': JQUERY_VERSION }
JQUERY_UI_URL = "/static/js/jquery-ui-%(version)s.min.js" %{ 'version': JQUERY_UI_VERSION }
JQUERY_UI_CSS_URL = "/static/css/jquery-ui/jquery-ui-%(version)s.css" %{ 'version': JQUERY_UI_VERSION }
ANGULAR_URL = "/static/js/angular-%(version)s.min.js" %{ 'version': ANGULAR_VERSION }
去示例(full context):
func init() {
angular_ver := "1.0.5"
bootstrap_ver := "2.3.1"
jquery_ver := "1.9.1"
if appengine.IsDevAppServer() {
Angular = fmt.Sprintf("/static/js/angular-%v.js", angular_ver)
BootstrapCss = fmt.Sprintf("/static/css/bootstrap-%v.css", bootstrap_ver)
BootstrapJs = fmt.Sprintf("/static/js/bootstrap-%v.js", bootstrap_ver)
Jquery = fmt.Sprintf("/static/js/jquery-%v.js", jquery_ver)
} else {
Angular = fmt.Sprintf("//ajax.googleapis.com/ajax/libs/angularjs/%v/angular.min.js", angular_ver)
BootstrapCss = fmt.Sprintf("//netdna.bootstrapcdn.com/twitter-bootstrap/%v/css/bootstrap-combined.min.css", bootstrap_ver)
BootstrapJs = fmt.Sprintf("//netdna.bootstrapcdn.com/twitter-bootstrap/%v/js/bootstrap.min.js", bootstrap_ver)
Jquery = fmt.Sprintf("//ajax.googleapis.com/ajax/libs/jquery/%v/jquery.min.js", jquery_ver)
}
}
如果你有一个部署stript缩小你的本地(即非CDN)内容,请在此处运行,并使用上面的方法,但使用扩展名为.min的本地URL。