rmrevin / yii2-minify-view

Yii2 View component with minification css & js
MIT License
191 stars 67 forks source link

Минификатор срабатывает каждый раз при аякс запросе #22

Closed Krknv closed 8 years ago

Krknv commented 8 years ago

Минификатор срабатывает каждый раз при аякс запросе. Получается что каждый запрос генерируется js файл в папке minify.

upd. если используется POS_HEAD, то проблемы не возникает

rmrevin commented 8 years ago

Accepted.

Krknv commented 8 years ago

Как временное решенеие изменил 122 строчку в файле View.php:

self::PH_BODY_END => ($ajaxMode) ? "" : $this->renderBodyEndHtml($ajaxMode)
rmrevin commented 8 years ago

Внутри render partial подключаются какие-то assets?

Krknv commented 8 years ago

Нет, только в хедере. Но после того как запрос ушел генерируется JS с другим (меньшим) размером.

rmrevin commented 8 years ago

На каждый запрос генерируется? Или только один раз? Особенность этого расширения в том, что оно минифицирует любой набод assets. То есть если в каком-то разделе помимо условного AppAssetBundle подключаются какие-то ещё assets, то он минифицирует это в новый пак. Например, на всех страницах подключается только AppAssetBundle, расширения просто минифицирует его. Но в одном из разделов во вьюхе подключается доп скрипт, например

$this->registerJsFile('/js/user/edit.js');

В этом случае расширения создаст новый минифицированный пак AppAssetBundle + /js/user/edit.js

В Вашем случае возможно в renderPartial подключается какой-то виджет, который тянет свой AssetBundle, и расширение именно его пытается минифицировать. Теоретически, он должен минифицироваться только один раз, пока нет кэша в директории minify

Krknv commented 8 years ago

Только один раз. Но получается два инициализированных бутстрапа, которые не дают кликнуть по чекбоксу (один включает по клику, второй сразу выключает)

В yii2 кажется есть механизм, который предотвращает повторное добавление скрипта в шапку, но не в конец страницы

rmrevin commented 8 years ago

Рекомендую просто внутри афкс вызова не подключать assets. Это плохая практика. Скорее всего Вы используете pjax?

Krknv commented 8 years ago

Да, используется Pjax. Внутри подключаются бутстрап-карусели, которые и тянут за собой бутсрап. Кстати после запроса JS скрипт добавляется в header, вместо body.

rmrevin commented 8 years ago

Значит всё верно. Вам требуется не подключать assets внутри ajax действия. Тогда pjax не будет подключать assets повторно. Вместе подключения внутри ajax, Вам нужно подключить бандл виджета заранее. А внутри ajax сделать только инициализацию скрипта виджета.

whale001 commented 8 years ago

У меня похожая проблема, есть большой список скриптов в 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? Или вы считаете это не баг, а фича?

rmrevin commented 8 years ago

@whale001 Добрый день. Не совсем понял "если даже включить следующие бандлы", "они всё равно будут добавлены". Всё верно, если их добавить, они будут подключены. Если Вам не нужно их подключать, вы их не подключаете (если activeform не должен рендерить скрипты, выключаете параметр enableClientScript).

Вообще неправильно рендерить верстку на сервере. Скрипты должны быть загружены уже в браузере, а сервер должен возвращать только данные (в крайнем случае только верстку, без скриптов). Pjax и прочие - это костыли.

whale001 commented 8 years ago

Сама проблема в общем в том, что не все библиотеки "терпят" повторное подключение (конкретно мой пример связан с semantic-ui.js http://semantic-ui.com/ ).

rmrevin commented 8 years ago

@whale001 это Вы сегодня письмо написали? Ещё не успел протестировать с семантиком. Скорее всего нужно использовать уже минифицированную версию. Либо текеущий минификатор ломает скрипт (такое бывает, когда разработчики плагинов не ставят ;, например).

whale001 commented 8 years ago

Да, я писал, потом уже нашел эту тему. Дело именно в повторном подключении ВСЕХ бандлов через ajax, когда используется ActiveForm, а не в том, что скрипты не работают в минифицированном виде, сами скрипты прекрасно работают после минификации. В письме, я , пожалуй, не правильно описал проблему.

whale001 commented 8 years ago

Могу собрать простой пример для воспроизведения этой особенности. Сделать?

rmrevin commented 8 years ago

@whale001 я думаю просто не нужно в аякс обработчике подключать бандл. Зачем это делать?

whale001 commented 8 years ago

Он подключается автоматически, это заложено в поведении Yii2

whale001 commented 8 years ago

Ошибка в том, что минификатор в ответ на это подключает полный файл, а не новый небольшой, только с теми бандлами, которые были подключены при ajax ответе

rmrevin commented 8 years ago

@whale001 В yii не заложено автоматическое подключение бандла. Вы подключаете его где-то самостоятельно. Как раз в ajax запросах он не должен подключаться.

В yii заложена возможность понимать скрипты, которые приходят вместе с ответом сервера. А какие Вы там подключаете скрипты, это уже дело Ваших рук.

Минификатор минифицирует всё что попадает в view->jsFiles view->cssFiles.

whale001 commented 8 years ago

vendor\yiisoft\yii2\widgets\ActiveForm.php:200

rmrevin commented 8 years ago

Это подключение бандла виджета. Он не подключает Ваш основной бандл.

whale001 commented 8 years ago

Иными словами Вы предлагаете не использовать или переопределять поведение ActiveForm

whale001 commented 8 years ago

Основной подключается один раз в layout

rmrevin commented 8 years ago

Ещё раз сформулируйте, в чём проблема? В аякс ответе где нет лейаута минификатор подключает основной бандл? Покажите тест.

whale001 commented 8 years ago

Сейчас сделаю

whale001 commented 8 years ago

Оказалось, это связано с другой особенностью - повторное добавление библиотеки jquery, при использовании minify и добавлении всех файлов одним - ошибка есть, без использования minify , когда из ajax запроса файлы добавляются по одному - ошибки нет. Буду разбираться.

Сам minify делает, похоже, действительно всё правильно, но что-то мешает нормальной работе скриптов, когда дополнительные скрипты из ajax Запроса приходят одним файлом.

whale001 commented 8 years ago

Разобрался, с minify не срабатывает initScriptFilter() vendor\yiisoft\yii2\assets\yii.js:370

так как ожидаемых названий файлов нет

надо подумать над решением