c# - Există o modalitate de a dezactiva validarea js/css atunci când se folosește minimizarea prin System.Web.Optimization Bundling?
Lucrez cu .NET 4.5 System.Web.Optimization pentru crearea de bundle-uri. Când fac bundle de fișiere cu minimizarea activată, am observat că unele fișiere CSS și JavaScript nu se micșorează pentru că nu trec de mecanismele de validare. Acestor fișiere li se scriu mesaje precum
/* Minification failed. Returning unminified contents.
(5616,18): run-time error CSS1036: Expected expression, found '@Arial'
pentru că clasa avea font-family: @Arial Unicode MS;
sau Javascript care nu avea window în fața variabilei globale a produs următoarele erori.
/* Minification failed. Returning unminified contents.
(210,13-20): run-time error JS1300: Strict-mode does not allow assignment to undefined variables: PageObj
(189,13-20): run-time error JS1300: Strict-mode does not allow assignment to undefined variables: PageObj
*/
Înțeleg că soluția corectă ar fi să se corecteze erorile, totuși, având multe fișiere cu multe erori de acest fel poate fi uneori dificil de corectat. Există o modalitate de a dezactiva validarea CSS/JS la bundling sau ar trebui să se folosească un scriitor personalizat IBundleTransform care să elimine lucruri precum "use strict" din fișierele JavaScript care sunt bundelate și minificate?
Răspuns #1
Poți realiza acest lucru scriind propria clasă care moștenește IBundleBuilder.
Codul de mai jos este o adaptare a unui pachet NuGet asociat, LicensedBundler, care păstrează comentariile importante și comprimă fișierele, fără a comprima fișierele cu erori, mutându-le în schimb pe ele și eroarea lor în partea de sus a bundle-ului (funcționalitatea implicită a ASP.NET bundling este să nu comprime nimic). După cum puteți observa, în CssSettings există o opțiune pentru a ignora toate erorile:
public class LicensedStyleBundle : Bundle
{
public LicensedStyleBundle(string virtualPath)
: base(virtualPath)
{
this.Builder = new LicencedStyleBuilder();
}
public LicensedStyleBundle(string virtualPath, string cdnPath)
: base(virtualPath, cdnPath)
{
this.Builder = new LicencedStyleBuilder();
}
}
public class LicencedStyleBuilder : IBundleBuilder
{
public virtual string BuildBundleContent(Bundle bundle, BundleContext context, IEnumerable<BundleFile> files)
{
var content = new StringBuilder();
foreach (var file in files)
{
FileInfo f = new FileInfo(HttpContext.Current.Server.MapPath(file.VirtualFile.VirtualPath));
CssSettings settings = new CssSettings();
settings.IgnoreAllErrors = true; //this is what you want
settings.CommentMode = Microsoft.Ajax.Utilities.CssComment.Important;
var minifier = new Microsoft.Ajax.Utilities.Minifier();
string readFile = Read(f);
string res = minifier.MinifyStyleSheet(readFile, settings);
content.Append(res);
}
return content.ToString();
}
public static string Read(FileInfo file)
{
using (var r = file.OpenText())
{
return r.ReadToEnd();
}
}
}
Apoi, în fișierul tău BundleConfig.cs, folosești LicensedStyleBundle în loc de StyleBundle:
bundles.Add(new LicensedStyleBundle("~/Content/css").Include("~/Content/site.css"));
Poți face un cod similar pentru ScriptBundle. Dacă ai nevoie de indicii, tot codul sursă se află pe site-ul proiectului Github pentru pachetul NuGet și ar necesita doar mici ajustări pentru a ignora erorile, așa cum face codul de mai sus.
