在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文件更小,因为我的示例实际上就一样,所以看不出来差别。

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

探寻ASP.NET MVC鲜为人知的奥秘(1):对LESS的支持的更多相关文章

  1. 探寻ASP.NET MVC鲜为人知的奥秘(2):与Entity Framework配合,让异步贯穿始终

    Why 在应用程序,尤其是互联网应用程序中,性能一直是很多大型网站的困扰,由于Web2.0时代的到来,人们更多的把应用程序从C/S结构迁移到B/S结构,这样会带来客户端轻量,部署.试试方便快捷等优势, ...

  2. 探寻ASP.NET MVC鲜为人知的奥秘(3):寻找多语言的最佳实践方式

    如果你的网站需要被世界各地的人访问,访问者会使用各种不同的语言和文字书写习惯,那么创建一个支持多语言的网站就是十分必要的了,这一篇文章就讲述怎么快速合理的创建网站对多语言的支持.接下来通过一个实例来讲 ...

  3. [asp.net mvc 奇淫巧技] 05 - 扩展ScriptBundle,支持混淆加密javascript

    一.需求: 在web开发中,经常会处理javascript的一些问题,其中就包括js的压缩,合并,发布版本以及混淆加密等等问题.在asp.net 开发中我们使用ScriptBundle已经可以解决ja ...

  4. ASP.NET MVC 5 - 给数据模型添加校验器

    在本节中将会给Movie模型添加验证逻辑.并且确保这些验证规则在用户创建或编辑电影时被执行. 拒绝重复 DRY ASP.NET MVC 的核心设计信条之一是DRY: "不要重复自己(DRY ...

  5. ASP.NET MVC 从零开始 - create and run

    这篇文章是从我的 github 博客 http://lxconan.github.io 导入的. 如果你想用 ASP.NET MVC 创建一个网络应用,那么你可以搜到很多的文章.但是没有多少文章告诉你 ...

  6. ASP.NET MVC 实现AJAX跨域请求方法《1》

    ASP.NET MVC 实现AJAX跨域请求的两种方法 通常发送AJAX请求都是在本域内完成的,也就是向本域内的某个URL发送请求,完成部分页面的刷新.但有的时候需要向其它域发送AJAX请求,完成数据 ...

  7. ASP.NET MVC分页组件MvcPager 2.0版发布暨网站全新改版

    MvcPager分页控件是在ASP.NET MVC Web应用程序中实现分页功能的一系列扩展方法,该分页控件的最初的实现方法借鉴了网上流行的部分源代码, 尤其是ScottGu的PagedList< ...

  8. 学习ASP.NET MVC(二)——我的第一个ASP.NET MVC 控制器

    MVC全称是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范,用一种业务逻辑和数据显示分离的方法组织代码,将 ...

  9. [asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文

    我们在asp.net 开发中已经封装了最强大的HttpContext,我们可以在HttpContext中可以获取到几乎任何想获取的东西,也可以在HttpContext写入需要返回客户端的信息.但是这些 ...

随机推荐

  1. 【LeetCode每天一题】Remove Duplicates from Sorted Array II(移除有序数组中重复的两次以上的数字)

    Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twic ...

  2. ssti记录

    先看个python沙箱: #!/usr/bin/env python from __future__ import print_function print("Welcome to my P ...

  3. programming-languages学习笔记--第5部分

    programming-languages学习笔记–第5部分 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} program ...

  4. [转载] 我的WafBypass之道(SQL注入篇)

    我的WafBypass之道(SQL注入篇) Web安全 作者:先知技术社区   2016-11-23  7,566   [本文转自安全脉搏战略合作伙伴先知技术社区 原帖地址  安全脉搏编辑huan97 ...

  5. java的四舍五入

    四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么简单了.在讲解之间我们先看如下一个经典的案例: public static void main(String[] ...

  6. JQuery资源网站(收藏)

    收藏几个不错的JQuery资源网站,以后备用,给共享者点个赞!!! http://jquery.com/ http://www.htmleaf.com/ http://www.oschina.net/ ...

  7. 小程序采坑之setData

    根据双向绑定当我setData的时候input的值应该改变,但是并没有.而且this.data中的值也没有改变 <input class="weui-input" bindi ...

  8. 如何弹出WiFi提示列表。

    如果你的程序中用到了WiFi,想在没有有效WiFi的时候出现如图所示的提示该怎么做? 其实很简单, 只需要在Info.plist中添加如下Key/Value UIRequiresPersistentW ...

  9. svn 提交报错post-commit hook failed (exit code 23) with output

    svn 提交文件,hook同步更新报权限错误 排查后可能原因是被同步的服务器 selinux 已开启. 查看状态命令:/usr/sbin/sestatus -v  #如果SELinux status参 ...

  10. iOS 第三方库、插件、知名博客总结

    iOS 第三方库.插件.知名博客总结 用到的组件 1.通过CocoaPods安装 项目名称 项目信息 AFNetworking 网络请求组件 FMDB 本地数据库组件 SDWebImage 多个缩略图 ...