Меню

Техники за напреднали

Влез Излез

GIT post-merge hook за комбиниране и minify-ване на JavaScript

От известно време използвам един малък script на GIT post-merge hook за един от проектите си (M Simple Nav).

Днес го доработих, така че да бъде малко по-гъвкав и реших да го споделя с хората, които също имат проекти под GIT и биха искали лесно да minify-ват всичките си JS файлове в един:

Начинът, по който работи script-а е, че първо взима името на branch-а в променлива:

current_branch="$(git rev-parse --abbrev-ref HEAD)";

После се прави проверка кой е този branch, тъй като за моя проект ми трябва този hook да се изпълни, единствено, ако merge-вам нещо към production:

if [[ $current_branch == 'production' ]]; then

Чрез следващия ред намирам всички файлове в папка „js“, чието име завършва на „.js“ и списъкът с имена на файлове подавам към cat функцията, която просто събира всички файлове в един (при мене е „js/combined.js“).

find js -name *.js | xargs cat > js/combined.js

След това посредством CURL изпращам съдържанието на този файл към online service за минифициране и резултата записвам в „js/combined.min.js“ и изтривам не-минифицирания „js/combined.js“, тъй като повече нямам нужда от него.

Забележка: Тъй като се използва online service трябва да сте сигурни, че при merge-ването имате интернет. В противен случай стъпката няма да се изпълни правилно.

Бихте могли вместо с CURL към външен service да си инсталирате команда, която да минифицира JavaScript-а, но аз предпочитам този service, тъй като резултатът освен minify-нат е и GZIP-нат (компресиран).

За финал правя нов автоматичен commit с новата версия на minify-натия JS.

  • Anton каза:

    Според мен подходът ти е напълно погрешен. Причините са няколко:

    – изпълняваш команда към външна услуга
    * Какво ще се случи ако от javascript-minifier.com пуснат експлойт вместо съдържанието на твоя файл. Нямаш никакви проверки за това.
    * Ако javascript-minifier.com спре поради някаква причина, няма да можеш да пуснеш нова версия на файла ти или тя ще е с невалидно съдържание
    – curl е по-бавен от решението по-долу

    Вместо това:
    – изтегли yuicompressor
    – build-вай локално (пример: java -jar yuicompressor-2.4.8.jar source.js -o source.js –charset utf-8)
    – push-вай вече build-нати файлове
    – използвай GZIP компресия на уеб сървъра ти

    • magadanski_uchen каза:

      Съгласен съм, че като цяло разчитането на външен service не е добро, поради причините, които си изтъкнал: няма гаранция, че винаги ще работи; възможно е полученият резултат да не е точно каквото сме очаквали. Така че, ако човек предпочита – винаги може да го направи с локална библиотека.

      Аз лично винаги тествам резултатът, преди да кача файловете от „production“ branch-а си live и харесвам този service, тъй като все още се срещат сървъри без модул, който да GZIP-ва файлове преди сервирането им.

      В случаят, това на което трябва да се наблегне, не е javascript-minifier.com service-а, колкото идеята за автоматично конкатениране и компресиране на JS файлове от даден проект и push-ването им в отделен branch. Какво е мнението ти за това?

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax