Minify inline JS and CSS (can be disable in configuration)

This commit is contained in:
Craig Andrews 2009-12-05 00:41:22 -05:00
parent 88e50003ae
commit c08d7f1aa4
3 changed files with 74 additions and 11 deletions

View File

@ -33,8 +33,15 @@ Author URI: http://candrews.integralblue.com/
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
// We bundle the minify library...
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/minify/min/lib');
class MinifyPlugin extends Plugin
{
private $minifyInlineJs = true;
private $minifyInlineCss = true;
const cacheKey = 'minify';
/**
* Add Minification related paths to the router table
@ -104,8 +111,58 @@ class MinifyPlugin extends Plugin
}
}
function minifyUrl($src) {
return common_local_url('minify',null,array('f' => $src ,v => STATUSNET_VERSION));
function onStartInlineScriptElement($action,&$code,&$type)
{
if($this->minifyInlineJs && $type=='text/javascript'){
$c = common_memcache();
if (!empty($c)) {
$cacheKey = common_cache_key(self::cacheKey . ':' . crc32($code));
$out = $c->get($cacheKey);
}
if(empty($out)) {
$out = $this->minifyJs($code);
}
if (!empty($c)) {
$c->set($cacheKey, $out);
}
if(!empty($out)) {
$code = $out;
}
}
}
function onStartStyleElement($action,&$code,&$type,&$media)
{
if($this->minifyInlineCss && $type=='text/css'){
$c = common_memcache();
if (!empty($c)) {
$cacheKey = common_cache_key(self::cacheKey . ':' . crc32($code));
$out = $c->get($cacheKey);
}
if(empty($out)) {
$out = $this->minifyCss($code);
}
if (!empty($c)) {
$c->set($cacheKey, $out);
}
if(!empty($out)) {
$code = $out;
}
}
}
function minifyUrl($src) {
return common_local_url('minify',null,array('f' => $src ,v => STATUSNET_VERSION));
}
static function minifyJs($code) {
require_once('JSMin.php');
return JSMin::minify($code);
}
static function minifyCss($code, $options = array()) {
require_once('Minify/CSS.php');
return Minify_CSS::minify($code,$options);
}
}

View File

@ -4,6 +4,10 @@ Note that if enabled this plugin and use a theme server,
(if any of $config['theme']['server'], $config['theme']['path'],
$config['theme']['dir'] are set) theme CSS will not be minified.
This plugin will use memcache, if it is available, for storing minified inline
and file javascript and css. Because minification is non-trivial, using
memcache is recommended.
Installation
============
add "addPlugin('minify',
@ -12,7 +16,16 @@ to the bottom of your config.php
Settings
========
None at the moment
minifyInlineJs (true): Minify inline javascript.
Because caching isn'tas effective for inline resources (due to its more
dynamic nature) than static files, minifying inline resources may adversely
affect performance for higher volume sites. Testing (and memcache usage)
are highly recommended.
minifyInlineCss (true): Minify inline CSS.
Because caching isn'tas effective for inline resources (due to its more
dynamic nature) than static files, minifying inline resources may adversely
affect performance for higher volume sites. Testing (and memcache usage)
are highly recommended.
Example
=======

View File

@ -19,9 +19,6 @@
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
// We bundle the minify library...
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/minify/min/lib');
class MinifyAction extends Action
{
const TYPE_CSS = 'text/css';
@ -30,8 +27,6 @@ class MinifyAction extends Action
// Apache default and what Yahoo! uses..
const TYPE_JS = 'application/x-javascript';
const cacheKey = 'minify';
var $file;
var $v;
@ -81,7 +76,7 @@ class MinifyAction extends Action
$c = common_memcache();
if (!empty($c)) {
$cacheKey = common_cache_key(self::cacheKey . ':' . $this->file . '?v=' . empty($this->v)?'':$this->v);
$cacheKey = common_cache_key(MinifyPlugin::cacheKey . ':' . $this->file . '?v=' . empty($this->v)?'':$this->v);
$out = $c->get($cacheKey);
}
if(empty($out)) {
@ -102,16 +97,14 @@ class MinifyAction extends Action
$info = pathinfo($file);
switch(strtolower($info['extension'])){
case 'js':
require_once('JSMin.php');
$out = JSMin::minify(file_get_contents($file));
$out = MinifyPlugin::minifyJs(file_get_contents($file));
header('Content-Type: ' . self::TYPE_JS);
break;
case 'css':
require_once('Minify/CSS.php');
$options = array();
$options['currentDir'] = dirname($file);
$options['docRoot'] = INSTALLDIR;
$out = Minify_CSS::minify(file_get_contents($file),$options);
$out = MinifyPlugin::minifyCss(file_get_contents($file),$options);
header('Content-Type: ' . self::TYPE_CSS);
break;
default: