asp.net mvc自動壓縮文件,並生成CDN引用

来源:http://www.cnblogs.com/Innovate/archive/2016/05/06/5465287.html
-Advertisement-
Play Games

ScriptsBundleTransform.cs BundleConfig.cs 這樣的話就能生成 CDN 站點下的JS文件引用了 對了這裡漏掉了一個地方, 但是如果CDN站點掛掉了怎麼辦,咱們繼續: SctiptsBundleExtensions.cs 這樣會生成如下的JS應用: 這樣的話當CD ...


很多站點都是用了靜態文件分離。我推薦一種處理靜態文件分離的方式。

BundleExtensions.cs
 public static class BundleExtensions
    {
        public static string Version = "1.0.0";
        public static string ScriptsPath = "Cdn";

        public static Bundle Production(this Bundle bundle, string cdn, string root, string minified,
            string full = "")
        {
            var transform = new ScriptsBundleTransform()
            {
                Version = Version,
                ScriptsPath = System.IO.Path.Combine("~/", ScriptsPath, root),
                Minified = minified,
                Full = full
            };

            bundle.Transforms.Add(transform);
            bundle.CdnPath = cdn + "/" + root + "/" + string.Format("{0}?{1}", minified, Version);
            return bundle;
        }
    }

ScriptsBundleTransform.cs

public class ScriptsBundleTransform : IBundleTransform
    {
        public string ScriptsPath { get; set; }
        public string Version { get; set; }
        public string Minified { get; set; }
        public string Full { get; set; }

        public ScriptsBundleTransform()
        {
        }

        public ScriptsBundleTransform(string path, string version, string minified, string full)
        {
            ScriptsPath = path;
            Version = version;
            Minified = minified;
            Full = full;
        }

        public void Process(BundleContext context, BundleResponse response)
        {
            string scriptsRoot = context.HttpContext.Server.MapPath(ScriptsPath);

            if (!Directory.Exists(scriptsRoot))
                Directory.CreateDirectory(scriptsRoot);

            //  if minified file name specified...
            if (!string.IsNullOrEmpty(Minified))
            {
                using (TextWriter writer = File.CreateText(Path.Combine(scriptsRoot, Minified)))
                {
                    writer.Write(response.Content);
                }
            }

            //  if full file name specified...
            if (!string.IsNullOrEmpty(Full))
            {
                using (Stream writer = File.OpenWrite(Path.Combine(scriptsRoot, Full)))
                {
                    foreach (var file in response.Files)
                    {
                        file.VirtualFile.Open().CopyTo(writer);
                    }
                }
            }
        }
    }

BundleConfig.cs

        public static void RegisterBundles(BundleCollection bundles)
        {
            bundles.UseCdn = true;
            BundleTable.EnableOptimizations = true;

            //制定壓縮後的資源存儲路徑
            BundleExtensions.ScriptsPath = "Resource";
            //制定請求時代的尾碼,為了刷新掉客戶端的緩存
            BundleExtensions.Version = "00001";
            //CDN站點地址
            const string ajaxCdnPath = "http://localhost/Cdn";

            bundles.Add(new ScriptBundle("~/bundles/bootstrap")
                .IncludeFallback("$.fn.affix",
                    "~/Resource/Scripts/common/transition.js",
                    "~/Resource/Scripts/common/button.js",
                    "~/Resource/Scripts/common/affix.js",
                    "~/Resource/Scripts/common/tab.js",
                    "~/Resource/Scripts/common/collapse.js",
                    "~/Resource/Scripts/common/tooltip.js",
                    "~/Resource/Scripts/common/respond.js")
                .Production(ajaxCdnPath, "Scripts", "bootstrap.mincdn.js", "bootstrap.src.js"));

            bundles.Add(new ScriptBundle("~/Content/bootstrap")
                .Include("~/Resource/Content/bootstrap.css")
                .Include("~/Resource/Content/common/button.css")
                .Include("~/Resource/Content/common/bootstrap-theme.css")
                .Production(ajaxCdnPath, "Content", "bootstrap.mincdn.css", "bootstrap.src.css"));

        }

 

這樣的話就能生成 CDN 站點下的JS文件引用了

<script src="http://localhost/Cdn/Scripts/bootstrap.mincdn.js?00001"></script>

對了這裡漏掉了一個地方,

http://localhost/Cdn站點需要你在IIS中指定到你站點的Resource下,不然訪問不到你的JS文件。

但是如果CDN站點掛掉了怎麼辦,咱們繼續:

SctiptsBundleExtensions.cs

    public static class SctiptsBundleExtensions
    {
        public static ScriptBundle IncludeFallback(this ScriptBundle bundle, string cdnFallbackExpression,
            string virtualPath, params IItemTransform[] transforms)
        {
            bundle.CdnFallbackExpression = cdnFallbackExpression;
            bundle.Include(virtualPath, transforms);
            return bundle;
        }

        public static ScriptBundle IncludeFallback(this ScriptBundle bundle, string cdnFallbackExpression,
          params string[] virtualPaths)
        {
            bundle.CdnFallbackExpression = cdnFallbackExpression;
            bundle.Include(virtualPaths);
            return bundle;
        }
    }

 

        bundles.Add(new ScriptBundle("~/bundles/jquery")
                .IncludeFallback("window.jQuery", "~/Resource/Scripts/common/jquery-{version}.js")
                .Production(ajaxCdnPath, "Scripts", "jquery.mincdn.js", "jquery.src.js"));

這樣會生成如下的JS應用:

<script src="http://localhost/Cdn/Scripts/jquery.mincdn.js?00001"></script>
<script>(window.jQuery)||document.write('<script src="/dome/bundles/jquery"><\/script>');</script>

這樣的話當CDN站點掛掉了還是能夠訪問到JS文件的。

接下來CSS怎麼處理呢:

StyleBundleExtensions.cs

 public static class StyleBundleExtensions
    {
        /// <summary>
        /// Include a stylesheet to fallback to when external CdnPath does not load.
        /// </summary>
        /// <param name="bundle"></param>
        /// <param name="fallback">Virtual path to fallback stylesheet</param>
        /// <param name="className">Stylesheet class name applied to test DOM element</param>
        /// <param name="ruleName">Rule name to test when the class is applied ie. width</param>
        /// <param name="ruleValue">Value to test when the class is applied ie. 1px</param>
        /// <returns></returns>
        public static StyleBundle IncludeFallback(this StyleBundle bundle, string fallback,
            string className = null, string ruleName = null, string ruleValue = null)
        {
            if (String.IsNullOrEmpty(bundle.CdnPath))
            {
                throw new Exception("CdnPath must be provided when specifying a fallback");
            }

            if (VirtualPathUtility.IsAppRelative(bundle.CdnPath))
            {
                bundle.CdnFallbackExpress(fallback);
            }
            else if (new[] { className, ruleName, ruleValue }.Any(String.IsNullOrEmpty))
            {
                throw new Exception(
                    "IncludeFallback for cross-domain CdnPath must provide values for parameters [className, ruleName, ruleValue].");
            }
            else
            {
                bundle.CdnFallbackExpress(fallback, className, ruleName, ruleValue);
            }

            return bundle;
        }

        private static StyleBundle CdnFallbackExpress(this StyleBundle bundle, string fallback,
            string className = null, string ruleName = null, string ruleValue = null)
        {
            bundle.Include(fallback);

            fallback = VirtualPathUtility.ToAbsolute(fallback);

            bundle.CdnFallbackExpression = String.IsNullOrEmpty(className) ?

                String.Format(@"function() {{
                var len = document.styleSheets.length;
                for (var i = 0; i < len; i++) {{
                    var sheet = document.styleSheets[i];
                    if (sheet.href.indexOf('{0}') !== -1) {{
                        var rules = sheet.rules || sheet.cssRules;
                        if (rules.length <= 0) {{
                            document.write('<link href=""{1}"" rel=""stylesheet"" type=""text/css"" />');
                        }}
                    }}
                }}
                return true;
                }}()", bundle.CdnPath, fallback) :

                String.Format(@"function() {{
                var loadFallback,
                    len = document.styleSheets.length;
                for (var i = 0; i < len; i++) {{
                    var sheet = document.styleSheets[i];
                    if (sheet.href.indexOf('{0}') !== -1) {{
                        var meta = document.createElement('meta');
                        meta.className = '{2}';
                        document.head.appendChild(meta);
                        var value = window.getComputedStyle(meta).getPropertyValue('{3}');
                        document.head.removeChild(meta);
                        if (value !== '{4}') {{
                            document.write('<link href=""{1}"" rel=""stylesheet"" type=""text/css"" />');
                        }}
                    }}
                }}
                return true;
            }}()", bundle.CdnPath, fallback, className, ruleName, ruleValue);

            return bundle;
        }
    }

 

好吧後面的大家自己摸索吧:)上班了
很多代碼是網上抄襲的,東拼西湊。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Github開源聲明 本網站的代碼開源,開源的目的如下 技術分享 希望業內同行貢獻代碼 希望能夠讓網站更加安全 開源地址: "CodeSnippet開源地址" 關於代碼貢獻 任何人都可以貢獻代碼,一般在 1 3個工作日內會確認合併 代碼請進行測試後提交。 現在需要如下的代碼貢獻 移動端自適應和響應式 ...
  • WCF的宿主可以是 Windows 服務、COM+應用程式、WAS(Windows Activation Services,Windows進程激活服務)或IIS、Windows應用程式,或簡單的控制台應用程式及任何.net程式。 ...
  • 做了1年多了C#,發現些項目過程中很多基礎東西都不是很清晰,基礎不夠牢固。現在開始複習基礎知識並做重點記錄 方法需要被重寫的時候,可以在方法前加入virtual使方法變成虛方法。 這樣我們可以重新寫個方法對虛方法進行重寫需要加上override。 註意:成員欄位和靜態函數都不能聲明為virtual, ...
  • 回到目錄 多看幾篇 之所以寫這篇文章完全是因為最近在研究FastDFS這個分散式的文件存儲系統,當然這不是我第一次研究它了,就像我們去看一本書,我們不會只看一篇,而是一次次,一篇篇,每看一次會有新的收穫,而研究技術,框架也是一樣,每研究一次,同樣會有不同層次的收穫,這次主要把fastDFS的集群就配 ...
  • 一些項目中,會涉及到事務的寫法,比如訂單相關,訂單成功,會涉及到產品的庫存和賬戶金額的一些信息變動,當然,如果整個流程成功,那是沒什麼問題,關鍵是如果中間某一步驟出現bug了,那之前已執行的一些變動就要回滾回去,所以就不可避免的用到事務的寫法。以前只是在資料庫中會涉及到事務寫法 最近做一些財務方面的 ...
  • 可以在 程式包管理器控制臺中輸入PM> Install-Package NPOI會下載最新版本NPOI----------------------------引用了NPOI-------------------------------- public static void Export() { s... ...
  • C#
    泛型:通過參數化類型來實現在同一份代碼上操作多種數據類型。利用“參數化類型”將類型抽象化,從而實現靈活的復用。 例子代碼: class Program { static void Main(string[] args) { ... ...
  • (譯者註:使用EF開發應用程式的一個難點就在於對其DbContext的生命周期管理,你的管理策略是否能很好的支持上層服務 使用獨立事務,使用嵌套事務,並行執行,非同步執行等需求? Mehdi El Gueddari對此做了深入研究和優秀的工作並且寫了一篇優秀的文章,現在我將其翻譯為中文分享給大家。由於 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...