assetic — это платформа управления активами для PHP, поддерживаемая командой Winter CMS.
<?php
use assetic Asset AssetCollection ;
use assetic Asset FileAsset ;
use assetic Asset GlobAsset ;
$ js = new AssetCollection ( array (
new GlobAsset ( ' /path/to/js/* ' ),
new FileAsset ( ' /path/to/another.js ' ),
));
// the code is merged when the asset is dumped
echo $ js -> dump ();
assetic актив — это что-то с фильтруемым контентом, который можно загружать и выгружать. Ресурс также включает метаданные, некоторыми из которых можно манипулировать, а некоторые являются неизменяемыми.
Свойство | Аксессор | Мутатор |
---|---|---|
содержание | получить контент | setContent |
время | getLastModified | н/д |
исходный корень | getSourceRoot | н/д |
исходный путь | GetSourcePath | н/д |
целевой путь | getTargetPath | SetTargetPath |
Свойство «целевой путь» указывает, куда следует сбросить актив (или коллекцию ресурсов).
Для управления активами можно применять фильтры.
<?php
use assetic Asset AssetCollection ;
use assetic Asset FileAsset ;
use assetic Asset GlobAsset ;
use assetic Filter LessFilter ;
use assetic Filter UglifyCssFilter ;
$ css = new AssetCollection ( array (
new FileAsset ( ' /path/to/src/styles.less ' , array ( new LessFilter ())),
new GlobAsset ( ' /path/to/css/* ' ),
), array (
new UglifyCssFilter ( ' /path/to/uglifycss ' ),
));
// this will echo CSS compiled by LESS and compressed by uglifycss
echo $ css -> dump ();
Фильтры, примененные к коллекции, будут каскадно применяться к каждому листу ресурса, если вы выполните итерацию по нему.
<?php
foreach ( $ css as $ leaf ) {
// each leaf is compressed by uglifycss
echo $ leaf -> dump ();
}
Ядро предоставляет следующие фильтры в пространстве имен assetic Filter
:
CoffeeScriptFilter
: компилирует CoffeeScript в Javascript.CssImportFilter
: встраивает импортированные таблицы стилей.CSSMinFilter
: минимизирует CSS.CssRewriteFilter
: исправляет относительные URL-адреса в ресурсах CSS при переходе на новый URL-адрес.GoogleClosureCompilerApiFilter
: компилирует Javascript с помощью API компилятора Google Closure.HandlebarsFilter
: компилирует шаблоны Handlebars в Javascript.JavaScriptMinifierFilter
: минимизирует JavascriptJpegoptimFilter
: оптимизируйте ваши файлы JPEG.JpegtranFilter
: оптимизируйте ваши JPEG-файлы.LessFilter
: анализирует LESS в CSS (используя less.js с node.js)LessphpFilter
: анализирует LESS в CSS (используя lessphp).OptiPngFilter
: оптимизируйте ваши PNGPackerFilter
: сжимает Javascript с помощью Packer Дина Эдвардса.PhpCssEmbedFilter
: встраивает данные изображения в вашу таблицу стилей.ReactJsxFilter
: компилирует React JSX в JavaScript.ScssphpFilter
: анализирует SCSS в CSS.SeparatorFilter
: вставляет разделитель между ресурсами для предотвращения ошибок слияния.StylesheetMinifyFilter
: сжимает CSS-файлы таблицы стилей.StylusFilter
: анализирует STYL в CSS.TailwindCssFilter
: создает таблицу стилей Tailwind CSS с помощью автономной утилиты интерфейса командной строки Tailwind CSS.TypeScriptFilter
: анализирует TypeScript в Javascript.UglifyCssFilter
: минимизирует CSS.UglifyJs2Filter
: минимизирует JavascriptUglifyJs3Filter
: минимизирует Javascript Для организации активов предусмотрен менеджер активов.
<?php
use assetic AssetManager ;
use assetic Asset FileAsset ;
use assetic Asset GlobAsset ;
$ am = new AssetManager ();
$ am -> set ( ' jquery ' , new FileAsset ( ' /path/to/jquery.js ' ));
$ am -> set ( ' base_css ' , new GlobAsset ( ' /path/to/css/* ' ));
Менеджер активов также можно использовать для ссылки на активы, чтобы избежать дублирования.
<?php
use assetic Asset AssetCollection ;
use assetic Asset AssetReference ;
use assetic Asset FileAsset ;
$ am -> set ( ' my_plugin ' , new AssetCollection ( array (
new AssetReference ( $ am , ' jquery ' ),
new FileAsset ( ' /path/to/jquery.plugin.js ' ),
)));
Для организации фильтров также предусмотрен менеджер фильтров.
<?php
use assetic FilterManager ;
use assetic Filter ScssFilter ;
use assetic Filter CssMinFilter ;
$ fm = new FilterManager ();
$ fm -> set ( ' sass ' , new ScssFilter ( ' /path/to/parser/scss ' ));
$ fm -> set ( ' cssmin ' , new CssMinFilter ());
Если вы не хотите создавать все эти объекты вручную, вы можете использовать фабрику активов, которая сделает большую часть работы за вас.
<?php
use assetic Factory AssetFactory ;
$ factory = new AssetFactory ( ' /path/to/asset/directory/ ' );
$ factory -> setAssetManager ( $ am );
$ factory -> setFilterManager ( $ fm );
$ factory -> setDebug ( true );
$ css = $ factory -> createAsset ( array (
' @reset ' , // load the asset manager's "reset" asset
' css/src/*.scss ' , // load every scss files from "/path/to/asset/directory/css/src/"
), array (
' scss ' , // filter through the filter manager's "scss" filter
' ?cssmin ' , // don't use this filter in debug mode
));
echo $ css -> dump ();
AssetFactory
имеет корневой каталог, который используется в качестве базового каталога для относительных путей к ресурсам.
Добавление к имени фильтра знака вопроса, как здесь cssmin
, приведет к тому, что этот фильтр будет опущен, когда фабрика находится в режиме отладки.
Вы также можете зарегистрировать Workers на фабрике, и все созданные ею активы будут переданы в метод worker process()
перед возвратом. Пример см. в разделе «Очистка кэша» ниже.
Вы можете сбросить все ресурсы, которые хранит AssetManager, в файлы в каталоге. Вероятно, он будет находиться ниже корня документа вашего веб-сервера, поэтому файлы можно будет обслуживать статически.
<?php
use assetic AssetWriter ;
$ writer = new AssetWriter ( ' /path/to/web ' );
$ writer -> writeManagerAssets ( $ am );
При этом будет использоваться целевой путь активов.
Если вы обслуживаете свои ресурсы из статических файлов, как только что описано, вы можете использовать CacheBustingWorker, чтобы переписать целевые пути для ресурсов. Перед расширением имени файла будет вставлен идентификатор, уникальный для конкретной версии ресурса.
Этот идентификатор основан на времени модификации актива, а также будет учитывать зависимые активы, если примененные фильтры поддерживают его.
<?php
use assetic Factory AssetFactory ;
use assetic Factory Worker CacheBustingWorker ;
$ factory = new AssetFactory ( ' /path/to/asset/directory/ ' );
$ factory -> setAssetManager ( $ am );
$ factory -> setFilterManager ( $ fm );
$ factory -> setDebug ( true );
$ factory -> addWorker ( new CacheBustingWorker ());
$ css = $ factory -> createAsset ( array (
' @reset ' , // load the asset manager's "reset" asset
' css/src/*.scss ' , // load every scss files from "/path/to/asset/directory/css/src/"
), array (
' scss ' , // filter through the filter manager's "scss" filter
' ?yui_css ' , // don't use this filter in debug mode
));
echo $ css -> dump ();
Предусмотрен простой механизм кэширования, позволяющий избежать ненужной работы.
<?php
use assetic Asset AssetCache ;
use assetic Asset FileAsset ;
use assetic Cache FilesystemCache ;
use assetic Filter JavaScriptMinifierFilter ;
$ jsMinifier = new JavaScriptMinifierFilter ();
$ js = new AssetCache (
new FileAsset ( ' /path/to/some.js ' , array ( $ jsMinifier )),
new FilesystemCache ( ' /path/to/cache ' )
);
// the JavaScriptMinifierFilter compressor will only run on the first call
$ js -> dump ();
$ js -> dump ();
$ js -> dump ();
Чтобы использовать расширение assetic Twig, вы должны зарегистрировать его в своей среде Twig:
<?php
$ twig -> addExtension ( new assetic Extension ( $ factory ));
После установки расширение предоставляет таблицы стилей и тег javascripts с синтаксисом, аналогичным тому, который использует фабрика активов:
{% stylesheets '/path/to/sass/main.sass' filter = 'sass,?yui_css' output = 'css/all.css' %}
< link href = " {{ asset_url }} " type = " text/css " rel = " stylesheet " />
{% endstylesheets %}
В этом примере на странице будет отображаться один элемент link
, содержащий URL-адрес, по которому можно найти отфильтрованный ресурс.
Когда расширение находится в режиме отладки, этот же тег будет отображать несколько элементов link
, по одному для каждого ресурса, на который ссылается глобус css/src/*.sass
. Указанные фильтры будут по-прежнему применяться, если они не помечены как необязательные с помощью ?
префикс.
Это поведение также можно вызвать, установив атрибут debug
в теге:
{% stylesheets 'css/*' debug = true %} ... {% stylesheets %}
Эти ресурсы необходимо записать в веб-каталог, чтобы эти URL-адреса не возвращали ошибки 404.
<?php
use assetic AssetWriter ;
use assetic Extension Twig TwigFormulaLoader ;
use assetic Extension Twig TwigResource ;
use assetic Factory LazyAssetManager ;
$ am = new LazyAssetManager ( $ factory );
// enable loading assets from twig templates
$ am -> setLoader ( ' twig ' , new TwigFormulaLoader ( $ twig ));
// loop through all your templates
foreach ( $ templates as $ template ) {
$ resource = new TwigResource ( $ twigLoader , $ template );
$ am -> addResource ( $ resource , ' twig ' );
}
$ writer = new AssetWriter ( ' /path/to/web ' );
$ writer -> writeManagerAssets ( $ am );
assetic основан на библиотеке веб-бассетов Python (доступна на GitHub).