【思路】-jscode

jscode

            //1.0 思路
            //VH.PutSet(TagFields.PageName, PageName.Index);
            //VContent.Put(TagFields.JsCode, VH.OutString(string.Concat(this.PcMobile, "common/_Self_Js.html"), true));

面臨問題:以前的的代碼只能放在頁面的底部,雖然可以每個頁面載入自己的代碼,但是代碼擺放的位置不夠靈活
而且代碼沒有壓縮功能。還可能由於頁面沒有載入完全導致js代碼執行起來有問題。看了下蘭亭的網頁,他們把大量的js代碼,甚至JQuery庫都輸出在了頁面上
後來想了一下爲什麼這樣做?
可以減少不必要的js額外請求;不會因爲庫沒有下載下來導致一些代碼沒有執行
實現要求:使用${jscode}標籤在頁面中的任意位置,輸出該頁面自定義的js代碼,並提供對代碼的壓縮功能
第一個版本思路
NVelocity有一個助手,在初始化完成之後指定一個模板的名字,就可以輸出這個模板的字符串,有了字符串就可以對字符串進行壓縮處理
所以嘗試了下

            #region 代碼
            /*VelocityHelper vh = new VelocityHelper();
            string pathTemplate = ConfigHelper.BaseDirectory + "themes\\" + ConfigManager.GetConfig().Theme
                + ConfigManager.GetConfig().PCthemeDir.Replace("/", "\\") + "common\\";
            vh.Init(pathTemplate);
            vh.PutSet(TagFields.PageName, PageName.Index);
            string jsString = vh.OutString("_Self_Js.html");
            VContent.Put("jsstring", ZipHtml.GZipHtml(jsString));*/
            #endregion

第一:每個頁面都要編寫上面的代碼增加了額外的開銷
第二:麻煩
第三:手機模板和PC模板各自定義的js代碼有可能不一樣,所以_Self_Js.html不在同一個目錄下,所以不行

第二個版本思路
嘗試將VelocityHelper封裝到頁面的基類中去,變成一個靜態的變量,這樣不用增加額外的對象開銷,而且內部的引擎不用做過多的初始化
在static HttpCustom()中嘗試將其初始化,模板路徑和HttpCustom路徑保持一致,並且只初始化一次
這樣在每個頁面中 只需要調用就可以生成這個頁面的js代碼,同時傳遞了PcMobile目錄,就可以爲PC和Mobile生成各自的js代碼 【比第一版的思路好多了】


VH.OutString(string.Concat(this.PcMobile, "common/vmjs.vm"), true)

壞處:每個頁面都需要編寫這個代碼,代碼還得需要編譯
每個頁面還需要PutSet這個頁面的類型,才能動態的加載js代碼
不靈活 也比較麻煩

第三版
既然可以在html中調用對象的方法,那麼應該講VH對象添加到數據上下文當中去
在html頁面中調用這個方法
同時做進一步的封裝string.Concat(this.PcMobile, "common/vmjs.vm") 封裝到 VH的內部處理
將PcMobile 封裝成它的一個屬性,在HttpCustom識別出訪問設備,也就是PcMobile初始化之後
也將VH的PcMobile 初始化,如此一來
在頁面中就可以這樣調用
    $VH.PutSet("pagename","index")
    $VH.OutString(true)

好處:靈活了許多
pagename 不僅僅是系統中固定的那幾個值了,可以自定義
而且可以自定義是否壓縮js代碼
到此完成!

總結:封裝思想  確定需求

 

 

發佈了103 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章