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

확장명이 .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’파일을 무시하는 구성 설정이 있습니까?



답변

내가 처음 게시 한 솔루션은 의문의 여지가 있습니다 (더러운 해킹입니다). 조정 된 동작은 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
     }


답변

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

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


답변

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


답변

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


답변

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


답변

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

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

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


답변

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