yaglify

Postprocessor for yate

npm install yaglify
12 downloads in the last week
24 downloads in the last month

yaglify

После компиляции yate-шаблонов, получающийся javascript не до конца оптимален. Например, там часто встречаются такие фрагменты:

var r0 = '';

r0 += closeAttrs(a0);
r0 += '<div class="' + 'hello' + '">';
r0 += '<span class="' + 'foo' + '">';
r0 += nodeset2xml( selectNametest('hello', c0, []) );
r0 += '</span>';
r0 += '</div>';

Хочется написать некий постпроцессор, который сделает из этого кода такой:

var r0 = '' + closeAttrs(a0) + '<div class="hello"><span class="foo">' + nodeset2xml( selectNametest('hello', c0, []) ) + '</span></div>';

К сожалению, существующие компрессоры javascript'а (например, uglifyjs) не справляются с этой задачей. Например, uglifyjs не может оптимизировать var s = x + 'foo' + 'bar'; до var s = x + 'foobar';.

При этом нет задачи написать полноценный компрессор, который заменит тот же uglifyjs. Хочется особо сложные и часто встречающиеся случаи (именно в сгенеренном коде) поправить, а остальное уже оставить для uglifyjs.

Инсталляция

npm install yaglify

Использование

yaglify foo.js

Что умеет делать:

  • Заменяет:

    r += expr1;
    r += expr2;
    ...
    r += exprN;
    

    на:

    r = r + expr1 + expr2 + ... + exprN;
    
  • Заменяет:

    r = expr0;
    r += expr1;
    r += expr2;
    ...
    r += exprN;
    

    на:

    r = expr0 + expr1 + expr2 + ... + exprN;
    
  • Заменяет:

    var r = expr0;
    r += expr1;
    r += expr2;
    ...
    r += exprN;
    

    на:

    var r = expr0 + expr1 + expr2 + ... + exprN;
    
  • Заменяет:

    'foo' + 'bar'
    

    на

    'foobar'
    
  • Заменяет:

    ( x + ( y + ( z + 'foo' ) + 'bar'
    

    на

    x + ( y + ( z + 'foobar' )
    
  • И кое-какие другие оптимизации, связанные с ассоциативностью сложения.

npm loves you