ASP.NET 优化 - 打包

13

我一直在尝试使用ASP.NET MVC 4中的新缩小和捆绑功能,只要您使用默认的css和js文件夹约定,它就非常好用。

/Content
/Scripts

我通常将CSS和脚本放在名为Static的文件夹中,就像这样:

/Static/Css
/Static/Js

我尝试像这样注册我的自定义包:

public static class BundleCollectionExtensions
{
    public static void RegisterScriptsAndCss(this BundleCollection bundles)
    {
        var bootstrapCss = new Bundle("~/Static/Css", new CssMinify());
        bootstrapCss.AddDirectory("~/Static/Css", "*.css");
        bootstrapCss.AddFile("~/Static/Css/MvcValidation.css");
        bootstrapCss.AddFile("~/Static/Css/bootstrap-responsive.min.css");
        bootstrapCss.AddFile("~/Static/Css/bootstrap.min.css");

        bundles.Add(bootstrapCss);

        var bootstrapJs = new Bundle("~/Static/Js", new JsMinify());
        bootstrapJs.AddDirectory("~/Static/Js", "*.js");
        bootstrapJs.AddFile("~/Static/Js/jquery-1.7.1.min.js");
        bootstrapJs.AddFile("~/Static/Js/jquery.validate.min.js");
        bootstrapJs.AddFile("~/Static/Js/jquery.validate.unobtrusive.min.js");
        bootstrapJs.AddFile("~/Static/Js/bootstrap.min.js");
        bootstrapJs.AddFile("~/Static/Js/gunsforhire.js");

        bundles.Add(bootstrapJs);
    }
}

并且在

Global.ascx.cs

我做了这个:

BundleTable.Bundles.RegisterScriptsAndCss();

生成的标记看起来像这样:

<link href="/Static/Css?v=D9JdmLZFFwjRwraNKfA1uei_YMoBoqLf-gFc0zHivM41" rel="stylesheet" type="text/css" />

<script src="/Static/Js?v=mbKbf5__802kj-2LS5j9Ba-wvSxBCKNMQGBgzou6iZs1" type="text/javascript"></script>

但是它不起作用,请求看起来像这样:

Request URL:http://localhost:49603/Static/Js?v=mbKbf5__802kj-2LS5j9Ba-wvSxBCKNMQGBgzou6iZs1
Request Method:GET
Status Code:301 Moved Permanently (from cache)
Query String Parametersview URL encoded
v:mbKbf5__802kj-2LS5j9Ba-wvSxBCKNMQGBgzou6iZs1

Request URL:http://localhost:49603/Static/Js/?v=mbKbf5__802kj-2LS5j9Ba-wvSxBCKNMQGBgzou6iZs1
Request Method:GET
Status Code:404 Not Found
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Host:localhost:49603
Referer:http://localhost:49603/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko)        Chrome/17.0.963.56 Safari/535.11
Query String Parametersview URL encoded
v:mbKbf5__802kj-2LS5j9Ba-wvSxBCKNMQGBgzou6iZs1
Response Headersview source
Cache-Control:private
Content-Length:4757
Content-Type:text/html; charset=utf-8
Date:Thu, 01 Mar 2012 19:05:44 GMT
Server:Microsoft-IIS/7.5
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?   QzpcQENvZGVccGVsbGVccGVsbGVoZW5yaWtzc29uLnNlXHNyY1xXZWJcU3RhdGljXEpzXA==?=

我做错了什么?

更新

我认为我最终通过以下方式解决了这个问题:

  1. 删除AddDirectory调用bootstrapCss.AddDirectory(“〜/ Static / Css”,“*. css”);

  2. 给bundles路径,这些路径不反映真实的目录结构


1
“给捆绑包分配不反映实际目录结构的路径”这句话是什么意思? - CallMeLaNN
如果你有一个像这样的目录结构 /scripts/app,你不应该在捆绑中使用该路径("~/scripts/app")。或者至少我在mvc 4 rc中遇到了一些问题。也许现在已经不是问题了。 - Pelle
你好,你知道我缺少哪个命名空间吗?我在bootstrapcss中没有看到Addfile或AddDirectory。 - Sakthivel
4个回答

7
你所做的“错误”是,你的bundle路径对应着一个真实路径。按照我的理解,当请求 “/Static/Css?v=D9JdmLZFFwjRwraNKfA1uei_YMoBoqLf-gFc0zHivM41” 时,路由引擎首先会查找物理路径。它在你的“static”文件夹中找到了一个匹配项,并试图在其中找到与“Css?v=D9JdmLZFFwjRwraNKfA1uei_YMoBoqLf-gFc0zHivM41”相匹配的文件。因为它不存在,所以返回了404错误。(我还见过访问被拒绝的情况。)当路由引擎无法找到物理文件路径时,它会寻找其他处理程序(如捆绑和压缩)来提供请求。
总之,我认为你已经从你的评论中明白了这一点,但我不确定这对于任何发现你问题的人来说是否非常清晰。只需将你的注册更改为:
var bootstrapCss = new Bundle("~/Static/Css", new CssMinify());

to:

var bootstrapCss = new Bundle("~/bundles/Css", new CssMinify());

如果您进行这种更改,您的问题将消失,(前提是没有与"bundles"对应的物理路径)。

4

如果几天前已经完成了这个操作并且它运行良好。我创建了一个名为Helper的文件夹,然后创建了一个名为CssJsBuilder的新类。

我的类看起来像这样:

public static void Initializing()
{
   IBundleTransform jstransformer;
   IBundleTransform csstransformer;

#if DEBUG
            jstransformer = new NoTransform("text/javascript");
            csstransformer = new NoTransform("text/css");
#else
      jstransformer = new JsMinify();
      csstransformer = new CssMinify();
#endif

            var bundle = new Bundle("~/Scripts/js", jstransformer);

            bundle.AddFile("~/Scripts/jquery-1.6.2.js", true);
            bundle.AddFile("~/Scripts/jquery-ui-1.8.11.js", true);
            bundle.AddFile("~/Scripts/jquery.validate.unobtrusive.js", true);
            bundle.AddFile("~/Scripts/jquery.unobtrusive-ajax.js", true);
            bundle.AddFile("~/Scripts/jquery.validate.js", true);
            bundle.AddFile("~/Scripts/modernizr-2.0.6-development-only.js", true);
            bundle.AddFile("~/Scripts/AjaxLogin.js", true);
            bundle.AddFile("~/Scripts/knockout-2.0.0.debug.js", true);
            bundle.AddFile("~/Scripts/bootstrap.js", true);
            bundle.AddFile("~/Scripts/dungeon.custom.js", true);

            BundleTable.Bundles.Add(bundle);

            bundle = new Bundle("~/Content/css", csstransformer);

            bundle.AddFile("~/Content/bootstrap-responsive.css", true);
            bundle.AddFile("~/Content/bootstrap.css", true);

            BundleTable.Bundles.Add(bundle);

            bundle = new Bundle("~/Content/themes/base/css", csstransformer);

            bundle.AddFile("~/Content/themes/base/jquery.ui.core.css", true);
            bundle.AddFile("~/Content/themes/base/jquery.ui.resizable.css", true);
            bundle.AddFile("~/Content/themes/base/jquery.ui.selectable.css", true);
            bundle.AddFile("~/Content/themes/base/jquery.ui.accordion.css", true);
            bundle.AddFile("~/Content/themes/base/jquery.ui.autocomplete.css", true);
            bundle.AddFile("~/Content/themes/base/jquery.ui.button.css", true);
            bundle.AddFile("~/Content/themes/base/jquery.ui.dialog.css", true);
            bundle.AddFile("~/Content/themes/base/jquery.ui.slider.css", true);
            bundle.AddFile("~/Content/themes/base/jquery.ui.tabs.css", true);
            bundle.AddFile("~/Content/themes/base/jquery.ui.datepicker.css", true);
            bundle.AddFile("~/Content/themes/base/jquery.ui.progressbar.css", true);
            bundle.AddFile("~/Content/themes/base/jquery.ui.theme.css", true);

            BundleTable.Bundles.Add(bundle);
        }

接下来,转到Global.asax

  1. 删除或注释掉BundleTable.Bundles.RegisterTemplateBundles()
  2. CssJsBuilder.Initializing()添加到Application_Start()方法中。
  3. 重新创建项目,然后再次启动。

希望这对您也有用。


2
在Global.asax.cs中替换

BundleTable.Bundles.RegisterTemplateBundles();

使用

BundleTable.Bundles.EnableDefaultBundles();


0

这是我如何操作的。

这是简化版本,我只使用了 default.aspx 文件,没有使用 global.asax(如果您想使用也可以)

在这个例子中,我使用了 2 个目录,Content2Scripts2

在 Content2 中,我有 2 个 CSS 文件,一个用于 class="naziv",另一个用于 class="naziv2"

在 Scripts2 中,有 2 个文件,一个定义了函数 f1(),另一个定义了函数 f2()

在 /bin 目录中应该有 3 个文件:

Microsoft.Web.Infrastructure.dll, System.Web.Optimization.dll, WebGrease.dll

<%@ Page Title="Home Page" Language="vb" debug="true"%>
<%@ Import namespace="System.Web.Optimization" %>

<script runat="server" >
    Sub Page_Load(sender As Object, e As EventArgs)
        System.Web.Optimization.BundleTable.EnableOptimizations = True ''true will force optimization even if debug=true

        Dim siteCssBundle = New StyleBundle("~/Content2/css")
        siteCssBundle.IncludeDirectory("~/Content2", "*.css")
        BundleTable.Bundles.Add(siteCssBundle)

        Dim siteJsBundle = New ScriptBundle("~/Scripts2/js")
        siteJsBundle.IncludeDirectory("~/Scripts2", "*.js")
        BundleTable.Bundles.Add(siteJsBundle)
    End Sub
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
    </head>
    <body onload="f1(); f2();">
        <%: Styles.Render("~/Content2/css")%>
        <%: Scripts.Render("~/Scripts2/js")%>
        <br />
        <span class="naziv">Span 1</span> <br />
        <span class="naziv2">Span 2</span> <br />
    </body>
</html>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接