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); } 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 class MinifyPlugin extends Plugin
{ {
private $minifyInlineJs = true;
private $minifyInlineCss = true;
const cacheKey = 'minify';
/** /**
* Add Minification related paths to the router table * Add Minification related paths to the router table
@ -104,8 +111,58 @@ class MinifyPlugin extends Plugin
} }
} }
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) { function minifyUrl($src) {
return common_local_url('minify',null,array('f' => $src ,v => STATUSNET_VERSION)); 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'], (if any of $config['theme']['server'], $config['theme']['path'],
$config['theme']['dir'] are set) theme CSS will not be minified. $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 Installation
============ ============
add "addPlugin('minify', add "addPlugin('minify',
@ -12,7 +16,16 @@ to the bottom of your config.php
Settings 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 Example
======= =======

View File

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