自寫腳本實現上線前本地批量壓縮混淆 js , css 代碼。


最近做項目遇到一個要求,就是把本地的 js 和 css 進行壓縮后再上線,由於之前項目並沒有使用 webpack 之類的庫,項目上也因為一些機密不能在線上壓縮,這無疑給代碼打包壓縮帶來了很大麻煩,於是上網搜索了一些代碼壓縮的方法,最終鎖定了第三方插件 yuicompressor-2.4.8.jar,因為后台發開用的語言是 java,代碼工具是 IntelliJ IDEA,前端開發使用的代碼工具是 WebStorm,而 yuicompressor-2.4.8.jar 兩者都可以兼容,所以果斷選擇。

 

關於 yuicompressor-2.4.8.jar 的配置網上有很多教程,在這里我借鑒了 https://blog.csdn.net/ke_g3/article/details/84763515 的安裝過程,完全可以運行,但是令人遺憾的是這個方法只能處理單個 js 或者 css 文件,對於項目里 js 和 css 比較少的尚且可以接受,但是對於大批量的 js 和 css 文件來說簡直是無法忍受,於是就開始了此次 本地批量壓縮混淆 js , css 代碼 的旅程。

 

對於將 yuicompressor-2.4.8.jar 作為第三方插件植入 IDEA 或者 WebStorm ,然后運行該插件其實運用了以下這行代碼:

java -jar jar存放目錄/yuicompressor-2.4.8.jar --type js --charset utf-8 目錄/XXX.js -o '.js$:.min.js'

上面的代碼就是將一個特定的 js 文件代碼壓縮,那我們就可以順藤摸瓜,利用該命令實現一個批量壓縮代碼的腳本。

直接上代碼:

 1 #腳本解釋器
 2 #!/bin/bash
 3 #執行方法
 4 function getdir(){
 5     #循環當前目錄
 6     for file in `ls $1`
 7     do
 8         #拼接
 9         dir_or_file=$1"/"$file
10         #判斷是目錄還是文件
11         if [ -d $dir_or_file ]
12         then
13             #如果是目錄遞歸執行方法
14             getdir $dir_or_file
15         else
16             #如果是文件則進行壓縮
17             compress $dir_or_file
18         fi
19     done
20 }
21 #執行壓縮
22 function compress(){
23     #判斷 js 文件且不是 min.js , .js 壓縮的 min.js 會覆蓋原有的 min.js
24     if [[ $dir_or_file == *.js ]] && [[ $dir_or_file != *.min.js ]]
25     then
26         #壓縮 js
27         java -jar /Applications/IntelliJ" "IDEA.app/Contents/lib/yuicompressor-2.4.8.jar --type js --charset utf-8 $dir_or_file -o '.js$:.min.js'
28     #判斷 css 文件且不是 min.css , .css 壓縮的 min.css 會覆蓋原有的 min.css
29     elif [[ $dir_or_file == *.css ]] && [[ $dir_or_file != *.min.css ]]
30     then
31         #壓縮 css
32         java -jar /Applications/IntelliJ" "IDEA.app/Contents/lib/yuicompressor-2.4.8.jar --type css --charset utf-8 $dir_or_file -o '.css$:.min.css'
33     fi
34 }
35 #先刪除帶 min 的壓縮文件 此處由於可能只有 min.js 而沒有它的 js 文件,所以棄用
36 #rm `find . -name "*.min.js"`
37 #rm `find . -name "*.min.css"`
38 #進入目錄
39 root_dir="."
40 getdir $root_dir

 

 上面的代碼說白了就是運行在終端之后將目標目錄內的 js 和 css 文件進行查找並進行壓縮。由於本人使用的是 mac 做的開發,所以並沒有考慮 windows 的執行命令,這個大家都懂的。當然上面的命令是基於 shell 命令寫的,可以運行 shell 的也可以使用。使用 windows 的小伙伴代碼把上面的代碼解釋說明一下后可以自己修改一下運行。

 

1、我們的思路就是先找到需要壓縮代碼的目錄,然后將該目錄下的 js 和 css 代碼壓縮,如果該目錄還有目錄,那么就遞歸再次執行壓縮操作。

2、首先定義壓縮目錄 root_dir,在這里我是直接 cd 到壓縮目錄下執行,所以是 ".",然后執行 getdir() 方法並將 root_dir 參數傳入進行目錄查找。

3、然后我們對傳入的 toot_dir 目錄進行循環遍歷,對該級目錄,即傳入的 root_dir = "." 進行判斷,如果是目錄的話我們再次執行 getdir() 方法進行循環操作,如果是文件的話就進入 compress() 方法,並將該文件作為參數傳入。

4、在 compress() 方法里我們先對傳入的參數進行判斷,如果是以 .js 文件結尾的且不是以 min.js 結尾的,運行

java -jar jar存放目錄/yuicompressor-2.4.8.jar --type js --charset utf-8 $dir_or_file -o '.js$:.min.js'

這樣就可以將 js 文件代碼進行壓縮了,css 文件同理。

后語:在編寫代碼進行測試時,自己在本地建了一個 test 目錄進行測試,里面放了一些 js 和 css 文件,然后進行第一次代碼壓縮,當時並沒有在 compress() 方法里進行 .min.js 和 .min.css 的判斷。然后進行第二次壓縮,發現原有的 js 文件壓縮的 min.js 會覆蓋掉第一次壓縮出來 min.js,但是第一次壓縮出來的 min.js 也會壓縮出來一份 min.min.js,由於向省懶勁就直接在進行壓縮之前先刪除掉文件內所有的 min.js 和 min.css,拿給項目的人用,結果傻眼了。因為開發人員在之前引入了好多第三方 js 和 css 庫,但是引入的只是 min.js 和 min.css,結果刪了之后有沒有它的沒壓縮過的文件,整個項目崩潰了,只好再把項目代碼回滾了一下,很是尷尬。所以還是不要偷懶,代碼邏輯考慮詳細點。

最后我們看一下效果:

  1、先通過代碼編輯器打開一個需要壓縮代碼的項目,這里我們在 test 目錄下又創建了一個 nextDir 目錄來做遞歸壓縮檢測:

  2、在 Terminal 內將文章開頭的代碼貼入,按下回車鍵:

最終結果就是在每個 js 和 css 文件下分別創建了各自的壓縮代碼。

當然我們也可以創建個文件將文章最上面的代碼寫進去,然后執行該文件來操作會更加方便點。

以上就是這次的代碼學習之旅,鑒於本人才疏學淺,能力有限,上面的代碼可能有很多缺陷和不足,又是第一次寫終端執行腳本,如果問題請各位大神批評指正,在此謝過!

好記性不如爛筆頭,特此記錄,與君共勉!



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM