germania-kg / asset-timestamper
为您的网站资产提供文件修改时间戳。
Requires
- php: ^5.6|^7.0
Requires (Dev)
- php-coveralls/php-coveralls: ^2.0
- phpunit/phpunit: ^5.7|^6.0|^7.0
README
为您的网站资产提供文件修改时间戳。
此可调用函数将在基础目录中查找指定的资产文件(例如CSS、JS通常),提取其 修改时间,并返回包含该时间戳的修改后的资产路径。
对于远程文件,将不会添加时间戳。AssetTimestamper将检查PHP的parse_url的结果数组中的host条目。
参见Chris Coyier的文章“缓存清除策略”,章节“更改文件名”。请注意——如Chris Coyier 指出,此技术可能会减慢服务器响应速度。仅对一些文件使用此技术应该没问题,注意不要过度使用。
使用Composer安装
$ composer require germania-kg/asset-timestamper
或者,直接将此包添加到您的composer.json中:
"require": { "germania-kg/asset-timestamper": "^2.0" }
从v1升级
在v1中,如果指定的资产不存在,则会抛出FileException。从版本2开始,将返回原始资产文件名。如果您之前没有看到此FileException,您无需做任何事情。所有其他用户都必须删除FileException捕获块。
弃用警告:该FileException类仍然随此包提供,将在版本3的发布版本中删除。在问题#1中讨论。
用法
您不需要有前置目录分隔符斜杠,因为它将“粘合”在内,如果需要的话。但是,结果将具有(或缺少)斜杠,具体取决于您如何传递资产文件名。
<?php use Germania\AssetTimestamper\AssetTimestamper; // Instantiation $at = new AssetTimestamper; // Both are equal echo $at( '/dist/styles.css' ); echo $at->__invoke( '/dist/styles.css' ); //even those, missing leading slash: echo $at( 'dist/styles.css' ); echo $at->__invoke( 'dist/styles.css' ); // Outputs something like: "/dist/styles/styles.20160522140459.css"
使用不同的基础路径
您可以为AssetTimestamper定义一个自定义目录,其中它应查找资产。当您的资产位于通过另一个(子)域名访问的目录中时,这很有用。假设您的项目目录如下所示
# Your current work dir, usually "www" subdomain
/var/www/project/htdocs
# Static files on a "static" subdomain
/var/www/project/static
/var/www/project/static/dist/styles.css
PHP和HTML的示例
使用另一个基础目录使用AssetTimestamper
<?php // Instantiation $at = new AssetTimestamper( "/var/www/project/static" ); echo '<link rel="stylesheet" type="text/css" href="//static.test.com' . $at( '/dist/styles.css' ) . '">';
HTML输出
<link rel="stylesheet" type="text/css" href="//static.test.com/dist/styles.20160522140459.css">
简单的Twig示例
echo $twig->render("website.tpl", [ 'stylesheets' => [ $at( 'dist/styles.css' ), $at( 'dist/widget.css' ) ] ]);
另一种Twig集成方式:过滤器
由于AssetTimestamper是可调用的,因此它可以很容易地用作Twig简单过滤器:
<?php $at = new AssetTimestamper( "/var/www/project/static" ), $filter = new Twig_SimpleFilter('add_timestamp', $at), $twig->addFilter( $filter );
因此,这样渲染网站
echo $twig->render("website.tpl", [ 'stylesheets' => [ 'dist/styles.css', 'dist/widget.css' ] ]);
…使用此Twig模板 …
{% for css in stylesheets %} <link rel="stylesheet" href="//static.test.com/{{ css|add_timestamp }}"> {% endfor %}
… 将导致以下输出
<link rel="stylesheet" href="//static.test.com/dist/styles.20160419100233.css"> <link rel="stylesheet" href="//static.test.com/dist/widget.20160413152259.css">
.htaccess
由于浏览器将请求修改后的文件名(实际上并不存在,至少以这个名称存在),您必须在您的 .htaccess中重写URL,如下所示
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.(\d+)\.(js|css)$ $1.$3 [L]
参见Chris Coyier的文章“缓存清除策略”,章节“更改文件名”,以及Stefano 对此的评论。
问题
目前没有已知问题,请自由地在问题页面上创建一个问题。
开发
$ git clone https://github.com/GermaniaKG/AssetTimestamper.git
$ cd AssetTimestamper
$ composer install
单元测试
可以选择将 phpunit.xml.dist
复制到 phpunit.xml
并根据您的需求进行调整,或者保持原样。运行 PhpUnit 测试或 composer 脚本,如下所示
$ composer test # or $ vendor/bin/phpunit