Здесь водятся драконы
Лев Солнцев
Здесь водятся драконы
Об авторе
10 лет профессиональной веб-разработки.
- Программирую с детства.
- Дотошен, изобретателен, перфекционист, люблю когда красиво.
- Мейнтейнер SVGO в свободное время (которого нет).
Зачем нужно знание технологий
- Фундамент для разработки.
- Ориентирование в предметной области.
- «Вечные ценности», которые никогда не устареют.
Таблицы
- Мейнстрим 90-х.
- Дурной тон в 2000-х.
Таблицы: страхи
- Непредсказуемы.
- Баг с тенью внутри в IE9.
Таблица: внешний вид
|
Заголовок |
Ячейка |
Ячейка с большим количеством текста показывает как браузер распределяет место в пользу длинной простыни текста. |
Свойство table-layout: fixed
CSS 2, раздел 17.5.2 «Table width algorithms: the 'table-layout' property».
- Говорит не учитывать содержимое ячеек. (Учитывается только первый ряд.)
- Заданные размеры жёстко соблюдаются.
- При заданной ширине таблицы, ячейки распределяются равномерно.
- Работает свойство
overflow
Таблица: table-layout: fixed
Internet Explorer 9
IE9: чистая таблица
border-collapse: collapse
CSS 2, раздел 17.6 «Borders».
- Объединяет границы ячеек.
- Убирает зазор между ячейками подобно
border-spacing: 0
(IE8+) и <table cellspacing=0>
.
- Поддерживается даже в IE6.
Таблицы: выводы
table-layout: fixed
делает таблицы предсказуемыми.
- Как вариант может помочь
max-width
.
- По возможности избегайте
border-collapse: collapse
(IE9−).
Общие выводы
- Знайте спецификации.
- Пересматривайте устоявшиеся подходы.
- Проверяйте гипотезы.
Индекс строки
'кот'[0] // => 'к'
Инициалы
firstName[0] + lastName[0]
Если индекса нет
''[0] // -> undefined
Итог
(firstName[0] || '') + (lastName[0] || '')
ECMAScript 3
str.charAt(index)
ECMAScript 3
firstName.charAt(0) + lastName.charAt(0)
Как оценить новую технологию
- Какая проблема решается?
- В чём новизна?
- Какие преимущества и недостатки?
Ожидание
Реальность
shouldComponentUpdate
Пример: компонент таблицы
class Table extends Component {
render() {
return (
<div>
{this.props.items.map(i =>
<Cell data={i}
options={this.props.options || []} />
)}
</div>
Пустой массив в константу
const default = [];
class Table extends Component {
render() {
return (
<div>
{this.props.items.map(i =>
<Cell data={i}
options={this.props.options || default} />
)}
</div>
Стрелочная функция
class TextField extends Component {
render() {
return (
<Input
onChange={e => this.props.update(e.target.value)}/>;
)
}
}
Связывание функции
class TextField extends Component {
update(e) {
this.props.update(e.target.value);
}
render() {
return (
<Input onChange={this.update.bind(this)}/>;
)
}
Предварительное связывание
class TextField extends Component {
constructor(props) {
super(props);
this.update = this.update.bind(this);
}
render() {
return <Input onChange={this.update}/>;
}
Выводы
- Фреймворк — только инструмент.
- Полезно знать как работает фреймворк.
- Оптимизируйте код в «горячих» местах.
DOM
Размерности блочной модели
Констатинопольский Константин Константинов
Констатинопольский Константин Константинов
Element.scrollWidth
Element.clientWidth
Установка title
for (var tr = tbody.firstChild; tr = tr.nextSibling;)
for (var td = tr.firstChild; td = td.nextSibling;)
if (td.scrollWidth > td.clientWidth)
td.title = td.textContent;
Выносим из цикла
var cells = [];
for (var tr = tbody.firstChild; tr = tr.nextSibling;)
for (var td = tr.firstChild; td = td.nextSibling;)
if (td.scrollWidth > td.clientWidth)
cells.push(td);
for (var i = cells.length; i--;)
cells[i].title = cells[i].textContent;
Ускорение в ~5 раз.
Выводы
- Используйте эффективные алгоритмы.
- Знайте, как работают браузеры.
Что быстрее?
var elem = document.getElementsByClassName('class')[0];
var elem = document.querySelector('.class');
Test |
Ops/sec |
getElementsByClassName('class')[0] |
5,519,101 ±0.56% fastest |
querySelector('.class') |
55,479 ±1.23% 99% slower |
jQuery $('.class') |
62,742 ±1.18% 99% slower |
Непосредственное измерение
Метод |
1-й, мкс |
2-й, мкс |
querySelector |
40 |
40 |
getElementsByClassName |
45 |
15 |
jQuery |
300 |
40 |
DOM 2
Выводы
- jsPerf(DOM) =
- Не занимайтесь микрооптимизациями.
- Знание основных принципов помогает сделать верные выводы.