Closed Krknv closed 8 years ago
Accepted.
Как временное решенеие изменил 122 строчку в файле View.php:
self::PH_BODY_END => ($ajaxMode) ? "" : $this->renderBodyEndHtml($ajaxMode)
Внутри render partial подключаются какие-то assets?
Нет, только в хедере. Но после того как запрос ушел генерируется JS с другим (меньшим) размером.
На каждый запрос генерируется? Или только один раз?
Особенность этого расширения в том, что оно минифицирует любой набод assets. То есть если в каком-то разделе помимо условного AppAssetBundle
подключаются какие-то ещё assets, то он минифицирует это в новый пак.
Например, на всех страницах подключается только AppAssetBundle
, расширения просто минифицирует его.
Но в одном из разделов во вьюхе подключается доп скрипт, например
$this->registerJsFile('/js/user/edit.js');
В этом случае расширения создаст новый минифицированный пак AppAssetBundle + /js/user/edit.js
В Вашем случае возможно в renderPartial подключается какой-то виджет, который тянет свой AssetBundle, и расширение именно его пытается минифицировать. Теоретически, он должен минифицироваться только один раз, пока нет кэша в директории minify
Только один раз. Но получается два инициализированных бутстрапа, которые не дают кликнуть по чекбоксу (один включает по клику, второй сразу выключает)
В yii2 кажется есть механизм, который предотвращает повторное добавление скрипта в шапку, но не в конец страницы
Рекомендую просто внутри афкс вызова не подключать assets. Это плохая практика. Скорее всего Вы используете pjax?
Да, используется Pjax. Внутри подключаются бутстрап-карусели, которые и тянут за собой бутсрап. Кстати после запроса JS скрипт добавляется в header, вместо body.
Значит всё верно. Вам требуется не подключать assets внутри ajax действия. Тогда pjax не будет подключать assets повторно. Вместе подключения внутри ajax, Вам нужно подключить бандл виджета заранее. А внутри ajax сделать только инициализацию скрипта виджета.
У меня похожая проблема, есть большой список скриптов в AppAsset, при ajax запросе, если даже включить следующие бандлы yii\web\JqueryAsset, yii\validators\ValidationAsset, yii\widgets\ActiveFormAsset в AppAsset, то при использовании в ajax запросе ActiveForm, они всё равно будут добавлены, minify в этом случае добавляет просто весь (полный) набор скриптов (в одном минифицированном файле), я решил эту проблему расширением rmrevin\yii\minify\View скопировал один метод renderBodyEndHtml() и добавил условие !$ajaxMode (первые строки метода)
if (!$ajaxMode && !empty($this->jsFiles[self::POS_END])) { $lines[] = implode("\n", $this->jsFiles[self::POS_END]); }
То, что предлагает RsD0p9BK, подойдет не всем, т.к. в этом случае будут удалены в том числе обычные скрипты, а не только дублирующие бандлы.
Ошибка работы получается в том, что при ajax запросе нужно формировать новый файл для нового небольшого набора подключенных скриптом, а не добавлять в ответ полный уже созданный файл.
Предлагаю открыть заново этот issue? Или вы считаете это не баг, а фича?
@whale001 Добрый день. Не совсем понял "если даже включить следующие бандлы", "они всё равно будут добавлены". Всё верно, если их добавить, они будут подключены. Если Вам не нужно их подключать, вы их не подключаете (если activeform не должен рендерить скрипты, выключаете параметр enableClientScript).
Вообще неправильно рендерить верстку на сервере. Скрипты должны быть загружены уже в браузере, а сервер должен возвращать только данные (в крайнем случае только верстку, без скриптов). Pjax и прочие - это костыли.
Сама проблема в общем в том, что не все библиотеки "терпят" повторное подключение (конкретно мой пример связан с semantic-ui.js http://semantic-ui.com/ ).
@whale001 это Вы сегодня письмо написали? Ещё не успел протестировать с семантиком. Скорее всего нужно использовать уже минифицированную версию. Либо текеущий минификатор ломает скрипт (такое бывает, когда разработчики плагинов не ставят ;
, например).
Да, я писал, потом уже нашел эту тему. Дело именно в повторном подключении ВСЕХ бандлов через ajax, когда используется ActiveForm, а не в том, что скрипты не работают в минифицированном виде, сами скрипты прекрасно работают после минификации. В письме, я , пожалуй, не правильно описал проблему.
Могу собрать простой пример для воспроизведения этой особенности. Сделать?
@whale001 я думаю просто не нужно в аякс обработчике подключать бандл. Зачем это делать?
Он подключается автоматически, это заложено в поведении Yii2
Ошибка в том, что минификатор в ответ на это подключает полный файл, а не новый небольшой, только с теми бандлами, которые были подключены при ajax ответе
@whale001 В yii не заложено автоматическое подключение бандла. Вы подключаете его где-то самостоятельно. Как раз в ajax запросах он не должен подключаться.
В yii заложена возможность понимать скрипты, которые приходят вместе с ответом сервера. А какие Вы там подключаете скрипты, это уже дело Ваших рук.
Минификатор минифицирует всё что попадает в view->jsFiles
view->cssFiles
.
vendor\yiisoft\yii2\widgets\ActiveForm.php:200
Это подключение бандла виджета. Он не подключает Ваш основной бандл.
Иными словами Вы предлагаете не использовать или переопределять поведение ActiveForm
Основной подключается один раз в layout
Ещё раз сформулируйте, в чём проблема? В аякс ответе где нет лейаута минификатор подключает основной бандл? Покажите тест.
Сейчас сделаю
Оказалось, это связано с другой особенностью - повторное добавление библиотеки jquery, при использовании minify и добавлении всех файлов одним - ошибка есть, без использования minify , когда из ajax запроса файлы добавляются по одному - ошибки нет. Буду разбираться.
Сам minify делает, похоже, действительно всё правильно, но что-то мешает нормальной работе скриптов, когда дополнительные скрипты из ajax Запроса приходят одним файлом.
Разобрался, с minify не срабатывает initScriptFilter() vendor\yiisoft\yii2\assets\yii.js:370
так как ожидаемых названий файлов нет
надо подумать над решением
Минификатор срабатывает каждый раз при аякс запросе. Получается что каждый запрос генерируется js файл в папке minify.
upd. если используется POS_HEAD, то проблемы не возникает