概要

背景 - 5.6以前のconcrete5

concrete5が最初にリリースされた時、JavaScriptやCSSをページに読み込んだりブロックテンプレートに含めるには、script や link タグを直接書くしかありませんでした。この方法は単純でメンテナンスしやすい方法ですが、下記のような様々な問題があります。

  • ブロックテンプレートのアセットをパッケージングできない。
  • ページ内のアセットの位置を最適化できない。ブロックタイプのアセットは、ブロックが出力された位置にそのまま出力されてしまいます。
  • サイト全体のCSSやJavaScriptファイルが肥大化してしまいます。
  • 開発者が自力で管理する必要があります。
  • アセットの重複を避ける手段がありません。ブロックを複数回読み込むと、JavaScriptも複数回読み込まれます。
  • ブロックから、コアのアセットを呼び出す手段がありません。

concrete5 が成熟するにつれて、アセット管理もより良い方法になっていきました。

  • ブロックのviewテンプレートからview.jsとview.cssを自動で読み込む。
  • ブロックのカスタムテンプレートからview.jsとview.cssを自動で読み込む。
  • View::addHeaderItem() と View::addFooterItem() によって、HTMLのヘッダーとフッターにスタイルシートやJavaScriptを差し込むことができるようになりました。
  • これらのメソッドをブロックから使うことができなかったため(レンダリング上の問題で)、BlockController::on_page_view() を追加しました。ブロックがページ上で使われる際に、ページのヘッダーやフッターにアセットを追加することができます。

繰り返しになりますが、これには次のような利点があります。

  • テンプレートの自由度
  • カスタムテンプレーとからよりエレガントなJSとCSSの読み込み。
  • より良いアセットの再利用 - ページ内で必要なアセットのみが自動で読み込まれます。
  • 同じアセットはページに1回しか読み込まれません。
  • 必須アセットを指定することができます。

しかし、完璧には程遠いものでした。

  • ヘッダーの肥大化
  • アセットのミニファイができませんでした。
  • アセットの増殖。あるアドオンがあるアセットを必要とする際、他のアドオンが全く同じアセットを必要とする場合でも、2つのファイルが読み込まれていました。
  • 全てがファイル名に基づく脆弱な仕組みでした。もしアドオンがjQuery UIを必要としているとします。我々がjQuery UIの位置を変更したり、複数のファイルに分割したら?このことが、我々がコアに付属のアセットを再編成しにくくさせました。
  • 問題は、bootstrapによって悪化しました。あるテーマはbootstrapを使い、他では使いません。あるアドオンは使い、他では使いません。しかし、すべてのリクエストで数百KBのライブラリを読み込ませなければなりません。

問題の解決:concrete5 5.7 のアセット・サブシステム

concrete5 5.7のアセット・サブシステムは、これらの問題を解決し、これまでにない新たな機能も提供するものです。それは、jQueryやBootstrapなど、concrete5で使われるすべてのサードパーティーのJavaScriptやCSSライブラリーを、中央集権的なレジストリで管理し、アセットをシェア可能にするものです。このレジストリにはパッケージやカスタマイズコードからも追加することができます。それぞれのアセットは、ヘッダーとフッターのどちらに追加されるべきかや、ミニファイ可能かどうか、他のアセットと結合可能かどうか、といった情報を持っています。このアセットシステムは、ローカルかリモートかにかかわらず、実際のファイル名に依存せず、開発者にアセットやそのグループのハンドルを設定する機能を提供します。テーマやパッケージがアセットを提供済みと申告すれば、concrete5はそれらを自動で読み込みません。ブロックのカスタムテンプレートから自動で読み込まれるアセット(view.js と view.css)も同時にサポートされます。

原文:Overview