번 들러는 .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.