omissis/bundlefu

此包已被废弃且不再维护。未建议替代包。

BundleFu 是一个 PHP 5.3+ 库,可以将多个 CSS/JavaScript 文件捆绑成一个大的包,并一次性发送。

v0.9.5 2012-09-17 12:39 UTC

This package is auto-updated.

Last update: 2022-02-01 12:21:25 UTC


README

Build Status

BundleFu 是一个 PHP 5.3+ 库,可以将多个 CSS/JavaScript 文件捆绑成一个大的包,并一次性发送。

注意:如果您需要 BundleFu 的 PHP 5.2 版本,请切换到 5.2 分支

它高度灵感来源于 Ruby on Rails 插件 bundle-fu

简而言之,它可以将这个

<script type="text/javascript" src="/js/jquery.js"></script>
<script type="text/javascript" src="/js/jquery.myplugin.js"></script>
<script type="text/javascript" src="/js/app.js"></script>
<script type="text/javascript" src="/js/app.module.js"></script>
<link media="screen" type="text/css" href="/css/reset.css">
<link media="screen" type="text/css" href="/css/jquery.myplugin.css">
<link media="screen" type="text/css" href="/css/app.css">
<link media="screen" type="text/css" href="/css/app.module.css">

转换为这个

<link href="/css/cache/bundle_3f84da97fc873ca8371a8203fcdd8a82.css?1234567890" rel="stylesheet" type="text/css">
<script src="/js/cache/bundle_3f84da97fc873ca8371a8203fcdd8a82.js?1234567890" type="text/javascript"></script>

特性

  • 自动检测 CSS 和 JavaScript 文件的修改,并自动重新生成捆绑包。
  • 捆绑内容可以通过过滤器进行修改,例如 CSS URL 重写以避免损坏的图像、代码压缩和压缩等。(该库包含一个使用 Google Closure Compiler 的过滤器,该过滤器通过 服务 API 提供)。
  • 能够在 Rackspace Cloudfiles 上存储生成的捆绑包。

安装

可以使用 Composer 工具安装 BundleFu。您可以将 dotsunited/bundlefu 添加到 composer.json 中的依赖项,或者如果要将 BundleFu 作为独立包安装,请转到主目录并运行

$ wget https://getcomposer.org.cn/composer.phar
$ php composer.phar install

然后您可以使用由 composer 生成的自动加载器来访问 BundleFu 类

<?php
require 'vendor/autoload.php';
?>

如果您需要将捆绑包上传到 Rackspace Cloudfiles,则需要注册提供的流包装器

<?php
require_once 'Drupal/shims.inc';
require_once 'Drupal/includes/file.inc';
require_once 'Drupal/includes/stream_wrappers.inc';
require_once 'Drupal/rackspacecloudfiles_streams.inc';

variable_set('rackspace_cloud_api_key',    $apiKey);
variable_set('rackspace_cloud_auth_url',   $authUrl);
variable_set('rackspace_cloud_container',  $containerName);
variable_set('rackspace_cloud_cdn_domain', $cdnContainerUrl);
variable_set('rackspace_cloud_username',   $username);

stream_wrapper_register('rscf', 'RackspaceCloudFilesStreamWrapper')
    or die("Failed to register rscf:// protocol");
?>

使用方法

配置 Bundle 实例

<?php
$bundle = new \DotsUnited\BundleFu\Bundle();

$bundle
    // Set the document root
    ->setDocRoot('/path/to/your/document_root')

    // Set the css cache path (relative to the document root)
    ->setCssCachePath('css/cache')

    // Set the javascript cache path (relative to the document root)
    ->setJsCachePath('js/cache');
?>

或者,您可以将选项数组传递给构造函数(或稍后使用 setOptions 方法)

<?php
$options = array(
    'doc_root' => '/path/to/your/document_root',
    'css_cache_path' => 'css/cache',
    'js_cache_path' => 'js/cache',
);

$bundle = new \DotsUnited\BundleFu\Bundle($options);
?>

使用实例在模板中捆绑您的文件

<?php $bundle->start(); ?>
<script type="text/javascript" src="/js/jquery.js"></script>
<script type="text/javascript" src="/js/jquery.myplugin.js"></script>
<script type="text/javascript" src="/js/app.js"></script>
<script type="text/javascript" src="/js/app.module.js"></script>
<link media="screen" type="text/css" href="/css/reset.css">
<link media="screen" type="text/css" href="/css/jquery.myplugin.css">
<link media="screen" type="text/css" href="/css/app.css">
<link media="screen" type="text/css" href="/css/app.module.css">
<?php $bundle->end(); ?>

将捆绑的 <script><link> 标签输出到您想要的位置

<?php
// Renders both <script> and <link> tags
echo $bundle->render();

// Renders the <link> tag only
echo $bundle->renderCss();

// Renders the <script> tag only
echo $bundle->renderJs();
?>

使用工厂

您还可以使用工厂来创建捆绑实例。优点是工厂可以持有全局选项(如 bypassdoc_root),这些选项可以跨所有创建的捆绑包共享

<?php
$options = array(
    'doc_root' => '/path/to/your/document_root',
    'css_cache_path' => 'css/cache',
    'js_cache_path' => 'js/cache',
);

$factory = new \DotsUnited\BundleFu\Factory($options);

// $bundle1 and $bundle2 use the same doc_root, css_cache_path and js_cache_path options
$bundle1 = $factory->createBundle();
$bundle2 = $factory->createBundle();
?>

您可以将特定选项传递给 createBundle 方法(全局工厂选项将被覆盖)

<?php
$bundle1 = $factory->createBundle(array('name' => 'bundle1', 'doc_root' => '/path/to/another/document_root'));
$bundle2 = $factory->createBundle(array('name' => 'bundle2'));
?>

工厂还允许您为过滤器定义名称别名。然后您可以为 css_filterjs_filter 选项定义字符串别名,而不是传递过滤器实例

<?php
$filters = array(
    'js_closure_compiler' => new \DotsUnited\BundleFu\Filter\ClosureCompilerServiceFilter()
);

$factory = new \DotsUnited\BundleFu\Factory(array(), $filters);

$bundle1 = $factory->createBundle(array('js_filter' => 'js_closure_compiler'));
?>

过滤器

您可以使用过滤器来操作加载的 CSS/JavaScript 文件以及捆绑的 CSS/JavaScript 代码。过滤器是实现了 DotsUnited\BundleFu\Filter\FilterInterface 接口的类。

您可以通过以下方式添加过滤器

<?php
$bundle->setCssFilter(new MyCssFilter());
$bundle->setJsFilter(my MyJsFilter());
?>

如果您需要多个过滤器,可以使用 DotsUnited\BundleFu\Filter\FilterChain 如此

<?php
$filterChain = new \DotsUnited\BundleFu\Filter\FilterChain();

$filterChain->addFilter(new MyCssFilter1());
$filterChain->addFilter(new MyCssFilter2());

$bundle->setCssFilter($filterChain);
?>

默认过滤器

BundleFu 默认提供以下过滤器。

CssUrlRewriteFilter

DotsUnited\BundleFu\Filter\CssUrlRewriteFilter 用于将CSS文件中的相对URL重写,以避免图像引用错误。

<?php
$bundle->setCssFilter(new \DotsUnited\BundleFu\Filter\CssUrlRewriteFilter());
?>

注意:除非您自己设置了CSS过滤器,否则此过滤器将自动为每个包注册为默认CSS过滤器。

CssOptimizeFilter

DotsUnited\BundleFu\Filter\CssOptimizeFilter 执行一些任务以减小您的CSS文件大小。

<?php
$bundle->setCssFilter(new \DotsUnited\BundleFu\Filter\CssOptimizeFilter());
?>

ClosureCompilerServiceFilter

此过滤器使用Google Closure CompilerService API编译javascript代码。

只需添加DotsUnited\BundleFu\Filter\ClosureCompilerServiceFilter过滤器,您的javascript包将自动编译。

<?php
$bundle->setJsFilter(new \DotsUnited\BundleFu\Filter\ClosureCompilerServiceFilter());
?>

CallbackFilter

DotsUnited\BundleFu\Filter\CallbackFilter可以使用任何PHP回调进行过滤。如果您想使用YUI Compressor压缩CSS,您可以选择编写自定义过滤器或使用以下代码利用Callback过滤器。

<?php
$filter = new \DotsUnited\BundleFu\Filter\CallbackFilter(function($content) {
    $descriptorspec = array(
         0 => array('pipe', 'r'),  // STDIN
         1 => array('pipe', 'w'),  // STDOUT
         2 => array('pipe', 'a')   // STDERR
    );

    $handle = proc_open('java -jar /path/to/yuicompressor.jar --type css' , $descriptorspec, $pipes);

    if (is_resource($handle)) {
        fwrite($pipes[0], $content);
        fclose($pipes[0]);

        $compressed = stream_get_contents($pipes[1]);
        fclose($pipes[1]);

        proc_close($handle);

        if ($compressed) {
            return $compressed;
        }
    }

    return $content;
});

$bundle->setCssFilter($filter);
?>

注意事项

  • $bundle->start()$bundle->end()之间所有内容都将丢失。请确保只将css/javascript包含在块内。

  • 通过解析输出并查找包含文件来检测脚本和样式表。HTML注释将被忽略,因此如果像这样注释掉一个脚本

    <!-- <script src="/js/script.js" type="text/javascript"></script> -->

    注释将被忽略,文件仍然会被打包。请确保通过PHP进行注释。

    <?php /* <script src="/js/script.js" type="text/javascript"></script> */ ?>
  • 通过查询字符串加载的外部依赖项将不起作用。

    <script src="/js/scriptaculous.js?load=effects,controls" type="text/javascript"></script>

    相反,您需要像往常一样包含每个javascript文件。

许可证

BundleFu在新BSD许可证下发布。