번 들러는 .min 파일을 포함하지 않습니다


261

확장명이 .min.js 인 파일을 포함하지 않는 mvc4 번 들러에 이상한 문제가 있습니다.

내 BundleConfig 클래스에서 선언합니다.

public static void RegisterBundles(BundleCollection bundles)
{
    bundles.Add(new ScriptBundle("~/Scripts/jquery")
        .Include("~/Scripts/jquery-1.8.0.js")
        .Include("~/Scripts/jquery.tmpl.min.js"));            
}

내 견해로는, 나는 선언한다

<html>
    <head>
    @Scripts.Render("~/Scripts/jquery")
    </head><body>test</body>
</html>

렌더링 할 때는 렌더링 만

<html>
    <head>
         <script src="/Scripts/jquery-1.8.0.js"></script>
    </head>
    <body>test</body>
</html>

jquery.tmpl.min.js의 이름을 jquery.tmpl.js로 바꾸고 그에 따라 번들의 경로를 업데이트하면 두 스크립트가 모두 올바르게 렌더링됩니다.

'.min.js'파일을 무시하는 구성 설정이 있습니까?


MVC 4 번 들러를 사용하고 있으며 .min.js 파일을 포함하고 있습니다.
Eric J.

RTM 버전 또는 RC? 그것은 나를 위해 RC에서도 잘 작동했다
치명적인

10
디버그 모드에서 작업하면 축소없이 "dev"버전이 사용되고 디버그 이외 모드에서는 축소 된 버전이 선택됩니다. 실제로 작동하는지 확인하려면 web.config 디버그 값을 true에서 false로 변경하십시오.
피터 Germishuys

28
어떤 경우에는 스크립트의 축소되지 않은 버전이 없습니다. 두 파일이 모두 있으면 이해할 수 있습니다 .
치명적인

1
기본적으로 이와 같이 작동하는 것은 엄청납니다 ... 확실히 파일이 축소 되었을 수 있지만 Microsoft는 캐시 버스 팅 목적으로 번들에 사전 축소 된 스크립트를 추가하는 이점을 보지 못했다고 생각합니다 (매우 작은 v매개 변수 해시 즉, URL에 추가되고 변경됩니다 때 파일 내용 변경)
nothingisnecessary

답변:


257

내가 처음 게시 한 솔루션은 의문의 여지가 있습니다 (더러운 해킹입니다). 조정 된 동작은 Microsoft.AspNet.Web.Optimization 패키지에서 변경되었으며 많은 주석 작성자가 지적한 것처럼 조정이 더 이상 작동하지 않습니다. 현재 패키지 버전 1.1.3에서는 문제를 전혀 재현 할 수 없습니다.

System.Web.Optimization.BundleCollection의 소스 (당신이 사용할 수있는 참조하십시오 dotPeek을 당신이에 대해 할 수있는 무엇의 더 나은 이해를 위해 예 :). Max Shmelev의 답변 도 읽으십시오 .

원래 답변 :

.min.js의 이름을 .js로 바꾸거나 다음과 같은 작업을 수행하십시오.

    public static void AddDefaultIgnorePatterns(IgnoreList ignoreList)
    {
        if (ignoreList == null)
            throw new ArgumentNullException("ignoreList");
        ignoreList.Ignore("*.intellisense.js");
        ignoreList.Ignore("*-vsdoc.js");
        ignoreList.Ignore("*.debug.js", OptimizationMode.WhenEnabled);
        //ignoreList.Ignore("*.min.js", OptimizationMode.WhenDisabled);
        ignoreList.Ignore("*.min.css", OptimizationMode.WhenDisabled);
    }

    public static void RegisterBundles(BundleCollection bundles)
    {
        bundles.IgnoreList.Clear();
        AddDefaultIgnorePatterns(bundles.IgnoreList);
        //NOTE: it's bundles.DirectoryFilter in Microsoft.AspNet.Web.Optimization.1.1.3 and not bundles.IgnoreList

        //...your code
     }

4
나도 고마워-그래서 내 MVC4 gotcha 목록에 추가 :)
Dan B

27
이것은 긴 wtf 순간이었고, 그 이유 또는 결과로 주석 처리 된 최소 파일을 추가했을 수 있었으며, 이제 내 스크립트 파일을 누가 출력에서 ​​훔치고 있는지 궁금해하는 데 시간이 낭비되었습니다.
Giedrius

5
OP의 Fatal의 의견에 따르면,이 솔루션은 축소 버전과 일반 버전이 모두있는 경우 중복 참조를 생성합니다 (예 : jquery).
danmiser

11
M $, somefile.min.js가 명시 적으로 지정되었거나 .min.js 파일 만 있으면 .min.js 파일 만 포함하십시오! 그렇지 않으면 현재 동작을 적용하십시오!
Adaptabi

3
실제 클래스를 "IgnoreList"라고하는 것은 놀라운 일이지만 Object에서 직접 파생됩니다. LINQ, 반복 없음 - msdn.microsoft.com/en-us/library/...
JP 열 BERGE

176

Microsoft는 다음과 같은 동작을 암시합니다 (그리고 프로젝트에서 따르기를 선호합니다).

짧은 버전

  1. 프로젝트의 동일한 폴더에 스크립트의 디버그 버전과 축소 버전이 모두 있습니다.
    • script.js
    • script.min.js
  2. 코드의 번들에는 script.js 만 추가합니다 .

그 결과는 것입니다 자동으로script.js는 에 포함 된 디버그 모드와 script.min.js 에서 RELEASE 모드.

긴 버전

.debug.js 버전 도있을 수 있습니다 . 이 경우 파일은 DEBUG에서 다음 우선 순위에 포함됩니다.

  1. script.debug.js
  2. script.js

릴리스에서 :

  1. script.min.js
  2. script.js

노트

그건 그렇고, 유일한 이유는이하는 30 ℃와 pH 5.5 또는 다른 pH의 MVC4가 축소 된 버전이 자동으로 처리 할 수없는 경우가에서 스크립트의 버전을. 예를 들어 다음 코드는 자동으로 난독 처리 할 수 ​​없습니다.

if (DEBUG) console.log("Debug message");

다른 모든 경우에는 스크립트의 디버그 버전 만 있으면됩니다.


6
그러나 좋은 설명이지만 OP의 문제는 일부 스크립트 ( jquery.tmpl)에 포함되지 않은 파일이 아닌 버전의 파일을 다운로드하지 않았다는 것입니다. 번
들러

동의하지만 좋은 설명이지만 OP의 모든 질문에 대답하지는 않습니다.
Diego

2
짧은 버전이 작동하지 않았습니다. "script.js"는이 두 릴리스 유형 모두에 포함됩니다. DEBUG / RELEASE를 토글하고 (소스를 볼 때) 'script.js'가 선택 / 렌더링되었습니다.
user981375

4
user981375를 사용하려면 web.config 파일에서 <compilation debug = "false"/>도 설정해야합니다.
Max Shmelev

5
이 답변은 "모범 사례"접근 방식이므로 동일한 목표를 달성하기 위해 번 들러의 기본 규칙을 따르는 방법에 대해 설명합니다.
James Reategui

5

파일의 축소 버전 만 있으면 축소 된 파일을 복사하고 복사 된 파일 이름에서 .min을 제거한 다음 번들에서 축소되지 않은 파일 이름을 참조하는 것이 가장 간단한 해결책입니다.

예를 들어 js 구성 요소를 구입했는데 some-lib-3.2.1.min.js라는 파일이 있다고 가정합니다. 이 파일을 번들로 사용하려면 다음을 수행하십시오.

  1. some-lib-3.2.1.min.js를 복사하고 복사 한 파일의 이름을 some-lib-3.2.1.js로 바꿉니다. 프로젝트에 두 파일을 모두 포함하십시오.

  2. 다음과 같이 번들에서 축소되지 않은 파일을 참조하십시오.

    bundles.Add(new ScriptBundle("~/bundles/libraries").Include(
        "~/Scripts/some-lib-{version}.js"
    ));

이름에 'min'이없는 파일이 실제로 축소 되었기 때문에 실제로 읽을 수없는 사실을 제외하고는 문제를 일으키지 않아야합니다. 디버그 모드에서만 사용되며 별도의 스크립트로 작성됩니다. 디버그 모드가 아닌 경우 사전 컴파일 된 최소 파일이 번들에 포함되어야합니다.


4

적어도 MVC5에서 작동하는 좋은 솔루션을 찾았습니다 . Bundle대신 사용할 수 있습니다 ScriptBundle. 이 경우 ScriptBundle우리가 좋아하지 않는 똑똑한 행동은 없습니다 (.min 등 무시). 내 솔루션 Bundle에서 .min 및 .map 파일과 함께 3d 파티 스크립트를 사용 ScriptBundle하고 코드에 사용 합니다. 나는 그것을하는 데 대한 단점을 발견하지 못했습니다. 이러한 방식으로 작동하려면 angular.js와 같은 원본 파일을 추가해야하며 디버그에서 angular.js를로드하고 angular.min.js를 릴리스 모드로 번들로 제공합니다.


최적화가 비활성화되어 있으면 작동하지 않는 것 같습니다 ( ScriptTable.EnableOptimizations = false). 패턴이 포함 된 스크립트 경로는 렌더링되지 않습니다 (예 :) ~/Scripts/thirdpartylib/*.js. 그것은 수행 할 때 작업을 EnableOptimizations = true하지만, 그렇게 ScriptBundle.
Steven Liekens

나는 그것을 개발 중에도 거짓으로 사용하고 설명하는 데 문제가 없으므로 영향을 줄 수있는 다른 것이있을 수 있습니다. 패턴을 작동시키는 대신 includeDirectory를 사용해야합니다.
Ilya Chernomordik

파일의 ".min.js"버전을 렌더링하고 있습니까? 네임 스페이스 System.Web.Optimizations또는 너겟 패키지에서 번들을 사용 하고 Microsoft.Web.Optimizations있습니까?
Steven Liekens

System.Web.Optimization을 사용하고 최소 버전을 렌더링하는지 확인했지만 실제로 IncludeDirectory를 사용하지 않는 것으로 나타 났지만 최소 버전에서는 작동하지 않으면 이상 할 것입니다 ... IncludeDirectory가 아닙니다. 나를 위해 충분히 사용자 정의 스캔을하고 포함을 사용하여 모든 필터를 추가하므로 패턴과 IncludeDirectory가 제대로 작동하지 않을 수도 있지만 조금 이상합니다.
Ilya Chernomordik

1
아니요, 문제는 두 가지입니다. .min.js파일 만 있고 *.js패턴이로 끝나는 파일과 일치하지 않습니다 .min.js.
Steven Liekens

3

*.min.js파일 을 렌더링하려면 BundleTable.EnableOptimizations모든 번들에 적용되는 전역 설정 인 disable을 사용해야합니다 .

특정 번들에 대해서만 최적화를 사용하려는 경우 번들 ScriptBundle에서 파일을 열거 할 때 최적화를 일시적으로 활성화하는 고유 한 유형을 작성할 수 있습니다 .

public class OptimizedScriptBundle : ScriptBundle
{
    public OptimizedScriptBundle(string virtualPath)
        : base(virtualPath)
    {
    }

    public OptimizedScriptBundle(string virtualPath, string cdnPath)
        : base(virtualPath, cdnPath)
    {
    }

    public override IEnumerable<BundleFile> EnumerateFiles(BundleContext context)
    {
        if (context.EnableOptimizations)
            return base.EnumerateFiles(context);
        try
        {
            context.EnableOptimizations = true;
            return base.EnumerateFiles(context);
        }
        finally
        {
            context.EnableOptimizations = false;
        }
    }
}

축소되지 않은 파일이 있는지 여부에 관계없이 축소 된 파일을 항상 사용해야하는 번들 OptimizedScriptBundle대신에 사용하십시오 ScriptBundle.

ASP.NET MVC 용 Kendo UI의 예는 축소 된 파일의 모음으로 배포됩니다.

bundles.Add(new OptimizedScriptBundle("~/bundles/kendo")
        .Include(
            "~/Scripts/kendo/kendo.all.*",
            "~/Scripts/kendo/kendo.aspnetmvc.*",
            "~/Scripts/kendo/cultures/kendo.*",
            "~/Scripts/kendo/messages/kendo.*"));

프로덕션 게시 작업에서 누락 된 스크립트를 발견했으며 이것이 MVC 문제라고 생각했는데이 대답을 찾았습니다. lo. 너무 오랫동안 작업 한 결과, 나는 검도에서 벗어나기 위해 무엇이든한다
Felipe

@Felipe 나는 같은 상황에 있었기 때문에이 답변을 썼습니다. 검도는 끔찍하다. 내 모범이 도움이되기를 바랍니다.
Steven Liekens

2

필자의 경우 디버그 / 비 버전으로 제공되는 (놀라운!) Knockout.js 라이브러리를 사용하고있었습니다.

"~/Scripts/knockout-{Version}.js"
"~/Scripts/knockout-{Version}.Debug.js"

이 작업을 수행하기 위해 번들에 "Knockout- {Version} .js"(비디 버그)를 포함시키고 .debug를 얻었습니다. 디버그 모드의 js 파일.


1

쉬운 방법 .min 파일의 이름을 바꾸십시오. 예를 들어 abc.min.css가있는 경우이 파일의 이름을 abc_min.css로 바꾸고 번들에 추가하는 것보다. 나는 그것을하는 올바른 방법이 아니라 일시적인 해결책을 알고 있습니다. 감사하고 행복한 코딩.


1
너겟 파일을 다운로드 할 때마다, 당신은 그때 이름을 바꿔야합니다.
Anirudha Gupta

나는 그것을 할 수는 없습니다 올바른 방법을 알고 있지만 단지 일시적인 솔루션
RK 샤르마

1
이 줄이 나를 위해 일하고 있음 // BundleTable.EnableOptimizations = true;
Anirudha Gupta

0

들러 혜택을 많이 가지고있는 이 페이지를 확인 하지만를 :

Microsoft MVC4 플랫폼 각 스크립트 또는 스타일 번들에 대해 최소 버전과 최소 버전이 모두 있다고 가정합니다 (디버그 및 vsdoc과 같은 다른 파일도 사용 가능). 따라서 이러한 파일 중 하나만있는 상황에서는 문제가 있습니다.

출력을 처리하기 위해 web.config 파일에서 디버그 상태를 영구적으로 변경할 수 있습니다.

<compilation debug="false" targetFramework="4.0" />

출력 변화를보십시오! 파일 필터링이 변경되었습니다. 목적을 달성하기 위해 애플리케이션 로직을 변경하는 무시 케이스 필터링을 변경해야합니다!


1
debug = "false"를 추가해도 여전히 작동하지 않습니다. IgnoreList를 지우더라도 min.js 파일은 여전히 ​​포함되지 않습니다 ...
MoSs

-21

여러분은 Microsoft가 함께 행동 할 때까지 간단하게 유지하려고합니다.

이 시도

RegisterBundles에서 Kendo에 대한이 번들을 작성하십시오.

bundles.Add(new StyleBundle("~/Content/kendo/css").Include(
                    "~/Content/kendo/2012.3.1121/kendo.common.min.css",
                     "~/Content/kendo/2012.3.1121/kendo.dataviz.min.css",
                      "~/Content/kendo/2012.3.1121/kendo.blueopal.min.css"
 ));

_Layout.cshtml에서 다음을 입력하십시오.

@if (HttpContext.Current.IsDebuggingEnabled)
 { 
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.common.min.css")"      
rel="stylesheet"  type="text/css" />
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.dataviz.min.css")" 
rel="stylesheet" type="text/css" />   
<link href="@Url.Content("~/Content/kendo/2012.3.1121/kendo.blueopal.min.css")"    
rel="stylesheet" type="text/css" />
 }
 else
 {
     @Styles.Render("~/Content/kendo/css")   
 }

이런 식으로 프로덕션에서 번들을 최대한 활용하고 디버그에서 참조를 얻습니다.

Microsoft가 MVC 4 코드를 수정하면 문제 해결


3
나는이 제안 된 솔루션의 팬이 아닙니다. 이제 적어도 두 곳에서 스크립트 세트를 유지해야합니다.
Fatal

이것은 번들링의 목적을 거의 물리 치지 않습니다.
Oliver

4
번들링은 이미 이런 식으로 작동합니다. 디버그 모드에서 프로젝트를 실행하면 각 CSS 파일이 개별적으로로드되지만 릴리스에서 실행하면 하나의 파일로 결합되고 축소됩니다. if 블록 내의 코드는 페이지에서 디버그 모드로 자동 렌더링되는 코드와 동일합니다.
채드 레비
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.