Есть ли механизм bundle-нга содержимого тегов script/style для asp.net mvc?

В ASP.NET 4.5 появилась возможность создавать бандлы скриптов с помощью ScriptBundle/@Scripts.Render. Но данная возможность позволяет только объединять существующие .js файлы. Но как быть, если у меня сложносоставные шаблоны, каждый из которых может иметь собственную логику построения структуры html и собственный тег script с определенным наполнением внутри? Причем этот тег script содержит внутри строки c# кода (условия, переменные и т.п.), т.е. формируется динамически. В итоге полный документ мог бы содержать 4-5 тегов script с большим количеством логики, что не есть хорошо - это полный бардак с точки зрения структуры документа. В идеале надо бы всё подобное содержимое вынести в конец документа, либо вообще в отдельный файл (желательно в один), но как?
Да, можно для каждого представления и частичного представления создать свой отдельный js файл (в которые вынесены секции script каждого представления) , можно даже генерировать такие js-файлы в отдельном action, если нужно выполнять логику razor, а потом получать объединенный бандл на странице, но это тоже выглядит очень некрасиво.
Было бы замечательно, если бы в любом представлении можно было написать @Scripts.Include("~scripts", script.../script), а в основном layout просто вставить @Scripts.Render("~scripts"), получив некий адрес на временный файл со всем содержимым тегов script всех участвующих в построении страницы представлений и частичных представлений. Причем, да, понятно, что не все script надо включать в такой временный файл, т.к. некоторые из них могут меняться для каждой страницы, а некоторые могут быть полустатичными, поэтому достаточно не включать в @Scripts.Include такое содержимое.

Порылся в сети и не нашел такой возможности в стандартном механизме. Может быть, есть какие-то пакеты, расширяющие стандартное поведение?
  • Вопрос задан
  • 74 просмотра
Пригласить эксперта
Ответы на вопрос 1
Jeer
@Jeer
уверенный пользователь
Привет, что-то совсем никто ничего не пишет (
Смысл бандлов в чем - существующие скрипты объеденить в один и этот один файл разместить на сервере, поправьте, если я не прав. То есть, в режиме дебага у вас отдаются имеющиеся файлы, а в режиме релиза, эти файлы вначале склеиваются на сервере. А потом отдаются уже готовые файлы. Я сталкивался с бандлами давным-давно, когда только учился, а потом благополучно их выпилил и не возвращался больше. Так что прошу прощения, если чего-то напутал, но должно быть именно так и это принципиальный момент.
Если у вас динамически создающиеся скрипты (когда вы средствами разора формируете вёрстку с вкраплениями js), то, получается, что под каждый запрос каждого пользователя у вас появляются свои, разные файлы. Динамически созданные страницы отдаются пользователю, но на сервере ничего не остается. Если под каждый запрос будет вначале проходить процесс связывания и минификации, то это будет нереально долго. Вот один раз такое проделать и потом отдавать всем один закешированный файл - это быстро. А под каждый запрос такое делать, это будет нереал.
В общем, ответ на ваш вопрос - этот механизм не позволяет добавлять динамически сформированные скрипты в бандлы.
На самом деле, если у вас невозможно выделить js код в отдельные файлы, значит, что-то не так со структурой проекта и js кода в нём.
Попробуйте (в целях саморазвития) посмотреть как решаются ваши проблемы в других проектах. К примеру, в студии есть шаблон .net core + angular, в нём уже настроен webpack, который выполняет примерно такую же функцию, как и бандлы (но он тоже не справится с вашей проблемой).
Смысл в том, что вы вначале из c# создаете скрипт, который сразу заполнен инициализированными значениями, но при обновлении (думаю, что вы через ajax обновляетесь?) у вас есть методы, которые принимают данные через api и обновляют те самые значения на странице, по сути кода становится если не в два раза, так в полтора больше. В spa решениях оставляют только работу через api, то есть не будет динамических скриптов, поэтому весь такой js код остается статичным, его можно связывать и минифицировать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы