это плохая практика - требовать файлы php, а не ссылку на js и css?

Я хочу поместить такие фрагменты в несколько файлов 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. Оба варианта использования, которые я поднял в этом вопросе, довольно хорошо обрабатываются современными фреймворками/препроцессорами.


person David Meister    schedule 22.02.2010    source источник
comment
foo должно быть .foo или #foo :)   -  person Sampson    schedule 22.02.2010
comment
@Jonathan Не обязательно ... Я думаю, вы можете использовать Javascript для создания тегов.   -  person Tyler Carter    schedule 22.02.2010
comment
@Chacha: Конечно, вы можете создать тег foo, но я сомневаюсь, что это то, что имел в виду пользователь :)   -  person Sampson    schedule 22.02.2010
comment
хорошо, теперь это .foo! :П   -  person David Meister    schedule 22.02.2010


Ответы (4)


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

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

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

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

person bcosca    schedule 22.02.2010
comment
Это определенно самая большая проблема с тем, что я предложил для типов проектов, над которыми я работаю. Спасибо за внимание! это было бы больно отлаживать. - person David Meister; 22.02.2010

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

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

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

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

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

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

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

person MarkR    schedule 22.02.2010
comment
это кажется мне вполне разумным. Так что это не категорическое НЕТ из-за вопиющей проблемы с безопасностью, это скорее проблема производительности и разработки. Оба они должны быть взвешены в контексте проекта, и я думаю, что могу сделать это, основываясь на том, что вы сказали :) Спасибо! - person David Meister; 22.02.2010

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

person Sampson    schedule 22.02.2010
comment
Черт с ним! Make a css.php принимает файл в качестве параметра GET и анализирует токены, такие как %varname%, в заданные базой данных! Чрезмерное усложнение FTW! - person Tyler Carter; 22.02.2010
comment
дело не в чрезмерном усложнении. Я использую codeigniter в качестве фреймворка, и мне бы хотелось использовать функцию base_url() в моем css для улучшения переносимости и сокращения ввода. Если я использую относительные URL-адреса, мои фоновые изображения часто не появляются, когда я редактирую css с помощью надстройки веб-разработчика Firefox. Это мелочи, которые имеют значение.. - person David Meister; 22.02.2010
comment
@user278457 user278457 Относительные пути в CSS не должны быть проблемой, поскольку они всегда обслуживаются из одного и того же каталога. Включение CSS на каждую страницу на самом деле значительно усложнит решение проблем с путями. Получите достойный редактор CSS для редактирования (CSSEdit для OS X). ;-П - person deceze♦; 22.02.2010

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

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

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

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

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

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

person Jasmine Hegman    schedule 21.09.2012