Grav - 资产经理


本章我们来学习一下Asset ManagerGrav 0.9.0 中引入了 Asset Manager,以统一用于添加和管理JavaScriptCSS等资源的界面。从主题和插件添加这些资产将提供高级功能,例如排序资产管道资产管道用于缩小和压缩资产,从而降低对浏览器的要求,同时也减小资产的大小。

Asset Manager 是一个类,可通过插件事件挂钩在 Grav 中使用。您还可以通过 Twig 调用直接在主题中使用 Asset Manager 类。

配置

Asset Manager 由一组配置选项组成。system.yaml文件包含默认值;您可以在user/config/system.yaml文件中覆盖这些值。

assets:                     # Configuration for Assets Manager (JS, CSS)
   css_pipeline: false      # The CSS pipeline is the unification of multiple CSS resources into one file
   css_minify: true         # Minify the CSS during pipelining
   css_rewrite: true        # Rewrite any CSS relative URLs during pipelining
   js_pipeline: false       # The JS pipeline is the unification of multiple JS resources into one file
   js_minify: true          # Minify the JS during pipelining

主题中的资产

安装 Grav 时,反物质主题将作为默认主题。它显示了如何在该主题中的base.html.twig文件中添加 CSS 文件的示例。

{% block stylesheets %}
   {% do assets.addCss('theme://css/pure-0.5.0/grids-min.css', 103) %}
   {% do assets.addCss('theme://css-compiled/nucleus.css',102) %}
   {% do assets.addCss('theme://css-compiled/template.css',101) %}
   {% do assets.addCss('theme://css/custom.css',100) %}
   {% do assets.addCss('theme://css/font-awesome.min.css',100) %}
   {% do assets.addCss('theme://css/slidebars.min.css') %}

   {% if browser.getBrowser == 'msie' and browser.getVersion == 10 %}
      {% do assets.addCss('theme://css/nucleus-ie10.css') %}
   {% endif %}
   {% if browser.getBrowser == 'msie' and browser.getVersion >= 8 and browser.getVersion <= 9 %}
      {% do assets.addCss('theme://css/nucleus-ie9.css') %}
      {% do assets.addJs('theme://js/html5shiv-printshiv.min.js') %}
   {% endif %}
{% endblock %}
{{ assets.css() }}

下面简单解释一下上面的代码。

  • 树枝标签中定义的区域可以替换或附加到扩展该区域的模板中,并且您可以看到该块内do asset.addCss()调用的数量。

  • {% do %}标签允许您处理变量,而无需任何内置于 Twig 本身的输出。

  • 可以使用addCss()方法将 CSS 资源添加到资源管理器中。您可以通过传递数值作为第二个参数来设置样式表的优先级。对addCss()方法的调用会从 CSS 资源中渲染出 HTML 标签。

JavaScript 资源的使用方式与 CSS 资源相同。树枝标签内的 JavaScript 资源如下所示。

{% block javascripts %}
   {% do assets.addJs('jquery',101) %}
   {% do assets.addJs('theme://js/modernizr.custom.71422.js',100) %}
   {% do assets.addJs('theme://js/antimatter.js') %}
   {% do assets.addJs('theme://js/slidebars.min.js') %}
   {% do assets.addInineJs('alert(\'This is inline!\')') %}
{% endblock %}
{{ assets.js() }}

添加资产

下表列出了不同类型的添加方法 -

先生。 方法及说明
1

添加(资产,[选项])

根据文件扩展名,添加方法与资产相匹配。这是调用 CSS 或 JS 直接方法之一的正确方法。您可以使用选项来设置优先级。资产是否应包含在组合/缩小管道中由管道属性控制。

2

addCss(资产,[选项])

通过使用此方法,您可以将资源添加到CSS资源中。根据第二个参数中设置的优先级,资产在列表中排序。如果未设置优先级,则默认设置为 10。资产是否应包含在组合/缩小管道中由管道属性控制。

3

addDirCss(目录)

通过使用此方法,您可以添加一个由 CSS 资源组成的实体目录,该目录将按字母顺序排列。

4

addInlineCss(css, [选项])

您可以使用此方法在内联样式标记内提供一串 CSS。

5

addJs(资产,[选项])

通过该方法可以给JS资源添加资源。如果未设置优先级,则它将默认优先级设置为 10。管道属性确定资产是否应包含在组合/缩小管道中。

6

addInlineJs(javascript, [选项])

该方法允许您在内联脚本标签内添加一串 JS。

7

addDirJs(目录)

通过该方法,您可以添加一个由JS资源组成的实体目录,该目录将按字母顺序排列。

8

注册集合(名称,数组)

此方法允许您使用名称注册由 CSS 或 JS 资源组成的数组,以便稍后可以通过 add ()方法使用它。如果您使用多个主题或插件,那么此方法非常有用。

选项

有很多选项可以传递资产数组,解释如下 -

对于 CSS

  • 优先级- 它采用整数值,默认值为 100。

  • pipeline - 当资产不包含在 pipeline 中时,它设置为false值。默认值设置为true

对于JS

  • 优先级- 采用整数值,默认值为 100。

  • pipeline - 当资产不包含在 pipeline 中时,设置false 。默认值设置为true

  • loading - 此选项支持 3 个值,例如emptyasyncdefer

  • group - 它由指定组的唯一名称的字符串组成。默认值设置为true

例子

{% do assets.addJs('theme://js/example.js', 
{'priority':101, 'pipeline':true, 'loading':'async', 'group':'top'}) %}

渲染资源

CSS 和 JS 资源的当前状态可以通过使用以下命令来呈现 -

CSS()

css()方法基于已添加到 Asset Manager 中的所有 CSS 资源,呈现一个由 HTML CSS 链接标记组成的列表。根据管道属性,列表可以包含缩小的文件和单个/组合资产。

js()

js()方法基于已访问 Asset Manager 的所有 JS 资源,呈现一个由 HTML JS 链接标记组成的列表。根据管道属性,列表可以包含缩小的文件和单个/组合资产。

指定资产

Grav允许您使用名称注册CSS和JS资产的集合,以便您可以使用注册的名称将资产添加到资产管理器中。这可以在 Grav 中通过使用名为命名资产 的功能来完成。这些自定义集合在system.yaml中定义这些集合可以由任何主题或插件使用。

assets:
   collections:
      jquery: system://assets/jquery/jquery-2.1.3.min.js
      bootstrap:
         - https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css
         - https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css
         - https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js

registerCollection ()方法可以通过以下代码以编程方式使用 -

$assets = $this->Grav['assets'];
   $bootstrapper_bits = [https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css,
      https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css,
      https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js];
   $assets->registerCollection('bootstrap', $bootstrap_bits);
$assets->add('bootstrap', 100);

分组资产

Grav 0.9.43 引入了一项名为Grouped Assets 的新功能,它允许您在添加资产时传递由可选组成的选项数组。当页面的特定部分需要一些 JS 文件或内联 JS 时,此功能非常有用。

通过使用选项语法,您必须在添加资产时指定组,如下所示。

{% do assets.addJs('theme://js/example.js', {'priority':102, 'group':'bottom'}) %}

如果没有为资产设置组,则head将设置为默认组。如果您希望这些资源在底部组中呈现,则必须在主题中添加以下内容。

{{ assets.js('bottom') }}

静态资源

每当您想在不使用 Asset Manager 的情况下引用资源时,都可以使用url()辅助方法。例如,当您想引用主题中的图像时,可以使用以下语法。

<img src = "{{ url("theme://" ~ widget.image) }}" alt = "{{ widget.text|e }}" />

url ()帮助器方法可以选择采用第二个参数,以使 URL 通过使用truefalse值来包含域和架构。默认情况下,该值设置为false,仅显示相对 URL。

例子

url("theme://somepath/mycss.css", true)