Back to "CSS مُجمِّع/ المُقلِّد ASP.net contrtrol"

This is a viewer only at the moment see the article on how this works.

To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk

This is a preview from the server running through my markdig pipeline

Imported mostlylucidcouk

CSS مُجمِّع/ المُقلِّد ASP.net contrtrol

Thursday, 25 March 2010

عندما أقول إخترقوا، أعني ذلك... هذا ليس في أي طريقة إنتاج جاهزة... إنها مجرد عينة في هذه المرحلة. إذا تسببت في انفجار كلبك، فلا تلوموني!

فكرت أن أقوم بعمل على الإنترنت لكي يلعب الناس معه، وهذا أحد مشاريعي الصغيرة (لا يُسمح لي بكتابة الشفرة في العمل...[(التذكير دائماً)

إذاً، ماذا يفعل؟

حسناً، واحدة من أهم قضايا الأداء للمواقع الحالية هي عدد الطلبات التي يقدمونها إلى الخادم، وليس وقت المعالجة الفعلي بجانب الخادم. عندما أكون أولًا. كتب عن هذا بعد قراءة سَوَائِد تَسْتَعِدُّ مِنْ أَعْمَالِ سَائِلَةً مِنَ ٱلْأَسْفَارِ ٱلْمُقَدَّسَةِالمواقع الشبكية ذات الأداء الرفيع حسناً، على أي حال مؤخراً كنت ألعب مع عدد من أجهزة التحكم بخادم ASP.net التي تهدف إلى جعل عدد الخادمات التي تتصل بـ ASP.net على التطبيق أن يجعل أقل بكثير. الأول من هذه هي (حتى الآن) غير منشورة. CSSSSSSSهذه هي بداية الثانية؛ وقد كتب هذا في بضع ساعات الليلة الماضية لأنني لم أستطع النوم للتفكير في كيفية عملها. والشفرة شديدة الخشونة ولكنها تظهر المفهوم بشكل جيد.

في جوهر الأمر أردت الحد الأدنى من الجهد الممكن للجمع والضغط متعدد <rel= "ورقة وصف"> ملف خانات معاً، قلّل منها إلى أدنى استخدام YUUI مُصَ ضغط (عـن ...و مخرجات a وقت متوقف على بوصة حالة التاريخ مُعدّل لـ ملفّ الاسم لـ ملفّ الاسم بوصة a ثابت موقع بوصة a مكان بوصة وقت end get get ملفّ.

إذاً، كيف يعمل؟

حسناً، تخيل أنه كان لديك صفحة مع بعض تعريفات الأسلوب مثل هذا:

   1: <link type="text/css" rel="stylesheet" href="../../../build/logger/assets/logger.css"/>
   2: <link type="text/css" rel="stylesheet" href="../../../build/yuitest/assets/testlogger.css"/>        
   3: <style type="text/css">
   4: #container, #container2 {
   5:     width: 400px;
   6: }
   7:  
   8: .yui-carousel-element {
   9:     margin: 0;
  10:     padding: 0;
  11: }
  12:  
  13: .yui-carousel-element li {
  14:     border: none;
  15:     margin: 0;
  16:     padding: 0;
  17:     width: 100px;
  18: }
  19: </style>

كما ترون لدينا تعريفان لملف CSS وعلامة نمط. ألن يكون لطيفاً لو أمكننا الجمع والتدقيق في هذه... حسناً...

   1: <asp:CSSManager runat="server">
   2:         <link type="text/css" rel="stylesheet" href="~/build/logger/assets/logger.css"/>
   3:         <link type="text/css" rel="stylesheet" href="../../../build/yuitest/assets/testlogger.css"/>        
   4:         <style type="text/css">
   5:         #container, #container2 {
   6:             width: 400px;
   7:         }
   8:  
   9:         .yui-carousel-element {
  10:             margin: 0;
  11:             padding: 0;
  12:         }
  13:  
  14:         .yui-carousel-element li {
  15:             border: none;
  16:             margin: 0;
  17:             padding: 0;
  18:             width: 100px;
  19:         }
  20:         </style>
  21: </asp:CSSManager>

يمكنك أن ترى في الـ snqyppit up up أننا فقط لفنا تعريفات CSS في <CSCSSS مدير>…<CSSSS مدير> علامة... هذا كل ما في الأمر! شيء آخر، أن المُلاحِظ سيكون قد لاحظ أنّه يمكنني الآن استخدام / في href... هو تأثير جانبي لطيف من هذه الطريقة...

ومن الواضح أن هذا لا يزال محدوداً إلى حد ما، ولا يعمل في شركة جزئ ترست، ولا يتعامل مع نطاقات متعددة؛ فعلى سبيل المثال، مستوى الموقع CSS، ومستوى الصفحة CSS، والصفحات الرئيسية حيث تريد صحائف متعددة مع محتويات مختلفة. وتتمثل الخطة في مواصلة العمل على هذا لفترة قصيرة من الوقت... لذا فإنني سأستكمل هذا قريباً بكل تأكيد تقريباً.

   1: using System;
   2: using System.Collections.Generic;
   3: using System.ComponentModel;
   4: using System.Text;
   5: using System.Web.UI;
   6: using System.Web.UI.HtmlControls;
   7: using System.IO;
   8: using System.Security.Cryptography;
   9: using Yahoo.Yui.Compressor;
  10:  
  11: namespace CSSManager
  12: {
  13:     [DefaultProperty("Text")]
  14:     [ToolboxData("<{0}:CSSManager runat=server></{0}:CSSManager>")]
  15:  
  16:     [ParseChildren(true, "cssFiles")]
  17:     public class CSSManager : Control, INamingContainer
  18:     {
  19:  
  20:         public const string FILE_PATH = "~/OutputCSS/{0}.css";
  21:  
  22:         public CSSManager() { }
  23:  
  24:         public List<HtmlGenericControl> CSSFiles
  25:         {
  26:             get;
  27:             set;
  28:         }
  29:  
  30:  
  31:         private StringBuilder combinedSheets = new StringBuilder();
  32:  
  33:         public string GetStyleSheet(string virtualPath)
  34:         {
  35:             string filePath = Context.Server.MapPath(virtualPath);
  36:             if (!string.IsNullOrEmpty(filePath))
  37:             {
  38:                 return File.ReadAllText(filePath);
  39:             }
  40:             return string.Empty;
  41:  
  42:         }
  43:  
  44:         public string CalculateFileHash(string filePaths)
  45:         {
  46:             MD5CryptoServiceProvider csp = new MD5CryptoServiceProvider();
  47:             byte[] pathBytes = csp.ComputeHash(System.Text.UTF8Encoding.UTF8.GetBytes(filePaths));
  48:             return BitConverter.ToUInt64(pathBytes, 0).ToString();
  49:  
  50:         }
  51:  
  52:         public void WriteFile(string textToWrite, string fileHash)
  53:         {
  54:             File.WriteAllText(Context.Server.MapPath(string.Format(FILE_PATH, fileHash)), textToWrite);
  55:         }
  56:  
  57:         public string CreateDatedFilePath(string filePath)
  58:         {
  59:             FileInfo fi = new FileInfo(Context.Server.MapPath(filePath));
  60:             if (fi.Exists)
  61:             {
  62:                 return fi.LastWriteTimeUtc.Ticks.ToString() + "#" + filePath;
  63:             }
  64:             return string.Empty;
  65:  
  66:  
  67:         }
  68:  
  69:         protected override void CreateChildControls()
  70:         {
  71:  
  72:             if (this.DesignMode == true)
  73:             {
  74:                 foreach (var file in CSSFiles)
  75:                 {
  76:                     string rel = file.Attributes["rel"];
  77:  
  78:                     string href = file.Attributes["href"];
  79:  
  80:                     if (rel.ToLowerInvariant() == "stylesheet")
  81:                     {
  82:                         file.Attributes["href"] = this.ResolveClientUrl(Context.Server.MapPath(href));
  83:                         this.Controls.Add(file);
  84:                     }
  85:  
  86:                 }
  87:             }
  88:             StringBuilder filePaths = new StringBuilder();
  89:             int i = 0;
  90:             foreach (var file in CSSFiles)
  91:             {
  92:                 string tagName = file.TagName.ToLowerInvariant();
  93:                 if (tagName == "link")
  94:                 {
  95:                     string rel = file.Attributes["rel"];
  96:                     string href = file.Attributes["href"];
  97:  
  98:                     if (rel.ToLowerInvariant() == "stylesheet")
  99:                     {
 100:                         string styleSheet = GetStyleSheet(href);
 101:                         if (!string.IsNullOrEmpty(styleSheet))
 102:                             combinedSheets.Append(styleSheet);
 103:                         filePaths.AppendFormat("{0}#", CreateDatedFilePath(href));
 104:                     }
 105:                 }
 106:                 else if (tagName == "style")
 107:                 {
 108:                     string inner = file.InnerHtml;
 109:                     combinedSheets.Append(inner);
 110:                     filePaths.Append("CSSSTYLE_" + i);
 111:                     i++;
 112:                 }
 113:  
 114:             }
 115:             string minimizedStyles = CssCompressor.Compress(combinedSheets.ToString(), 0, CssCompressionType.Hybrid);
 116:             string fileHash = CalculateFileHash(filePaths.ToString());
 117:             WriteFile(minimizedStyles, fileHash);
 118:  
 119:             HtmlGenericControl gen = new HtmlGenericControl();
 120:             gen.TagName = "link";
 121:             gen.Attributes.Add("href", this.ResolveClientUrl(string.Format(FILE_PATH, fileHash)));
 122:             gen.Attributes.Add("rel", "stylesheet");
 123:             this.Controls.Add(gen);
 124:         }
 125:  
 126:     }
 127: }
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.