PHP動態壓縮js,css

瀟湘隱者發表於2016-04-22

正式釋出產品時,我們希望將專案裡的js,css合併壓縮,以減少http請求、防止輕易檢視原始碼。

使用

只需要在頭部引入一下程式碼即可:

    <meta charset="utf-8"/>
    <title>demo</title>

    <?php
    //定義需要壓縮的檔案
    $css = array(
        CSS_PATH . `base.css`,
        CSS_PATH . `style.css`,
        CSS_PATH . `my.css`
    );

    $js = array(
        PUB_PATH . `/lib/zepto.min.js`,
        PUB_PATH . `/js/1.js`,
        JS_PATH . `2.js`,
    );

    $css_path = base_url(parse_css($css));
    $js_path = base_url(parse_script($js));

    ?>

    <link rel="stylesheet" type="text/css" href="<?php echo $css_path ?>">
    <script src="<?php echo $js_path ?>"></script>
    
    <!--下面可以繼續放不能壓縮或者不想壓縮的檔案-->
    <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

這段程式碼會在指定的目錄(例如common/)裡生成壓縮過後的js和css.每次更新了js,css內容,請先刪除生成的壓縮檔案。

示例:

4e387d5edce14cc2bd6396f6ebb7921b.css
 7c10211f113f3175489196d336d67734.js

注意:
編寫的css和js檔案一定要符合規範。例如一定要加分號。js的function可以不加分號。

引用的資源

/**
*   合併壓縮css
*/
function parse_css($urls)
{
    $url = md5(implode(`,`, $urls));
    $path = FCPATH. `static/parse/`;
    $css_url = $path . $url . `.css`;
    if (!file_exists($css_url)) {
        if (!file_exists($path))
            mkdir($path, 0777);
        $css_content = ``;

        foreach ($urls as $url) {
            $css_content .= @file_get_contents($url);
        }

        $css_content = str_replace("
", ``, $css_content); //清除換行符
        $css_content = str_replace("
", ``, $css_content); //清除換行符
        $css_content = str_replace("	", ``, $css_content); //清除製表符

        $css_content = str_replace("../images/", "./../common/images/", $css_content);
        @file_put_contents($css_url, $css_content);
    }

    $css_url = str_replace(FCPATH, ``, $css_url);
    return $css_url;
}

/**
*   合併壓縮js
*/
function parse_script($urls)
{
    $url = md5(implode(`,`, $urls));
    $path = FCPATH. `/static/parse/`;
    $js_url = $path . $url . `.js`;
    if (!file_exists($js_url)) {
        if (!file_exists($path))
            mkdir($path, 0777);

        load_qy_lib(`JavaScriptPacker`);

        $js_content = ``;
        foreach ($urls as $url) {
            $append_content = @file_get_contents($url) . "
";
            $packer = new JavaScriptPacker($append_content);
            $append_content = $packer->_basicCompression($append_content);
            $js_content .= $append_content;
        }
        @file_put_contents($js_url, $js_content);
    }

    $js_url = str_replace(FCPATH, ``, $js_url);
    return $js_url;
}

專案裡引用到第三方類庫JavaScriptPacker可以在github下載:

/**
 * 9 April 2008. version 1.1
 *
 * This is the php version of the Dean Edwards JavaScript`s Packer,
 * Based on :
 *
 * ParseMaster, version 1.0.2 (2005-08-19) Copyright 2005, Dean Edwards
 * a multi-pattern parser.
 * KNOWN BUG: erroneous behavior when using escapeChar with a replacement
 * value that is a function
 *
 * packer, version 2.0.2 (2005-08-19) Copyright 2004-2005, Dean Edwards
 *
 * License: http://creativecommons.org/licenses/LGPL/2.1/
 *
 * Ported to PHP by Nicolas Martin.
 *
 * ----------------------------------------------------------------------
 * changelog:
 * 1.1 : correct a bug, ` ` packed then unpacked becomes ``.
 * ----------------------------------------------------------------------
 *
 * Changes:
 * 2014-08-28: grkalik: change class for composer support. no functionality change.
 *
 */


相關文章