SharePoint 2013 以降(SharePoint Online を含む)のバージョンでは、「ダウンロード最小化戦略(MDS)」といった機能があります。これは、ページを読み込む際に差分のみを処理することでより早く、滑らかにページを読み込むことができる機能とされています。

凄く良さそうな機能なのですが、この機能の動作がイマイチよく分からず、動作も安定していないように思います。最近、この機能に関して試行錯誤したので、記録として残して起きます。

ダウンロード最小化戦略の基本動作

ダウンロード最小化戦略が有効化されているサイトでは、ページを読み込む際には「start.aspx」という特殊なページを介して読み込まれます。どのページを読み込んでも、start.aspx が読み込まれ、「start.aspx#/SitePages/ホーム.aspx」のようにハッシュで実ページが指定されています。

有効化されているのに無効化されている?

何を言っているか分かりませんね、私も初めは分かりませんでした…。動作を見ていると、コンテンツ エディター Web パーツやスクリプト エディター Web パーツを配置し、JavaScript を挿入しているページでは、ダウンロード最小化戦略が無効化されているようです。

この時の動作としては、一旦は start.aspx へリダイレクトされますが、再び実ページへリダイレクトされているようです。

しかし動作が不安定?

(2015/1/13)あまりに再現できないので、ここから下の動作は私の勘違いだったのかもしれません…
ただし、スクリプト タグを挿入したページで必ずしもダウンロード最小化戦略が無効化されるというわけではなく、何がトリガーになっているのかは分からないのですが、時々(本当に時々…)start.aspx で読み込まれてしまうことがありました。一体どういうことなのでしょうか…?さて、困りました。

問題となるのはページ ロード時の JavaScript の実行

この動作で困ったのはページ ロード時に JavaScript を実行したい場合です。一般的にページ ロード時に実行するには、_spBodyOnLoadFunctionNames や jQuery であれば document.ready などなどを利用し行うのですが、start.aspx でページが開かれた場合には、これらが確実には実行されません。

ネットで調べてみると

海外のブログを検索してみると、ダウンロード最小化戦略に対応するには、ExecuteOrDelayUntilScriptLoaded を利用し、start.js の読み込みを待って asyncDeltaManager に登録しておいて実行すると良いよと書かれてありました。

SharePoint 2013 Execute Javascript function after MDS load
http://blog.symprogress.com/2013/09/sharepoint-2013-execute-javascript-function-after-mds-load/

ただ、基本的にはコンテンツ エディター Web パーツやスクリプト エディター Web パーツで JavaScript を挿入したページでは、ダウンロード最小化戦略は無効化される動作のため、start.aspx から読み込まれる start.js は読み込まれません。

そのため、無効化されている場合でも実行されるように、ExecuteOrDelayUntilScriptLoaded の外でも実行したい関数を呼んでおく必要があるように思います。

function doFunc(){
  //実行したい処理
}
ExecuteOrDelayUntilScriptLoaded(function(){
  if(typeof asyncDeltaManager != "undefined"){
    asyncDeltaManager.add_endRequest(doFunc);
  }else{
    doFunc();
  }
}, "start.js");
doFunc();

はたしてこれが正しいのか分かっていません…、何をトリガーとして start.aspx で読み込まれるのか分かっていないため、うまくテストができません…。

さいごに

結局のところ結論が出ていませんが、ダウンロード最小化戦略を有効化したサイトで、ページ ロード時に JavaScript を実行したい場合は、注意してくださいということです。

そうしたサイトでは、ダウンロード最小化戦略をサイトの機能から無効化してしまうのもアリかと思います。私が今になって試行錯誤しているのも、いつも真っ先にダウンロード最小化戦略を無効化していた為です…。

どなたか、こうすれば良いよ!という方がいましたら教えていただきたいです。

この記事の中で、何回ダウンロード最小化戦略と書いたのでしょうか、ダウンロード最小化戦略にうなされそうです。