最近项目中用到了easy ui ,但是在配置BundleConfig 的时候出现了问题,easy ui的脚本jquery.easyui.min.js 压缩后出现各种脚本错误,总是莫名其妙的 i标量错误,xx未定义。其实在其他项目中也会遇到压缩后报错的问题,只是js文件比较小,直接在页面就引用了,不过easyui文件有700kb左右,直接引用会导致浏览器无法出现200 OK(from cache)缓存,增加http开销。

  百度,谷歌也没有太好的解决办法。只能自己想办法了,通过分析System.Web.Optimization源码,发现在资源合并前会对ScriptBundle应用Transforms。最后发现只要Bundle在加入 BundleCollection之前清空Transforms就不会在压缩原始资源了。

明白原理也有解决方案了,比如:

 

1.在 bundles.Add(...)前清空Bundle.Transforms:

  • 优点:简单,无需任何额外附件代码即可实现
  • 缺点:不能对Include(... ...)的每一项资源单独设定是否压缩
var scriptBundle=new ScriptBundle("~/Content/jquery.easyui/1.4.5/js").Include(
    "~/Content/jquery.easyui/1.4.5/jquery.easyui.min.js",
    "~/Content/jquery.easyui/1.4.5/locale/easyui-lang-zh_CN.js");
scriptBundle.Transforms.Clear();
bundles.Add(scriptBundle);

  

2.写一个扩展方法,清空Transforms并返回Bundle:

  • 优点:简单;
  • 缺点:不能对Include(... ...)的每一项资源单独设定是否压缩;
public static class BundleEx
{
    public static Bundle NoMinify(this Bundle scriptBundle)
    {
        scriptBundle.Transforms.Clear();
        return scriptBundle;
    }
}

 

bundles.Add(new ScriptBundle("~/Content/jquery.easyui/1.4.5/js").Include(
                "~/Content/jquery.easyui/1.4.5/jquery.easyui.min.js",
                "~/Content/jquery.easyui/1.4.5/locale/easyui-lang-zh_CN.js").NoMinify());

 

  

 

3.自己继承 ScriptBundle重写Transforms逻辑,或者重写GenerateBundleResponse(BundleContext context)不应用Transform;

 

  • 优点:灵活,可以单独控制每个文件是否进行压缩;
  • 缺点:额外增加代码

 

相关文章:

  • 2021-06-17
  • 2022-01-13
  • 2022-02-02
  • 2022-12-23
  • 2021-07-13
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-28
  • 2021-11-15
  • 2021-08-09
  • 2021-09-02
  • 2021-07-20
  • 2021-12-13
相关资源
相似解决方案