Использование YUI Compressor для файлов JavaScript, содержащих PHP

#php #javascript #compression #yui

#php #javascript #сжатие #yui

Вопрос:

Я хочу использовать компрессор YUI для файлов JavaScript, содержащих PHP-код, например:

 <?php $include 'headerDefinitions.js.php'; ?>
function hello(name) {
    alert('Hello '   name);
}
hello('<?= $_GET["name"] ?>');
  

Это, очевидно, приводит к некоторым ошибкам при запуске через yui compressor, подобным этому:

 java -jar yui-compressor.jar --type js -o target-file.js.php source-file.js.php
  

поскольку компрессор предполагает, что даже часть PHP является JavaScript. Есть ли способ сжать JavaScript, сохраняя и игнорируя части PHP? Таким образом, приведенный выше пример приводит к:

 <?php $include 'headerDefinitions.js.php'; ?>function hello(a){alert('Hello ' a)}hello('<?= $_GET["name"] ?>');
  

Комментарии:

1. hello('<?= $_GET["name"] ?>'); — скажи мне, что это была просто шутка.

2. Это всего лишь пример, а не реальный код.

3. Тогда все пользователи могут спать спокойно :).

4. Я бы никогда не осмелился поделиться реальным кодом, который выглядел бы так 😉

Ответ №1:

Это не сработает. Вы должны определить все свои функции в простых файлах .js, и тогда все динамические значения или вызовы функций будут на вашей PHP-странице. Помимо разрешения сжатия, это позволит вашим .js файлам правильно кэшироваться браузером.

Ответ №2:

Чтобы ответить самому:

ответ джигги по отделению JavaScript от PHP, вероятно, самый понятный, и ему следует следовать, когда это возможно. Но иногда это невозможно. В моем случае я не могу разделить PHP и JavaScript, не потратив огромное количество времени (это старый и большой проект).

В любом случае, YUI Compressor не удаляет комментарии JavaScript, начинающиеся с /*! , поэтому ключевым моментом является окружение PHP-кода блоком комментариев, подобным этому:

 /*!
 <?php $include 'headerDefinitions.js.php'; ?> */
function hello(name) {
    alert('Hello '   name);
}
hello('<?= $_GET["name"] ?>');
  

Вот и все. При просмотре в браузере будет пустой блок комментариев, но им можно пренебречь или заполнить некоторой информацией об авторских правах.

PHP-код в строках JavaScript не требует дополнительного внимания, поскольку они (очевидно) остаются нетронутыми в процессе сжатия:

 var myString = '<?= $_GET["name"] ?>';
  

изменять не нужно. Вам нужно только позаботиться о том, чтобы не использовать одинарные или двойные кавычки как для объявления строки JavaScript, так и для строк в коде PHP.