Как удалить бесполезный код JavaScript, используя Python или Lisp - PullRequest
1 голос
/ 31 марта 2012

Код JavaScript выглядит следующим образом:

   <script>
    a={name:"abc"};
    b={xyz:"123"};
    this.c='aaa';
    this.cc='bbb';
    d=new Date();
    var e=new Array();
    var f=false;
    this.g=123;
    this.g++;
    document.write(b.xyz+this.cc);
    </script>

Только переменные b(b={xyz:"123"};) и cc(this.cc='bbb';) используются выше.

Кто-нибудь знает, есть ли способ удалить неиспользуемые переменные с помощью Python или Lisp?

Ответы [ 3 ]

3 голосов
/ 31 марта 2012

Попробуйте closure compiler, чтобы удалить избыточный код и бесполезные пробелы из javascript кода: Я запустил ваш код (158 bytes) на closure compiler и получил (89 bytes):

a={name:"abc"};b={b:"123"};this.a="bbb";d=new Date;document.write(b.b+this.a);

http://closure -compiler.appspot.com

1 голос
/ 31 марта 2012

Быстрый и грязный текст на основе хака в TXR:

script.txr:

@(collect)
@prolog
@(last)
<script>
@(end)
@(collect :vars (code))
@  (block occurs)
@    (cases)
@{decl /(var )?/}@{var /[a-z]+/}=@expr
@      (trailer)
@      (skip)
@      (cases)
@        (skip)@var@(skip)
@        (bind code `@decl@var=@expr`)
@      (or)
</script>
@        (fail occurs)
@      (end)
@    (or)
@code
@    (end)
@  (end)
@(last)
</script>
@(end)
@(collect)
@epilog
@(end)
@(output)
@{prolog "\n"}
<script>
@{code "\n"}
</script>
@{epilog "\n"}
@(end)

Контрольный пример script.html:

verbatim
text
<script>
a={name:"abc"};
b={xyz:"123"};
this.c='aaa';
this.cc='bbb';
d=new Date();
var e=new Array();
var f=false;
this.g=123;
this.g++;
</script>
left
alone

Запуск:

$ txr script.txr script.html
verbatim
text
<script>
a={name:"abc"};
b={xyz:"123"};
this.c='aaa';
this.cc='bbb';
var e=new Array();
this.g=123;
this.g++;
</script>
left
alone

Как видите, некоторая конденсация была достигнута.

Однако код считает, что aaa представляет собой использование переменной a.Переменная e сохраняется, поскольку e встречается в var f=false;но вы больше этого не видите, потому что сама эта строка удалена, поскольку f не происходит.

Если вы хотите больше, чем просто тупые текстовые хаки, вам нужно проанализировать Javascript.(Возможно и в TXR ясным и дисциплинированным грамматическим способом, но кодирование всех грамматических правил утомительно.)

1 голос
/ 31 марта 2012

В стране Common Lisp есть parse-js для анализа кода JavaScript. Существует также интерпретатор CL-JavaScript , построенный поверх него, если вы хотите интерактивно оценивать код JavaScript и выполнять какой-то динамический анализ. Что касается статического анализа, существует cl-uglify-js , также построенный поверх parse-js - либо он выполняет удаление мертвого кода, либо вы можете попытаться изменить его, чтобы сделать это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...