Столкнулся с тем, что не особо освещен вопрос управления javascript на друпале - как в рунете, так и в англоязычном сегменте.
Началось всё вообще с вопроса оптимизации скорости загрузки страниц - с упором на оптимизацию загрузки для незарегистрированнных пользователей.
Для CSS я легко удалил все системные скрипты для незалогиненных пользователей, кроме пары необходимых, а вот с JS надолго задумался.
В принципе, помимо _css_alter есть и _js_alter - но сколько я не искал (в т.ч. и по офсайтам и документации) я не нашёл сколько-то годных вариантов решения.
Такое впечатление, будто особо даже нет необходимости отключить jQuery хоть на какой-то одной странице (а у меня есть куча и статических и динамических страниц, где можно безболезненно отключить все JS-скрипты). Где-то на stackoverflow я даже видел мнение - мол, jQuery настолько сильно интегрировано в drupal 7, что вырезать его бессмысленно и опасно. Ну дак я положим, готов отключать его только для незалогиненных пользователях и только на определённых страницах.
Два варианта нашёл: либо делать unset скрипта:
<?php
$alias = drupal_get_path_alias($_GET['q']);
if ($alias == "my-page-alias") {
unset($javascript['sites/all/modules/dhtml_menu/dhtml_menu.js']);
unset($javascript['sites/all/modules/apachesolr_autocomplete/apachesolr_autocomplete.js']);
}?>
либо откладывать загрузку скрипта:
<?phpfunction mymodule_js_alter (&$javascript)
{
$javascript['misc/drupal.js']['defer'] = TRUE;
}
function mymodule_js_alter (&$javascript)
{
foreach ($javascript as $key => $value) {
$javascript[$key]['defer'] = TRUE;
}
}
?>
Однако непонятно допустим, что делать, если я хочу в html.tpl.php выставить js не в head-страницы, а в самом низу страницы - и делать это в завимости от залогиненности пользователя, от каких-либо параметров URL и т.п. Переменных не хватает в первую очередь... $logged_in определяется на уровне page.tlp.php, а не на уровне html.tpl.php, других переменных вообще нет.
Вовсе непонятно, каким образом собирается
Комментарии
Здесь ( http://www.drupal.ru/node/79656 ) также остаётся без ответа вопрос управления jQuery.extend Drupal.settings - теме два года, видимо никто не пользуется подобного рода оптимизацией?
Ещё один попутный вопрос - как выводить часть скриптов в head, а часть - в footer (поблизости от закрывающего ).
Поддержка в семёрке есть (можно в js_alter прописать вместо $scope = 'header' футер), но ни одной работающей темы (начиная от zen) не нашёл.
Кроме того, я слышал, что данную фичу будут пилить уже в восьмёрке (пруфлинков кроме этого не нашёл: http://davehall.com.au/blog/dave/2010/08/08/kicking-javascript-footer-dr... )
В общем, пока получается вот что.
Грамотно управлять загрузкой скриптов пока так и не знаю путь - поэтому пошёл по пути полного искоренения всех js друпала.
Поскольку у меня очень много отключенных модулей друпала (например, Locale) то мне хватило следующего:
<?php
function theme_js_alter(&$javascript) {
if (user_is_logged_in())
{
return;
}
unset($javascript['misc/jquery.js']);
unset($javascript['misc/jquery.once.js']);
unset($javascript['misc/drupal.js']);
unset($javascript['settings']);
return;
}
?>
первая и вторая строка отключают jquery, третья - скрипт drupal.js, а последняя - отрубает настройки (см. в теме, которую я упоминал ранее)
А в целом - жаль, да. Я бы предпочёл какой-нибудь асинхронный загрузчик впаять внешний, чтобы было более удобно управлять загрузкой всех остальных скриптов.
Если вы даже квери обрубаете, у вас сайт вообще простейший похоже, зачем тогда Друпал использовать, проще на HTML/CSS тогда уже сверстать - на скорость загрузки не нарадуетесь:) Мне кажется для "с упором на оптимизацию загрузки для незарегистрированнных пользователей." лучше в сторону кеширования, сжатия и склейки скриптов и стилей смотреть:)
Нет, вы ошибаетесь. У меня как раз очень сложный сайт, но который в [url=http://developers.google.com/speed/pagespeed/insights/]Page Speed Online[/url] выбивает 97/100 на 93% страниц - причём не только на простеньких страницах - но и на весьма сложных.
Одна из причин этого - как раз управление асинхронной загрузкой скриптов, которая прибавила мне сразу 6 пунктов (попробуйте дефолтный друпал - и поймёте: даже если вы все "склейки, кэши" врубите - всё равно не дотянете до сотки)
Да, я отрубил jquery (очень удобная библиотека, но я не испытываю священного трепета перед ней и ещё помню, как многие вещи написать вообще БЕЗ jquery на нативном кроссбраузерном js - чтобы не тащить лишние килобайты этой библиотеки) - но я отрубил его только для того, чтобы иметь возможность подключать тогда, когда мне это реально нужно и на тех страницах, на которых я хочу включить. Drupal не оставляет мне выхода - он ВСЕГДА подключает jquery и кучу своих скриптов, jquery слишком глубоко вшито в ядро.
Я не агитирую БЕЗДУМНО идти по моему пути - нужно чёткое понимание, какие модули ставятся, что отключается и зачем, что и как повлияет (порой в самом неожиданном месте - например, банальное отключение модуля Local мне принесло несколько неочевидных багов, которые пришлось долго вылавливать). Я знаю, где отошёл от стиля написания кода drupal - но осознанно шёл на некоторые компромиссы.
А тема мне по-прежнему интересна, с удовольствием почитаю как выкручиваются другие.
quimbie, лично я для себя сделал такой вывод, что у drupal такая уже структура - все скрипты подключаем в head, управляем ними с помощью _js_alter, позволяем им объединяться и сжиматься. И отходить от этой структуры крайне нежелательно, потому что все модули управляют скриптами тоже через _js_alter, отчего есть риск наделать нечаянно ошибок, связанных с этими вот многочисленными модулями.