aklatzke / asset-funnel
基于每页自动打包所有请求的资产。
Requires
- josegonzalez/dotenv: ^1.2
This package is not auto-updated.
Last update: 2024-10-02 18:55:17 UTC
README
aklatzke/asset-funnel
一个小巧且灵活的带有内置缓存的资产加载器。
####安装
安装 Composer。
将以下内容添加到您的 composer.json
文件中的 require
块
"aklatzke/asset-funnel" : "dev-master"
在您的命令行中运行 composer update
。
在您的应用程序中,使用 require_once('/path/to/vendor/autoload.php');
。
-- ####要求
加载环境变量,且 PHP >= 5.6。
如果使用 require-dev
,josegonzalez/phpdotenv 将作为依赖项安装。
-- ####配置
首先,确保您的环境中定义了以下变量
FUNNEL_STORAGE_PATH
您可以将此设置为应用程序中的任何临时或存储文件夹。这是库将存储缓存的和合并的文件的地方。
导入命名空间: use Aklatzke\Funnel\Funnel
;
接下来,创建一个指定输出文件类型的 funnel 实例
$jsFunnel = ( new Funnel('.js') );
$cssFunnel = ( new Funnel('.css') );
您可能希望将类加载到服务容器中,以便您可以在整个应用程序中访问它们,以便从多个页面添加资产(例如,在单独的部分或页面上添加脚本)。请参阅您自己的容器文档,只需记住将其创建为单例。
-- ####添加资产
Funnel
类接受本地和外部资源。当使用 ->bundle()
方法将唯一的文件组合(本地和外部)组合在一起时,会创建一个唯一的哈希值来引用该文件组合。如果再次请求相同的组合,则将使用缓存的和合并的版本,从而实现单个文件请求而不是多个。
添加本地资源
$jsFunnel->add('/absolute/path/to/file.js');
添加外部资源
$jsFunnel->addExternal('http://path-to-remote/file-version-1.0.js');
外部资源将自动下载,这意味着一旦构建了缓存文件,您就不再需要为该文件发送 HTTP 请求。
您还可以添加任意字符串: $requestLog->add('Remote IP: ' . $_SERVER['REMOTE_ADDR']);
-- ####加载资源
有两种方法可以加载您的资产,但两种方法的第一个步骤都是运行 bundle
方法
$jsFunnel->bundle('/application/base/path');
这返回文件内容的一个字符串,所以如果您愿意,可以直接将其输出到您的页面
<?php $criticalCSSFunnel->add('/path/to/critical.css'); ?> <head> .. head content .. <style><?php echo $criticalCSSFunnel->bundle(); ?></style> </head>
如果这不是您的风格,您也可以获取文件路径并将其放入一个标签中
<?php $jsFunnel->addExternal('http://some-jquery-cdn/jquery-x.x.js'); $jsFunnel->bundle(); $jsPath = $jsFunnel->getPath(); ?> <script type="text/javascript" src="<?php echo $jsPath; ?>"></script> </body>
只要文件名保持一致,文件就会缓存。
-- ####缓存破坏
如果在开发环境中,您可以运行一个“dry run”的 bundle,这将继续下载文件而不是引用缓存版本
use Aklatzke\Funnel\Funnel; $funnel = ( new Funnel('.json', Funnel::DRY_RUN) );
在实时服务器上,您可以添加查询参数
$funnel->add('data-1.json?v=1.0.1');
如果外部库的版本号发生变化,则将重新下载。
您还可以重新使用 string
方法来使缓存失效
$funnel->string('// Version 1.0.1'); $funnel->add('index.js');
只需在 string
方法中更新版本号,这将导致库读取文件并刷新缓存。这是一种有效地对缓存文件进行版本控制的方法,因为您可以回退字符串版本,并且之前的文件将被引用。
用途
- 日志文件
(new Funnel('.log'))->string('Some log statment');
- CSS
(new Funnel('.css'))->add('arbitrary.css')->add('arbitrary2.css')->bundle()
; - JS
(new Funnel('.css'))->add('arbitrary.js')->add('arbitrary2.js')->bundle()
; - 配置文件
- 动态页面
require( (new Funnel('.php'))->add('header.htm')->add('requested-page.htm')->add('footer.htm')->bundle()->getPath() )
;
即将推出
- 测试
- 文件分隔符(例如,在每个javascript文件前传递';')
贡献
我愿意接受与库当前关注点紧密耦合的功能或扩展其适用于其他文件类型的实用性的PR。