ASP.NET MVC-번들 구성 순서


84

내 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 내가 원하는 바가 아니다.

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



@PaulMcCowat 예,하지만 아직 축소 된 버전을 사용하고 있지 않습니다. Microsoft.AspNet.Web.Optimizations 1.1.0을 사용하고 있습니다.
Leonardo Herrera

@LeonardoHerrera 크리스 알려진 파일이 들러에 의해 지정된 순서에 주위에 이동되어, 자신의 의견에 언급 된 것처럼 생각하는 것 ...하지만 난 내가하는 그 파일이 무엇인지하지 않도록 때문에 할 수 없다 주도 물어 볼게요 . 주문을 지정하지 않았으므로 IBundleOrderer를 사용하는 것이 효과가 있는지 알고 싶습니다.
MikeSmithDev

[이 링크] [1] [1]에서 @Softlion 대답을보십시오. stackoverflow.com/questions/11979718/…
Omid-RH

@section Scripts { @Scripts.Render("~/bundles/jqueryval") }내 스크립트가 순서대로로드되지 않는 문제를 해결 한 것
같습니다

답변:


103

기본적으로 번들링 순서는 설명에서 지적한대로 와일드 카드가있는 이름의 알파벳순입니다. 그러나 그것은 또한 당신의 의존성 트리가 무엇이라고 생각하는지에 따라 순서를 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의 질문에 대한 답변은 인기있는 스크립트 라이브러리의 기본 순서에 대한 추가 통찰력을 제공합니다.

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


짤막하게하는 것은 아니지만, 와일드 카드와 같은 것을 사용할 때는 "기본적으로 번들링 순서는 알파벳순입니다."는 사실입니다. 순서를 지정할 때, 그가 가지고있는 것처럼, 그의 순서를 사용해야합니다. 번 들러가 알려진 파일 유형을 이동하고 그의 순서를 무시하고 있다고 가정 할 수 있습니다.
MikeSmithDev

번 들러는 종속성에 대한 일부 논리를 사용하여 주문하는 것 같습니다. 그것은 jquery.validate.globalize.js다른 두 사람에게 필요 하다고 생각합니다 . 참조에서 : "[번 들러]는 알려진 프레임 워크 자바 스크립트 파일 (예 : jQuery 또는 Prototype 스크립트)을 자동으로 번들에 먼저 배치하여 해당 유형을 사용하는 코드가 실행되기 전에 실행되도록합니다."
Mister Epic

3
구체적인 순서는 다음과 같습니다. jquery.js jquery-min.js jquery- * jquery-ui * jquery.ui * jquery.unobtrusive * jquery.validate * modernizr- * dojo. * mootools-core * mootools- * prototype.js prototype- * scriptaculous- * ext.js ext- *
ravndal 2014

6
프로그래밍이 재미없는 곳입니다. VS가 이것을 복잡하게 만드는 이유는 무엇입니까?
Jaider 2014

5
이것이 존재한다는 사실은 그것이 얼마나 어리석은 지 내 마음을 날려 버립니다. 정말 .. 번 들러는 내가 입력 한 것보다 내 의존성을 더 잘 주문하는 방법을 알고 있습니까? Gulp.js (또는 Grunt) FTW!
John Culviner

30

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);

이 정보는 어디에서 찾을 수 있습니까? 링크를 제공해 주시겠습니까?
PussInBoots 2014

난 그냥이 질문에 대한 현재의 응답의 방법을 사용하려고하지만 변화 내가 IBundleOrderer 인터페이스를 확인하므로, ASP.NET MVC 5에서 오류가 내 selkf을 발견했다
세바스티안 로자을

Orderer 속성이 없습니다. 저는 MVC 5.2.x를 사용하고 있습니다
Legends

1
MVC 5.2.3으로 테스트하고 tehres는 Orderer 속성입니다.
Sebastián Rojas

28

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

인프라 클래스 필요 :

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",
                    //...
                );

1
좋은 생각!
Aruna
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.