首页 > 编程 > JavaScript > 正文

Asp.net MVC CSS/Javascript Bundle 配置文件

2019-11-17 02:09:54
字体:
来源:转载
供稿:网友

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)引用

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表