Nancy/Minify & Bundleを使う

提供: MonoBook
移動: 案内検索

ASP.NET 4から搭載されたMinify & BundleをMac上のMonoとNancyから使ってみる。 リリースビルドするとJavaScriptCSSから無駄が省かれるという機能である。

静的コンテンツを扱えるようにする[編集]

なにはともあれNancyで静的コンテンツを使える状態にする。

NuGetから必要なパッケージを入れる[編集]

ASP.NET関連のほとんどが、いつの間にかASP.NET本体から分離されてNuGetへ移行している。Linux上のMonoでもASP.NETを使えという思し召しらしい。Xamarin Studioからも一発で入る。

web.configを編集[編集]

<configuration>
  <configSections>
      <!--  追加 -->
      <section name="razor" type="Nancy.ViewEngines.Razor.RazorConfigurationSection, Nancy.ViewEngines.Razor" />
      <!--  追加 -->
  </configSections>

  <!--  追加 -->
  <razor disableAutoIncludeModelNamespace="false">
    <assemblies>
      <add assembly="System.Web.Optimization" />
      <add assembly="System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </assemblies>
    <namespaces>
      <add namespace="System.Web.Optimization" />
    </namespaces>
  </razor>
  <!--  追加 -->

  <system.webServer>
    <!--  追加 -->
    <modules runAllManagedModulesForAllRequests="true">  
      <remove name="BundleModule" />  
      <add name="BundleModule" type="System.Web.Optimization.BundleModule" />  
    </modules> 
    <!--  追加 -->
  </system.webServer>
</configuration>

バンドルを登録する[編集]

どこでもいいので登録内容が記述されたメソッドを作る。 純正に右に倣えで「App_Start/BundleConfig.cs」にしておくと無難だと思われる。

using System;
using System.Web.Optimization;
 
namespace Test
{
    public class BundleConfig
    {
        public static void RegisterBundles(BundleCollection bundles) 
        {
            bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                "~/Scripts/jquery-{version}.js"));
        }
    }
}

サーバー起動時に登録する。 Global.asax.cs(無ければ作る)のApplication_Startメソッドから上記の登録メソッドを呼び出す。

using System;
using System.Web.Optimization;
 
namespace Test
{
    public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(Object sender, EventArgs e)
        {
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}

Scripts.Renderの違い[編集]

ASP.NET 4で標準の記述方法が使えない。

@Scripts.Render("~/bundles/jquery")

以下を使うことで代用する。

@Html.Raw(Scripts.Render("~/bundles/jquery").ToString())

ToStringを忘れるとRazorが落ちる。 凄い嵌った。

Razorテンプレートの記述例
@using System.Web.Optimization
@{
    Layout = null;
}
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>@ViewBag.Title</title>
    @Html.Raw(Styles.Render ("~/bundles/themes/base/css").ToString())
    @Html.Raw(Scripts.Render("~/bundles/jquery").ToString())
    @Html.Raw(Scripts.Render("~/bundles/jqueryui").ToString())
  </head>
  <body>
    @RenderBody()
  </body>
</html>

その他[編集]

Linuxならmod_pagespeedで良いじゃんというツッコミは禁止である。 あれはコンパイルが難しいというか配布サーバーが不安定すぎて泣ける。

関連項目[編集]

参考文献[編集]