Очень часто, сталкиваясь с вопросом ускорения работы сайта, замечаешь, что тормозит сей процесс больше всего загрузка сторонних файлов, будь то стили или скрипты.
Лучший способ это объединять выше перечисленные ресурсы в один файл (например all.css, all.js)
В этой статье рассмотрим менее радикальный метод ускорения процесса, а именно удаление \n, \t etc. из файлов стилей и возвращения их в обратный, удобоваримый, вид.
Поковырявшись немного в питоне на свет появился простенький скрипт:
#!/usr/bin/python # -*- coding: utf8 -*- import sys import re import os.path if len(sys.argv) == 2: if os.path.isfile(sys.argv[1]): out = "" comment = False f1 = open(sys.argv[1], "r") while 1: text = f1.readline() if text == "": break out += re.sub(' ','',text).rstrip() f1.close() os.rename(sys.argv[1], sys.argv[1] + ".bak") out = re.sub('{ ','{',out) out = re.sub(' {','{',out) out = re.sub('} ','}',out) out = re.sub(' }','}',out) out = re.sub(': ',':',out) out = re.sub(' :',':',out) out = re.sub('\/\*',' /* ',out) out = re.sub('\*\/',' */ ',out) while " " in out: out = re.sub(' ',' ',out) f2 = open(sys.argv[1], "w") f2.write(out) f2.close() else: if len(sys.argv) == 3 and ((sys.argv[1] == "-u" and os.path.isfile(sys.argv[2])) or (sys.argv[2] == "-u" and os.path.isfile(sys.argv[1]))): print "uncript" filePath = sys.argv[2] if os.path.isfile(sys.argv[2]) else sys.argv[1] f2 = open(filePath + ".temp", "w") f1 = open(filePath, "r") while 1: text = f1.readline() if text == "": break text = re.sub('{', ' {\n', text) text = re.sub(' \/\*', '/*', text) text = re.sub('\*\/ ', '*/\n', text) text = re.sub(';', ';\n', text) text = re.sub(':', ' : ', text) text = re.sub('}', '}\n\n', text) f2.write(text) f1.close() f2.close() os.rename(filePath, filePath + ".bak") f2 = open(filePath, "w") f1 = open(filePath + ".temp", "r") isStyle = False while 1: text = f1.readline() if text == "": break if "{" in text or "}" in text: if "}" in text: isStyle = False if isStyle and text != "}": text = "\t" + text text = re.sub(',', ',\n\t', text) else: text = re.sub(',', ',\n', text) if "{" in text or "}" in text: if "{" in text: isStyle = True f2.write(text) f1.close() f2.close() os.remove(filePath + ".temp") else: print "CSS file compressor\nVersion: 0.1\n\nTo compress file use:\n\t./css.py \nTo uncompress file use\n\t./css.py -u"
Скрипт работает крайне просто:
- если задать ему параметром css файл, то он станет в одну строчку и потеряет все лишние пробелы и табуляции;
- если задать упакованный файл и ключ «-u» то он станет удобочитаемым.
При упаковке на всякий случай создается backup исходного файла.
При распаковке тоже!
и имена у них совпадают.
А теперь пример:
При упаковке jquery-ui-1.8.9.custom.css с 32,678 байт он стал 30,549 байт.