chh / pipe
将您的资源放入Pipe中并对其进行处理。
Requires
- php: >=5.3.3
- chh/fileutils: ~1.0@dev
- chh/meta-template: ~1.0@dev
- chh/shellwords: ~0.1
- monolog/monolog: ~1.0
- psr/log: ~1.0
- symfony/yaml: ~2.0
- ulrichsg/getopt-php: @dev
Requires (Dev)
- chh/bob: 1.0.*@dev
- imagine/imagine: ~0.4
- mikey179/vfsstream: ~1.1
- phpunit/phpunit: ~3.7
- react/http: ~0.2.0
- symfony/http-kernel: ~2.1
Suggests
- imagine/imagine: Enable image compressors
- react/http: Enable the standalone asset server (~0.2.0)
- symfony/http-kernel: Enable dynamic asset serving with Pipe\Server
This package is not auto-updated.
Last update: 2024-09-14 13:18:01 UTC
README
将您的资源放入pipe中并对其进行处理。
Pipe是一种资产管线,灵感来自Sprockets。它旨在作为管理资产的实际方法。它旨在提供一套实用的配置来管理资产,并支持网络环境中常见的预处理器语言,如CoffeeScript或LESS。
Pipe为您提供什么
- 对Less和CoffeeScript的原生支持
- 集成依赖管理。
- 支持多个资产加载路径,允许您将应用程序的库与供应商库分离。
- 通过设计用于处理缓存破坏和压缩,试图减轻资产部署的痛苦。
安装
获取composer(如果您还没有的话)
wget https://getcomposer.org.cn/composer.phar
然后在项目的根目录下的 composer.json
中添加此内容
{
"require": {
"chh/pipe": "*"
}
}
现在进行安装
php composer.phar install
入门
环境
首先您需要一个 Pipe\Environment
实例。环境包含您的加载路径,用于检索资产,并将处理器/引擎映射到您的资产。
环境由多个加载路径组成。检索资产时,会在加载路径的每个目录中进行查找。这样您可以将资产分布在多个目录中,例如 vendor_assets
和 assets
。
要添加一些加载路径,请使用 appendPath
方法。可以使用 prependPath
方法将路径前置,但请谨慎使用,因为您可以通过这种方式覆盖资产。
<?php use Pipe\Environment; $env = new Environment; $env->appendPath("assets"); $env->appendPath("vendor_assets");
通过访问环境实例的索引或调用 find
方法来检索资产。
find
方法在没有找到资产时返回 null
,或者返回一个资产实例。
<?php $asset = $env["js/application.js"]; # equal to: $asset = $env->find("js/application.js");
要获取资产的经过处理的主体,请使用 getBody
方法。
<?php echo $asset->getBody();
您可以使用 getLastModified
方法获取资产的最后修改时间戳。
将资产导出到文件
要将资产导出到文件,请使用 write
方法。
write
方法接受一个选项数组
dir (string)
:目录是文件的名称前缀。资产内容的哈希值会自动包含在生成的文件名中。include_digest (bool)
:是否应将资产内容的SHA1哈希值包含在文件名中?compress (bool)
:使用GZIP压缩内容,并以.gz
扩展名写入。
启用压缩
您可以通过设置 js_compressor
和 css_compressor
配置键,或在环境实例上调用 setJsCompressor
或 setCssCompressor
来开启压缩。
支持的JavaScript压缩器
uglify_js
,使用NodeJS上构建的流行的Uglify JS压缩器。使用npm -g install uglify-js
进行安装。yuglify_js
,基于Uglify JS构建的压缩器,行为类似于YUI压缩器。使用npm -g install yuglify
进行安装。
支持的CSS压缩器
yuglify_css
,使用Yuglify压缩器的功能,通过CSSmin压缩CSS。需要yuglify
NPM包。
示例
<?php $env = new Environment; $env->appendPath("assets/stylesheets"); $env->appendPath("assets/vendor/stylesheets"); $env->appendPath("assets/javascripts"); $env->appendPath("assets/vendor/javascripts"); $env->setJsCompressor('yuglify_js'); $env->setCssCompressor('yuglify_css'); # Compressors are Bundle Processors. Bundle Processors are only run on Bundled Assets. # Pass 'bundled' => true to get a Bundled Asset. $asset = $env->find('application.js', ['bundled' => true]); echo $asset->getBody();
指令
每个内容类型为application/javascript
或text/css
的文件都会被DirectiveProcessor
处理。该处理器会解析这些文件的头部,寻找以等号开始的特殊注释。
/* CSS
*= require foo.css
*= depend_on bar.css
*/
# CoffeeScript
#= require foo.coffee
// Javascript
//= require foo.js
每个指令的参数由Bourne Shell的规则分割。这意味着你需要用单引号或双引号引用包含空格的参数。
//= require "some name with spaces.js"
require
用法
require <path>
require指令接受一个资产路径作为参数,处理该资产,并在资产的之前插入依赖项的内容。
路径也可以以./
开头,这意味着在路径解析时跳过加载路径,并在当前资产的同一路径中查找文件。
depend_on
用法
depend_on <path>
定义path
是当前资产的依赖项,但不进行处理。以这种方式定义的资产在计算最后修改时间时会被考虑,但内容不会被添加。
require_tree
用法
require_tree <path>
要求加载指定路径目录下找到的所有文件。
例如,如果你有一个包含所有单个小工具和小工具基原型的目录,那么你可以require_tree
widgets/
目录。这样,每个开发者只需将文件放入widgets/
目录,而不必维护一个庞大的单个资产列表。
// index.js
//= require ./widget_base
//= require_tree ./widgets
引擎
引擎用于在资产被导出之前处理它们。每个引擎都映射到一个或多个文件扩展名(例如,CoffeeScript映射到.coffee
)。每个资产可以由一个或多个引擎处理。资产上使用的引擎及其顺序由资产的文件扩展名确定。
例如,为了首先通过PHP引擎处理资产,然后通过LESS编译器处理,给资产添加.less.php
后缀。
以下是默认提供的引擎及其与文件扩展名的映射列表
在内部,管道引擎是meta-template模板。查看其README
以获取有关构建您自己的引擎的更多信息。
要向Pipe添加一个引擎类,请使用环境的registerEngine
方法,该方法将引擎的类名作为第一个参数,将扩展名数组作为第二个参数。
动态服务资产。
Pipe包括一个Pipe\Server
,该服务器能够通过HTTP动态地提供资产。服务器设计为在.php
文件中调用,通过mod_php
或FastCGI提供服务。
要使用动态资产服务器,你需要另外要求symfony/http-foundation
。你的composer.json
中的require
部分应该看起来像这样
{
"require": {
"chh/pipe": "*@dev",
"symfony/http-foundation": "*"
}
}
服务器构造函数期望一个环境作为唯一参数。你可以从头开始构建环境或使用Config
类。
将此放入一个名为assets.php
的文件中
<?php use Pipe\Server, Pipe\Environment, Symfony\Component\HttpFoundation\Request; $env = new Environment; $env->appendPath("vendor_assets"); $env->appendPath("assets"); $server = new Server($env); $server->dispatch(Request::createFromGlobals()) ->send();
服务器将所有请求URI相对于环境的加载路径解析。因此,要渲染js/index.js
JavaScript文件,您将请求URI /assets.php/js/index.js
。
服务器还通过Last-Modified
和If-Not-Modified-Since
HTTP头应用一些条件缓存。如果依赖项的更改没有立即显示,请尝试在浏览器中进行强制刷新或清除浏览器的缓存。
为生产部署准备资产。
将资产编译成不需要Pipe运行时支持的方式是个好主意。负责此事的是Pipe\Manifest
类。
清单文件用于编译资源,并写入一个JSON编码的文件,该文件将逻辑路径(应用本身已知的)映射到包含校验和的路径(应用无法预先知道)。
要将文件添加到清单中,请调用清单的compile
方法
<?php
$env = new \Pipe\Environment;
$env->appendPath('assets/javascripts');
$manifest = new \Pipe\Manifest($env, 'build/assets/manifest.json');
$manifest->compile('index.js');
这将在build/assets
目录中创建index-<SHA1 digest>.js
文件和manifest.json
文件。
该文件看起来可能像这样
{
"assets": {
"index.js": "index-0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33.js"
}
}
然后部署位于build/assets
中的所有内容,例如部署到CDN或静态文件服务器。
在生产环境中运行的应用程序可以使用清单如下,以创建到资源的链接
<?php
# Better cache this, but omitted for brevity
$manifest = json_decode(file_get_contents('/path/to/manifest.json'), true);
# Path where the contents of "build/assets" are deployed.
# Could be a path to a CDN.
$prefix = "/assets";
printf('<script type="text/javascript" src="%s/%s"></script>', $prefix, $manifest['assets']['index.js']);
许可协议
MIT许可协议
版权所有 (c) 2012 Christoph Hochstrasser
特此授予任何获得此软件及其相关文档副本(“软件”)的个人免费使用该软件的权利,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许获得软件的个人进行此类操作,前提是遵守以下条件
上述版权声明和本许可协议应包含在软件的所有副本或主要部分中。
本软件按“原样”提供,不提供任何形式的质量保证,无论是明示的、暗示的还是其他形式的保证,包括但不限于适销性、适用于特定目的和非侵权性保证。在任何情况下,作者或版权所有者都不应对任何索赔、损害或其他责任负责,无论该索赔、损害或其他责任是基于合同、侵权或其他方式产生,与软件或软件的使用或其他交易有关。