如何在Google App Engine上自动化Javascript和CSS缩小?

时间:2011-08-30 05:44:19

标签: javascript css google-app-engine minify

我无法找到适合自动化Google App Engine CSS和Javascript缩小的解决方案。

6 个答案:

答案 0 :(得分:4)

编写一个部署脚本,使用缩小的JS和CSS制作应用程序的副本,然后在其上调用appcfg。除非您动态生成它,否则不应动态缩小它。

答案 1 :(得分:4)

如果要在HTML页面中使用您的JS / CSS文件,那么一个非常好的选择是让App Engine通过实验性的“页面速度”功能自动优化您的网站(缩小,捆绑,内联等)。你可以这样做:

  1. 转到项目的App Engine信息中心: https://appengine.google.com/settings?&app_id=s~your_project_id

  2. 点击“应用程序设置”(左下角“管理”部分)。

  3. 向下滚动到“效果”部分,找到“PageSpeed Service:”。选中“启用PageSpeed服务”复选框,然后点击“保存”。

  4. 这将添加响应过滤器,这些过滤器将自动执行诸如组合和缩小JS之类的操作,将缩小的捆绑包从脚本引用转换为内联脚本(减少服务器请求的数量)以及更酷和轻松的性能提升。在此处详细了解此功能:https://developers.google.com/speed/pagespeed/service/faq

答案 2 :(得分:2)

我最终创建了这个appengine脚本(使用memcache和slimit)。 我发现slimit是最好的缩小脚本,但我正在考虑使用谷歌的那个。

http://ronreiterdotcom.wordpress.com/2011/08/30/automatic-javascript-minification-using-slimit-on-google-app-engine/

答案 3 :(得分:2)

通过将脚本内容加载到字符串中,使用jsmin处理它,最后保存并提供结果,您可以非常有效地自动执行该过程。不要担心性能,只在创建应用程序实例时运行jsmin(确定不是每个请求)。

你可以抓住jsmin.py here

假设我有这个函数从文件系统读取JS(未压缩,调试版本)并在logger.py模块中返回它的字符串内容:

class ScriptManager():
    def get_javascript(self):
        path_to_js = os.path.join(os.path.dirname(__file__), 'js/script.js')
        return file(path_to_js,'rb').read()

用jsmin处理它。确保使用正确的缓存标头。以此jsrendered示例模块作为示例

js_compressed =
jsmin.jsmin(scripts.logger.ScriptManager().get_javascript())


JS_CACHE_FOR_DAYS = 30

class scriptjs(webapp2.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/javascript'
        expires_date = datetime.datetime.utcnow() + datetime.timedelta(JS_CACHE_FOR_DAYS)
        expires_str = expires_date.strftime('%d %b %Y %H:%M:%S GMT')
        self.response.headers.add_header('Expires', expires_str)
        self.response.headers['Cache-Control'] = 'public'
        self.response.cache_control.no_cache = None
        self.response.out.write(js_compressed)

现在从main.py中的动态contnet处理程序返回:

 app = webapp2.WSGIApplication([
     ('/scripts/script.js', jsrender.scriptjs),...

答案 4 :(得分:1)

尼克的回答是正确的方法,但你可以在请求JS / CSS时动态执行 - 然后将cache-control设置为public以将结果缓存到上游。

答案 5 :(得分:1)

您可以尝试使用名为wro4j

的工具提供的构建时或运行时解决方案(使用maven插件)

免责声明:这是我正在开展的一个项目。