6

JS および CSS ファイルを管理するための Yii の AssetManager に関する情報はあまり見つかりません。私の質問は、AssetManager を使用するポイントは何ですか? 開発プロセスにどのような価値が追加されるかはわかりません。実際、コードが複雑になっているようです...スクリプトやCSSコードを変更するたびに、アセットフォルダーに移動して削除する必要があります私は最新バージョンを持っています。

すべての Javascript ファイルを /webroot/js/ の下に置き、タグを使用してファイルをロードするだけで、AssetManager の問題を解決するよりもはるかに簡単なようです。さらに、Yii の registerCoreScript 関数は、YSlow が推奨するように、スクリプト タグをコードの末尾の body タグの近くに配置するのではなく、常にヘッダー タグ内に配置します。

Yii の AssetManager に対する私の理解にはギャップがあるに違いないと思います。AssetManager を使用する方が、PHP コード内にスクリプト タグをハードコーディングするよりも優れている理由を知っている人はいますか? 私は少し混乱しています...

ありがとう!

4

3 に答える 3

23

誰かが私よりもこれに答えることができると確信していますが、基本的には、ソースJS および CSS ファイルを Protected フォルダーに残すことができるようにするためです。

これは 1 つの点で少し安全ですが、私にとっての主な利点は、アセット公開システムを使用してアセットを圧縮および縮小したり、その他の方法で処理したりできることです。コードベースから分離します。

また、これについて qiang (Yii を書いた人)からの公式の回答があります。

于 2010-09-03T18:36:18.093 に答える
8

Yiiのアセットマネージャーの主な利点は、コンポーネントを自己完結型の方法で構造化できることです

ウィジェットの物語

UIウィジェットであるコンポーネントについて考えてみます。ディストリビューションに、コンポーネントの実装とともにいくつかのアセットが含まれていると仮定します。たとえば、次のファイルです。

SuperWidget.php
superwidget.css
superwidget.js
image_for_css.png

アセットマネージャーが存在しなかった場合に、このウィジェットをアプリケーションにどのように組み込むかを検討してください。一般的な手順は次のとおりです。

  1. ディレクトリSuperWidget.php内のどこかにコピーしますprotected/
  2. ディレクトリにコピーsuperwidget.jsしますjs/
  3. ディレクトリにコピーsuperwidget.cssしますcss/
  4. ディレクトリにコピーimage_for_css.pngするimages/か、おそらく内部にコピーしてcss/、相対的なパスの依存関係を減らすのに役立ててください

次に、実行時にSuperWidgetはCSSとJavaScriptを含めるために適切なタグを発行します。これを行うには、これらのアセットを正確にどこに配置したかを知る必要があります。言い換えれば、インストールに関するいくつかの選択は任意に行うことができますが、ソースを編集しない限り、それらは石に設定されます

ウィジェットは再利用できますか?

このウィジェットが高度にカスタマイズされており、アプリケーションの不可分の一部となることを意図している場合、このアプローチは正常に機能し、アセットマネージャーを用意する必要はあまりありません。しかし、配布したいのが広く役立つコンポーネントである場合はどうでしょうか。

問題が発生し始めます。

まず、調査した展開スキームでは、ウィジェットのユーザーがさまざまなファイルをさまざまなディレクトリにコピーする必要があり、インストール手順が複雑になり、エラーが発生する可能性が高くなります。

ただし、より大きな問題は、デプロイメントスキームが、独自に開発された他のコンポーネントのデプロイメントスキームと競合する可能性があることです。他の誰かがsuperwidget.jsファイルを持っていると決めた場合はどうなりますか?

これら2つのコンポーネントのインストール手順が矛盾する場合は、明らかに一方を意図したとおりにインストールできないため、詳細を変更し、コンポーネントのソースコードをハッキングして、これらの変更に対応します。後でそのコンポーネントの新しいバージョンにアップグレードする場合は、カスタマイズを慎重に考慮する必要があり、「コピー/上書き」アップグレードは不可能になります。

これらすべては実際にはきれいではなく、実際には起こりそうにないかもしれませんが、それは確かに正しく感じられません。

資産運用会社、そうする

ここでアセットマネージャーが登場します。コンポーネントを次のように構成することにしたとしましょう。

superwidget/
  SuperWidget.php
  assets/
    css/
      superwidget.css
    js/
      superwidget.js
    images/
      image_for_css.png

protected/インストールした他のコンポーネントに関係なく、これをディレクトリ内のどこかに直接コピーできます。ここで発生する可能性のある最悪の事態superwidget/は、競合が発生した場合に別の名前に変更する必要があることです。

アセットマネージャーを使用して、ディレクトリ全体をSuperWidget.php 公開superwidget/assets/します。コピーは、たとえばassets/1337c0de/assets/アプリケーションのベースアセットパスで1337c0de/あり、Yiiによって作成され、他の公開されたアセットと競合しないことが保証されたランダムハッシュです。

これは、SuperWidgetのアセットが他のコンポーネントのアセットと競合する可能性がないことを意味し、 SuperWidgetを真に再利用可能にします。また、内部のディレクトリ構造1337c0de/はディストリビューションと同じであるため、CSSは../images/、ランダムハッシュの値(公開後にのみ認識される)を参照しなくても、相対パスを使用して画像を参照できます。

資産運用会社ではないこと

  • これはセキュリティを強化する方法ではありません。コンポーネントソースはとにかく内部のどこかにありprotected/(したがって、そこでは改善されません)、アセットは、コピーされる場所に関係なくWebアクセス可能である必要があります(何があってもセキュリティはありません)。
  • これは、アセットを処理するための包括的なソリューションではありません(CSSの縮小など)。これを行うカスタムアセットマネージャーをインストールすることは可能ですが、再利用可能なコンポーネントに含まれるアセットは、すべての「ベースアプリケーション」アセットの中で少数派になることを忘れないでください。全面的に縮小したい場合は、他のすべても処理する必要があり、アセットマネージャーはそこであなたを助けません。

TL; DR

アセットマネージャーを使用すると、他のコンポーネントとの競合を恐れることなく、簡単に配布でき、アプリケーションに含めることができるコンポーネントを作成できます。

于 2012-10-18T12:58:13.317 に答える