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

Posted

技术标签:

【中文标题】如何在 Google App Engine 上自动化 Javascript 和 CSS 缩小?【英文标题】:How do I automate Javascript and CSS minification on Google App Engine? 【发布时间】:2011-11-06 12:52:46 【问题描述】:

我找不到任何合适的解决方案来自动化 Google App Engine CSS 和 javascript 缩小。

【问题讨论】:

【参考方案1】:

如果您的 JS/CSS 文件要在 html 页面中使用,那么一个很好的选择是让 App Engine 通过实验性的“页面速度”功能自动优化您的网站(缩小、捆绑、内联等)。您可以通过以下方式打开它:

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

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

    向下滚动到“性能”部分并找到“PageSpeed 服务:”。选中“启用 PageSpeed 服务”复选框并点击“保存”。

这将添加响应过滤器,这些过滤器会自动执行合并和缩小 JS 等操作,将缩小的包从脚本引用转换为内联脚本(以减少服务器请求的数量)以及更酷、更轻松的性能改进。在此处阅读有关此功能的更多信息:https://developers.google.com/speed/pagespeed/service/faq

【讨论】:

很遗憾,此解决方案在 2015 年 12 月 1 日之后将不再有效,因为 Google App Engine 的 PageSpeed 服务将被关闭。如App Engine documentation 所述:[...] Google App Engine 的 PageSpeed 服务已弃用,将于 2015 年 12 月 1 日关闭。Google App Engine 上的 PageSpeed 集成将继续有效,直到 2015 年 12 月 1 日,在此日期之后,PageSpeed 优化将不再应用于您的应用。【参考方案2】:

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

【讨论】:

即时缩小有什么问题?如果您使用的是缓存副本,我看不出这种方法有什么问题。 @Ron 你的代码没有改变,所以没有理由一遍又一遍地缩小。那些获得缓存未命中的用户将看到显着的额外延迟,而对您没有真正的收益。这也浪费资源。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

您可以通过将脚本的内容加载到字符串中,使用 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),...

【讨论】:

【参考方案5】:

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

更苗条 - http://pypi.python.org/pypi/slimmer/ JSmin.py - http://code.google.com/p/v8/source/browse/branches/bleeding_edge/tools/jsmin.py 缓存控制标头抖动 - http://groups.google.com/group/google-appengine/browse_thread/thread/be3fa7b5e170f378 和博文 - http://www.kyle-jensen.com/proxy-caching-on-google-appengine

【讨论】:

【参考方案6】:

您可以尝试使用名为 wro4j 的工具提供的构建时或运行时解决方案(使用 maven 插件)

免责声明:这是我正在进行的项目。

【讨论】:

以上是关于如何在 Google App Engine 上自动化 Javascript 和 CSS 缩小?的主要内容,如果未能解决你的问题,请参考以下文章

在 Google App Engine 中创建表单自动完成

当一个人创建一个新模型时,应该在哪里放置代码以在 Google App Engine/Django 上自动增加一个分片计数器?

如何在 Google Cloud App Engine 上使用 PubSub 创建订阅者,该订阅者通过 Publisher 从 Google Cloud App Engine Flex 收听消息?

如何在 Google App Engine 上部署 Ktor 应用程序?

如何在 Google App Engine 上设置暂存环境

如何从 Python 中的 App Engine 在 Google BigQuery 上创建架构?