web-dev-qa-db-ja.com

1つのJSファイル/ライブラリのキャッシュを無効にする

Drupal 8.1.7を使用して group モジュールを使用しています。ユーザーがグループまたはグループにリンクされた記事を表示すると(/ group/...またはnode/...)、各グループに特定のCSSを指定したい。

私はトリックを行うモジュールを開発します(グループまたは記事を表示するかどうかを確認し、グループを取得して、ページのCSSスタイルを変更するJSファイルをロードします)。 dev drupalキャッシュなしでうまく機能しますが、キャッシュをアクティブにして本番環境でモジュールをテストすると、JSファイルは1回だけロードされるようです。drush crは、ファイルを再度ロードします。

Drupalに毎回ファイルをロードするように指示する方法、またはファイルをキャッシュに入れない方法はありますか?mymodule.libraries.ymlで多分?

color:
  js:
    js/mymodule.js: {}
  dependencies:
    - core/jquery
    - core/drupalSettings
    - core/drupal
2
Snabow

現在のアプローチでは、JSファイルをグローバルにロードするため、カスタムモジュールまたはテーマに直接ロードします。

ただし、これは最善の解決策ではありません。必要なのは、ノードを前処理し、ノードがグループに属しているかどうかを確認し、識別クラスを追加することです。これにより、CSSでターゲットを設定できます。

あなたが本当に困難に行きたいなら、#lazy_builderプレースホルダー。 このブログの投稿 には良い説明があります。

1
zerolab

グループごとに1つの異なるJSがあるとは信じられません。だからキャッシングはクールで、あなたの問題はJSの関数のトリガーにあると思います。

Drupal.behaviorsを使用して、ページが読み込まれるたびにJSの関数を呼び出すことができます。

(function ($, Drupal) {

  Drupal.behaviors.anyInit = {
      attach: function () {
        myInitFunction();
      }
  }
})(jQuery, Drupal);

function myInitFunction() { do something }

次のように、変数をレンダリング配列にアタッチすることで、変数をJS(グループ名など)に渡すことができます。

$build['#attached']['library'][] = 'bootasde/asdejs';
$build['#attached']['drupalSettings']['bootasde']['proreos_server'] = SystemTools::getProreosServer();
$build['#attached']['drupalSettings']['bootasde']['checktyp'] = 'a';
$build['#attached']['drupalSettings']['bootasde']['id'] = $id;

次に、JSでその変数にアクセスします。

  var server = drupalSettings.bootasde.proreos_server;
  var id = drupalSettings.bootasde.id;
  var tp = drupalSettings.bootasde.checktyp;

お役に立てば幸いです。

別の方法は、twigテンプレートのCSSクラスにグループ名を追加し、各グループ名にいくつかの特別なセレクターを持たせることです。

3
Rainer Feike