omissis / bundlefu
BundleFu 是一个 PHP 5.3+ 库,可以将多个 CSS/JavaScript 文件捆绑成一个大的包,并一次性发送。
Requires
- php: >=5.3.3
- omissis/php-cloudfiles: 1.7.12
README
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(); ?>
使用工厂
您还可以使用工厂来创建捆绑实例。优点是工厂可以持有全局选项(如 bypass
和 doc_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_filter
和 js_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 Compiler和Service 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许可证下发布。