Bundler .min dosyaları içermiyor


261

Mvc4 bundler ile .min.js uzantılı dosyalar dahil garip bir sorun var

BundleConfig sınıfımda beyan ederim

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

Bence beyan ederim

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

Ve işlediğinde, yalnızca

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

Jquery.tmpl.min.js dosyasını jquery.tmpl.js olarak yeniden adlandırırsam (ve paketteki yolu buna göre güncelleştirirsem), her iki komut dosyası da doğru şekilde işlenir.

'.Min.js' dosyalarını yoksaymasına neden olan bazı yapılandırma ayarları var mı?


MVC 4 bundler kullanıyorum ve .min.js dosyaları dahil.
Eric J.

sürümü veya RC? RC'de benim için de Tamam çalışıyordu
Ölümcül

10
Fikir, hata ayıklama modunda çalışmanın, küçültme olmadan "dev" sürümünün kullanılacağı ve hata ayıklama modunda olduğunuzda, küçültülmüş sürümün seçilmesidir. Eylem halinde görmek için web.config hata ayıklama değerinizi true yerine false olarak değiştirin.
Pieter Germishuys

28
bazı durumlarda komut dosyasının küçültülmüş olmayan sürümüne sahip değilsiniz. Ben olabilir belki iki dosya var olsaydı bunu anlıyoruz.
Ölümcül

1
Varsayılan olarak böyle çalıştığı bir serseri ... emin, dosya zaten küçültülmüş olabilir , ancak Microsoft'un önbellek bozma amaçları için paketlere önceden küçültülmüş komut dosyaları ekleme avantajını göremediğini düşünüyorum (güzel küçük vparametre karması URL'ye eklenir ve dosya içeriği değiştiğinde değişir)
hiçbir şey gerekmez

Yanıtlar:


257

Başlangıçta gönderdiğim çözüm şüpheli (kirli bir kesmek). Tweaked davranışı Microsoft.AspNet.Web.Optimization paketinde değişti ve tweak artık birçok yorumcunun işaret ettiği gibi çalışmıyor. Şu anda sorunu paketin 1.1.3 sürümü ile yeniden oluşturamıyorum.

Ne yapmak üzere olduğunuzu daha iyi anlamak için lütfen System.Web.Optimization.BundleCollection kaynaklarına bakın ( örneğin dotPeek kullanabilirsiniz ). Ayrıca Max Shmelev'in cevabını da okuyun .

Orijinal cevap :

.Min.js dosyasını .js olarak yeniden adlandırın veya benzeri bir şey yapın

    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
Benden de teşekkürler - bu yüzden bunu MVC4 gotcha listeme ekleyerek :)
Dan B

27
Bu uzun bir wtf anıydı, sebep ya da sonuçlanacak bir şeyle yorumlanan bu min dosyalarını ekleyebilirlerdi, şimdi bütün saat, komut dosyalarımı çıktıdan kimin çaldığını merak ediyordu.
Giedrius

5
Fatal'in OP'deki yorumu uyarınca, bu çözüm her ikisi de varsa minimize edilmiş ve normal sürümler için yinelenen referansları (örn. Jquery) yeniden yönlendirecektir.
danmiser

11
M $, somefile.min.js açık bir şekilde belirtildiğinde veya yalnızca .min.js dosyası varsa, yalnızca .min.js dosyasını ekleyin! Aksi takdirde sadece mevcut davranışı uygulayın!
Adaptabi

3
Gerçek sınıfın "IgnoreList" olarak adlandırılması inanılmazdır, ancak doğrudan Object'den türetilir. LINQ yok, yineleme yok. - msdn.microsoft.com/en-us/library/…
JP ten Berge

176

Microsoft aşağıdaki davranışı ifade eder (ve bunu projelerimde izlemeyi tercih ederim):

kısa versiyon

  1. Projenizde aynı klasörün altında hem hata ayıklama hem de küçültülmüş sürümleri var:
    • script.js
    • script.min.js
  2. Kodunuzdaki bir pakete yalnızca script.js eklersiniz .

Sonuç olarak, olur otomatik var script.js dahil DEBUG modu ve script.min.js içinde RELEASE modunda.

uzun versiyon

Ayrıca .debug.js sürümüne sahip olabilirsiniz . Bu durumda, dosya DEBUG'da aşağıdaki önceliğe dahil edilir:

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

BÜLTENİ:

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

Not

Bu arada, komut dosyalarınızın MVC4'te .min sürümlerine sahip olmasının tek nedeni , küçültülmüş sürümün otomatik olarak işlenememesi durumudur. Örneğin, aşağıdaki kod otomatik olarak gizlenemez:

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

Diğer tüm durumlarda, komut dosyanızın hata ayıklama sürümü ile devam edebilirsiniz.


6
güzel bir açıklama, ancak OP sorunu bazı komut dosyaları ( jquery.tmpl) sahip değil, ile gelmedi, min-olmayan sürüm dosyasının indirilen alamadım oldu.
Paketleyici

Kabul ediyorum, güzel bir açıklama ama tüm OP'nin sorusuna cevap vermiyor.
Diego

2
Kısa versiyon benim için çalışmadı. "script.js" bu sürüm türlerinin her ikisine de dahil edilir. DEBUG / RELEASE'i değiştirdim ve (kaynağa baktığımda) 'script.js' seçilen / işlenen kişiydi.
user981375

4
user981375, ayrıca web.config dosyasında <compilation debug = "false" /> ayarlamanız gerekir
Max Shmelev

5
Bu cevabı tercih ediyorum, çünkü bu "en iyi uygulamalar" yaklaşımıdır ve aynı hedefe ulaşmak için paketleyicinin varsayılan kurallarının nasıl izlenebileceğini açıklar.
James Reategui

5

Tüm sahip olduğunuz bir dosyanın küçültülmüş bir sürümü ise, bulduğum en basit çözüm küçültülmüş dosyayı kopyalamak, kopyalanan dosyanın adından .min dosyasını kaldırmak ve ardından paketinizdeki küçültülmemiş dosya adına başvurmaktır.

Örneğin, bir js bileşeni satın aldığınızı ve size bir-lib-3.2.1.min.js adlı bir dosya verdiklerini varsayalım. Bu dosyayı bir pakette kullanmak için aşağıdakileri yapın:

  1. Some-lib-3.2.1.min.js dosyasını kopyalayın ve kopyalanan dosyayı some-lib-3.2.1.js olarak yeniden adlandırın. Her iki dosyayı da projenize ekleyin.

  2. Paketinizdeki küçültülmemiş dosyaya şu şekilde bakın:

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

Adında 'min' olmayan dosyanın gerçekten küçültülmüş olması, herhangi bir soruna neden olmamalıdır (aslında okunamaz olması dışında). Yalnızca hata ayıklama modunda kullanılır ve ayrı bir komut dosyası olarak yazılır. Hata ayıklama modunda olmadığında, önceden derlenmiş min dosyası paketinize dahil edilmelidir.


4

En azından MVC5'te çalışan iyi bir çözüm buldum, Bundlebunun yerine kullanabilirsiniz ScriptBundle. Bu ScriptBundledurumda sevmediğimiz (.min, vs.'yi göz ardı ederek) akıllı davranışı yoktur. Benim Bundleçözümümde .min ve .map dosyaları olan 3d parti komut dosyaları için kullanıyorum ve kodumuz ScriptBundleiçin kullanıyorum . Bunu yapmanın herhangi bir dezavantajı fark etmedim. Bu şekilde çalışması için angular.js gibi orijinal bir dosya eklemeniz gerekir ve hata ayıklamada angular.js'yi yükler ve angular.min.js dosyasını yayın modunda paketler.


Optimizasyonlar devre dışı bırakıldığında ( ScriptTable.EnableOptimizations = false) çalışmaz . Bir desen içeren komut dosyası yolları oluşturulmaz (örn. ~/Scripts/thirdpartylib/*.js). Ne zaman işe yarıyor EnableOptimizations = true, ama öyle ScriptBundle.
Steven Liekens

Ben de yanlış (geliştirme sırasında) ile kullanın ve tarif ettiğiniz sorunları yok, bu yüzden sizin için etkileyen başka bir şey olabilir. Ayrıca desen çalışması için dahil yerine IncludeDirectory yapmak gerekir.
Ilya Chernomordik

Dosyanızın ".min.js" sürümünü oluşturduğundan emin misiniz? System.Web.OptimizationsAd alanından veya nuget paketinden paketler Microsoft.Web.Optimizationsmi kullanıyorsunuz?
Steven Liekens

System.Web.Optimization kullanıyorum ve min sürümünü oluşturduğunu kontrol ettim, ama aslında IncludeDirectory kullanmadığımı anladım, ancak min sürümü ile çalışmadıysa garip olurdu ... IncludeDirectory değil gibi benim için yeterli Ben özel bir tarama yapmak ve Include kullanarak tüm filtre eklemek, bu yüzden desen ve IncludeDirectory orada düzgün çalışmıyor, biraz garip olsa.
Ilya Chernomordik

1
Hayır, sorun iki katlıdır: yalnızca bir .min.jsdosya vardır ve *.jsdesen, biten dosyalarla eşleşmez .min.js.
Steven Liekens

3

*.min.jsDosyaları oluşturmak BundleTable.EnableOptimizationsiçin, tüm paketler için geçerli olan genel bir ayar olan devre dışı bırakmanız gerekir .

Yalnızca belirli paketler için optimizasyonları etkinleştirmek istiyorsanız ScriptBundle, paketteki dosyaları numaralandırırken geçici olarak optimizasyonları etkinleştiren kendi türünüzü oluşturabilirsiniz .

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

Küçültülmüş bir dosyanın var olup olmadığına bakılmaksızın, küçültülmüş dosyası her zaman kullanılması gereken paketler OptimizedScriptBundleyerine kullanın ScriptBundle.

Yalnızca küçültülmüş dosyaların bir koleksiyonu olarak dağıtılan ASP.NET MVC için Kendo UI örneği.

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

Bir üretim yayınlama eyleminde bazı eksik senaryolarla karşılaştım ve bunun bir MVC sorunu olduğunu düşündüğümde, bu cevabı buldum .. işte, kendo işin içinde. Onunla çok uzun süre çalıştıktan sonra, kendo'dan uzaklaşmak için her şeyi yaparım
Felipe

@Felipe aynı durumdaydım, bu yüzden bu cevabı yazdım. Kendo korkunç. Umarım örneğim yardımcı olur.
Steven Liekens

2

Benim durumum için, Debug / Non sürümleri olarak gelen (harika!) Knockout.js kütüphanesini kullanıyordum:

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

Bu işi yapmak için, "Knockout- {Version} .js" (hata ayıklamayan) Paketime dahil ettim ve .debug'u aldım. Hata ayıklama modunda js dosyası.


1

Kolay bir yol sadece .min dosyasını yeniden adlandırın Örneğin, bu dosyayı abc_min.css olarak yeniden adlandırmak ve paketinize eklemek yerine abc.min.css var. Bunu yapmanın doğru yolu değil, sadece geçici bir çözüm olduğunu biliyorum. teşekkürler ve mutlu kodlama.


1
Her zaman nuget dosyayı indirir, sonra yeniden adlandırmanız gerekir.
Anirudha Gupta

Bunu yapmanın doğru yolu olmadığını biliyorum, ama sadece geçici bir çözüm
RK Sharma

1
Bu satırı benim için koymak // BundleTable.EnableOptimizations = true;
Anirudha Gupta

0

Bundler'ın bu sayfaya bir çok avantajı var AMA :

Microsoft MVC4 Platformu, her Komut Dosyası veya Stil Paketi için en azından hem minimize edilmiş hem de minimüssüz sürümünüz olduğunu düşünür (Debug ve vsdoc gibi başka dosyalar da mevcuttur). Bu nedenle, bu dosyalardan yalnızca birinin olduğu durumlarda sorun yaşıyoruz.

Çıktıyı işlemek için web.config dosyasındaki hata ayıklama durumunu kalıcı olarak değiştirebilirsiniz:

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

Çıktı değişikliklerine bakın! Dosya filtreleme değişti. Amaca ulaşmak için uygulama mantığını değiştirecek vaka filtrelemesini yoksaymalıyız!


1
Debug = "false" eklemek hala benim için çalışmıyor. Min.js dosyaları da IgnoreList'i temizlememe rağmen hala dahil değil ...
MoSs

-21

Millet sadece Microsoft birlikte hareket edene kadar onu saklıyorum

Bunu dene

RegisterBundles içinde kendo için bu paketi oluşturmak

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 dosyasında şunu yazın:

@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")   
 }

Bu şekilde Üretimdeki en iyi paketleri ve Debug'da bir referans alırız

Microsoft MVC 4 Kodunu düzelttiğinde düzeltin


3
Ben bu önerilen çözümün hayranı değilim. Şimdi (en az) iki yerde komut dizisi bulundurmak zorundasınız
Fatal

Bu paketlemenin amacını neredeyse yendi, değil mi?
Oliver

4
Paketleme zaten bu şekilde çalışıyor. Projeyi hata ayıklama modunda çalıştırırsanız, her CSS dosyası tek tek yüklenir, ancak sürümde çalıştırdığınızda birleştirilir ve bir dosyaya küçültülür. İf bloğundaki kod, hata ayıklama modunda sayfada otomatik olarak görüntülenenle aynıdır.
Chad Levy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.