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
Thursday, 25 March 2010
当我说"黑客"是真心的...这是没有办法的制作准备就绪...这只是目前阶段的一个样本。如果它导致你的狗爆炸,别怪我!
我想在网络上抛出一份进展中的工作,让人们可以玩耍。 这是我的小宠物项目之一(我不允许在工作时写代码.[我总是提醒大家! )
那么,它能做什么呢?
目前网站的主要性能问题之一是他们向服务器提出的要求数量, 而不是实际的服务器边处理时间。 当我第一次访问时 为此写入 读完Steve Sounders的诗后,高性能网站 坦率地说,这对我来说是一个惊喜! 嗯,最近我一直在玩一些 ASP. NET 服务器控制器,这些控制器旨在优化服务器调用 ASP.NET 应用程序的次数,但必须少得多。 首先是(到目前为止)尚未公布。 CSS 样版控制。 下面是第二个开始;这是在昨晚几小时后写下来的,因为我无法入睡想着它如何运作。 代码非常粗糙,但它很好地展示了这个概念。
本质上,我想尽最大的努力 结合和压缩多重 <ll 链接“样式表”> CSS 文件条目合并, 使用 YUI YUI 压缩器 (用于. NET... 的代码解码并输出文件名称(在当时的固定位置,“~/DEXPUCTCSS/”)的根据时间(在此情况下,为文件修改日期) hash,然后为新文件在页面中输出标签。
那么,它是如何运作的呢?
想象一下你有一个页面 上面有像这样的样式表定义
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: CSS 管理器>…<主管/主管:中央支助事务主管> 标签... 仅此而已! 还有一件事, 观察者会注意到我现在可以使用~/ 在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: }
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.