Привет Народ 👋,

Что такое объединение и минификация? 🤔

Методы связывания и минимизации были введены в MVC 4 для сокращения времени загрузки запросов. Объединение позволяет нам загружать кучу статических файлов с сервера в одном HTTP-запросе.

На следующем рисунке показана техника связывания:

Поскольку мы обычно сталкиваемся с этой проблемой в пакетах CSS, мы пытаемся отладить код стиля в файлах CSS, но ничего не найдено, чтобы исправить это, мы создаем BundleMinificationUtility, которая является консольным приложением.

Вот файл конфигурации JSON.

CssBundleConfig.json

{
  "css": [
    {
      "destinationpath": "../css/home-bundled.css",
      "files": [
        "../css/bootstrap-4.2.1.min.css",
        "../all.css",
        "../css/style.css"
      ]
    },
    {
      "destinationpath": "../css/header-bundled.css",
      "files": [
        "../css/toastr.min.css",
        "../css/Typeahead.min.css"
      ]
    }
  ]
}

Программа.cs

using Newtonsoft.Json;
using NUglify;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
static void Main(string[] args) {
  #region Extracting the files
  string cssFileName = ConfigurationManager.AppSettings["cssBundleConfig"];
  #endregion
  result = File.ReadAllText(cssFileName);
  ExtractCssFile(result);
}

static void ExtractCssFile(string fileJson) {
  try {
    CssBundleConfigEntity obj = JsonConvert.DeserializeObject < CssBundleConfigEntity > (fileJson);
    if (obj.css.Count > 0) {
      foreach(var e in obj.css) {
        string destinationFilePath = e.destinationpath;
        File.WriteAllText(destinationFilePath, string.Empty);
        foreach(var file in e.files) {
          AppendCSSFile(file, destinationFilePath);
        }
      }
    }
  } catch {}
}
static void AppendCSSFile(string file, string destinationFilePath) {
try {
string fileName = "/* " + Path.GetFileName(file) + " */";
    File.AppendAllText(destinationFilePath, fileName);
    File.AppendAllText(destinationFilePath, Environment.NewLine);
    var fileText = File.ReadAllText(file);
var minifiedFileText = Uglify.Css(fileText);
File.AppendAllText(destinationFilePath, minifiedFileText.ToString());
    File.AppendAllText(destinationFilePath, Environment.NewLine);
  } catch {
}
}

Это консольное приложение создаст новые связанные файлы по пути назначения, который мы определили в файле CssBundleConfig.json.

Теперь запустите консольное приложение BundleMinificationUtility из события после сборки проекта ASP.NET MVC. 🔥🎯

Перед вызовом нового упакованного мини-файла в View .csHTML давайте просто настроим совместимость включения и отключения минимизации, поскольку у нас есть функция включения/отключения оптимизации минимизации в файле Bundle.config в ASP.NET MVC.

Создайте CustomRenderStyle (пользовательский помощник Html), который будет возвращать IHtmlString в соответствии с конфигурацией текущего проекта ASP.NET MVC. 🔥

CustomBundle.cs

public class CustomBundle {
    
  static string varEnableBundleOptimization = ConfigurationManager.AppSettings["EnableBundlingMinification"];
  public static IHtmlString RenderStyle(string path) {
    try {
      string strHost = HttpContext.Current.Request.Url.OriginalString;
      string jsFileName = strHost + "UtilityBundleMinification/CssBundleConfig.json";
using(WebClient client = new WebClient()) {
        Stream stream = client.OpenRead(jsFileName);
        string result = new StreamReader(stream).ReadToEnd();
        return MvcHtmlString.Create(ExtractCssFile(result, path));
      }
} catch {
}
    path = "<link href='" + path + "' type='text/css' rel='stylesheet' />";
    return MvcHtmlString.Create(path);
  }
  
  
  static string ExtractCssFile(string fileJson, string path) {
    string link = string.Empty;
    try {
if (varEnableBundleOptimization.Equals("1")) {
        link += "<link href='" + path + "' type='text/css' rel='stylesheet' />";
return link;
      }
      CssFilePathEntity obj = JsonConvert.DeserializeObject < CssFilePathEntity > (fileJson);
      if (obj.css.Count > 0) {
        string searchedString = SearchFilePath(path, "css/");
var file = obj.css.Where(x => SearchFilePath(x.destinationpath, "Content/") == searchedString).FirstOrDefault();
foreach(var e in file.files) {
link += "<link href='" + BASEPATH + e.Replace("../", "/") + "' type='text/css' rel='stylesheet' />";
          link += Environment.NewLine;
        }
      }
} catch (Exception ex) {
}
return link;
  }
}
public static string SearchFilePath(string ActualString, string ToSearch) {
  int ix = ActualString.IndexOf(ToSearch);
if (ix != -1) {
    return ActualString.Substring(ix + ToSearch.Length);
}
  return "";
}

Если для параметра EnableBundlingMinification задано значение false, будут добавлены файлы, являющиеся дочерними элементами объекта destinationPath.

Теперь вызывается метод RenderStyle CustomBundle.cs (Custom Html Helper) в представлении Razor. ✅😃

HomeView.csHtml

@CustomBundle.RenderStyle("home-bundled.css") // destinationPath file from CssBundleConfig.css
@CustomBundle.RenderStyle("header-bundled.css") // destinationPath file from CssBundleConfig.css

Бум, ошибка минимизации была устранена, и новые связанные файлы были минимизированы. 🥳🎉🕺🏼

Та же стратегия, которую вы можете использовать для пакета и минимизации Javascript.

Вот и все, удачного кодинга ☺️.