google-app-engine - 如何在 Google App Engine 上缩小和版本化 js/css?

标签 google-app-engine minify

webassets won't work on GAE要即时压缩 js/css,最好的方法似乎是在部署时执行。

经过大量谷歌搜索后,我想出了下面的脚本来实现这一点。

起初我认为最好的办法是保留 base.html 中的 javascript 路径,然后简单地压缩 css/js。

cssmin 压缩css 并覆盖原来的。 然而,关闭不允许覆盖原来的,这个概念已经失败了。

第二个问题是,即使我关闭覆盖了原始文件,缓存也会成为一个问题。出于这个原因,每个缩小的 css/js 的部署都应该在文件名中带有一个随机数,以便在新部署后实际选择新版本。根据我提出的概念,这是不可能的。

因此,实现此目的的唯一方法是使用 sed 或其他方式修改 base.html

在我重新发明轮子之前,有没有更好的方法来做到这一点?非常感谢

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()

最佳答案

您应该在实例启动时进行一次性检测,根据您的应用程序是否在开发服务器上运行来设置一些全局变量。您可以基于此生成 Assets 所需的 URL,并为每个 Assets 提供一个版本列表。

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)
    }
}

如果您有一个 deploy stript 来缩小您的本地(即非 CDN)内容,请在此处运行它,并使用上述方法,但使用带有 .min 扩展名的本地 url。

关于google-app-engine - 如何在 Google App Engine 上缩小和版本化 js/css?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17219743/

相关文章:

python - 使用 Google App Engine 实现 "Starts with"和 "Ends with"查询

spring - 使用 Spring RestTemplate 时未设置“X-Appengine-Inbound-Appid” header

java - Spring MVC 和 "big forms"

html - 通过命令行删除 html-minifier 中的注释

javascript - 使用 Maven 插件缩小 CSS 和 JS 文件不起作用

google-app-engine - 有什么办法可以访问本地网络中的GAE开发应用程序服务器吗?

java - Google 应用引擎中的 Struts2 Tiles

javascript - meteor 是否会在生产环境中缩小 client/compatibility 目录中的文件?

asp.net - 如何让 Chirpy 与 JS 和 mash.config 一起工作

javascript - grunt js 缩小转换 unicode 字符