[javascript] ASP.NET MVC-번들 구성 순서

내 ASP.NET MVC 5 응용 프로그램에서 특정 로캘 (es-CL)을 사용하려고합니다. 다음이 있습니다.

  1. web.config uiculture 및 culture를 “es-CL”로 변경했습니다.
  2. GlobalizejQuery.Validation.Globalize 패키지를 설치했습니다.
  3. 내보기에서 기본 언어를 변경했습니다. <html lang="es-cl">
  4. 새 번들을 생성하고 적절한보기에 포함했습니다.

에서 BundleConfig.cs :

bundles.Add(new ScriptBundle("~/bundles/jqueryval")
    .Include("~/Scripts/jquery.validate.js")
    .Include("~/Scripts/jquery.validate.unobtrusive.js"));

bundles.Add(new ScriptBundle("~/bundles/globalization")
    .Include("~/Scripts/globalize/globalize.js")
    .Include("~/Scripts/globalize/cultures/globalize.culture.es-CL.js")
    .Include("~/Scripts/jquery.validate.globalize.js"));

적절한보기에서 :

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/bundles/globalization")
}

그러나 생성 된 소스 코드는 다음과 같습니다.

<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>

<script src="/Scripts/jquery.validate.globalize.js"></script>
<script src="/Scripts/globalize/globalize.js"></script>
<script src="/Scripts/globalize/cultures/globalize.culture.es-CL.js"></script>

있습니다 jquery.validate.globalize.js의 스크립트가 전에로드되는 globalize.js 내가 원하는 바가 아니다.

왜 이런 일이 발생합니까? 단일 번들의 포함 순서에 의존 할 수 있습니까? 아니면이 단일 스크립트를 다른 번들에 넣고 내보기에서 지정해야합니까?



답변

기본적으로 번들링 순서는 설명에서 지적한대로 와일드 카드가있는 이름의 알파벳순입니다. 그러나 그것은 또한 당신의 의존성 트리가 무엇이라고 생각하는지에 따라 순서를 jQuery정하고 스크립트가 맨 위에있는 것처럼 보입니다. 다음을 구현하는 객체를 만들어야합니다 IBundleOrder.

class NonOrderingBundleOrderer : IBundleOrderer
{
    public IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files)
    {
        return files;
    }
}

이것은 기본 순서를 방지합니다. 이제 사용하려면 :

var bundle = new ScriptBundle("~/bundles/globalization")
    .Include("~/Scripts/globalize/globalize.js")
    .Include("~/Scripts/globalize/cultures/globalize.culture.es-CL.js")
    .Include("~/Scripts/jquery.validate.globalize.js");

bundle.Orderer = new NonOrderingBundleOrderer();

bundles.Add(bundle);

참조 : http://stevescodingblog.co.uk/changing-the-ordering-for-single-bundles-in-asp-net-4/

추가 읽기를 위해 MikeSmithDev의 질문에 대한 답변은 인기있는 스크립트 라이브러리의 기본 순서에 대한 추가 통찰력을 제공합니다.

번들 내 파일 순서-알려진 라이브러리는 무엇입니까?


답변

MVC 5의 마지막 버전 (2014 년 10 월 27 일)에서는이 클래스를 대신 사용해야합니다.

class AsIsBundleOrderer : IBundleOrderer
{
    public IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> files)
    {
        return files;
    }
}

그리고 다른 응답과 같이 번들을 만듭니다.

var bundle = new ScriptBundle("~/bundles/globalization")
.Include("~/Scripts/globalize/globalize.js")
.Include("~/Scripts/globalize/cultures/globalize.culture.es-CL.js")
.Include("~/Scripts/jquery.validate.globalize.js");

bundle.Orderer = new AsIsBundleOrderer();

bundles.Add(bundle);


답변

번들을 만드는 동안 코드줄이려면 확장 메서드를 만드는 것이 좋습니다.

인프라 클래스 필요 :

class NonOrderingBundleOrderer : IBundleOrderer
{
    public IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> files)
    {
        return files;
    }
}


static class BundleExtentions
{
    public static Bundle NonOrdering(this Bundle bundle)
    {
        bundle.Orderer=new NonOrderingBundleOrderer();
        return bundle;
    }
}

이제 다음과 같이 사용하십시오.

하나의 명령으로 모두 ?

bundles.Add(new ScriptBundle("~/bundles/jqueryval")
               .NonOrdering()
               .Include(
                    "~/Scripts/globalize/globalize.js",
                    "~/Scripts/globalize/cultures/globalize.culture.es-CL.js",
                    //...
                );


답변