1. 程式人生 > >SoCompressor-JS與CSS本地批量壓縮、混淆、美化、格式化GUI工具.

SoCompressor-JS與CSS本地批量壓縮、混淆、美化、格式化GUI工具.

前一段時間在寫web時自己寫了幾個JS檔案用於前後臺展示與互動,在後來要壓縮js時發現基本都是帶命令列的壓縮工具,而且不能批量處理,線上壓縮壓縮完畢之後得一個個下,最可悲的是還需要自己重新命名檔案並且選擇下載位置,太麻煩了。後來再網上搜了一下,發現這類GUI工具確定比較少,即使有功能也少的可憐(最無語的是有的出錯不報,很鬱悶),恰好最近想再練練winform,所以就萌生了自己寫一個相關用途的小工具的想法,當然由於水平有限介面做的很難看,各位見諒,不過功能雖簡單應該還是有一點實用價值的吧。

軟體起了個名:SoCompressor,需要.Net Framework3.5的支援。

本小工具有以下幾個特點:

1.壓縮、混淆、美化、格式化都支援,斷網條件下可以使用,軟體不是使用的線上API.

1.支援批量操作,可以同時處理JS與CSS檔案,可以多檔案匯入,多資料夾搜尋,當然直接複製程式碼進行操作也可。

2.可以選擇對原檔案的備份處理操作:如 “在各原檔案所在目錄新建名為"SoCompressor_backup"的資料夾並將原檔案移到到此目錄下”,"將原檔名附加標識".bak"以備份原檔案“,移動到桌面,或者不進行處理等。

3.可以在備份目錄下生成還原指令碼。此還原指令碼的作用不是壓縮備份原檔案,而是可以將最近一次用SoCompressor備份的原檔案以其備份前的檔名還原到其各自的應有位置(有點繞。。)。

3.對輸出檔案的檔名可自定義附加標識,也有預設標識,如".min",則如果原檔名為a.js,那麼輸出檔案的檔名則為a.min.js.

4.輸出路徑問題。有時候我們對不同目錄下的檔案一起壓縮,這時候如果用傳統的方法我們還得指定一個統一的輸出路徑,然後再將檔案一個個導到其它地方,所以為了方便除了可以自定義輸出路徑外,也可以讓輸出檔案與其各自對應的原檔案位置相同。

5.支援多個處理引擎,目前添加了YUI Compressor與UglifyJS,如果後續有需要的話還會新增.各個處理引擎的詳細引數設定在“設定”裡面可以調整。關於UglifyJS:大家都知道如果要使用UglifyJS的話需要Node.js環境,所以我在軟體裡面加了處理引擎初始化,如果大家要使用UglifyJS而沒有配置好的話,軟體會自動配置Node.js環境與UglifyJS,這也是安裝包頗大的原因,包含了Node.js在x86與x64的兩個安裝包。

v1.0版本配幾張圖。





貼一段其中的處理程式碼:

public class JSYUI:ISoCompressor
    {
        public string CompressionType { get; set; }
        public bool DisableOptimizations { get; set; }
        public bool IgnoreEval { get; set; }
        public bool ObfuscateJavascript { get; set; }
        public bool PreserveAllSemicolons { get; set; }

        public FileInfoAndException Execute(string inFile, string outFile, Encoding encoding)
        {
            FileInfoAndException fe = new FileInfoAndException();
            string strContent = "";
 	        try
            {
                Yahoo.Yui.Compressor.JavaScriptCompressor jsCompressor = new Yahoo.Yui.Compressor.JavaScriptCompressor();
                jsCompressor.Encoding = encoding;
                Yahoo.Yui.Compressor.CompressionType ct1 = Yahoo.Yui.Compressor.CompressionType.Standard;
                switch (CompressionType)
                {
                    case "Standard":
                        ct1 = Yahoo.Yui.Compressor.CompressionType.Standard;
                        break;
                    case "None":
                        ct1 = Yahoo.Yui.Compressor.CompressionType.None;
                        break;
                }
                jsCompressor.CompressionType = ct1;
                jsCompressor.DisableOptimizations = this.DisableOptimizations;
                jsCompressor.IgnoreEval = this.IgnoreEval;   //大小寫變換
                jsCompressor.ObfuscateJavascript = this.ObfuscateJavascript;    //程式碼混淆
                jsCompressor.PreserveAllSemicolons = this.PreserveAllSemicolons;   //保留所有分號
                jsCompressor.ThreadCulture = System.Globalization.CultureInfo.CurrentCulture;
                strContent = jsCompressor.Compress(System.IO.File.ReadAllText(inFile, encoding));
                System.IO.File.WriteAllText(outFile, strContent);
                fe.outFileInfo = new FileInfo(outFile);
            }
            catch (Exception e)
            {
                fe.strException = "處理檔案時出錯,錯誤原因:" + e.Message;  //此處在之後要改為捕捉具體的異常
            }
            return fe;
        }

        public bool Init()
        {
            return true;
        }
    }

    public class CSSYUI:ISoCompressor
    {
        public string CompressionType { get; set; }
        public bool RemoveComments { get; set; }

        public FileInfoAndException Execute(string inFile, string outFile, Encoding encoding)
        {
            FileInfoAndException fe = new FileInfoAndException();
            string strContent = "";
            try{
                Yahoo.Yui.Compressor.CssCompressor cssCompressor = new Yahoo.Yui.Compressor.CssCompressor();
                Yahoo.Yui.Compressor.CompressionType ct1 = Yahoo.Yui.Compressor.CompressionType.Standard;
                switch (CompressionType)
                {
                    case "Standard":
                        ct1 = Yahoo.Yui.Compressor.CompressionType.Standard;
                        break;
                    case "None":
                        ct1 = Yahoo.Yui.Compressor.CompressionType.None;
                        break;
                }
                cssCompressor.CompressionType = ct1;
                cssCompressor.RemoveComments = this.RemoveComments;
                strContent = cssCompressor.Compress(System.IO.File.ReadAllText(inFile, encoding));
                System.IO.File.WriteAllText(outFile, strContent);
                fe.outFileInfo = new FileInfo(outFile);
            }catch(Exception e)
            {
                fe.strException = "處理檔案時出錯,錯誤原因:" + e.Message;  //此處在之後要改為捕捉具體的異常
            }
            return fe;
        }

        public bool Init()
        {
            return true;
        }
    }
汗,今天剛發現釋出的工具中少了點程式碼,已補上。
SoCompressor下載地址: 百度網盤