Tìm kiếm trang web

c# - Có cách nào để tắt kiểm tra js/css khi sử dụng System.Web.Optimization Bundling minimisation không?


Tôi đang làm việc với .NET 4.5 System.Web.Optimization bundling. Khi gộp các tệp với tính năng giảm thiểu được bật, tôi nhận thấy rằng một số CSS và JavaScript không được giảm thiểu vì không vượt qua các cơ chế xác thực. Những tệp này nhận được các thông điệp được ghi như

/* Minification failed. Returning unminified contents.
(5616,18): run-time error CSS1036: Expected expression, found '@Arial'

bởi vì lớp có font-family: @Arial Unicode MS;
hoặc Javascript không có window phía trước biến toàn cục đã tạo ra các lỗi sau.

/* 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
 */

Tôi thực sự hiểu rằng giải pháp đúng là sửa các lỗi, tuy nhiên việc có nhiều tệp với rất nhiều lỗi như thế này đôi khi có thể là một rắc rối để sửa. Có cách nào để tắt việc xác thực css/js khi đóng gói không hoặc người ta sẽ phải sử dụng bộ ghi IBundleTransform tùy chỉnh để loại bỏ những thứ như "use strict" khỏi các tệp javascript đang được đóng gói và nén không?

Câu trả lời #1

Bạn có thể thực hiện điều này bằng cách viết lớp của riêng bạn kế thừa từ IBundleBuilder.

Mã dưới đây là một phiên bản điều chỉnh của gói NuGet liên quan LicensedBundler, giữ lại các chú thích quan trọng và nén các tệp trong khi không nén các tệp có lỗi, thay vào đó di chuyển chúng và lỗi của chúng lên đầu gói (chức năng mặc định của đóng gói ASP.NET là không nén bất kỳ gì). Như bạn có thể thấy, trong CssSettings có một tùy chọn để bỏ qua tất cả các lỗi:

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

Sau đó trong BundleConfig.cs của bạn, bạn sử dụng LicensedStyleBundle thay vì StyleBundle:

bundles.Add(new LicensedStyleBundle("~/Content/css").Include("~/Content/site.css"));

Bạn có thể viết mã tương tự cho ScriptBundle. Nếu bạn cần hướng dẫn, toàn bộ mã nguồn có tại trang dự án Github cho gói NuGet và chỉ cần một vài chỉnh sửa nhỏ để bỏ qua lỗi, giống như mã trên đã làm.