Ruby/Rails expert
201 subscribers
27 photos
19 links
Рабочие практики, советы, полезные инструменты из мира Ruby on Rails

Автор: @gambala
Download Telegram
Вышла альфа версия Rails 7. Фичи

✦ Новый подход к фронтенду (подробно освещался ранее на этом канале)
✦ Асинхронные ActiveRecord-запросы
✦ Шифруемые ActiveRecord-атрибуты
✦ Комментарии в SQL (полезно для логов)
✦ Zeitwerk включен по-умолчанию
✦ Spring выключен по-умолчанию

https://weblog.rubyonrails.org/2021/9/15/Rails-7-0-alpha-1-released/

А ниже – пара мыслей про Tailwind CSS, esbuild и путь, по которому идут рельсы во фронтенде 👇
Forwarded from Vitaliy Emeliantsev
This media is not supported in your browser
VIEW IN TELEGRAM
Хорошая новость – вышел Stimulus 3.0

Новое API для параметров, значения по-умолчанию, больше колбеков, дебаг-режим, интеграция с Tailwind CSS

Анонс: https://world.hey.com/hotwired/stimulus-3-c438d432
Доки: https://stimulus.hotwired.dev/

Плохая новость – в библиотеке все еще кошмарнейшее именование. И стало еще хуже

Ребята все еще гнут свою линию и именуют контроллеры, параметры, экшны, функции и файлы по совершенно диким принципам, не основанным ни на каких стандартах ни из мира JS, ни из мира руби

Кто-то в Basecamp, совершенно незнакомый с понятием «семантический разрыв», все еще принимает идиотские решения по API

В итоге получаем фреймворк с хорошей идеей, и с cryptic API, который придется зазубрить, чтобы нормально его использовать

Не рекомендую

Кстати, Github (которые тоже используют много руби и рельс у себя) совершенно спокойно развивают Catalyst – правильный и логичный Stimulus. За ним – будущее

https://github.github.io/catalyst/
По тегу #коммит на канале доступны полезные коммиты, которые можно читать и применять в своих проектах

https://github.com/gambala/rubyshow/commit/1c46aafcf2830e7d0c0b102d3b22052f4f587e27

В сегодняшнем коммите, в рамках проекта https://ruby.show
– перешел с Webpacker v5 → v6
– с PostCSS v7 → v8
– включил JIT в TailwindCSS, чем ускорил сборку стилей в 40 раз и получил все новые фичи JIT-тейлвинда (динамические классы, доп-модификаторы и т.д.)
Перешел с webpack на esbuild и postcss cli сборщики, ускорив сборку фронтенда еще в 100-120 раз 🚀

В проекте сейчас рельсы 6.1, но и с ними, и c 6.0 – можно использовать новые гемы jsbundling-rails и cssbundling-rails

Это микрообертки (никакой магии, никаких внутренних конфигов как в вебпакере), позволяющие ненавязчиво использовать esbuild, postcss и tailwind cli, и другие современные сборщики (webpack в том числе) для сборки js и css

Чуть позже я проделаю такой же переход на другом боевом проекте побольше (вебпакер собирает там ассеты 60-130 секунд), по результатам отпишусь – прим. ред

#коммит https://github.com/gambala/rubyshow/commit/c49eec61a81661cea84a38eb0552a32ecdddfce2
Ruby/Rails expert
Перешел с webpack на esbuild и postcss cli сборщики, ускорив сборку фронтенда еще в 100-120 раз 🚀 В проекте сейчас рельсы 6.1, но и с ними, и c 6.0 – можно использовать новые гемы jsbundling-rails и cssbundling-rails Это микрообертки (никакой магии, никаких…
Перевел на esbuild один из клиентских проектов

В вебпакере сборка фронта занимала 60-90 секунд. Сейчас в esbuild занимает 2-3

И на локальном стенде в режиме --watch собирает бандл моментально. Цифры в районе 5-50 миллисекунд

Кажется пора сесть и по горячим следам написать гайд на англ языке (который завирусится, попадет к DHH в твиттер, в rubyweekly и т.д.)

На какой платформе публикнуть гайд? Что вообще сейчас модно? DEV.to?
А, да. Я же ищу себе помощника/преемника

Фулстек Ruby on Rails, 10-40 часов в неделю. Не галера – проекты устоявшиеся, многолетние, финансово-стабильные. Я работаю с клиентом 4 года

Пиши напрямую: @gambala

1. Как долго ты в Rails
2. Сколько берешь в час
3. Сколько часов свободных в неделю

Поговорим за опыт, код и практики

Давай работать вместе
Настроил в ESBuild аналог webpack-bundle-analyzer – для оценки размера бандла и зависимостей

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

#коммит https://github.com/gambala/rubyshow/commit/48734d5d7863982cb3f65b555d93674668900e87
Снова попробовал мигрировать с turbolinks на новый turbo в Rails

Basecamp в своем репертуаре – ломают API, плюют на совместимость, сообщество своими силами поднимает upgrading guide'ы

Но ситуацию это пока не спасает – Rails UJS и формы в Devise не работают

Сохранил тикет на будущее, буду отслеживать https://github.com/hotwired/turbo-rails/issues/122
Вышли Ruby on Rails 7.0

Помимо фронтенда без сборки или со сборкой быстрым esbuild (уже обсуждали на этом канале) в новых рельсах есть еще пара клевых вещей, но важным я вижу не это

Важнее то, как DHH с командой изменили подачу рельс в публичном пространстве. Рельсы теперь не просто уютный фреймворк, на котором можно быстро начать пилить веб-сервисы. Теперь это мощный фреймворк с сильными примерами компаний, кода. DHH активно продает фреймворк

Даже уютную милую картинку с человечками при старте нового рельсового приложения убрали и заменили на лого фреймворка в новом фирменном стиле

Удастся ли лучше продавать такой фреймворк ребятам из Долины? Поживем – увидим
Simple ≠ Easy

Фраза популярная, но на русском не всегда понятная. В переводе на русский оба слова кажутся синонимами:

Просто ≠ Легко

Но чтобы сохранить исходный смысл, Easy лучше переводить как «Привычно». И фраза трансформируется в:

Легко, потому что просто ≠ Легко, потому что привычно

Об этом правиле важно помнить и носить с собой, делая тот или иной выбор

Бывает непонятно, какой из вариантов выбрать. Но если смотреть на варианты сквозь правило, часто выясняется, что один из вариантов кажется легким просто потому что он привычный – хотя на самом деле внутри сложнее другого

И совет в общем виде простой:

Выбирайте Simple, не Easy
Как думаете, почему эта тема в Ruby/Rails канале? И как применима в руби/рельсах (и в разработке в целом)?
Офигенный материал по оптимизации скорости на беке

Полуторачасовой скринкаст (можно не смотреть целиком, ниже распишу как ускориться) и два примера (код на гитхабе) ДО и ПОСЛЕ оптимизаций.

Оптимизации наивкуснейшие и грамотно реализованные. Некоторые вещи могут быть слишком сложны (SQL портянка вместо ActiveRecord запросов) но даже взяв и внедрив лишь часть советов – можно получить прирост в производительности

Уверен, какие-то советы вы уже успешно применяете (асинк джобы те же), но все еще много мест и практик, которые можно почерпнуть и применить

– Статья: https://www.twnsnd.com/posts/how_i_100xd_bulk_import_speed_in_rails_with_some_gnarly_sql.html

– Скринкаст: https://www.youtube.com/watch?v=pOyvSxB9qFQ

– Пример ДО: https://github.com/ryantownsend/bulk-import-exercise

Точка входа – контроллер в API: https://github.com/ryantownsend/bulk-import-exercise/blob/main/app/controllers/movie_imports_controller.rb

От него можно (прям в гитхабе) ходить по другим классам и смотреть как выполняется запрос

– Пример ПОСЛЕ: https://github.com/ryantownsend/bulk-import-exercise-solution

Точка входа – тот же контроллер в API: https://github.com/ryantownsend/bulk-import-exercise-solution/blob/main/app/controllers/movie_imports_controller.rb

Список техник:

ActionController::Metal – не триггерит и не тратит время на middleware, но params нужно пермиттить самостоятельно (отслеживая дыры в безопасности)

– jsonb поле в ActiveRecord автоматически сериализуется в ruby-object, для больших json-структур это долго и дорого по RAM. attribute :entries, :text отключает авто-сериализацию

– Асинк джобы, очевидно

MovieImport.where(id: movie_import_id).update_all("finished_at = now()") быстрее чем
MovieImport.find(movie_import_id).update(finished_at: Time.zone.now)

– Гигантские json структуры (речь про batch-bulk импорт данных) выгодно обрабатывать батчами, пусть даже в одном потоке – это делает лок БД не одним длинным, а серией коротких

– Гигантская SQL-простыня UPSERT_QUERY_TEMPLATE – спорно, т.к. усложняется поддержка, но жутко интересно. Насколько оказывается PG SQL богат возможностями и быстр

AfterCommitEverywhere гем позволяет объявлять коллбеки after_commit в любом месте программы внутри транзакции. Когда выполнится транзакция ApplicationRecord.transaction – выполнится коллбек

EventStream – офигенно используется концепт ActiveSupport::CurrentAttributes, чтобы в рамках реквеста накопить в синглтоне какие-то данные, а потом в самом конце реквеста, что-то с этими данными сделать
Доклады с RailsConf 2022 доступны для просмотра онлайн

Каждый раз жду и наслаждаюсь будто новый сезон любимого сериала, после каждой конференции – прим. ред

https://youtube.com/playlist?list=PLbHJudTY1K0f1WgIbKCc0_M-XMraWwCmk
По Ruby on Rails 2.5 года существовал клевый чат и канал по бесплатному обучению и вкатыванию в веб-разработку и руби/рельсы – @LearnRubyForPikabuChat. Я был там все эти 2.5 года как ментор и эксперт со стороны

Сейчас чат меняет владельца, и я не знаю как он будет развиваться, но хочу взять эстафетную палочку и продолжить развивать бесплатное вкатывание в IT и веб-разработку

Благо сам давно подумываю о написании Roadmap по входу в IT в 2022 (приветствую ваши вопросы и интересующие темы в комментариях)

А план обучения с того канала сохранил здесь: https://gambala.pro/roadmap
Ruby on Rails получит прокси-сервис (написанный на Go)

Уже сейчас он работает в ONCE/Campfire и обеспечивает HTTP/2, public caching, X-Sendfile, gzip, SSL (Let's Encrypt). Обещают работу с любым Rails-приложением из коробки. Отличное дополнение для приложений, что деплоятся Kamal'ом в Docker. Сейчас всё это хорошо закрывает Cloudflare, но иметь hosted решение однозначно приятно.

https://github.com/rails/rails/issues/50479