探寻ASP.NET MVC鲜为人知的奥秘(1):对LESS的支持

在ASP.NET MVC3中(从那时开始),我们拥有了对js和css等文件的捆绑(Bundling)和压缩(Minification)的能力,这是ASP.NET性能优化工作的一部分。

想一下很久以前,我们在mvc2的时代,我们使用这样的方式引入js和css文件:

<script type="text/javascript" src="@Url.Content("~/Script/Script.js")"></script>

Why

刚开始没有什么问题,而随着我们项目的越来越大,需要引入的资源文件越来越多的时候,我们就难免会遇到以下这些问题:

  1. 需要在Production环境将这些文件替换为压缩版本(e.g  jQuery.xxx.min.js)
  2. CSS文件需要借助其他工具去压缩
  3. 引入的文件越来越多,难以管理
  4. 大量的资源文件导致浏览器加载缓慢

How

而在ASP.NET MVC3空出世后,我们就再也不需要受到以上这些困扰了。

首先,当我们开启了Optimizations开关后,当Web.config文件中的System.Web/Compilation@debug设置为false的时候(在生产环境下,需要设置为false),我们在浏览器端获取到的资源文件将会是经过压缩和捆绑的。这样做的好处是:

  1. 减少了服务器端的流量,给服务器退烧(通过压缩)
  2. 自动缓存资源文件,服务器端不更改的话,不会重新加载(通过缓存机制)
  3. 由于大多浏览器限制了对一个host同时连接数量,所以加快了网站访问速度(通过捆绑)

以下是一个简单的示例,我这里用一个新建的ASP.NET MVC项目进行演示:

在新建一个MVC项目后,打开App_Start/BundleConfig.cs文件,可以看到一个静态的RegisterBundles方法,这个方法和RegisterRoutes方法一样,都是在应用程序在首次加载的时候调用的,也就是说,所有的捆绑和压缩的操作都会在应用程序加载的时候执行一次,以后会直接引用它,而当在应用程序启动后,人工干预了某个在捆绑中注册了的资源文件,MVC也只会去重新加载和压缩这一部分。

在这个RegisterBundles方法体内,可以设置BundleTable.EnableOptimizations静态属性,这个静态属性默认是设置为True的,也就是当网站在生产环境下,会对css和js等文件进行捆绑和压缩,而在开发模式下不会执行这些操作,当然你也可以通过设置为False组织它这种行为,

在方法体内,可以通过调用BundleCollection参数的Add方法增加我们要捆绑的文件:

bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
                      "~/Scripts/bootstrap.js",
                      "~/Scripts/respond.js"));

这里的”~/bundles/bootstrap“是一个虚拟的路径,当我们在View文件中引用的时候,实际加载的是"~/Scripts/bootstrap.js"和"~/Scripts/respond.js"两个文件,Include方法的参数为一个字符串类型的参数组,所以我们可以添加任意多个的文件,在View文件中使用如下方式进行应用:

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

捆绑机制同时也支持CDN

var jqueryCdnPath = "http://libs.baidu.com/jquery/1.9.0/jquery.min.js";

            bundles.Add(new ScriptBundle("~/bundles/jquery",
                        jqueryCdnPath).Include(
                        "~/Scripts/jquery-{version}.js"));

Focus came

而这篇文章要说的重点是,直接使用这种捆绑和压缩的机制完成LESS的编译,虽然我们也可以使用LESSCSS在浏览器端编译less,但是并不能得到编译过的CSS文件,而很多时候我们需要得到它,判断是不是我们预想的那样。

更多关于LESS的介绍以及LESS的优势,参见这里

首先,我们需要添加dotless程序包:

之后,我在项目中Content目录下,添加一个StyleSheet1.less,代码如下:

@color:#F7F7F7;

body{
    background-color:@color;
}

这时候,您并不需要去担心IIS会对less后缀的文件返回404,因为最终输出到客户端的是一个经过编译的CSS文件。

在BundleRegister方法中,添加如下代码:

var lessbundle = new Bundle("~/bundles/less").Include("~/Content/*.less");
            lessbundle.Transforms.Add(new LessTransform());
            lessbundle.Transforms.Add(new CssMinify());
            bundles.Add(lessbundle);

在代码第一行,我们添加了对Content目录下所有后缀为less文件的捆绑,第二行添加了LESS的转换功能,这个功能就是由dotless提供的,第三行添加了对这一捆绑提供压缩的功能,这样我们在Production环境下,就会得到编译并且压缩的css代码;

在生产环境下,浏览器得到的源码中会找到类似以下的代码:

<link href="/bundles/less?v=vnAgv976RJi72MAy6iBw7DhQ9yxBbhXMXY0yOqNN5BU1" rel="stylesheet"/>

打开这个路径,会得到已经编译过的CSS代码:

body{background-color:#f7f7f7}

而在Production环境下,回更近一步,将css中的空白字符去掉,使CSS文件更小,因为我的示例实际上就一样,所以看不出来差别。

这篇文章就到这里了,最近工作的事很闹心啊,做技术人的洁癖和敏感,很他妈要命!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

加速 Webpack

作者:吴浩麟 https://www.ibm.com/developerworks/cn/web/wa-lo-expedite-webpack/index.ht...

2935
来自专栏应兆康的专栏

Vim教程

Vim文本编辑器使用 先上官方的图吧,然后解释    (来自: www.viemu.com)附上中文版 ? ? Vim分为3种模式:  命令模式(Command...

3228
来自专栏电光石火

IDEA入门级使用教程

IDEA的基础配置 下载好IDEA,免不了一些配置和个人设置。一些设置问题和操作我放在最后讲,因为不影响我们的 使用。先说一下jdk和tomcat的配置...

22510
来自专栏mySoul

js跨站脚本

跨站脚本,称为xss这个术语用来表示一类的安全问题,指攻击者向目标web站点注入html标签或者脚本。

1784
来自专栏陈仁松博客

UWP基础教程 - App多语言支持

UWP实现本地化非常简单,所谓本地化表现最为直观的就是UI上文字和布局方式了,针对文字,提供不同的语言资源文件即可,而针对布局方式,比如在 阿拉伯地区 阅读顺序...

3646
来自专栏IT可乐

HTML中的超链接

超链接:也叫URL(Uniform Resource Locator),就是统一资源定位器。一般效果是我们点击网页上某个地方,网页会自动跳转到另外一个地方。 一...

3535
来自专栏崔庆才的专栏

只会用Selenium爬网页?Appium爬App了解一下

3.5K5

如何使用Midnight Commander,一个可视文件管理器

对于初学者来说,使用命令行工具来管理Linux服务器上的文件的方式可能是令人生畏的,耗时的,有时甚至是会带来风险的。而资深使用者会希望切换到更合适的工具来处理不...

1.3K5
来自专栏pangguoming

在AngularJS应用中实现认证授权

在AngularJS应用中实现认证授权 在每一个严肃的应用中,认证和授权都是非常重要的一个部分。单页应用也不例外。应用并不会将所有的数据和功能都 暴露给所有的用...

4377
来自专栏软件测试经验与教训

Fiddler用法整理

读书与实践是获取知识的主要渠道,学习的权力只掌握在每个人自己手中,让学习成为一种生活的习惯,这比任何名牌大学的校徽重要得多!

1701

扫码关注云+社区

领取腾讯云代金券