Здесь водятся драконы

Лев Солнцев

Здесь водятся драконы

Здесь водятся драконы

Об авторе

10 лет профессиональной веб-разработки.

Веб-технологии

HTML5 CSS Javascript

Зачем нужно знание технологий

  1. Фундамент для разработки.

Таблицы

Таблицы

  1. Мейнстрим 90-х.

Таблицы: страхи

  1. Непредсказуемы.

Таблица: внешний вид

Заголовок
Ячейка Ячейка с большим количеством текста показывает как браузер распределяет место в пользу длинной простыни текста.

Таблица: переполнение

Комментарии https://web-standards.ru/articles/check-it-before-you-wreck-it/#comment

Свойство table-layout: fixed

CSS 2, раздел 17.5.2 «Table width algorithms: the 'table-layout' property».

Таблица: table-layout: fixed

Заголовок
Ячейка Ячейка с большим количеством текста показывает как браузер распределяет место в пользу длинной простыни текста. https://web-standards.ru/articles/check-it-before-you-wreck-it/#comment
CSS is awesome

Бой с тенью

Попапчик

Internet Explorer 9

Попапчик

IE9: чистая таблица

Попапчик

border-collapse: collapse

CSS 2, раздел 17.6 «Borders».

Таблицы: выводы

  1. table-layout: fixed делает таблицы предсказуемыми.
    • Как вариант может помочь max-width.
  2. По возможности избегайте border-collapse: collapse (IE9−).

Основные способы вёрстки

  1. Таблица
  2. Бестабличная вёрстка

Общие выводы

  1. Знайте спецификации.
  2. Пересматривайте устоявшиеся подходы.
  3. Проверяйте гипотезы.

ECMAScript 5

Индекс строки

		'кот'[0]  // => 'к'
	

Инициалы

		firstName[0] + lastName[0]
	

Если индекса нет

		''[0]  // -> undefined
	

Итог

		(firstName[0] || '') + (lastName[0] || '')
	

ECMAScript 3

		str.charAt(index)
	

ECMAScript 3

		firstName.charAt(0) + lastName.charAt(0)
	

Как оценить новую технологию

  1. Какая проблема решается?
  2. В чём новизна?
  3. Какие преимущества и недостатки?
Миссионеры
React.js logo

Ожидание

Поезд «Сапсан»

Реальность

Старый поезд

shouldComponentUpdate

…В некоторых случаях ваш компонент может ускорить этот процесс через переопределение функции 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}/>;
  }
	

Источник

React.js pure render performance anti-pattern

Выводы

  1. Фреймворк — только инструмент.
Дом на колёсах

DOM

Обход 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 раз.

Выводы

  1. Используйте эффективные алгоритмы.
  2. Знайте, как работают браузеры.

jsperf.com

Что быстрее?

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

Примечание: Коллекции в DOM для HTML являются живыми в том смысле, что они автоматически обновляются при изменениях соответствующего им документа.

Выводы

  1. jsPerf(DOM) = Pile of poo

Ссылки

  1. HTML Living Standard
  2. CSS current work
  3. You Don't Know JS (book series)
  4. learn.javascript.ru
  5. Mozilla Developer Network
  6. How browsers work

Спасибо!

Email: grelimail@gmail.com

Twitter: @ruGreLI