Управление javascript вообще и javascript в частности

Главные вкладки

Аватар пользователя quimbie quimbie 16 сентября 2013 в 10:47

Столкнулся с тем, что не особо освещен вопрос управления 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, других переменных вообще нет.

Вовсе непонятно, каким образом собирается

Комментарии

Аватар пользователя quimbie quimbie 16 сентября 2013 в 13:02

Ещё один попутный вопрос - как выводить часть скриптов в head, а часть - в footer (поблизости от закрывающего ).
Поддержка в семёрке есть (можно в js_alter прописать вместо $scope = 'header' футер), но ни одной работающей темы (начиная от zen) не нашёл.
Кроме того, я слышал, что данную фичу будут пилить уже в восьмёрке (пруфлинков кроме этого не нашёл: http://davehall.com.au/blog/dave/2010/08/08/kicking-javascript-footer-dr... )

Аватар пользователя quimbie quimbie 3 октября 2013 в 19:36

В общем, пока получается вот что.
Грамотно управлять загрузкой скриптов пока так и не знаю путь - поэтому пошёл по пути полного искоренения всех 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, а последняя - отрубает настройки (см. в теме, которую я упоминал ранее)

А в целом - жаль, да. Я бы предпочёл какой-нибудь асинхронный загрузчик впаять внешний, чтобы было более удобно управлять загрузкой всех остальных скриптов.

Аватар пользователя sergeybelya sergeybelya 3 октября 2013 в 19:49

quimbie wrote:
В общем, пока получается вот что.
Грамотно управлять загрузкой скриптов пока так и не знаю путь - поэтому пошёл по пути полного искоренения всех 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 тогда уже сверстать - на скорость загрузки не нарадуетесь:) Мне кажется для "с упором на оптимизацию загрузки для незарегистрированнных пользователей." лучше в сторону кеширования, сжатия и склейки скриптов и стилей смотреть:)

Аватар пользователя quimbie quimbie 5 октября 2013 в 15:24

sergeybelya wrote:

Если вы даже квери обрубаете, у вас сайт вообще простейший похоже, зачем тогда Друпал использовать, проще на 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 - но осознанно шёл на некоторые компромиссы.
А тема мне по-прежнему интересна, с удовольствием почитаю как выкручиваются другие.

Аватар пользователя ФинтУшами ФинтУшами 3 октября 2013 в 20:33

quimbie, лично я для себя сделал такой вывод, что у drupal такая уже структура - все скрипты подключаем в head, управляем ними с помощью _js_alter, позволяем им объединяться и сжиматься. И отходить от этой структуры крайне нежелательно, потому что все модули управляют скриптами тоже через _js_alter, отчего есть риск наделать нечаянно ошибок, связанных с этими вот многочисленными модулями.