germania-kg/asset-timestamper

为您的网站资产提供文件修改时间戳。

2.0.8 2022-03-30 10:12 UTC

This package is auto-updated.

Last update: 2024-08-29 04:25:26 UTC


README

为您的网站资产提供文件修改时间戳。

Packagist PHP version Build Status Scrutinizer Code Quality Code Coverage Build Status

此可调用函数将在基础目录中查找指定的资产文件(例如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