assetic / framework
PHP 资产管理框架
Requires
- php: ^7.3 || ^8.0
- ext-curl: *
- ext-json: *
- ext-simplexml: *
- symfony/deprecation-contracts: ^2.2.0 || ^3.0
- symfony/process: ^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0
Requires (Dev)
- meenie/javascript-packer: ^1.1
- phpspec/prophecy-phpunit: ^2.0
- phpunit/phpunit: ^9.5.8
- psr/log: ^1.0
- ptachoire/cssembed: ^1.0
- scssphp/scssphp: ^1.0
- symfony/phpunit-bridge: ^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0
- twig/twig: ^2.11
- wikimedia/less.php: ^3.0 || ^5.0
- wikimedia/minify: ^2.2
Suggests
- meenie/javascript-packer: The Assetic\Filter\PackerFilter requires meenie/javascript-packer
- ptachoire/cssembed: The Assetic\Filter\PhpCssEmbedFilter requires ptachoire/cssembed
- scssphp/scssphp: The Assetic\Filter\ScssphpFilter requires scssphp/scssphp
- twig/twig: Assetic provides an integration with the Twig templating engine
- wikimedia/less.php: The Assetic\Filter\LessphpFilter requires wikimedia/less.php
- wikimedia/minify: The Assetic\Filter\JavaScriptMinifierFilter && Assetic\Filter\CSSMinFilter requires wikimedia/minify
Replaces
- kriswallsmith/assetic: 1.4.0
This package is auto-updated.
Last update: 2024-09-14 05:49:26 UTC
README
Assetic 是一个由 Winter CMS 团队维护的 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\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 编译成 JavaScriptCssImportFilter
: 内联导入的样式表CSSMinFilter
: 最小化 CSSCssRewriteFilter
: 在移动到新 URL 时修复 CSS 资产中的相对 URLGoogleClosure\CompilerApiFilter
: 使用 Google Closure Compiler API 编译 JavaScriptHandlebarsFilter
: 将 Handlebars 模板编译成 JavaScriptJavaScriptMinifierFilter
: 最小化 JavaScriptJpegoptimFilter
: 优化您的 JPEG 图像JpegtranFilter
: 优化您的 JPEG 图像LessFilter
: 使用 less.js 和 node.js 将 LESS 解析为 CSSLessphpFilter
: 使用 lessphp 将 LESS 解析为 CSSOptiPngFilter
: 优化您的 PNG 图像PackerFilter
: 使用 Dean Edwards 的 Packer 压缩 JavaScriptPhpCssEmbedFilter
: 将图像数据嵌入到样式表中ReactJsxFilter
: 将 React JSX 编译成 JavaScriptScssphpFilter
: 将 SCSS 解析为 CSSSeparatorFilter
: 在资产之间插入分隔符以防止合并失败StylesheetMinifyFilter
: 压缩样式表 CSS 文件StylusFilter
: 将 STYL 解析为 CSSTailwindCssFilter
: 使用 Tailwind CSS 独立 CLI 工具构建 Tailwind CSS 样式表TypeScriptFilter
: 将 TypeScript 解析为 JavaScriptUglifyCssFilter
: 最小化 CSSUglifyJs2Filter
: 最小化 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,工厂创建的所有资产在返回之前都将传递给工作者的 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\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();
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 %}
这些资产需要写入到网络目录,这样这些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);