将其他文件添加到C#脚本和css包中

时间:2017-08-17 23:19:54

标签: javascript c# css optimization minify

好的,所以我一直在使用C#捆绑来缩小和组合脚本和CSS。

但我不确定如何将脚本附加到已经创建的包中。

我试图附加到捆绑包,因为并非所有脚本都在同一个文件中,因为我正在使用visual studio中的nopcommerce解决方案。因此,脚本将添加到整个解决方案中。

以下是捆绑代码:

bundles.Add(new ScriptBundle("~/Content/themes/base/js/scripts/footeroptimized").Include(
    "~/Themes/MyTheme/Content/js/bootstrap.min.js",
    "~/Scripts/jquery.validate.min.js",
    "~/Scripts/jquery.validate.unobtrusive.min.js",
    "~/Scripts/public.common.min.js",
    "~/Themes/MyTheme/Content/js/readmore.min.js"));

我想也许我可以使用捆绑.Add()函数,但是我收到错误:

 bundles.Add("~/Themes/MyTheme/Content/js/global.min.js"));

错误是:"无法从字符串转换为system.web.optimization.bundle"

我无法找到解释为什么我会收到这个错误。

我还添加了优化的使用声明@using System.Web.Optimization;

任何人都知道如何添加到已创建的包中。

更新:

我也尝试了以下但是它不起作用:

var footerScriptBundle = new ScriptBundle("~/Content/themes/base/js/scripts/footeroptimized");
footerScriptBundle.Include(
    "~/Themes/MyTheme/Content/js/bootstrap.min.js",
    "~/Scripts/jquery.validate.min.js",
    "~/Scripts/jquery.validate.unobtrusive.min.js",
    "~/Scripts/public.common.min.js",
    "~/Themes/MyTheme/Content/js/readmore.min.js");

footerScriptBundle.Include("~/Themes/MyTheme/Content/js/global.min.js");

干杯

2 个答案:

答案 0 :(得分:1)

您描述的用例不适合捆绑包。您无法在运行时修改捆绑包,即使可以,也无法修改捆绑包。

想一想。您访问一个页面,并请求并接收浏览器缓存的包abc.js。然后,您访问另一个页面,该页面也会询问abc.js,只有您希望内容不同。除此之外,浏览器不会要求该文件,并将重用旧文件,因为它已被缓存。捆绑包用于避免在多个页面上一起发送总是需要的文件。

如果您确实需要捆绑其他文件,则需要将不同的文件放入自己的捆绑包中,并在每个页面上请求两个捆绑包,或者为每个不同的方案创建一个捆绑包,包含所有基本文件的捆绑包加上特定于站点区域的文件。

但是,如果只需要一个附加文件,并且您尝试添加到捆绑包中的文件仅用于一个页面,那么您做错了。该文件根本不属于捆绑包!只需像往常一样使用正常的<script><link>标记进行投放。即使您有多个文件,如果它们只在一个页面上使用,也许您可​​以将它们组合成一个(非捆绑的)文件。或者如上所述,制作一个仅适用于那些少数文件的特殊包,并包含或不包含它作为第二个单独的包。

浏览器不得不请求两个对象,一个包以及一个特定于页面的javascript或第二个包的额外开销并不是那么大。尝试以这种方式构建捆绑包不会获得很大的价值,这样做将成为梦魇比例的头痛。不要那样做。

有一天使用HTTP 2.0,我们可能会忘记捆绑,因为浏览器可以通过单个请求请求许多文件,然后在单个响应中接收所有答案。在这一点上,缩小仍然很重要,但我们会完全放弃捆绑,因为它们的好处将通过协议本身完全实现。仍然可能有多个请求,沿着可以处理请求的地方分开,例如,对可以从CDN提供的所有静态内容(图像,视频,样式表,javascript等)的一个请求,以及一个请求对于所有动态内容。

答案 1 :(得分:0)

因为我在研发之间丢失了此问题的URL,所以我在MSDN博客上留下了答复(因此下面的txt并不侵犯版权)。
https://blogs.msdn.microsoft.com/rickandy/2012/08/14/adding-bundling-and-minification-to-web-forms/#comment-47175

将文件包含在MasterPage中的原因是合理的,以便在一个与之相关的地方拥有通用文件,但这可以为其他目的提供解决方案:
顺便说一句,它基本上不必在global.asax中注册。我喜欢在MasterPage中有捆绑文件的url列表(将相关的内容放在一个地方),所以我滥用:) BundleConfig中名为“ IsRegistered”的静态布尔值?初始化为false,然后在RegisterBundles chk中将其初始化(如果返回true),否则将其设为true并执行寄存器。现在BundleConfig中还有两个其他方法,分别是RenderJS和RenderCSS(它们分别称为Styles.Render和Scripts.Render),但是在渲染之前,这些方法调用RegisterBundles方法(例如PreRender事件),因此现在在注册的命名空间中派生了2个控件作为TagPrefix,控件是JSBundle和CSSBundle,它们接受Src和Href,其设置器将路径添加到BundleConfig中的其他2个数组中(唯一)。最后,RegisterBundles使用数组将其包括在捆绑软件中。现在,我可以从Master.cs甚至在母版本身中添加文件,但只能在渲染时间之前,而不是Application_Start
在主人那里叫这个:

private static bool IsRegistered = false;
//...
public static System.Web.IHtmlString RenderJS(params string[] paths) {
    if (!IsRegistered)
        RegisterBundles();
    return Scripts.Render(paths);
}

并检查RegisterBundles中的注册状态:

public static void RegisterBundles() {
    if (IsRegistered)
        return;
    IsRegistered = true;
    //...;
}

唯一地添加文件:

private static string[] CSSPths
    , JSPths;
public static void AddJS(params string[] pths) {
    if (JSPths == null)
        JSPths = new string[0];
    JSPths = MyNameSpace.Arrays.Merge(JSPths, pths
        .Select(elm => "~/" + elm.TrimStart('~', '/'))
        .Except(JSPths).ToArray());
}

编辑:
嗯,我们可以通过UserControls的OnInit事件(例如NavBar或菜单)将文件添加到包中