Good style по фронту
В мире фронтенда приходится решать просто огромное количество задач, и так получилось, что на работе мне приходится работать c HTML версткой писем, HTML5 версткой лендинг страниц, подгонкой разных блоков друг к другу, выравниванием отступов) и разных игр с цветами и размерами и всем зоопарком плагинов jQuery
вместе с велосипедами их владельцев, а еще разные адаптивные хаки и костыли. В общем та еще работка. А с другой стороны также необходимо, писать js плагины для jQuery, что-бы верстальщики сами не велосипедили на лендингах,нативную js бизнес логику без библиотек с поддержкой IE7 в 2016 году( кастомные виды input’ов, начиная от выбора цвета и календарей, заканчивая на уровне Marionette.LayoutView описание документации к этому, и все это лучше для меня еще и 1 раз собрать и иметь возможность переносить с самых разношорстных проектов от статических сайтов до сложных систем на Yii, Symfony и REST сервисов с java backend’ом так, чтобы backend команда легко принимала для себя и работала с полученным модулем\компонентом\функцией\инпутом и это я еще не упоминал о Node.js который выполняет тесты в связке с BrowserStack сотен сайтов для своего мониторинга доступности интерфейсов, ну я это все просто так. К вопросу — Что можно делать на фронте?
За время работы я как и любой разработчик сталкивался с задачами которые не решаются установкой библиотеки и просмотром stackoverflow, но результат нужно было показывать. Приведенные ниже примеры и советы не являются панацеей и сторонников некоторых подходов к разработке может поввергнуть в шок, но оставим это для сторонников.
Какие проекты могут быть и из чего может состоять набор фронтенд разработчика?
Функционал конечно везде требуется разный, где-то вообще никому не нужен ваш package.json, и установка nodejs для запуска gulp команды это что-то из области фантастики, а где-то без системы сборки совсем невозможно жить. Иногда нужен просто index.html, а иногда полноценное SPA.
HTML\TWIG
В качестве шаблонизатора, я предпочитаю TWIG, он отлично дружит с Marionette js, Symfony и Yii. Какие-то маленькие и динамические элементы можно и на JS сделать с помощю document.createElement(). Массовую сборку большого количества статичных типичных файлов собираю через consolidate.
Советы по симфони
- Все ссылки внутри шаблонов, должны быть указаны через функцию path
Плохо<a href="http://…..">ссылка</a>
Хорошо <a href="path("routename")”>ссылка</a>
- Ссылки на изображения должны быть переданы в src атрибут с помощью функции asset(). Так есть функция asset_if_exists, которая принимает два параметра: первый — сам ассет, второй — урл ассета-заглушки если искомый ассет не найден (только на shakes.im)
- В разметке следует каждый новый элемент ставить с новой строки
Плохо
<div class="header"><p><i class="icon icon-header></i>header text</p></div>
Хорошо
<div class="header"> <p> <i class="icon icon-header></i> header text </p> </div>
- При использовании TWIG блок {% extends %} всегда пишется на первой строке и отделяется пустой строкой от остальных блоков.
- На продакшн не должны попадать комментарии и различные “временные/тестовые” блоки.
JS
- За каждый view должен отвечать 1 js файл. Файл внутри должен иметь свою область видимости и по возможности сводить к минимуму использование глобальных переменных, для избежания конфликтов.
Плохо
function funcName() { … }
Хорошо
(function(){ var funcName = function () { … }; })();
- Для корректной передачи данных в твиг, не стоит писать весь js в твиге, необходимо только передать нужные переменные после подгрузки скрипта.
Пример:
{% if is_granted('ROLE_ADMIN') %}
<script type='text/javascript'> $(function(){ shakes.adminAjaxUrl = '{{ path('a_switch_user') }}'; }); </script> <script src="{{ asset('bundles/app/js/admin_login.js') }}"></script> {% endif %}
Стоит обратить внимание на то, что переменная передается не в глобальный объект window а в зарезервированный объект shakes доступный на всех страницах сайта
- Обязательно использовать strict mode, для избежания множества ошибок. Подробнее читать тут.
- JS библиотеки необходимо отделять от самописных js файлов в папку lib
- При навешивании обработчиков на какие-либо элементы, рекомендуется добавить отдельный класс для этого с префиксом js прим. js-submit-form
- При работе с динамическим состоянием элементов на js в форме и интерфейсе, обязательно пересчитывать и поддерживать актуальным состояние “модели” данных при любых действиях. Перед сабмитом формы, также программно проверять состояние модели, а также прогонять кейсы с движением пользователя “вперед/назад” в браузере с кешированием.
ES2015 (ES6)
На момент написания статьи, новый стандарт JavaScript “как-бы” уже можно лицезреть во всех новомодных браузерах, но вам лучше познакомиться с Babel и npm вам в этом поможет. на данный момент. JS разработчикам обязательно уже сейчас необходимо привычно обращаться со стрелочными функциями, а также стилистикой let, const, class, уметь ответить на вопросы о замыканиях, передаче контекста, промисах и etc…
CSS
- Предпочтительна методология БЭМ. Все классы элементов должны быть названы по принципу (блок)__(название_елемента)-(модификатор)
- Для удобства все иконки следует выносить в файлы icons.css или пользоваться сборщиком спрайтов gulp. Я использую gulp-iconfont
- Максимально избегать каскадных правил в CSS — придерживаться правила 1 элемент = 1 селектор.
- Четко понимать разницу между HTML4 и HTML5 и понимать семантику языков.
Организация фронтенд архитектуры
- В production должны попадать только минифицированные и обработанные css файлы. Для сборки фронта используется Gulp.
- Чтобы не запоминать всем участникам команды. различные gulp команды, конфиг gulp’a должен быть настроен с командой build, которая в необходимой очередности запускае все необходимые задачи.
буду пополнять и обновлять список по мере поступления идей и обратной связи от вас)
Последняя редакция 31 января, 2023 в 05:01