【问题标题】:Javascript minification automatizationJavascript 缩小自动化
【发布时间】:2011-05-22 03:20:31
【问题描述】:

我有一个使用大量 jquery/javascript 的网站。现在,在索引页面上,我的头部包含大约 10 个 javascript 文件:

<head>
<script src="/js/jquery.js"></script>
<script src="/js/jquery_plugin_1.js"></script>
<script src="/js/jquery_plugin_2.js"></script>
<script src="/js/jquery_plugin_3.js"></script>
<script src="/js/my_scripts_1.js"></script>
<script src="/js/my_scripts_2.js"></script>
<script src="/js/my_scripts_3.js"></script>
<script src="/js/my_scripts_4.js"></script>
<!-- ...and so on -->
</head>

由于访问者人数越来越多,我开始考虑所有这些的性能。我已经读过,缩小所有 javascript 文件并将它们集中在一起是个好主意,因此浏览器必须只发出一个 HTTP 请求。我这样做了。现在我有 everything.js 文件,其中包含所有 javascript,包括 jquery、插件和我的自定义脚本。

<head>
<!--
<script src="/js/jquery.js"></script>
<script src="/js/jquery_plugin_1.js"></script>
<script src="/js/jquery_plugin_2.js"></script>
<script src="/js/jquery_plugin_3.js"></script>
<script src="/js/my_scripts_1.js"></script>
<script src="/js/my_scripts_2.js"></script>
<script src="/js/my_scripts_3.js"></script>
<script src="/js/my_scripts_4.js"></script>
...
-->
<script src="/js/everything.js"></script>
</head>

当我需要更改其中一个文件时,乐趣就开始了。每次,为了检查我的更改是否按预期工作,我需要压缩文件并更新everything.js 或取消注释所有旧代码。使用这种工作流程,很容易忘记一些事情并犯错误。

问题:有没有自动化的东西可以解决这个问题?一些东西,可以让我像以前一样编辑我的单独文件,并在我准备好测试我的更改时缩小和整合所有内容?

我正在使用 PHP5 和 SVN

解决方案

谢谢大家的帮助,我找到了我的解决方案: 我将在我的 SVN 存储库中放置一个 post-commit 挂钩,它将获取我所有的 .js 文件,将它们放在一起并使用 YUI 压缩器缩小它们。然后,在我的脚本中,我将分叉 javascript 包含,以便在开发环境中该站点将包含单独的 javascript 文件,但在生产中将包含组合和缩小的文件。

【问题讨论】:

  • 你可以编写一个shell脚本来为你做这件事,收集特定目录中的所有.js文件,然后组合并压缩结果。
  • 我认为你应该检查你的脚本在一个文件中是否正常工作。

标签: php javascript performance minify


【解决方案1】:

我认为您应该检查您的脚本在一个文件中时是否正常工作,然后压缩该文件。 我们没有很多文件,所以我们使用 yui compressor 为每个文件使用 js 缩小器。 如果您使用的是自动部署,您应该执行缩小然后部署,否则批处理脚本应该没问题。

【讨论】:

    【解决方案2】:

    老实说,我以前没有这样做过,但是我遇到了这两种解决方案,并认为它们可能对您有所帮助:

    jMerge

    Automatic merging and versioning of CSS/JS files with PHP

    祝你好运!

    【讨论】:

      【解决方案3】:

      我们有自定义部署脚本来处理它。简而言之,它使用YUI Compressor 压缩所有 CSS 和 JavaScript 文件,并将它们打包到最多两个文件中,一个是通用文件,另一个是针对给定页面的特定逻辑文件。完成后,我们创建一个符号链接(或一个新文件夹,取决于项目)到包含打包文件的文件夹,新的更改会立即传播。这种方法适用于除开发之外的所有环境。

      在缩小之前,这是 CSS 结构的样子(对于 JavaScript,它或多或少相同,只是给你一个想法):

      css/Layout/Core/reset.css
      css/Layout/Core/index.css
      css/Layout/Tools/notice.css
      css/Layout/Tools/form.css
      css/Layout/Tools/overlay.css
      css/Skin/Default/Core/index.css
      css/Skin/Default/Tools/notice.css
      css/Skin/Default/Tools/form.css
      css/Skin/Default/Tools/overlay.css
      css/Layout/Tools/gallery.css
      css/Layout/Tools/comments.css
      css/Layout/Tools/pagination.css
      css/Layout/Index/index.css
      css/Skin/Default/Tools/gallery.css
      css/Skin/Default/Tools/comments.css
      css/Skin/Default/Tools/pagination.css
      css/Skin/Default/Tools/achievements.css
      css/Skin/Default/Tools/labels_main.css
      css/Skin/Default/Index/index.css
      

      之后:

      minified/1290589645/css/common.css
      minified/1290589645/css/0135f148a7f6188573d2957418119a9a.css
      

      我们喜欢这种方法,因为它不需要即时处理任何额外的代码。这只是部署问题,每两周进行一次生产。我们的 staging 环境每天都在更新,有时甚至一天不止一次,我们还没有遇到任何问题。

      【讨论】:

      • yuicompressor 能很好地处理 url() 类型值(例如background-image: url(../foo.jpg))吗?因为 URL 是相对于 CSS 文件的,所以在压缩文件时需要更新这些,否则相对引用将不正确。
      • 不确定是否诚实。我们没有任何问题,因为我们有一些额外的逻辑,YUI Compressor 是否处理得好并不重要。
      【解决方案4】:

      创建一个这样的 php 文件并将其保存为merge_js.php 在您的 js 目录中

      <?php
      ob_start ("ob_gzhandler");
      $f=$_GET['f'];
      if(@file_exists($f)){
          $inhoud = file_get_contents($f);
          header("Content-type: application/javascript; charset: UTF-8");
          header("Cache-Control: must-revalidate");
          $offset = 60 * 60 ;
          $ExpStr = "Expires: " .
          gmdate("D, d M Y H:i:s",
          time() + $offset) . " GMT";
          header($ExpStr);
      }else{
      // file not found, we return empty
       $inhoud= "";
      }
      print $inhoud;
      

      像这样调用你的java

      <script type='text/javascript' src='js/merger_js.php?f=blackcan.js'></script>
      

      现在您的 javascript 文件已压缩发送到浏览器。确保您的服务器可以处理 gzip(通常默认安装)

      希望对你有帮助

      【讨论】:

      • 将php文件另存为merge.php
      • 但它没有合并任何东西。
      • 对不起,可能名字有误,应该命名为compress之类的。
      • 在这种情况下,压缩不是指传输压缩,而是 JavaScript 代码压缩(删除 cmets、不必要的空格、缩短变量名等)。
      • 这是一个带有潜在严重安全问题的坏例子。由于该示例未尝试验证 $f 的值或检查文件是否为 js 并且位于预期的目录中,因此几乎可以使用此代码提供任何文件。我的建议,不要使用这个。
      猜你喜欢
      • 1970-01-01
      • 2011-11-06
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多