background image

Content tagged with: yslow

Eric's picture

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;
?>

Eric's picture

In an effort to decrease page load times I implemented the following code in a Drupal module to minify my javascript using jsmin-php (http://code.google.com/p/jsmin-php/).

<?php
// define module path
$modulePath = drupal_get_path('module','MYMODULE');
   
// define javascript file
$jsFile = 'MYMODULE.js';

// define minified javascript filename
$jsFileMin = 'MYMODULE_minified.js';
   
if (
is_writable($modulePath . '/' . $jsFileMin)) {
  require_once(
'jsmin-1.1.1.php');
 
$newJS = JSMin::minify(file_get_contents($modulePath . '/' . $jsFile));
 
file_put_contents($modulePath . '/' . $jsFileMin, $newJS);
 
drupal_add_js($modulePath . '/' . $jsFileMin);
} else {
 
// add module javascript
 
drupal_add_js($modulePath . '/' . $jsFile);       
}
?>