概要
背景 - 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