[ASP.NET MVC]Razor Views 預編譯(Pre-Compile)[1]-加快第一次執行回應速度

  • 19419
  • 0
  • Web
  • 2011-08-07

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,提供預編譯工具有以下這二套(如圖一)。

image

圖一 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,建置動作改成無。

image

5.之後此檔案在存檔後,就後直接編譯好。

image

 

註:使用上有點小麻煩就是每個檔案要自己重覆 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"

reg檔下載 x64 x86

 

但我沒找到如何讓.cshtml預設建置動作為無,知道的朋友可以分享一下。

 

除了減少執行時期的編譯時間外,還有因為每個View都是會預先編譯,所以View中的錯誤可以比較容易發現,雖然更改.csproj檔,設定MvcBuildViews屬性為true,也可以做到View編譯以檢查錯誤,但因為每一個編譯時要先將每個.cshtml檔案轉成.cs後再編譯,編譯會很慢,但本篇的作法是每次編輯檔案時就會產生.cs,編譯時不會照成太大的時間消粍。

 

發行網站

使用Viual Studio 2010的發行功能,匯出後你會發現匯出的資料夾少了Views(如果都有把建置動作改成無,就會如圖二),那些View去那裡了呢? 原來已經與Controller一樣都編譯同一個dll中。

image

圖二 發行後的檔案

 

如何載入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 組件註冊的相關程式都寫在這裡。

image

 

而ViewEngine共存的方式可以參考此編[ASP.NET MVC]Razor Views 預編譯(Pre-Compile)[2]-獨立View並讓新舊方法共存

 

參考資源

http://blog.davidebbo.com/2011/06/precompile-your-mvc-views-using.html