zoukankan      html  css  js  c++  java
  • Asp.net MVC CSS/Javascript Bundle 配置文件

      Asp.net mvc 中使用 Web Optimization 可以合并、压缩JS和CSS文件,但是每次修改都要改代码 ~/App_Start/BundleConfig.cs ,遂有了将它挪到配置文件的想法

      思路很简单,做一个XML配置文件来保存。

      首先,了解一下Bundle有两种,一种是StyleBundle,一种是ScriptBundle,所以配置文件中,需要支持两种;Bundle下的文件,把文件路径加进来就ok了

    1)确定XML格式,如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <bundles xmlns="http://www.mobwiz.net/Schema/BundleConfig">
      <cssbundles>
        <bundle>
          <name>~/content/backstage</name>
          <files>
            <file>~/Content/bootstrap.min.css</file>
            <file>~/Content/bootstrap-theme.min.css</file>
            <file>~/Content/bootstrap-datetimepicker.min.css</file>
            <file>~/Content/treetable/jquery.treetable.css</file>
            <file>~/Content/treetable/jquery.treetable.theme.default.css</file>
            <file>~/Content/admin.css</file>
            <file>~/Content/uploadify.css</file>
          </files>
        </bundle>
        <bundle>
          <name>~/content/portal</name>
          <files>
            <file>~/Content/bootstrap.min.css</file>
            <file>~/Content/bootstrap-theme.min.css</file>
            <file>~/Content/portal.css</file>
          </files>
        </bundle>
      </cssbundles>
      <scriptbundles>
        <bundle>
          <name>~/script/backjs</name>
          <files>
            <file>~/Scripts/jquery-1.11.2.min.js</file>
            <file>~/Scripts/bootstrap.min.js</file>
            <file>~/Scripts/jquery.cookie.js</file>
            <file>~/Scripts/jquery.validate.min.js</file>
            <file>~/Scripts/jquery.validate.unobtrusive.min.js</file>
            <file>~/Scripts/jquery.validate.unobtrusive.bootstrap.min.js</file>
            <file>~/Scripts/jquery.treetable.js</file>
            <file>~/Scripts/jquery.uploadify.min.js</file>
            <file>~/Scripts/json2.js</file>
            <file>~/Scripts/jquery.autosize-min.js</file>
            <file>~/Scripts/jquery.ba-bbq.js</file>
            <file>~/Scripts/mwext.js</file>
            <file>~/Scripts/jquery.uploadify.min.js</file>
            <file>~/Scripts/moment.min.js</file>
            <file>~/Scripts/moment-with-locales.min.js</file>
            <file>~/Scripts/bootstrap-datetimepicker.min.js</file>
            <file>~/Scripts/bootstrap-treeview.min.js</file>
          </files>
        </bundle>
        <bundle>
          <name>~/script/keditor</name>
          <files>
            <file>~/kindeditor/kindeditor-all-min.js</file>
            <file>~/kindeditor/lang/zh_CN.js</file>
          </files>
        </bundle>
        <bundle>
          <name>~/script/fixie</name>
          <files>
            <file>~/Script/html5shiv.min.js</file>
            <file>~/Script/respond.min.js</file>
          </files>
        </bundle>
      </scriptbundles>
    </bundles>

    2)读取代码

    public class BundleConfig
        {
            // For more information on bundling, visit http://go.microsoft.com/fwlink/?LinkId=301862
            public static void RegisterBundles(BundleCollection bundles)
            {
                var path = HttpContext.Current.Server.MapPath("~/App_Data/bundles.config");
    
                XElement rootEL = XElement.Load(path);
                XNamespace ns = rootEL.Attribute("xmlns").Value;
                Debug.Assert(rootEL != null);
    
                var cssBundles = rootEL.Element(ns + "cssbundles");
                if (cssBundles != null && cssBundles.HasElements)
                {
                    var list = cssBundles.Elements(ns + "bundle");
    
                    if (list != null)
                    {
                        foreach (var xElement in list)
                        {
                            var name = xElement.Element(ns + "name").Value;
    
                            var files = xElement.Element(ns + "files").Elements(ns + "file");
                            var fileList = new List<string>();
                            foreach (var element in files)
                            {
                                fileList.Add(element.Value);
                            }
                            bundles.Add(new StyleBundle(name).Include(fileList.ToArray()));
                        }
                    }
                }
    
                var scriptBundles = rootEL.Element(ns + "scriptbundles");
                if (scriptBundles != null && scriptBundles.HasElements)
                {
                    var list = scriptBundles.Elements(ns + "bundle");
                    if (list != null)
                    {
                        foreach (var xElement in list)
                        {
                            var name = xElement.Element(ns + "name").Value;
                            var files = xElement.Element(ns + "files").Elements(ns + "file");
                            var fileList = new List<string>();
                            foreach (var element in files)
                            {
                                fileList.Add(element.Value);
                            }
                            bundles.Add(new ScriptBundle(name).Include(fileList.ToArray()));
                        }
                    }
                }
            }
        }

    这段代码,写得比较粗暴,各位就将就看一下了,原理就是读取xml中的配置,然后添加到BundleConfig中去

    3)Schema编写

    因为是配置文件,做个Schema,这样用VS编写,也会有语法提示了,避免错误,XSD用XML Spy做的,本来想上传文件的,结果没找到怎么插入一个附件,就贴代码了,复制,保存到一个xsd,放到VS 的 Schema目录下,就 ok了。

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.mobwiz.net/Schema/BundleConfig"
        xmlns="http://www.mobwiz.net/Schema/BundleConfig"
         elementFormDefault="qualified" attributeFormDefault="unqualified">
        <xs:element name="bundles">
            <xs:annotation>
                <xs:documentation>Root element for bundles</xs:documentation>
            </xs:annotation>
            <xs:complexType>
                <xs:all>
                    <xs:element name="cssbundles">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="bundle" type="bundleType" maxOccurs="unbounded"/>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                    <xs:element name="scriptbundles">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="bundle" type="bundleType" maxOccurs="unbounded"/>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:all>
            </xs:complexType>
        </xs:element>
        <xs:complexType name="bundleType">
            <xs:annotation>
                <xs:documentation>Bundle Type</xs:documentation>
            </xs:annotation>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="files">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="file" type="xs:string" maxOccurs="unbounded"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:schema>
    View Code

    4)改动更新

    这个还没实现,思路是使用 FileSystemWatcher 监视配置文件,如果文件发生改动,就重新载入这些配置。当然,也可以简单粗暴 的直接重启网站,这样就重新载入了。

    5)引用

    这个没变化,在页面里用下面的代码调用即可 

    @Styles.Render("~/content/backstage")
    @Scripts.Render("~/script/backjs")

    2015.06.17

  • 相关阅读:
    httpcontext in asp.net unit test
    initialize or clean up your unittest within .net unit test
    Load a script file in sencha, supports both asynchronous and synchronous approaches
    classes system in sencha touch
    ASP.NET MVC got 405 error on HTTP DELETE request
    how to run demo city bars using sencha architect
    sencha touch mvc
    sencha touch json store
    sencha touch jsonp
    51Nod 1344:走格子(贪心)
  • 原文地址:https://www.cnblogs.com/mobwiz/p/css_js_bundle_config.html
Copyright © 2011-2022 走看看