Коли я кажу "крізь" я маю на увазі, що це виробництво готове.. це просто зразок на цій стадії.
Я думав, що я зробив роботу в реальному житті для людей, з якими можна погратися. (Ім не дозволено писати код на роботі... не є рівноцінним тому, що я маю на увазі)[М завжди нагадувала!).
Отже, що він робить?
Одною з основних проблем швидкодії для поточних веб-сайтів є кількість запитів, які вони надсилають на сервер, а не фактична тривалість обробки сервера. написав про це Після читання Стіва Стерса відмінно сяєВеб- сайти високої швидкодії Це було, чесно кажучи, сюрприз для мене! Ну, в будь- якому разі останнім часом I've бавився з великою кількістю контролю сервера ASP.NET, який має намір зробити оптимізацію сервера називається ASP. NET Програма, яка має зробити набагато меншим. Перший з них є (до того часу) unpread Керування спрайтом CSS... внизу - початок другого; це було написано кілька годин минулої ночі, як я міг би спати, щоб думати про те, як він може діяти.
По суті, я хотів мінімального обсягу зусиль, щоб комбінувати та стиснути кратне <link rel=⇩sheet}> Записи файлів CSS разом, мінімізувати їх використання Компресор YUI (для NET... on Codeplex) і виведення даних про час, що залежить від часу (у нашому випадку, Дата зміненого для файла) хеш для назви файла (у незмінному місці на даний момент, }/ ВиводокCSS /), потім виводить теґ на сторінці для цього нового файла.
Отже, як це працює?
Уявіть, що у вас є сторінка з такими визначеннями таблиці стилів:
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>
Ви можете бачити в фрагменті вище, що ми щойно обгорнули визначення CSS в <asp: CSSManager>…</ asp: CSSManager> tags...'s all there is to it! Є ще одна річ, спостережливий буде помічений, що тепер я можу використовувати ~/ in the epf... its are a nice ефект цього методу...lets you keep the божевільний шлях which (........... /.. /)
Очевидно, що це все ще трохи обмежено, він не працює в прямому Trust, він не працює з декількома областями; скажімо, рівень сайта CSS, Page CSS і Masterpages, де ви бажаєте декілька аркушів з іншим вмістом. План - продовжувати працювати над цим на деякий час... так що я майже напевно оновлюватиму це найближчим часом.
Джерело йде за
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: }
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.