В HTML5 было внедрено большое количество семантических элементов для точного описания содержимого веб-страницы. Постарайтесь извлечь максимум пользы из богатого синтаксиса HTML5.
Не стоит заниматься этим пунктом в последнюю очередь. Совсем не обязательно быть экспертом по WCAG (Web Content Accessibility Guidelines — Руководство по созданию доступного контента), чтобы улучшить свой сайт, можно начать с малого:
Научиться правильно и по назначению использовать свойство alt.
Для ссылок и кнопок использовать соответствующие семантические элементы HTML5 (а не зверства вроде <div class=button>).
Для передачи информации использовать не только цвет.
Хоть определение языка и кодировки не является обязательным, рекомендуется определять их и на уровне HTML-документа, даже если они передаются в HTTP-заголовках. Предпочитайте UTF-8 любым другим кодировкам.
Не стоит прерывать загрузку страницы для выполнения скриптов без веской на то причины. Если ваша таблица стилей имеет большой размер, стоит выделить те стили, которые нужно загружать вначале, а остальные – поместить в отдельный файл таблицы стилей. Два HTTP запроса выполняются существенно дольше, чем один, но при этом страница будет частично загружена, а это хорошо с точки зрения восприятия пользователя.
Несмотря на то, что в CSS точка с запятой является разделительным символом, лучше используйте его как завершающий символ.
/* плохой стиль */
div {
color: red
}
/* хороший стиль */
div {
color: red;
}
Боксовая модель
Такая модель, в идеале, должна быть одинаковой для всего документа. Глобальное объявление { box-sizing: border-box; } приемлемо, но для конкретных элементов страницы не стоит изменять их боксовую систему.
/* плохой стиль */
div {
width: 100%;
padding: 10px;
box-sizing: border-box;
}
/* хороший стиль */
div {
padding: 10px;
}
Поведение элементов
Изменяйте стандартное поведение элемента только при необходимости. Например, не стоит изменять способ отображения изображения чтобы убрать отступы под ним.
/* плохой стиль */
img {
display: block;
}
/* хороший стиль */
img {
vertical-align: middle;
}
Кроме того, не выводите элемент за пределы страницы.
/* плохой стиль */
div {
width: 100px;
position: absolute;
right: 0;
}
/* хороший стиль */
div {
width: 100px;
margin-left: auto;
}
Позиционирование
В CSS существует множество способов позиционирования элементов, но постарайтесь ограничиться использованием списка свойств с такими значениями (в порядке приоритета):
Старайтесь уменьшить до минимума количество селекторов, жестко привязанных к DOM. В случае, если ваш селектор применяется к более чем трем псевдоклассам, дочерним или соседним элементам, лучше добавить для этого элемента отдельный CSS класс.
/* плохой стиль */
div:first-of-type :last-child > p ~ *
/* хороший стиль */
div:first-of-type .info
Без необходимости не переопределяйте селекторы.
/* плохой стиль */
img[src$=svg], ul > li:first-child {
opacity: 0;
}
/* хороший стиль */
[src$=svg], ul > :first-child {
opacity: 0;
}
Спецификация элементов
Не нужно делать селекторы сложными для переопределения. Для этого уменьшите частоту использования спецификатора id и избегайте использования правила !important.
Переопределение
Переопределение стилей усложняет селекторы и отладку верстки. Избегайте его по возможности.
/* плохой стиль */
li {
visibility: hidden;
}
li:first-child {
visibility: visible;
}
/* хороший стиль */
li + li {
visibility: hidden;
}
Наследование
Не дублируйте объявления стилей, которые могут быть пронаследованы.
/* плохой стиль */
div h1, div p {
text-shadow: 0 1px 0 #fff;
}
/* хороший стиль */
div {
text-shadow: 0 1px 0 #fff;
}
Компактность
Старайтесь писать компактный код — используйте сокращенную форму записи.
/* плохой стиль */
div {
transition: all 1s;
top: 50%;
margin-top: -10px;
padding-top: 5px;
padding-right: 10px;
padding-bottom: 20px;
padding-left: 10px;
}
/* хороший стиль */
div {
transition: 1s;
top: calc(50% - 10px);
padding: 5px 10px 20px;
}
Язык
Для ясности предпочитайте осмысленные английские названия.
/* плохой стиль */
:nth-child(2n + 1) {
transform: rotate(360deg);
}
/* хороший стиль */
:nth-child(odd) {
transform: rotate(1turn);
}
Префиксы
Удаляйте устаревшие префиксы без зазрения совести. Если же вам необходимо их использовать, то вставляйте их перед именем стандартного свойства.
/* плохой стиль */
div {
transform: scale(2);
-webkit-transform: scale(2);
-moz-transform: scale(2);
-ms-transform: scale(2);
transition: 1s;
-webkit-transition: 1s;
-moz-transition: 1s;
-ms-transition: 1s;
}
/* хороший стиль */
div {
-webkit-transform: scale(2);
transform: scale(2);
transition: 1s;
}
Анимация
Предпочитайте переходы анимациям. Анимацию стоит применять только для свойств элемента opacity и transform.
Где возможно, используйте безразмерные величины. Если используете относительные единицы измерения, то используйте rem. Для значений, связанных со временем, используйте секунды.
/* плохой стиль */
div {
margin: 0px;
font-size: .9em;
line-height: 22px;
transition: 500ms;
}
/* хороший стиль */
div {
margin: 0;
font-size: .9rem;
line-height: 1.5;
transition: .5s;
}
Цвета
Если вам необходима прозрачность, используйте rgba. В любом другом случае — используйте hex формат.
/* плохой стиль */
div {
color: hsl(103, 54%, 43%);
}
/* хороший стиль */
div {
color: #5a3;
}
Отрисовка
Не загружайте ресурс, создать который можно средствами CSS.
/* плохой стиль */
div {
// position: relative;
transform: translateZ(0);
}
/* хороший стиль */
div {
/* position: relative; */
will-change: transform;
}
JavaScript
Производительность
Предпочитайте правильный, выразительный, читабельный код производительному. В основном не JavaScript будет узким местом производительности вашей системы. Оптимизировать стоит такие моменты как сжатие изображений, перепостроение дерева DOM и доступ из сети. Если и выбирать совет из этого документа, то выбирайте этот.
// плохой стиль (хотя намного быстрее по скорости)
const arr = [1, 2, 3, 4];
const len = arr.length;
var i = -1;
var result = [];
while (++i < len) {
var n = arr[i];
if (n % 2 > 0) continue;
result.push(n * n);
}
// хороший стиль
const arr = [1, 2, 3, 4];
const isEven = n => n % 2 == 0;
const square = n => n * n;
const result = arr.filter(isEven).map(square);
Не храните состояние
Старайтесь поддерживать чистоту ваших функций. В идеале, у них не должно быть побочных эффектов, кроме того, они не должны использовать переданные извне данные и возвращать новые объекты вместо изменения существующих.
// плохой стиль
const merge = (target, ...sources) => Object.assign(target, ...sources);
merge({ foo: "foo" }, { bar: "bar" }); // => { foo: "foo", bar: "bar" }
// хороший стиль
const merge = (...sources) => Object.assign({}, ...sources);
merge({ foo: "foo" }, { bar: "bar" }); // => { foo: "foo", bar: "bar" }
Встроенные конструкции языка
Старайтесь как можно больше использовать встроенные методы.
Если это обоснованно, используйте неявное преобразование типов. В любых других случаях избегайте этого.
// плохой стиль
if (x === undefined || x === null) { ... }
// хороший стиль
if (x == undefined) { ... }
Циклы
Не используйте циклы, поскольку они вынуждают вас использовать изменяемые объекты. Используйте методы объявленные в array.prototype.
// плохой стиль
const sum = arr => {
var sum = 0;
var i = -1;
for (;arr[++i];) {
sum += arr[i];
}
return sum;
};
sum([1, 2, 3]); // => 6
// хороший стиль
const sum = arr =>
arr.reduce((x, y) => x + y);
sum([1, 2, 3]); // => 6
Если же вы не можете использовать эти методы, либо их использование неприемлемо, используйте рекурсию.
Используйте const вместо var, там где это возможно:
Условные операторы
Предпочитайте IIFE (вызываемое “по месту” функциональное выражение) конструкциям типа if,else if,if, else и switch выражениям.
// плохой стиль
var grade;
if (result < 50)
grade = "bad";
else if (result < 90)
grade = "good";
else
grade = "excellent";
// хороший стиль
const grade = (() => {
if (result < 50)
return "bad";
if (result < 90)
return "good";
return "excellent";
})();
Итерирование объектов
Где это возможно, не используйте for..in.
const shared = { foo: "foo" };
const obj = Object.create(shared, {
bar: {
value: "bar",
enumerable: true
}
});
// плохой стиль
for (var prop in obj) {
if (obj.hasOwnProperty(prop))
console.log(prop);
}
// хороший стиль
Object.keys(obj).forEach(prop => console.log(prop));
Объекты как пары “ключ/значение”
Обычно лучше использовать объект как пару “ключ/значение”, это решение более мощное, но существуют случаи, когда объекты правильнее использовать как экземпляры класса Object.
// плохой стиль
const me = {
name: "Ben",
age: 30
};
var meSize = Object.keys(me).length;
meSize; // => 2
me.country = "Belgium";
meSize++;
meSize; // => 3
// хороший стиль
const me = Map();
me.set("name", "Ben");
me.set("age", 30);
me.size; // => 2
me.set("country", "Belgium");
me.size; // => 3
Каррирование
Возможно, в других языках программирование каррирование реализовано хорошо, но в JavaScript этого следует избегать. Оно ухудшает читабельность кода, поскольку выглядит инородной конструкцией, а случаи, когда использование каррирования обоснованно, крайне редки и необычны.
// плохой стиль
const sum = a => b => a + b;
sum(5)(3); // => 8
// хороший стиль
const sum = (a, b) => a + b;
sum(5, 3); // => 8
Читабельность
Не запутывайте ваш код, используя, с виду, “умные” конструкции.
// плохой стиль
foo || doSomething();
// хороший стиль
if (!foo) doSomething();
// bad
void function() { /* IIFE */ }();
// хороший стиль
(function() { /* IIFE */ }());
// плохой стиль
const n = ~~3.14;
// хороший стиль
const n = Math.floor(3.14);
Переиспользование кода
Не бойтесь создавать большое количество небольших, компонуемых функций, которые можно использовать много раз.
// плохой стиль
arr[arr.length - 1];
// хороший стиль
const first = arr => arr[0];
const last = arr => first(arr.slice(-1));
last(arr);
// плохой стиль
const product = (a, b) => a * b;
const triple = n => n * 3;
// хороший стиль
const product = (a, b) => a * b;
const triple = product.bind(null, 3);
Зависимости
Сводите к минимуму зависимость от чужого кода. Не нужно добавлять в проект целую библиотеку ради пары строчек, которые можно написать самому.
Рассказали, что такое React Router, что такое маршрутизация, для чего она нужна и как настроить простую и вложенную маршрутизацию на сайте. Привели примеры кода.