ASP.NET 2.0之後的版本都有很貼心的功能,網頁部分是第一次執行時編譯,之後的瀏覽使用此編譯,好處是可以隨時編輯網頁,下次重新執行時又會再及時編譯,不需要透過Visual Studio編譯,但是缺點是第一次因為要執行編譯,回應會非常非常的慢,而且當網站一段時間沒有連線IIS會回收資源,所以常常隔天第一個使用系統人都比較幸運,要等ASP.NET及時編譯,當然也有另一個選項是所有的東西都預先編譯好,好處是全部都先編譯好了,執行時就不會在編譯,加快第一次執行的回應速度,壞處是必需使用Visual Studio編譯後才能更版,因為不是ASP.NET預設選項,設定的步驟不少,本編是針對ASP.NET MVC 3 的Razor View做預編譯設定。
ASP.NET 2.0之後的版本都有很貼心的功能,網頁部分是第一次執行時編譯,之後的瀏覽使用此編譯,好處是可以隨時編輯網頁,下次重新執行時又會再及時編譯,不需要透過Visual Studio編譯,但是缺點是第一次因為要執行編譯,回應會非常非常的慢,而且當網站一段時間沒有連線IIS會回收資源,所以常常隔天第一個使用系統人都比較幸運,要等ASP.NET及時編譯,當然也有另一個選項是所有的東西都預先編譯好,好處是全部都先編譯好了,執行時就不會在編譯,加快第一次執行的回應速度,壞處是必需使用Visual Studio編譯後才能更版,因為不是ASP.NET預設選項,設定的步驟不少,本編是針對ASP.NET MVC 3 的Razor View做預編譯設定。
ASP.NET MVC 3中Razor View做預編譯在寫這編時還沒有看到官方的做法,不過在社群中到是看到二套做法,都是要安裝Visual Studio Extension。
在Visual Studio 2010中打開擴充管理員,在線上圖庫中搜尋Razor,提供預編譯工具有以下這二套(如圖一)。
圖一 Razor View預譯編工具
這二套做法不同,但結果是相同的,本編只介紹Razor Generator的使用,對Razor Single File Generator for MVC有興趣可上他的官網,教學很豐富。
使用Razor Generator
1.安裝套件。
2.新增ASP.NET MVC 3.0專案。
3.使用NuGet安裝PrecompiledMvcViewEngine。
4.在任一.cshtml檔案的屬性窗視中的自訂工具中輸入RazorGenerator,建置動作改成無。
5.之後此檔案在存檔後,就後直接編譯好。
註:使用上有點小麻煩就是每個檔案要自己重覆 4 的動作,如果未來都想使用此方法,可以改機碼讓Visual Studio新增.chhtml檔案時預設增加RazorGenerator。
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\Generators\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\.cshtml] @="RazorGenerator" //x86 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\Generators\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\.cshtml] @="RazorGenerator"
但我沒找到如何讓.cshtml預設建置動作為無,知道的朋友可以分享一下。
除了減少執行時期的編譯時間外,還有因為每個View都是會預先編譯,所以View中的錯誤可以比較容易發現,雖然更改.csproj檔,設定MvcBuildViews屬性為true,也可以做到View編譯以檢查錯誤,但因為每一個編譯時要先將每個.cshtml檔案轉成.cs後再編譯,編譯會很慢,但本篇的作法是每次編輯檔案時就會產生.cs,編譯時不會照成太大的時間消粍。
發行網站
使用Viual Studio 2010的發行功能,匯出後你會發現匯出的資料夾少了Views(如果都有把建置動作改成無,就會如圖二),那些View去那裡了呢? 原來已經與Controller一樣都編譯同一個dll中。
圖二 發行後的檔案
如何載入dll中的View
安裝完PrecompiledMvcViewEngine後,會在參考中會看到增加了二個組件,PrecompiledMvcViewEngine與WebActivator,與App_Start中增加了PrecompiledMvcViewEngineStart.cs檔案。
PrecompiledMvcViewEngine.dll 提供ViewEngine,註冊組件,讓使用System.Web.Mvc.ViewEngines FindView時可以找到dll中的View。
WebActivator 是可以讓Web啟動時執行某些程序,可參考黑大的WebActivator - 不修改Global.asa也能加入Application_Start。
PrecompiledMvcViewEngineStart.cs 組件註冊的相關程式都寫在這裡。
而ViewEngine共存的方式可以參考此編[ASP.NET MVC]Razor Views 預編譯(Pre-Compile)[2]-獨立View並讓新舊方法共存
參考資源
http://blog.davidebbo.com/2011/06/precompile-your-mvc-views-using.html