デバッグ時とリリース時でJavaScript/CSSの圧縮・非圧縮を使い分ける
JavaScript や CSS はリリース時には、最適化や圧縮、複数ファイルを1ファイルに統合するなどといったパフォーマンスチューニングをすると思います。ですが、チューニング済みのJavaScriptやCSSファイルだとデバッグや修正ができません。
今回は、デバッグ時とリリース時で使い分けをする方法を整理します。
使い分けは条件付きコンパイル引数(#IF)を使って実現しますが、手法としてデザイナ側(.aspx)で分けるのとコード側(.cs)で分ける手法の2種類があります。デザイナ側で分ける手法の方がより簡単で分かりやすいですが、AjaxControlToolkitを使用している場合(実行時エラーになります)などアプリケーションの構成によっては利用できない場合もあります。その場合は、コード側で分ける方法を利用します。
注意点ですが、条件付きコンパイル引数の判定がデザイナ側の場合は web.config の compilation の設定によりますが、コード側の場合は web.config ではなく、アセンブリ(dll)がリリースモードでコンパイルされているかどうかによります。(もちろん、コンパイルしないタイプのASP.NETアプリケーションの場合はweb.configによります。)
す
- デザイナ側(.aspx)で分ける手法
.aspx側で、#IF ディレクティブを使用しふ読み込むファイルを分けます。デバッグモードかどうかは、web.configの以下の設定によります。勘違いしやすいですが、dllのコンパイル時にReleseを設定した場合ではありません。web.configの設定です。
デバッグモード
<compilation debug="true">
リリースモード
<compilation debug="false">
<% #if DEBUG Then %> <script type="text/javascript" src="/js/jquery.min.js"></script> <script type="text/javascript" src="/js/common.js"></script> <script type="text/javascript" src="/js/messages.js"></script> <script type="text/javascript" src="/js/login.js"></script> <link type="text/css" rel="Stylesheet" href="/css/common.css" /> <link type="text/css" rel="Stylesheet" href="/css/login.css" /> <% #Else %> <script type="text/javascript" src="/js/login_min.js"></script> <link type="text/css" rel="Stylesheet" href="/css/login_min.css" /> <% #End if %>
AjaxControlToolkitを使用している場合、以下のメッセージが表示される事が有ります。この場合、デザイナ側で分ける事はできません。
コントロールにコード ブロック (<% ... %>) が含まれているため、コントロールのコレクションを変更できません。
- コード側(.cs)で分ける手法
Page_Load時にHTMLヘッダを動的に追加し、デバッグ時とリリース時で追加するファイルを分けます。
デバッグモードかどうかは、コンパイル時の設定によります。web.configの設定は関係ありません。デザイナで指定する場合と異なるため注意する必要があります。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace WebApplication2 { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { List<string> jsFiles = new List<string>(); List<string> cssFiles = new List<string>(); #if DEBUG jsFiles.Add("/js/jquery.min.js"); jsFiles.Add("/js/common.js"); jsFiles.Add("/js/messages.js"); jsFiles.Add("/js/login.js"); cssFiles.Add("/css/common.css"); cssFiles.Add("/css/login.css"); #else jsFiles.Add("/js/login_min.js"); jsFiles.Add("/js/login_min.css"); #endif foreach (string jsItem in jsFiles) { HtmlGenericControl jsHeader = new HtmlGenericControl("script"); jsHeader.Attributes["type"] = "text/javascript"; jsHeader.Attributes["src"] = jsItem; Page.Header.Controls.Add(jsHeader); } foreach (string cssItem in cssFiles) { HtmlLink cssHeader = new HtmlLink(); cssHeader.Href = cssItem; cssHeader.Attributes["rel"] = "stylesheet"; cssHeader.Attributes["type"] = "text/css"; Page.Header.Controls.Add(cssHeader); } } } }