Grav - 资产管理器

在本章中,让我们研究资产管理器。资产管理器是在 Grav 0.9.0 中引入的,以统一添加和管理资产(如 JavaScriptCSS)的界面。从主题和插件中添加这些资产将提供高级功能,例如 排序资产管道资产管道 用于最小化和压缩资产,从而降低浏览器的要求并减少资产的大小。

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

配置

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

assets: # 资产管理器 (JS、CSS) 的配置
    css_pipeline: false # CSS 管道是将多个 CSS 资源统一到一个文件中
    css_minify: true # 在管道传输过程中缩小 CSS
    css_rewrite: true # 在管道传输过程中重写任何 CSS 相对 URL
    js_pipeline: false # JS 管道是将多个 JS 资源统一到一个文件中
    js_minify: true # 在管道传输过程中缩小 JS

主题中的资产

安装 Grav 时,Antimatter 主题是默认主题。它展示了如何在此主题中的 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() }}

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

  • 在扩展该代码的模板中,可以替换或附加 block twig 标签中定义的区域,您可以看到此块中 do assets.addCss() 调用的次数。

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

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

JavaScript 资源的使用方式与 CSS 资源相同。 block twig 标签内的 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() }}

添加资产

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

Sr.No. 方法和说明
1

add(asset, [options])

根据文件扩展名,add 方法与资产相匹配。它是调用 CSS 或 JS 的直接方法之一的适当方法。您可以使用 options 来设置优先级。资产是否应包含在组合/最小化管道中由管道属性控制。

2

addCss(asset, [options])

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

3

addDirCss(directory)

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

4

addInlineCss(css, [options])

您可以使用此方法在内联样式标签内提供 CSS 字符串。

5

addJs(asset, [options])

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

6

addInlineJs(javascript, [options])

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

7

addDirJs(directory)

通过使用此方法,您可以添加由 JS 资产组成的实体目录,这些资产将按字母顺序排列。

8

registerCollection(name,array)

此方法允许您注册一个由 CSS 或 JS 资源组成的数组,并为其指定一个名称,以便稍后使用 add() 方法使用它。如果您使用多个主题或插件,则此方法非常有用。

选项

有许多选项可以传递资源数组,如下所示 −

对于 CSS

  • priority − 它采用整数值,默认值为 100。

  • pipeline − 当资产未包含在管道中时,它设置为 false 值。默认值设置为 true

对于 JS

  • priority − 它采用整数值,默认值为 100。

  • pipeline − 当资产未包含在管道中时,设置 false。默认值为true

  • loading − 该选项支持emptyasyncdefer3个值。

  • group − 由一个字符串组成,用于指定组的唯一名称。默认值设置为 true

示例

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

渲染资产

可以使用以下 − 渲染 CSS 和 JS 资产的当前状态

css()

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

js()

根据已进入 Asset Manager 的所有 JS 资产,js() 方法呈现由 HTML JS 链接标签组成的列表。根据管道属性,列表可以包含最小化文件和单个/组合资产。

命名资产

Grav 允许您使用名称注册 CSS 和 JS 资产集合,以便您可以使用注册的名称将资产添加到 Asset Manager。这可以在 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 引入了一项名为分组资产的新功能,它允许您在添加资产时传递由可选group组成的选项数组。当您在页面的特定部分需要一些 JS 文件或内联 JS 时,此功能非常有用。

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

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

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

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

静态资产

每当您想在不使用资产管理器的情况下引用资产时,都可以使用 url() 辅助方法。例如,当您想要从主题中引用图像时,可以使用以下语法。

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

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

示例

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