sunveloper / kriswallsmith-assetic
PHP的资产管理框架
Requires
- php: >=5.3.1
- symfony/process: ^2.0 || ^3.0 || ^4.0 || ^5.0
Requires (Dev)
- leafo/lessphp: ^0.5.0
- meenie/javascript-packer: ^1.1
- mrclay/minify: ^2.3.3 || ^3.0
- natxet/cssmin: 3.0.6
- patchwork/jsqueeze: ^1.0 || ^2.0
- phpunit/phpunit: ^4.8 || ^5.6 || ^6.0 || ^7.0 || ^8.0 || ^9.0
- psr/log: ^1.1.3
- ptachoire/cssembed: ^1.0.2
- scssphp/scssphp: ^1.2.1
- symfony/phpunit-bridge: ^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0
- twig/twig: ^1.23 || ^2.0 || ^3.0
- yfix/packager: dev-master
This package is not auto-updated.
Last update: 2024-09-22 04:12:50 UTC
README
Assetic是一个PHP的资产管理框架。
<?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的资产是有可过滤内容的对象,可以被加载和导出。资产还包括元数据,其中一些可以操作,一些是不可变的。
"目标路径"属性表示资产(或资产集合)应该导出到哪里。
过滤器
可以将过滤器应用于资产进行操作。
<?php use Assetic\Asset\AssetCollection; use Assetic\Asset\FileAsset; use Assetic\Asset\GlobAsset; use Assetic\Filter\LessFilter; use Assetic\Filter\Yui; $css = new AssetCollection(array( new FileAsset('/path/to/src/styles.less', array(new LessFilter())), new GlobAsset('/path/to/css/*'), ), array( new Yui\CssCompressorFilter('/path/to/yuicompressor.jar'), )); // this will echo CSS compiled by LESS and compressed by YUI echo $css->dump();
如果迭代集合,应用在集合上的过滤器将级联到每个资产叶节点。
<?php foreach ($css as $leaf) { // each leaf is compressed by YUI echo $leaf->dump(); }
核心在Assetic\Filter
命名空间中提供了以下过滤器
AutoprefixerFilter
:使用autoprefixer解析和更新特定供应商的属性CoffeeScriptFilter
:将CoffeeScript编译成JavaScriptCompassFilter
:Compass CSS创作框架CssEmbedFilter
:将图像数据嵌入到您的样式中CssImportFilter
:内联导入的样式表CssMinFilter
:压缩CSSCleanCssFilter
:压缩CSSCssRewriteFilter
:在移动到新URL时修复CSS资产中的相对URLDartFilter
:使用dart2js编译JavaScriptEmberPrecompileFilter
:预编译Handlebars模板为JavaScript,以便在Ember.js框架中使用GoogleClosure\CompilerApiFilter
:使用Google Closure Compiler API编译JavaScriptGoogleClosure\CompilerJarFilter
:使用Google Closure Compiler JAR编译JavaScriptGssFilter
:使用Google Closure Stylesheets Compiler编译CSSHandlebarsFilter
:将Handlebars模板编译为JavaScriptJpegoptimFilter
:优化您的JPEGJpegtranFilter
:优化您的JPEGJSMinFilter
:压缩JavaScriptJSMinPlusFilter
:压缩JavaScriptJSqueezeFilter
:压缩JavaScriptLessFilter
:将LESS解析为CSS(使用less.js和node.js)LessphpFilter
:将LESS解析为CSS(使用lessphp)OptiPngFilter
:优化您的PNGPackagerFilter
:解析包含打包标记的JavaScriptPackerFilter
:使用Dean Edwards的Packer压缩JavaScriptPhpCssEmbedFilter
:将图像数据嵌入到您的样式中PngoutFilter
:优化您的PNGReactJsxFilter
:将React JSX编译为JavaScriptSass\SassFilter
:将SASS解析为CSSSass\ScssFilter
:将SCSS解析为CSSSassphpFilter
:使用Libsass的sassphp绑定将Sass解析为CSSScssphpFilter
:使用scssphp解析SCSSSeparatorFilter
:在资产之间插入分隔符以防止合并失败SprocketsFilter
:Sprockets JavaScript依赖项管理StylusFilter
:将STYL解析为CSSTypeScriptFilter
:将TypeScript解析为JavaScriptUglifyCssFilter
:压缩CSSUglifyJs2Filter
:压缩JavaScriptUglifyJsFilter
:压缩JavaScriptYui\CssCompressorFilter
:使用YUI压缩器压缩CSSYui\JsCompressorFilter
:使用YUI压缩器压缩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\Sass\SassFilter; use Assetic\Filter\Yui; $fm = new FilterManager(); $fm->set('sass', new SassFilter('/path/to/parser/sass')); $fm->set('yui_css', new Yui\CssCompressorFilter('/path/to/yuicompressor.jar'));
资产工厂
如果您不想手动创建所有这些对象,可以使用资产工厂,它将为您完成大部分工作。
<?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 '?yui_css', // don't use this filter in debug mode )); echo $css->dump();
AssetFactory使用根目录构造,该目录作为相对资产路径的基础目录。
在过滤器名称前加问号,例如这里的yui_css
,当工厂处于调试模式时,该过滤器将被忽略。
您还可以在工厂上注册工作者,由工厂创建的所有资产在返回之前都会传递给工作者的process()
方法。下面是关于缓存失效的示例。
将资产导出到静态文件
您可以将AssetManager持有的所有资产导出到目录中的文件。这可能会在您的web服务器文档根目录下,以便静态提供文件。
<?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\Yui; $yui = new Yui\JsCompressorFilter('/path/to/yuicompressor.jar'); $js = new AssetCache( new FileAsset('/path/to/some.js', array($yui)), new FilesystemCache('/path/to/cache') ); // the YUI compressor will only run on the first call $js->dump(); $js->dump(); $js->dump();
Twig
要使用Assetic Twig 扩展,您必须将其注册到您的Twig环境中
<?php $twig->addExtension(new AsseticExtension($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
glob引用的每个资产。指定的过滤器仍然会被应用,除非它们使用?
前缀标记为可选。
您还可以通过在标签上设置debug
属性来触发此行为
{% stylesheets 'css/*' debug=true %} ... {% stylesheets %}
这些资产需要写入Web目录,以便这些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);