Drupal 5: Minify and aggregate all javascript files to increase page load time performance

Adding this code to your Drupal site can improve two sections of a YSlow report, “Make fewer HTTP requests” and “Minify JS”. This function minifies and aggregates your javascript into a single file. It requires the Google code library jsmin-php (http://code.google.com/p/jsmin-php/).

Stick this function in your template.php file in your theme directory:

<?php
function minify_scripts($scripts) {

  // define paths
  $jsMinFileName = 'jsmin_minified.js';
  $jsMinAbsolutePathDir = getcwd() . '/' . file_directory_path();
  $jsMinAbsolutePath = $jsMinAbsolutePathDir . '/' . $jsMinFileName;
  $jsMinRelativePath = base_path() . file_create_path($jsMinFileName);

  // check to see if file is writable
  if (
    (!file_exists($jsMinAbsolutePath) && !is_writable($jsMinAbsolutePathDir))
    ||
    (file_exists($jsMinAbsolutePath) && !is_writable($jsMinAbsolutePath))
    ) {
    return $scripts;
  }

  // include js minify library
  require_once('jsmin-1.1.1.php');

  // split $scripts on new line
  $exploded = explode("\n", trim($scripts));

  $minifiedJS = "";
  foreach ($exploded as $k => $v) {

    // ensure this line is javascript
    if (!(substr($v,0,7)=='<script' && substr($v,-9)=='</script>')) continue;

    // convert <script> to xml
    $xml = simplexml_load_string($v);

    if ($xml['type']=='text/javascript' && strlen($xml['src'])) {

      // define path to old file
      $oldFile = getcwd() . $xml['src'];

      // minify javascript
      $minifiedJS .= JSMin::minify(file_get_contents($oldFile));

      // unset exploded array entry
      unset($exploded[$k]);

    }

  }

  // check to see if javascript has not been minified
  if (strlen($minifiedJS)==0) return $scripts;

  // write file
  file_put_contents($jsMinAbsolutePath, $minifiedJS);

  // re-index array
  sort($exploded);

  // add entry
  $exploded[] = "<script type='text/javascript' src='$jsMinRelativePath'></script>";

  return implode("\n", $exploded);

}
?>

In your page.tpl.php theme file, replace this line:

<?php print $scripts ?>

with:

<?php print minify_scripts($scripts); ?>

You can also improve your score in the “Put JS at the bottom” section by ensuring this line of code resides at the bottom of your page.tpl.php file. I insert it just before this line:

<?php print $closure; ?>

Updated: