Peter Širka - Brutal Web Developer
JS algoritmus na minifikáciu JavaScriptu

Wed Aug 31 2016 15:37:00 GMT+0200 (Central European Summer Time)

JS algoritmus na minifikáciu JavaScriptu

Pred niekoľkými týždňami som používal v Total.js algoritmus na minifikáciu JavaScriptu od pána Crockforda a bol som s ním dlhodobo spokojný. No nedávno som napísal správičku ohľadom Total.js na server Root, kde som bol upozornený, že JS minifikátor používa v licencii frázu "Good, not Evil". Keďže s touto frázou malo problém viacej vývojárov / firiem, tak som začal ihneď konať a povedal som si, že Total.js musí mať jasne definovanú licenciu.

Priznám sa, že ani vo sne ma nenapadlo, že jedného dňa budem písať vlastný JavaScriptový minifikátor. Našťastie sa to podarilo a ešte lepšie ako som očakával. Dovolím si povedať, že nižšie uvedený algoritmus minifikuje lepšie JavaScriptový kód ako algoritmus od pána Crockforda.

Riešenie problémov

Keď som sa zamyslel nad algoritmom, tak som si povedal, že vlastne na tom nič extra ťažké nemôže byť, stačí vyriešiť problémy s deklaráciou regulárnych výrazov a deklaráciu stringových hodnôt v znakoch " a '.

Funkčnosť

  • odstraňuje komentáre
  • odstraňuje nadbytočné medzery, tabulátory
  • funguje aj s ES6
  • MIT licencia
// The MIT License
// Copyright 2012-2016 (c) Peter Širka <petersirka@gmail.com>
function minify(data) {

    var index = 0;
    var output = [];
    var isCS = false;
    var isCI = false;
    var alpha = /[0-9a-z]/i;
    var chars = /[a-z]/i;
    var white = /\W/;
    var skip = { '$': true, '_': true };
    var regexp = false;
    var scope;
    var prev;
    var next;
    var last;

    while (true) {

        // For web browsers
        var c = data.substring(index, index + 1);
        var prev = data.substring(index - 1, index);
        var next = data.substring(index + 1, index + 2);

        // For Node.js
        // var c = data[index];
        // var prev = data[index - 1];
        // var next = data[index + 1];

        index++;

        if (c === undefined)
            break;

        if (!scope) {

            if (!regexp) {
                if (c === '/' && next === '*') {
                    isCS = true;
                    continue;
                } else if (c === '*' && next === '/') {
                    isCS = false;
                    index++;
                    continue;
                }

                if (isCS)
                    continue;

                if (c === '/' && next === '/') {
                    isCI = true;
                    continue;
                } else if (isCI && (c === '\n' || c === '\r')) {
                    isCI = false;
                    alpha.test(last) && output.push(' ');
                    last = '';
                    continue;
                }

                if (isCI)
                    continue;
            }

            if (c === '\t' || c === '\n' || c === '\r') {
                if (!last || !alpha.test(last))
                    continue;
                output.push(' ');
                last = '';
                continue;
            }

            if (!regexp && (c === ' ' && (white.test(prev) || white.test(next)))) {
                if (!skip[prev] && !skip[next])
                    continue;
            }

            if (regexp) {
                if ((last !== '\\' && c === '/') || (last === '\\' && c === '/' && output[output.length - 2] === '\\'))
                    regexp = false;
            } else
                regexp = (last === '=' || last === '(' || last === ':') && (c === '/');
        }

        if (scope && c === '\\') {
            output.push(c);
            output.push(next);
            index++;
            last = next;
            continue;
        }

        if (!regexp && (c === '"' || c === '\'' || c === '`')) {

            if (scope && scope !== c) {
                output.push(c);
                continue;
            }

            if (c === scope)
                scope = 0;
            else
                scope = c;
        }

        if (c === '}' && last === ';')
            output.pop();

        output.push(c);
        last = c;
    }

    return output.join('').trim();
}

Značky


Posledné blogy
Brutálny polrok 2018
Fri Jun 22 2018 09:48:21 GMT+0200 (Central European Summer Time)
Konferencia/Workshop: TotalCon 2017
Thu Nov 16 2017 22:06:55 GMT+0100 (Central European Standard Time)
CodeCon 2017 z pohľadu organizátora
Sun Apr 09 2017 09:27:34 GMT+0200 (Central European Summer Time)
Elektrický bicykel KTM MACINA KAPOHO SLX 2017
Fri Mar 31 2017 15:32:37 GMT+0200 (Central European Summer Time)
Total.js platforma - školenia
Mon Jan 16 2017 18:35:05 GMT+0100 (Central European Standard Time)

Posledné komentáre
Thank you for your work! You are the great friend, great person and great expert!
Jozef Gula
Mon Jun 25 2018 08:02:14 GMT+0200 (Central European Summer Time)
It's been an absolute pleasure collaborating with you Peter, I've learned so much from Total.js a...
Pedro Costa
Fri Jun 22 2018 19:18:22 GMT+0200 (Central European Summer Time)
Tento skateboard až tak kopec nerieši, pretože má 2 silné motory. So mnou vyšiel všade, kde som b...
Peter Širka
Fri Jul 14 2017 09:30:56 GMT+0200 (Central European Summer Time)
Dobry den jak se vypořadavá s kopci ?
Lukáš
Thu Jul 13 2017 20:44:43 GMT+0200 (Central European Summer Time)
Chlapci z firmy Nazaret Pánu Bohu ďakujú a Tebe blahoželajú k dobre odvedenej práci. Super Peťo, ...
Tomáš
Thu Dec 15 2016 08:08:15 GMT+0100 (Central European Standard Time)