在传统的asp.net webForm 开发里,在发布时,如果选择预编译,就会自动将所有的aspx 文件编译,在发布后的目录里,就看不到aspx的源代码了,同时因为是预编译的,所以每个页面打开速度都挺快的。
而在MVC里,默认就不是这样了。
MVC在发布以后,我们熟知的这些cshtml文件会随着发布,一起发布到发布后的目录里。你源代码过去咱也不说什么了,但是,却没有把这些cshtml文件预编译为二进制文件。就会导致当我们每打开一个新页面时,第一次总会慢一些(这个是第一次是指,整个网站的这个页面被用户的第一次访问,而不是仅仅针对你一个人来说哦)。
举个例子来说,比如我们访问 /Activity/Page/1
对应的controller 是 Activity,action是Page
那么,当我们第一次访问这个 action时,.NET 会把 这个 Activity controller 对应的view 目录里的所有view(cshtml文件 ,实际目录其实就是 /Views/Activity/*.cshtml 这些文件)编译成一个dll文件(其实是先转成.cshtml.cs,然后再编译的),然后再加载这个dll进行。所以,第一次,总会慢一些,再快的服务器也得稍微等那么一下下,即使你负载均衡又怎么样?
当第二次再访问这个action时,.NET 会自动判断是否已编译过,如果已编译就直接调用执行,否则再重新编译一次(文件如果发生了变更会重新再编译一次)。
这时候,我们已经访问过 /Activity/List/Page/1,在页面里我们找到一个“活动”点进去,跳转到 /Activity/Detail/2。这个时候 会不会再要编译一次呢?不会了,因为在访问 /Activity/Page/1 的时候,已经把 "/Views/Activity/*.cshtml"这些文件都编译过了。.NET的这些cshtml编译策略是把一个目录下的所有cshtml文件都编译一遍,合并输出到一个dll文件里。
这块说明,请参考http://www.cnblogs.com/artech/archive/2012/09/04/razor-view-engine-01.html
我解释的不够好。
---------------------------------------------------------------------
那么,我们如何在发布的时候,就将项目工程里的所有cshtml都一次性编译好呢。
使用 "RazorGenerator.MsBuild",可以直接通过Nuget安装。(链接附在最后)
安装好以后,在编译之前,它会将项目工程里声明引入的cshtml文件都转成 {viewPageName}.cshtml.cs 文件,默认是输出到 "obj/CodeGens"目录下面;然后项目编译的时候就会把这些*.cshtml.cs编译,并合并到主程序集的dll文件 里,比如你的项目名是 RazorBuildDemo,那么生成的dll 就是RazorBuildDemo.dll, 所有的*.cshtml.cs 编译也都会合并到RazorBuildDemo.dll 里。
网站发布到生产环境以后,除了网站第一次打开稍微慢一些(网站初始化过程),其他时候打开各个页面,是不是要比之前的快一些了?
当然,这个东西的好处不仅仅是 预编译,还可以自动在发布时检查页面里的错误。因为是预编译页面,所以在发布时,每个页面都会进行处理,这样就可以自动检查页面里的错误代码(因为必须保证编译通过才行),省得有些地方改了,而又没去测,导致之前可能出现的低级错误。
这家其实还有几个这方面的工具,大家可以去看看。
之前一直搜这方面的工具,可惜一直都没有好的发现,有几个都是RazorGenerator.MVC 这个工具,虽然是同一家出的,但是这个要给每个页面都配置一下,好像新版的不用每个页面都设置这么麻烦,没去细研究,但是我想总没有 RazorGenerator.MsBuild 这个好用吧?我就喜欢这种傻瓜式的,用起来方便。所以我们自己做东西也要奔着傻瓜式做,让用户用着简单,可以有复杂的功能,但是上手,一定要简单,不然实在太难受了。我特么的就是一个懒人。
今天发现了这个好东西,不敢独享,我想一定要分享出来,给有需要的人。(我看这个RazorGenerator.MsBuild的安装数还是很多的)。
在百度我专门搜“RazorGenerator.MsBuild”搜的都是几个国外的英文站,国内就搜出来一个,也是博客园的,不过有点早,说明也比较浅一些。难道做ASP.NET MVC 开发的人少?
唉,自己技术圈子小,这些知识知道的还是太少,蛋疼!
所以,推荐大家,以后建MVC项目,最好把这个包添加到项目中。
在此,必须安利一下这个好东西“RazorGenerator.MsBuild”。
asp.net MVC开发,你值得拥有!
https://github.com/RazorGenerator/RazorGenerator