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

  • 19350
  • 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