Rails и управлението на активи (Rails asset pipeline)

29 дек.

Започнах да имам проблеми със скоростта на зареждане на някои страници на yetanotherprettifier.com. Поразгледах, какво съм направил и установих, че не е нужно части от javascript кодът и стиловете да бъдат компилирани в общите application.* файлове.

Управлението на активи в Rails с Rails asset pipeline изглежда изключително лесна работа. В същност цялата идеология на Rails е точно такава: ако го използваш по начина, по който е замислено да се ползва е детска игра! Когато обаче искаш да направиш нещо малко по-нестандартно, нещата загрубяват.

Проблемите с управлението на активите

В този случай почваш да се бориш с липсата на лесен достъп до качествена информация относно управлението на активите и тежките механизми на тази част от Rails. Винаги можеш да намериш някаква рецепта за бързо разрешаване на проблем като използването на мрежа за разпространение на съдържание (Content Delivery Network) за библиотеки като jQuery или Twitter Bootstrap, но пробвай да направиш същото с която и да е библиотека, и изпадаш в дълбоките дебри на някой джем. Сложна работа.

За това реших, че трябва сам да си свърша работата. И понеже сметнах, че това е прекрасна възможност да се науча как се правят джемове (които, ако следвам до сегашния стил да превеждам термините, трябва да наричам „скъпоценни камъни“), започнах да пиша джем. Но това е тема на друг пост.

След като направих джема, който генерираше таговете за включване на активите (т.е. Джаваскрипт файлове и стилове), се оказа, че jQuery се включва в страницата не само чрез CDN, но и в application.js. Кофти. Също така тагът, генериран от моя джем, предизвикваше грешка в конзолата на браузъра, оказваща, че jQuery не може да бъде намерено.

Въпреки, че знаех, че това се получава само в режим на разработка, трябваше да реша проблема, ако исках да публикувам джема.

Минимизиране на application.js

Отворих application.js и разкарах от него записът

//= require jquery

което премахна кода на jQuery от application.js. До тук добре. Чрез тези записи се определя кои от файловете трябва да се преработят и да се компилират и добавят в application.js. Директивата

//= require tree .

включва всички файлове в папката RAILS_ROOT/app/assets/javascripts, в процедурата по компилиране. Останалите директиви просто задават по-висок приоритет на споменатите файлове. Те ще бъдат добавени под ред преди останалите. Те обикновено са често използвани библиотеки като jQuery.

Ето защо, не трябва да държим активи, за които ще се използва CDN, в тази папка или нейна подпапка. Ако пък искате точно там да са тези активи, защото там им е мястото, горният запис трябва да се промени.

Как да използваме активи, без да ги компилираме с Rails Asset Pipeline

Знаех, че тагът се генерира добре, но все пак не намираше файлът, към който сочеше. За това реших, че всъщност трябва да накарам файлът да се окаже на точното място, а не да променям моя код.

Поразрових се из интернет и открих, че за да бъдат достъпни файловете, те трябва да са в папката RAILS_ROOT/public/assets/, в което има логика. Също така открих, че Rails Asset Pipeline чете една конфигурационна променлива, в която трябва да са записани всички файлове, които трябва да се преместят в публичната папка. Така стигнах до отговора на моите проблеми – добавяне на следния код:

Rails.application.config.assets.precompile += ['acssfile.css', 'ajsfile.js']

т.е. добавяне на имената на файловете към масив от стрингове. Малко е объркващ фактът, че за да не компилираш и комбинираш в един файл дадени файлове, трябва имената им да са в променлива наречена precompile, но c’est la vie.