chh/pipe

将您的资源放入Pipe中并对其进行处理。

v1.0.0beta1 2013-05-02 13:30 UTC

This package is not auto-updated.

Last update: 2024-09-14 13:18:01 UTC


README

将您的资源放入pipe中并对其进行处理。

Pipe是一种资产管线,灵感来自Sprockets。它旨在作为管理资产的实际方法。它旨在提供一套实用的配置来管理资产,并支持网络环境中常见的预处理器语言,如CoffeeScript或LESS。

Pipe为您提供什么

  • LessCoffeeScript的原生支持
  • 集成依赖管理
  • 支持多个资产加载路径,允许您将应用程序的库与供应商库分离。
  • 通过设计用于处理缓存破坏和压缩,试图减轻资产部署的痛苦。

Build Status

安装

获取composer(如果您还没有的话)

wget https://getcomposer.org.cn/composer.phar

然后在项目的根目录下的 composer.json 中添加此内容

{
    "require": {
        "chh/pipe": "*"
    }
}

现在进行安装

php composer.phar install

入门

环境

首先您需要一个 Pipe\Environment 实例。环境包含您的加载路径,用于检索资产,并将处理器/引擎映射到您的资产。

环境由多个加载路径组成。检索资产时,会在加载路径的每个目录中进行查找。这样您可以将资产分布在多个目录中,例如 vendor_assetsassets

要添加一些加载路径,请使用 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_compressorcss_compressor 配置键,或在环境实例上调用 setJsCompressorsetCssCompressor 来开启压缩。

支持的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/javascripttext/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-ModifiedIf-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

特此授予任何获得此软件及其相关文档副本(“软件”)的个人免费使用该软件的权利,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许获得软件的个人进行此类操作,前提是遵守以下条件

上述版权声明和本许可协议应包含在软件的所有副本或主要部分中。

本软件按“原样”提供,不提供任何形式的质量保证,无论是明示的、暗示的还是其他形式的保证,包括但不限于适销性、适用于特定目的和非侵权性保证。在任何情况下,作者或版权所有者都不应对任何索赔、损害或其他责任负责,无论该索赔、损害或其他责任是基于合同、侵权或其他方式产生,与软件或软件的使用或其他交易有关。