Это плохая практика, чтобы требовать файлы php, а не ссылки на js и css? - PullRequest
2 голосов
/ 22 февраля 2010

Я хочу поместить фрагменты, подобные этим, в несколько файлов php, а затем требовать их на моей главной странице вместо использования «чистых» файлов css и js. Я имею в виду, я уже делаю это по существу для моего HTML DOM.

это:

<script type='text/javascript'>
var foo = <?php echo $bar; ?>;
</script>

или это:

<style type='text/css'>
.foo{
background-image:url('<?php echo $bar; ?>image.png');
}
</style>

это действительно плохая практика?

и, если это так, каковы плюсы и минусы такого подхода?

Обновление:

В эти дни я просто использую Drupal, который обрабатывает передачу переменных PHP в js в системе тем и поддерживает CSS-препроцессоры, такие как LESS и SASS. Оба варианта использования, которые я поднял в этом вопросе, довольно хорошо обрабатываются современными фреймворками / препроцессорами.

Ответы [ 4 ]

5 голосов
/ 22 февраля 2010

Размещение Javascript через интерпретатор PHP, вероятно, не очень хорошая идея. Аналогично, CSS

  • Это поощряет антипаттерн иметь код на стороне сервера, пишущий код на стороне клиента
  • Сложнее тестировать JS и CSS по отдельности (если они начинают заполняться PHP-кодом)
  • Это делает вывод PHP больше
  • Клиенты не будут кэшировать часть страницы, только целый объект

Чтобы продолжить в последней части - Javascript и CSS могут стать большими (по сравнению с HTML). Если у вас есть клиентский браузер, кеширующий их, загружать их не нужно.

Верно, включение в основной документ означает, что не существует отдельного запроса, который уменьшает накладные расходы (особенно с SSL), но клиент все равно должен загрузить файл. Получение его из клиентского кэша обычно происходит быстрее.

С другой стороны, ваш код

<script type='text/javascript'>
var foo = <?php echo $bar; ?>;
</script>

Похоже, это часть данных, а не код Javascript, поэтому он может отличаться. Вы также можете корректно экранировать $ bar.

2 голосов
/ 22 февраля 2010

Хотя CSS не является проблемой, у вас возникнут проблемы, если вы захотите отправить это как HTTP-ответ через AJAX.

<script type='text/javascript'>
var foo = <?php echo $bar; ?>;
</script>

AJAX не разрешит Javascript по соображениям безопасности.

Рекомендуется хранить ваш Javascript в отдельном файле. Таким образом, кэширование сценария на стороне клиента будет в ваших интересах и с точки зрения трафика.

1 голос
/ 22 февраля 2010

Не думаю, что в этом есть что-то плохое. Некоторым людям это будет больно, но это нормально. Просто убедитесь, что эта интеграция сведена к минимуму, вы действительно не хотите, чтобы много php вкраплено в ваши css, javascript и html.

0 голосов
/ 21 сентября 2012

Следуя ветке MarkR (не вижу, как на нее ответить), предполагая, что вы просто пытаетесь передать данные в JS:

Один из способов получить лучшее из обоих миров состоит в том, чтобы включить в этот бит PHP некоторую логику, чтобы он проверял наличие определенного cookie-файла и имел определенное значение (например, версию / время). Как:

if (!isset($_COOKIE['warm']) && $_COOKIE['warm'] !== 'today') {
    echo '<script type=\'text/javascript\'>';
        echo "var foo = $bar;";
    echo '</script>';
}

Клиентская сторона сначала ищет глобал foo, и если он существует, он берет его и кеширует (например, localStorage) и устанавливает cookie с указанием времени, версии или какого-либо свойства из объекта foo. Если foo отсутствует, он будет проверять кэш (например, localStorage). Если бы его там не было, он сделал бы вызов AJAX.

Таким образом, вы сохраняете дополнительный запрос на пропущенного кеша / первого посетителя и получаете выгоду от кеширования для их повторов. Не стоит сходить с ума от этого, но я думаю, что это подойдет для небольших важных объектов данных (начальной загрузки, профиля пользователя, информации о панели инструментов и т. Д.).

(edit) Для ясности, основная идея сделать этот подход легко достижимым и обслуживаемым - хранить серверный код, который генерирует $ bar для JS, в одном месте, которое можно вызывать как при выводе PHP var var, так и при генерации ответа JSON. Аналогично, на стороне клиента будет использоваться одна функция для разбора $ bar, независимо от того, идет она из var, cache или AJAX.

...