Skip to content

Instantly share code, notes, and snippets.

@h4
Last active February 29, 2016 10:47
Show Gist options
  • Save h4/6938194 to your computer and use it in GitHub Desktop.
Save h4/6938194 to your computer and use it in GitHub Desktop.
Дамп трансляции конференции Fronteers 2013 от @webstandards_up

Мы начинаем текстовую трансляцию Fronteers 2013, двухдневной конференции в Амстердаме — http://t.co/QB5SYQ3cMx

Пол Айриш из Google открывает шестую конференцию Fronteers. Россия на шестом месте по количеству участников, например.

На сцене Стив Саудерс с докладом «Pre-browsing» http://t.co/AuqI08mSjX

Сетевые проблемы замедляют веб. Медленные сотовые сети и даже перегруженный WiFi. Мы часто видим белый экран без индикации загрузки.

Заголовок: отдавайте браузеру нужное ещё до того, как он за этим обратится.

Кэш не всегда спасает: он может пока не существовать (первый заход), устареть или не соответствовать нужной версии.

Дело разработчика: <link rel="dns-prefetch… prefetch… prerender. Дело браузера: DNS pre-resolution, TCP pre-connect, prefresh, preload

Предсказывание действий пользователя: искал Adventure Time, вероятно кликнешь по ссылке. Зашёл на Facebook, значит откроешь новостную ленту.

Как это работает: <link rel="dns-prefetch" href="//catroonnetwork.com”>, дёшево, открывает TCP-соединения.

Это работает в Chrome 22+, Chrome Mobile, Firefox, Firefox Mobile.

Спецификация <link rel="prefetch" href="//example.com/script.js"> для подгрузки ресурсов не слишком подробно описана.

Работает в: Android 4, Chrome 31, Firefox 23, Firefox Mobile 24, Opera 15+

Firefox префетчит только один ресурс одновременно, Android 6, Chrome и Opera 10 (6 с одного домена).

Если во время префетча перейти на другую страницу, то браузер — внезапно! — отменит процедуру. Справедливо для всех браузеров. И странно.

Это исправляется с помощью Accept-Ranges: bytes, тогда браузер подхватит разорванную предзагрузку. Если конечно это поддерживается сервером.

Сделать <link rel="prerender" href="//catroonnetwork.com"> это как загрузить страницу в фоновом табе. Рисково, тратит ресурсы и трафик.

С prerender легко ошибиться, но можно вставлять <link> динамически, что добавляет гибкости.

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

Chrome в этот момент начинает DNS-prefetch для всех возможных ресурсов, упомянутых на новой странице. Ещё до её отрисовки.

Аналогичная вещь происходит в тот же момент: TCP-preconnect для избавления от сетевых задержек.

Кое-что новое: Prefresh™. Когда Chrome начинает предзагружать нужные ресурсы (нужную версию jQuery) сайта, который он уже видел и запомнил.

Это избавляет от медленных ответов 200, 304 и времени чтения/записи на диск.

Prefresh включается параметром для запуска Chrome --specual-resource-prefetching

Если использовать техники адаптивных картинок с помощью JS, то предгазгрузчик браузера не найдёт <img src="…">, т.к. работает до работы с JS

Лучше положить картинки для вытягивания вручную через JS на другой домен, чтобы они не конфликтовали с автоматикой браузера.

Этим летом Chrome изменил логику подгрузки JS. Раньше он повышал приоритет JS-файлов внизу страницы, не в пользу ресурсов в начале страницы.

Рекомендованная книга: «High Performance Browser Networking» Ilya Grigorik http://t.co/Rd3yaR8uof

После каждого доклада Пол Айриш будет задавать вопросы докладчику. Задать свой вопрос можно @FronteersConf и есть шанс, что его озвучат.

Пол Айриш озвучил идею положить все популярные JS-библиотеки прямо в браузер, не просто в кэш. Стив сомневается в эффективности решения.

В: Так класть ли все скрипты в конец страницы? О: Это что-то из 2007 года, сегодня важно правильно применять атрибуты async и defer.

Следующий доклад «Putting Flexbox into practice» Zoe Mickley Gillenwater (мы пока думаем как написать это по-русски) http://t.co/ALXOgs5q4k

Зоуи признаётся, что верстала таблицами http://t.co/yJTssEDs24

Демо-сайт для презентации: http://t.co/qfTmsZmwRa

Батарея префиксов для работы Flexbox http://t.co/GKYDJ992ti

Чтобы справляться с префиксами, можно генерировать их на http://t.co/L58z0BYu69 или прямо в SASS https://t.co/wz0i6q6Nd7

Firefox всё ещё не поддерживает flex-wrap для многострочного Flexbox. Так что это значение пока использовать не стоит.

Также для работы flex-wrap важно иметь поддержку break-before, break-after, которые поддеживаются только в IE10 и Opera 12.x

Как свёрстана галерея на http://t.co/qfTmsZmwRa http://t.co/sxosKEhKWN

Flexbox, в отличие от привычной модели, позволяет удобно и предсказуемо смешивать различные единицы изменения: px, em и проценты.

Если flex-basis не равен нулю, то могут возникать неочевидные ситуации, когда ширина элемента умножается на flex:N, об этом мало говорят.

Свойства align-items и align-self исполнили мечту верстальщиков о вертикальном выравнивании.

Выравнивание с помощью Flexbox с фолбеком для старых браузеров http://t.co/dWCM1shSzx

Flexbox и фолбеки для старых обычно не конфликтуют, но иногда их лучше разделять с помощью Modernizr, например.

При использовании выравнивания с помощью justify-content, можно легко делать фолбек на инлайн-блоки, даже не разделяя код.

Повторимся: всё, о чём идёт речь в докладе Зоуи про Flexbox, проиллюстрировано кодом на сайте http://t.co/qfTmsZmwRa

@h4 принимаются идеи

Изменение порядка следования блоков с помощью order из Flexbox может дезориентировать при навигации по элементам с помощью фокуса.

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

Стоит ли вообще использовать Flexbox? Да, говорит Зоуи:

  1. Спецификация не поменяется и Flexbox станет мощным инструментом для построения раскладки и никуда не денется.
  2. Можно начать с небольших демо-сайтов, чтобы понять как Flexbox работает. И начать использовать его для небольших косметических вещей.
  3. Flexbox это весело! Он сильно меняет представление о возможностях раскладки.

Ссылки и ресуры для презентации по Flexbox: http://t.co/nToGPs98fS

В: Как с поддержкой Flexbox на мобильных? О: Поддержка отличная, кроме мобильного IE.

В: Насколько быстро работает Flexbox? О: Новая спецификация (2012) значительно быстрее старой (2009).

Следующий на сцене: Питер ван дер Зи с докладом «Real-time recompilation of running JavaScript» http://t.co/aoWCaxLXa6

Питер начал сразу с демо http://t.co/P95swx2pBI

В этой демке Питер меняет параметры скрипта для Canvas и изменения становятся видны сразу без перезагрузки кода. Даже не мелькает картинка.

Питер в Твитере @kuvos

Дальше идёт опасный лайв-кодинг, кстати в WebStorm на Linux.

Компиляция в случае JS — это подготовка кода для исполнения. И дальше исполнение динамически созданного кода.

Код для демо http://t.co/r0hs9CQOrt

Функция возвращает функцию, которая… http://t.co/dYwYm01e96

Таким образом, мы изменяем код без перезапуска приложения.

Проблемы подхода http://t.co/aDXwe4bCSP

Становится всё страшнее http://t.co/aHvwsfsjxB

Прямой и непрямой eval различаются потерей или сохранением контекста в исполняемой функции http://t.co/eHCRxfnX0s

Оказалось сложно транслировать текстом лайв-кодинг Питера, поэтому вот вам ссылка на все показанные демо и слайды: https://t.co/geVnxk3kYq

Следующий Robert Jan Verkade и «On power & responsibility» http://t.co/3JKuARTqns — ни строчки кода в презентации, обещает докладчик.

@Anton_Diaz, старый был внедрён (и распространён) в основном в WebKit, отсюда и сравнение.

«Никакого нытья по профессиональным вопросам», — предлагает Роберт http://t.co/JNkCabHhBa

@SelenIT2, Opera 12.x и IE10

Дизайнеры или «веб-декораторы» категорически не понимают веб, его принципы работы и жизни.

Так ли открыт мир фронтенда, как это кажется? Мы, вроде бы, находим решение и тут же делимся им.

Делится знаниями лишь небольшая группа, так называемая, «элита» любой группы.

Фронтенд в большинстве — это белые мужчины 25-35 лет с техническим образованием. Нам стоит расширить рамки и пригласить людей других групп.

Всегда ли мы говорим с коллегами вне нашей группы на одном языке? http://t.co/arMYsstNFq

Иногда стоит расчехлить PowerPoint, набросать пару диаграмм и графиков и поговорить с менеджером на его языке.

Внешний вид не только то, как нас принимают с первого взгляда, но и отражение нашей индивидуальности http://t.co/jIPEcdeEj8

Роберт причисляет себя к творческому поколению Зельдмана и Мейера и противопоставляет его современной тенденции к роботизации разработки.

Фронтендеры, тоже дизайнеры. Вы анализируете проблему, придумываете решение и создаёте воплощение в реальности. Это сложно роботизировать.

Традиция визуального дизайна включает способность выслушать потребности клиента, не просто делать красиво что попало.

Если дизайнер не понимает веб, то может быть эта ваша вина в том, что вы не показали ему простой CSS-файл, не объяснили технологии?

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

Бывали ли вы на UX-конференции, слушали ли вы внимательно вашего менеджера? Нельзя быть достаточно всезнающим, всегда есть пути дальше.

Не просто создавайте адаптивные и отзывчивые сайты. Будьте адаптивны и отзывчивы сами!

«Фронтендеры, хватит ныть. У вас отличная работа, вас никто не лупит по затылку. Это важный шаг», — советует Роберт.

Дальше: перерыв на обед, 1 час. Поешьте.

Следующий на сцене Алекс МакКау «Faster JavaScript web apps» http://t.co/DhEw6UcAGF

Кажущаяся скорость работы приложения или сайта столь же важна, как и реальная.

Где-то после 1 секунды загрузки сайта пользователь переключается в режим «оно зависло» и уходит или переключается на что-то другое.

Каскад ресурсов позволяет понять, что скорость зависит от сети и отрисовки http://t.co/Jskfd74Yop

Что можно сделать для ускорения сетевой части:

  1. Быстрый ответ сервера;
  2. Используйте KeepAlive;
  3. Не используйте редиректы;
  4. CDN
  5. Уменьшайте кол-во ресурсов;
  6. Минифицируйте JS/CSS;
  7. Собирайте ресурсы вместе;
  8. GZip;
  9. Кэш, отдельная статика;
  10. Кэширование Ajax-запросов;
  11. Удаление дублирующего кода;
  12. Минификация и сжатие картинок;

Ускорение на стороне клиента:

  1. Режим стандартов IE, переключение X-UA-Comp заголовком сервера;
  2. Подключение стилей как можно выше;
  3. Избегать блокирующего JS, async/defer;
  4. Отложенная загрузка некритичного JS.

Модуль ngx_pagspeed для Nginx — http://t.co/x1421Tn7EH

Снова звучит совет динамически вставлять <link rel="prefetch" href="…"> в <head> с помощью JS.

Меняйте классы у элементов как можно глубже по DOM, чтобы это оказывало как можно меньшее воздействие на перерисовку.

Использование createDocumentFragment для хранения DOM-эл. во время динамического создания быстрее для отрисовки, чем постоянная вставка.

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

Используйте перекл. классов, а не инлайн-стили. Не делайте ресайз картинок в CSS. Группируйте изменения в DOM.

@sapegin, ты отдаёшь себе отчёт, что разговариваешь с трансляцией?

Сервис PageSpeed Insights, включая API на 25 000 запросов в день — https://t.co/00u7CCtvo7

Как выглядит утечка памяти в инспекторе http://t.co/OqbbNubpDe

Сайт Алекса http://t.co/oN5tmjyFhj и он в Твитере @maccaw. Дальше вопросы и ответы.

Следующий: Пол Льюис из Chrome DevRel «A developer's guide to rendering performance» http://t.co/NtUndpMJFx

Хотите поговорить про быстродействие? Упоминайте тег #perfmatters, тогда вас услышат и другие.

Все говорят про загрузку страницы, а я хочу поговорить про то, что происходит потом — как пиксели попадают на экран. То есть про отрисовку.

После получения ресурсов и построения дерева DOM, происходит комбинация DOM + CSS = дерево отрисовки. Потом создаётся раскладка, aka layout.

Все фигуры, которые рисует браузер — векторные. Их нужно растеризировать, обрезать и прочее, то есть операция «paint» в инспекторе.

Все картинки (JPG, GIF, etc) нужно декодировать из форматов и тоже попиксельно нарисовать.

Подход «инструменты вместо советов» лучше, поскольку советы устаревают, а инструменты просто считают и показывают что оптимизировать.

«Рифмуется — значит правда», как говорит Джейк Арчибальд (про «tools not rools»)

Стили, влияющие на перерисовку (и голова Пола). Почти что все http://t.co/25iHYCNlbO

Библиотека fastdom для ускорения работы с DOM — https://t.co/n6McJ9qtaX В примере она повысила скорость с 9 до 58 fps.

Если нажать клавишу «h» в инспекторе Chrome, то выбранный элемент спрячется. И можно будет увидеть, как он влиял на быстродействие.

Если нужно что-то двигать, то убедитесь, что это «что-то» лежит в собственном слое отрисовки. Да-да, тот самый translate3d и другие.

Обработка и отрисовка картинок — самое тяжёлое и проблемное для быстродействия. Вот бы нам модификатор для «отложенных» картинок, но нет.

jQuery.animate до сих пор работает через таймауты (неэффективно), а не requestAnimationFrame (лучше), но есть патч, который это включает.

Тач-обработчики:

  1. Уменьшайте количество обработчиков событий;
  2. Подключайте событие как можно ближе (по дереву) к целевому элементу.
  3. Подключайте обработчики как можно позднее.

Прокрутка естественно вызыват перерисовку. Избегайте изменений во время прокрутки. Да, параллакс — это убийство браузера.

Если вы вставили анимир. GIF-спиннер, то не забудьте не просто прикрыть его загруженным, а выключить, иначе он продолжит отрисовываться.

Выводы:

  1. Быстродействие — это фича, а не юнит-тест.
  2. Вы контролируете то, что получает браузе (отключите box-shadow, у нас флэт-дизайн)
  3. Сначала профилируйте, потом исправляйте (это нельзя предсказать).
  4. Профилируйте раньше и чаще.

Следующий на сцене Лукас де Грут «On designing typefaces» http://t.co/I9p3d7hmwB

Первая мировая война шрифтов: (Adobe) PS vs. TT (Microsoft). Adobe проиграла и была вынуждена раскрыть секреты PostScript.

Непростой процесс хинтинга шрифтов http://t.co/fCGU1tskWJ

Хинтинг — это кропотливый ручной процесс искажения оригинальных кривых шрифта для каждого размера, чтобы они ложились на пиксельную сетку.

Хинтинг в VTT, софте от Microsoft http://t.co/8uCDVT53KA

Типы хинтинга: ч/б, серый, clear type и самый лучший — комбинация серого и clear type.

Иногда шрифты хинтуются не под целые пиксели, вроде 1 или 2, а например под 1,3 — такой шрифт Лукас сделал для дисплеев навигаторов Audi.

Старинная кернинговая пара http://t.co/J4sljhcrvs

Лукас сделал шрифты Calibri и Consolas для Microsoft.

Для эффективного кернинга нужны таблицы самых частых буквенных пар для каждого языка.

Кернинговые просветы между буквами создают своё впечатление для каждого языка. Те же буквы, но разный кернинг: сравните «dog» и «god».

На ретиновых экранах хинтинг не нужен.

В LucasFonts только над хинтингом работает целая команда, в частности, один программист и один русский.

Информация о поддержке и работе веб-шрифтах на сайте компании Лукаса — http://t.co/RQksYmWsJe

Сложнее всего локализовывать шрифты. Лукас потратил по 6 лет на греческий и кириллицу и арабский. Так что хинтинг — это ерунда, в сравнении.

Можно определять какое устройство запрашивает шрифт и отдавать его без хинтинга, например, для iOS и OS X.

Первые буквы Лукас сделал в 6 лет. В туалете. (цитата, со слов его матери)

Секция примеров из реальной практики: Эд Соуден рассказывает про разработку GOV.UK http://t.co/2qpSCTNq12

Сайт https://t.co/MukTVJpGK2 построен по принципу «сначала мобильные». Они поддерживают не браузеры, а пользователей. То есть IE6.

Набор инструментов (SASS и JS), созданный для разработки https://t.co/MukTVJpGK2https://t.co/BXaUydHG4m

Для IE6 сайт отдаётся как для мобильных в одну колонку, чтобы избежать возни с багами, но всё же донести информацию.

На сайте 7 базовых размеров шрифта, содержащихся в SASS-переменных. Эти переменные реагируют на размер вьюпорта и соотв. изменяются.

Всё, о чём шла речь, повторимся, на Гитхабе: https://t.co/BXaUydHG4m

Следующий: Антон Ванхаук рассказывает про сайт планирования транспорта http://t.co/gI2Ksw3DRa http://t.co/2qpSCTNq12

Его компанию попросили только «немного освежить дизайн», они переделали весь сайт до неузнаваемости.

Они попытались сделать из сайта не робота «доброе время суток», а попутчика «привет, куда едешь?»

Новые иконки, эмоциональные фотографии, идея «9292 путешествует с тобой».

Вместо кучи полей — умное выпадающее поле с подсказками, которое угадывает запрос http://t.co/njG8YAMG90

Следующая: Элани Оливьер про музей Rijksmuseum http://t.co/2qpSCTNq12

Сайт музея https://t.co/36UC0Qb0JV

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

Терабайт картин, разбитых на тайлы http://t.co/m63L54QNcU

Целевая аудитория сайта музея — двое вечером на диване с Айпадом. Идея: не тащить людей в музей, а принести музей в их дом.

Задача была: сайт для десктопа (IE8+) и мобильных (от телефона до планшета). Всё это под большим контролем за качеством со стороны клиента.

С проектом торопились, поэтому не тестировали на Андроиде. О чём жалеют, но уповают на сроки.

Работали по Аджайлу, было проще с приоритетами http://t.co/WVLD6sGBM0

Разработали в процессе свой CSS-фреймворк, что значительно ускорило разработку после начального этапа.

Разработали даже API для работы с материалами сайта, должны выпустить скоро.

В: Как вам удалось выложить все картины бесплатно? О: Цель — привлечь внимание к картинам, чтобы пришли посмотреть на оригинал. Это работает

На сцене Oliver Reichenstein и «Responsive typography» http://t.co/pAcSBRp0sD

Доброе утро! Мы начинаем http://t.co/EFE0ElXvM6

Первая версия сайта iA http://t.co/1QtIA4X9LO

В вебе всегда было шумно, поэтому Оливер начал первый сайт агентства почти без CSS.

Всё началось со статьи «Web Design is 95% Typography» в 2006 году http://t.co/3A9gq8cYDU

Оливер изучал философию и совсем не дизайнер, тем более не специалист по типографике.

Неужели так сложно выбрать шрифт для брендинга компании? Это кажется таким простым делом.

Веб был полон Верданой и Ариалом. Потом появилась Джорджия! В 2005 году она выглядела чем-то новым.

Типографика не о том, как выбирать шрифты, а о том, как именно их использовать.

Как же начать разбираться? Можно прочитать несколько книг, но они довольно сложные.

Оливер начал с выбора размера шрифта. Шрифт в вебе слишком мелкий. Всё потому, что веб-дизайнеры скрючены над экраном и напряжены.

Обычные люди читают текст в вебе расслабленно, на некотором расстоянии от экрана. Им не нужно выискивать пискели.

Оливер взял книгу, поместил её на комфортное расстояние от глаз и сравнил с экраном. Экран обычно гораздо дальше.

Оптимальным размером оказались 16 пикселей Джорджией. В 2005 году это звучало полным безумием, особенно на небольших экранах тех лет.

«Этот человек безумен, как он может заставлять нас читать такой огромный текст?» — говорили многие.

Для экранов с подсветкой для того, чтобы избежать «эффекта зебры» пришлось также увеличить высоту строки.

Также было принято, что шрифты с засечками не работают на экране, основанное на каком-то исследовании 1992 года.

В исследовании сравнивали что-то вроде 10-пиксельного Таймса с Верданой на плохом экране и конечно Вердана выигрывала.

Ситуация усложнилась: появились телефоны, планшеты, ретина, макбуки с крошечными пикселями.

Вьюпорт, то есть ширина экрана, это не главное. Крайне важно расстояние до экрана. Поэтому даже формула «16 пикселей» не работает.

Шрифтовики не сразу поняли, зачем изменять шрифты для экрана. «Ты меняешь высоту строки, которую я установил для шрифта?».

Первое впечатление от ретины: мы можем просто использовать обычные шрифты, как на бумаге и не париться. Но всё не так, это по-прежнему экран

Приходится напрягать воображение, чтобы представлять, что справа всё ещё Джорджия http://t.co/d3LKvPtCgz

Оливер ссылается на статью «Font Hinting and the Future of Responsive Typography» http://t.co/Xnm1TdJM6u

Даже сглаживание на экране делает шрифт чуть жирнее, чем он есть на самом деле, несмотря на огромные усилия по хинтингу.

На ретине тонкие шрифты слишком тонкие, на обычном экране чуть толще, чем нужно.

Так было и раньше: для разной бумаги, разных размеров шрифта нужно было применять разные литеры.

Чем меньше шрифт, тем жирнее должна быть форма буквы http://t.co/qKgmyoM71X

Уж не говоря про ловушки для краски на острых стыках кривых.

Усилия по выбору правильной насыщенности стоят того, хоть и не всегда заметны с первого взгляда http://t.co/uvjX1xqw5I

Причём от экрана к экрану нужна разная насыщенность. Что сложно объяснить традиционным шрифтовикам.

Оливер решил воссоздать шрифт из старой книги и так и провалился в кроличью нору http://t.co/2fDwk4nT67

Одним из первых экспериментов был шрифт iABC http://t.co/YUdoZMz9uZ

«Ты сделал шрифт за год? Молодец, только не показывай никому», — сказали маститые шрифтовики.

Сайт iA с отзывчивой типографикой, хотя маститые шрифтовики всё равно видят множество проблем — http://t.co/HwPTLkOo8y

Оливер опасается открывать шрифтовые программы, чтобы не его снова не засосала эта пучина.

Следующая на сцене Garann Means «How to rewrite your JS app (at least) 10 times» http://t.co/IxcpS3vWy1

Гэран написала книгу про Node.js для фронтендеров http://t.co/Gs0JsRegtA

Писать код просто — планировать его сложно.

Но мы привыкли слишком приотизировать часть работы, связанную с кодом и забывать про планирование.

Но если ты переписываешь что-то, то возникают другие проблемы http://t.co/4cwgzWiHVe

Но есть много причин, чтобы переписать код: новые технологии, апгрейд инфраструктуры, рост бизнеса, рефакторинг или просто ВСЁ СЛОМАЛОСЬ.

Плохой вариант, когда у вас есть 20% приложения и тут вы понимаете, что всё неправильно и выбрасываете код. Лучше так не делать.

Плохие идеи по переписыванию чего-то:

"1." Давайте используем новый фреймворк! Куча постов о нём, кто-то его пробовал на хакатоне, это 100% MVC — чем не причина.

И вы такой пишете пару строк и фреймворк делает инициализацию за вас. И модели, и данные… И тут вас всё-таки приходится писать что-то самому

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

Выбирайте фреймворк последним. Это не должно быть причиной для написания приложения. Он должен оставаться инструментом.

Другой вариант: "2." Давайте напишем наш собственный фреймворк! Весь код будет знаком, специально для вашего приложения, только нужное внутри.

В итоге вы переписываете уже знакомые вам фреймворки, только с блекджеком и прочим. С минимальной разницей и на это уходит слишком много сил

Правило: пишите одновременно только одно приложение. Как бы ни круто было писать пять штук сразу.

Пишите API сразу и сразу сквозь всё приложение, для всех вещей.

Или так: "3." Так может сделаем всё не на JS, а на сервере… на PHP?

Когда позже что-то нужно отладить, исправить, дописать — выходит, что было проще использовать один и тот же язык для клиента и сервера.

Или вот: "4." Давайте перепишем всё сами, даже браузерый DOM.

Или загрузчик файлов: сделаем его умным, красивым, с прогресс-баром… и Flash-роликом, который всё загружает.

И тут в JS появляются всякие Flash-привязки. А потом фолбек на обычный загрузчик, а потом ещё и на XHR, а потом…

Так может сразу стоило начать с базовых вещей, которые есть в браузере и сделать их лучше поверх существующего?

DOM — плохое место для хранения данных. Это дорого и сложно. Данные заслуживают отдельного, настоящего хранилища.

Или так: есть плагин или модуль для решения нашей задачи! Кто-то его написал, кому-то он помог. Давайте его возьмём.

В итоге вам приходится подстраиваться под то, что плагин возвращает, чистить его от лишних классов и кода.

И в итоге вы его переписываете. Точнее, дописываете на основе существующего. Но это уже не плагин, это кусок чужого кода.

Так может стоило сразу написать самому, не делая кривые решения на основе чужих ошибок?

Бывает и так: раз это MVC, то не нужно никакой системы зависимостей.

Отсутств. модульности приводит к бардаку в коде. Полагаться на глобальные переменные опасно. Приходится следить за порядком подкл. завис-тей

Или даже: у вас есть ужасный движок и вы находите инструмент или фреймворк, совместимый с этим ужасным. И вы радостно его используете.

Переписывание внешних мелочей приведёт вас к такому же плохому коду, который у вас есть в основном коде.

Или так: мы нашли крутую штуку, которая всё решает. Давайте её использовать. Так, что у нас за проблема?

Но решает ли эта штука проблему? Нужно сначала сформулировать проблему, а потом искать решение.

Сложно избежать полного переписывания. И лучше конечно сделать так, чтобы переписать всё только один раз, а не делать это постоянно.

Не начинайте писать код до тех пор, пока у вас нет плана разработки.

Хорошее план спасёт вас от десятка переписываний приложения.

Сайт http://t.co/yQ8b19cz4b и Твитер @garannm Гэран.

Следующий после перерыва: «The importance of Firefox OS» Sergi Mansilla http://t.co/jjbP4YZ8vm

Мозилла на сцене http://t.co/bo4ER4XBEO

Сайт Сергия http://t.co/SFYNtl6wmr

Сергий работает в норвежском телекоме Telenor над Firefox OS

Проблема: написал один раз… запустил один раз. (На одной платформе). http://t.co/ty9DA9YYkN

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

Пользователи страдают http://t.co/48fNBNp8fK

Решение — HTML5. Речь о наборе технологий, а не о модном бессмысленном словечке

WebRTC, IndexedDB, ASM.js, etc.

Среди современных устройств разве что тостеры не поддерживают HTML5.

Но мы снова и снова не используем общую платформу в виде HTML5 и пишем разных код для разных устройств.

HTML5 API одинаковы на всех устройствах, где есть браузеры, совместимые с веб-стандартами.

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

Backbone, Knockout, Angular, etc. — нет никаких ограничений по использованию подходов к разработке, в отличие от нативных платформ.

Аргумент про быстродействие веб-приложений — ерунда. Ответ Sencha на заявление про «медленный HTML5» от Facebook http://t.co/Nwqae41IOg

Конечно это потребовало трюков: <iframe> для каждой из частей приложения, что рендерило их в отдельных процессах.

Unreal Engine 3 in Firefox with asm.js — http://t.co/TFDQafy1jr

Ещё аргумент про ужасный JS, как язык. Но JS меняется к лучшему: классы, модульность.

Кроме того, есть десяток языков, компилирующихся в JS: от CoffeScript до Dart, LiveScript, Objective-J.

Список вариантов «Web coding beyond JavaScript» http://t.co/RAxf75Geo4

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

Первый нормальный аргумент: API к железу устройств. То есть отсутствие доступа к ним из JS.

Но ситуация улучшается благодаря: Appcelerator, PhoneGap (особенно версия 2).

Поначалу вещи вроде PhoneGap были даже запрещены в App Store http://t.co/yQSLYjEIxo

Мозилла помогла разрушить монополию IE в начале нулевых. То же делает и Firefox OS, чтобы освободить разработчиков от рамок платформ.

Мозилла работает над стандартизацией API для железа устройств. Вы не обязаны пользоваться апстором Мозиллы, хотя он есть.

Начать делать приложение для Firefox OS просто http://t.co/b0Df8xfI34

Плюс манифест http://t.co/gizaq7rb0S

Главная фича Firefox OS — отладка прямо в браузере. Это удобнее, чем всё, что есть на других платформах.

Есть расширение App Manager для Firefox, которое упрощает разработку и тестирование https://t.co/kzU60lxzPR

Расширение может подключаться к телефону и получать доступ к приложениям, установленным на телефоне и отлаживать их

Связь отладчик — телефон двусторонняя.

Другое расширение: симулятор Firefox OS https://t.co/ZRu6Uf8RBw

Brick http://t.co/OueTaRov2I — UI-компоненты для современных веб-приложений.

Набор шаблонов для веб-приложений: https://t.co/Y4NODE22sN Материалы для обучения: https://t.co/xzc1w8IOcX

В магазине приложений для Firefox OS простой процесс одобрения, без лишних ограничений — https://t.co/Mm3oO1UiOr

Следующий на сцене Гарри Робертс «Rationalising designs for better quality code» http://t.co/YSQiGrQ1o5

Второе название доклада; Рационализация дизайна для лучшего качества CSS http://t.co/zy83bFu5Kz

Третье, честное, название: Почему дизайнеры ненавидят меня.

Если вы не согласны с идеями Гарри, пишите ваши мнения с тегом #DesignersHateHim

Разработчики жалуются про плохой PSD не дизайнерам, а коллегам. Много нытья и расстроенных верстальщиков.

Гарри работает в большой британский медиакомпании Sky http://t.co/q5nVa13Xcd

Как фронтенд-разрабочик, Гарри связывает программистов с дизайнерами и часто принимает решения по оптимизации дизайна для лучшего соотв.

Я не анти-дизайнер, как может показаться. Этот подход может не сработать в некоторых ситуациях (для крошечных и огромных сайтов).

Компромисс — это хорошо: для поддержания хороших отношений с дизайнерами, для совместной эффективной работы, но «нет» значит «нет».

В Sky до сих пор существует процесс PSD — разработка — и т.д. Но большая организация не меняется в один день.

PSD — это идея, а не контракт. И он обязательно изменится: сам или уже в коде.

Типичная фраза «Это возможно, но…» Почти всё можно сделать, но это не значит, что это нужно делать и это хорошая идея в целом.

Быстродействие — прежде всего. Особенно когда об этом думают даже дизайнеры. И у нас в Sky так и происходит.

Если можно достичь 80% дизайна используя 20% кода — это именно то, что нужно сделать.

Это правило называется «80:20», запомните его.

Интересный вопрос: «Хм, я думал ты хороший разработчик? Почему ты не можешь это реализовать?»

Работа фронтендера гораздо важнее, чем просто воссоздать PSD в HTML и CSS. Ответственность гораздо выше.

Чем лучше, ты пишешь код, тем меньше тебе хочется делать это.

Лучше не писать код, который можно не писать. Перерабатывайте, переиспользуйте, нормализуйте, добавляется абстракций.

Когда дизайнер делает отступ снизу то 20px, то 22px, то 18px — пользователь не заметит разницы. Это стоит нормализовать до 20px

Вместо написания селекторов через запятую и 20px для них, лучше использовать переменную $padding: 20px и препроцессор.

Использовали что-то 3 раза и больше? Вынесите это в абстракцию, переиспользуйте.

CSS это язык, основанный на правилах (rules). Но если дизан не основан на правилах, то его крайне сложно передать в правилах.

Стоит помочь дизайнеру начать думать правилами, что не отменяет творчества.

Правила — это то, что не стоит нарушать, иначе одно потянет за собой другое и от системы ничего не останется.

Начало обычного проекта: html { font-size:16px; line-height:24px } В итоге 24px становится ключевым размером для отступов всего проекта.

Случайные числа в отступах и размерах ведут к непониманию. Лучше выбирать базовую величину и считать многое от неё. Например, те же l-h:24px

Стоит нормализовать и рационализировать решения в дизайне: если уменьшать или увеличивать что-то, то ровно в 2 раза, например.

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

Если вместо вставки картинки можно сделать пару рамочек, то лучше упростить её немного и реализовать проще.

Ищите альтернативы, меняйте дизайн, рационализируйте и нормализуйте его.

Наша задача не выпустить хороший дизайн, а сделать работающий продукт, который хорошо выглядит.

Чем сложнее код или конкретное решение, тем сложнее его понимать другим, тем оно более хрупкое.

Делайте удобные сайты, не статические картинки. Компромиссы для лучшего качества. Придерживайтесь правил. Будьте умнее, трюкуйте!

Клиент не должен знать ничего о коде. Но должен понимать, что он приобретёт от качественного кода — поддержка, стабильность, и т.д.

У нас часовой перерыв на обед. И вы не забудьте поесть.

Следующий Маркус Касэрас «Responsive images: ain't we there yet?» http://t.co/iG5K9OUUzM

Мы уже близко к отзывчивым картинкам? Да, мы почти уже там. По крайней мере ближе, чем когда либо.

Картинки занимают 60% от размера средней страницы. И процент растёт.

Так что такое отзывчивые картинки? Картинки, которые соответствуют ситуации и окружению.

Рекомендуемая статья: Responsive Images: What We Thought We Needed http://t.co/RESDaaSCWD

Важный документ для группы стандартизации отзывчивых картинок: Use Cases and Requirements for Standardizing http://t.co/xvc8ETKMiW

Картинка, которая хорошо сжата для порт. ориентации, может выглядеть плохо в ландш., т.к. становится больше http://t.co/4KbpROtJPz

Пока нет решения, которое покрывало бы все юзкейсы и нравилось бы всем.

Решение №1 <picture> (на манер <source> для <video>), предложенное Брюсом Лоусоном http://t.co/wmeQ1iI5WH

Минусы: несколько элементов; расширяет использование <source> в спец. контекстах (не только для <video>); смешивает MQ и разметку.

Решение номер 2, стрёмное http://t.co/glWn5cvvV2

Третье решение: атрибут и похожее свойство srcset, предложено в Apple.

Плюсы: нравится браузерам, уже внедрено в Safari. Минусы: не решает проблему с кропом, сложный синтаксис, что значит «w»?

Комьюнити и W3C http://t.co/e8Newav6fz

Что же нам на самом деле нужно: <img src=“”path-to-image>. И всё.

Четвёртое решение: использует HTTP для т.н. «client hints», то есть подсказок для клиентской части.

Плюсы: не нужна доп. разметка; браузер может заявить, что он поддерживает и только тогда получит что-то от сервера.

Минус: вы не всегда можете управлять заголовками «своего» сервера: Github pages, CDN, дешёвые хостинги.

Ещё минусы: прокси могут резать непонятное; может потребовать SSL для стабильной работы.

Набрасываем идеальное решение на лету http://t.co/KoOjYYfCaj

Следующий шаг http://t.co/hexapNIPLO

В итоге, получается вариант с <img> элементом и атрибутами src-1, src-2, src-n.

Становится страшнее http://t.co/9HmmzDPrLa

Ещё вариант: новый умный формат для изображений.

Картинка делится по частям внутри: 1-100 кб — одна, 100-300 кб другая и т.д.

Благодаря этом очень удобно делать кропы, выбирая только часть картинки, делая его на лету.

Минусы: новый формат изображений; потребует изменений в браузерах и соотв. софте; должен быть стандартизирован.

Так что же будет?

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

Один из полифилов для отзывчивых картинок — Picturefill https://t.co/CXi7O6T4QD

Есть идеи? Присоединяйтесь к Responsive Images Community Group http://t.co/gso88IVX9O

Возможные расширения для будущего волшебного формата изображений: .ric (resp img community) или .mif (magic image format).

Следующая на сцене Анжелина Фабро «Return of Inspector Web: Web Components a year later» http://t.co/HMbwBNPY5F

«Web Components» — это не просто одна технология, но группа, вроде как HTML5.

Shadow DOM — это способ спрятать элементы внутри другого элемента так, что родительский документ ничего не будет знать о них.

Отрисовка вложенного Shadow DOM заменяет заменяет родительский элемент в основном DOM. Именно отрисовку, а не элемент в дереве.

Демка, работает в Chrome Canary: http://t.co/gKimBDlkoF

Новая @-конструкция в CSS: @host, которая позволяет подняться на уровень выше из вложенного документа. @host { border:red }

Псевдоэлемент ::part для Shadow DOM http://t.co/f8LxrcK00J

Поддержка Shadow DOM: Firefox скоро, Chrome да, IE пока никаких новостей, про Safari тоже не очень понятно.

Содержимое нового элемента <template> будет обработано, но не отрисовано. Он может содержать элементы, стили и т.п.

<template> это замена <script type="text/template">, которая не хак.

Есть уже даже такое <link rel="import" href="some-page.html"> Firefox: скоро; Chrome за флагами; про IE никто не знает.

Специальные элементы: var foo = document.register('my-widget‘); document.body.append(foo);

Создание нового элемента: <my-widget></my-widget> или <div is="my-widget"> — первый способ лучше.

my-widget { color:red } my-widget:unresolved { opacity:0 } — если элемент не зарегистрирован в документе, то он не будет виден.

Поддержка: Firefox и Chrome за флагами; про IE ничего не известно.

Элемент <element> пока убрали из спецификации. Но способ создавать специальные элементы пока остался.

Новая штука Dectorators, о ней мало информации и нет собств. спецификации.

<decorator> — это способ применения презентационной разметки через задание логики в CSS. Что-то вроде шаблонизации, управляемой через CSS.

Считанные люди понимают как это работает. Звучит сомнительно, но есть некоторые удачные юзкейсы. Хотя нет ни одной реализации и спеки.

В проектах Мозиллы X-Tags и Brick используются полифилы для реализации части расказанного в докладе.

Polymer Project — проект, построенный на основе веб-компонентов http://t.co/M2yhTg3aFS

Polymer 168 кб, Angular 81 кб, X-Tag 63 кб.

Пример на Polymer, он поддерживает большую часть веб-компонентов, в отл. от других http://t.co/f33kIxVWwY

То, что делает AngularJS крайне похоже на спецификации веб-компонентов.

Чем больше создаётся библиотек, чем больше пишется кода, тем ближе спецификации веб-компонентов становятся к стабилизации и внедрению.

Один человек с любимой фичей ничего не значит. Сообщество, которое использует фичу через трюки или полифилы — повод внедрить это в браузер.

Визуальный редактор для приложений, использующий веб-компоненты — http://t.co/OnEH5HN3ZX

Получасовой перерыв: подышим, разомнёмся.

Следующий Доменик Деникола «The state of JavaScript» http://t.co/FQqCIcOZIx

95-й ролловеры, валидация форм; 97-й ECMA-262 1, IE4, DHTML; 99-й ES3: function expressions, try/catch/finally/regexp.

2004: сформировалась WHATWG и сфокусировала внимание на веб-приложениях; 2005 Ajax aka XMLHttpRequest; 2006 jQuery 1.0 и JS в массы.

2008 V8, началась гонка за скоростью, вышла книга «JS Good Parts» Крокфорда; 2009 ES5, ServerJS, CommonJS, Node.js, PhoneGap, JSConf EU.

2009-й начало JS-бума; 2010 Backbone.js, RequireJS; 2012 Windows 8, Nodecopter; 2013 Nodebots, Ember, Angular, Ext. Web Manifesto; asm.js

2014 ES6 финал, ES7 начало, ???

JS на фронтенде сегодня

Началось всё с jQuery, потом Backbone.js, потом Angular (гл. фишка компонентная система) и Ember (гл. фишка мультистраничные приложения).

Почему всё веселье доступно только с библиотеками?

Потому, что спека Web Components (Веб-компоненты) пока не готова, но будет. Сейчас можно использовать Polymer вместо неё.

Идею веб-компонентов сначала подхватил Angular.

Дальше: http://t.co/05Bjg6Ad1s

Неофиц. лого лучше передаёт мощь Node.js http://t.co/Wr1e0lw4nN

JS с помощью Node.js можно завести на любом устройстве.

Windows 8 была этапом, когда крупнейшая компания предложила писать приложения для ОС на JS.

js-git — http://t.co/n5lwr2FrBI

PDF через JS (осн. движок PDF в Firefox) — https://t.co/4B4JwhYBKw

Но мы пошли дальше: Shumway SWF (Flash) через JS — http://t.co/y1UWe5WcrE

Browserify — способ заставить работать большинство пакетов из npm в браузере http://t.co/L6S16snYVr

http://t.co/vwQQBeuAck — что-то вроде Minecraft в браузере

asm.js — это крайне оптимизированное подмножество JS, работающее с нативной скоростью http://t.co/slhZstS3U8

Идея JS как виртуальной машины для веба. Писать можно на чём угодно, но компилировать в JS.

.NET, JVM, Ruby, Python, Haskel — всё это можно скомпилировать в JS и запустить в браузере.

CoffeScript — это конечно круто, но круче компилировать ES6 в обычный JS.

ES6 в JS? См. traceur https://t.co/jkQFPGLFcw и es6ify https://t.co/GH0M9eVIvw

Новое в ES6, синтакс: class, extends, super — синтаксический сахар, вместо JS-библиотек; Arrow functions arr.map(x => x*x);

Destructuring: var {x,y} = getPoint(); Rest/spread: var [first, …rest] = els; Math.max(…myArray);

Извините, трансляция перегрелась от ES6.

Изменения в ES6 проходят под лозунгом: мы не можем ничего удалить или исправить из-за совместимости, но можем добавить новое и лучшее.

Доминик, помимо прочего, автор спецификации промисов (promises), которая вошла в ES6.

И такое можно будет делать в JS '<a href="${url}">${text}</a>'

ES7 будет ещё круче.

Что будет в ES7: Weak references; Async/await function^() {var res = await promise }; Object.observe; Типы значений: встроенные (int) и спец

И ещё оператор байндинга: var method = ::obj.foo

Firefox (OS) обычно не прячет новые фичи из ES6 за флагами (многое уже доступно в нём), в отличие от Chrome.

И закрывает конференцию Брюс Лоусон «HTML.future — what the web needs next» http://t.co/NMyvryz579

@thebits, Firefox (OS) — это Firefox и Firefox OS

@fetis26, будут, обычно к ноябрю

IndexedDB = Index Douchebag

Веб по всем цифрам проигрывает приложениям (20/80%) и приложения совсем не переходная технология, какой были плагины.

Брюс поражает аудиторию дизайнерскими способностями http://t.co/m8jjdVqf7m

DRM для веба продвигают Google и Microsoft — и вряд ли для того, чтобы погубить веб.

Помимо главных DRM-жупелов, технологию продвигает медиа-гигант BBC, по понятным причинам.

Если не будет DRM, то медиаконтент будет похоронен из апсторах и исчезнет из веба.

Большая цель PhoneGap — стать ненужным. Чтобы фронтенд мог появиться на платформах без его помощи.

Blink и соотв. браузеры внедряет автоматичекую фичу Lazy Layout, которая анализирует раскладку сайта и рисует её быстрее, чем остальное.

Или <img lazyload src=“…”>, новый способ отложенной загрузки изображений.

Opera работала над спецификацией W3C Widgets, но спека не выжила. По многим причинам, кроме глупого названия.

Очень похожие творится в Chrome App Store и даже на Windows 8. Было бы хорошо объединить все хорошие идеи под одним API.

Та же идея для браузерных расширений: Opera предложила независимый формат для расширений NEX (на основе CRX для Chrome).

«Мир переходит на смартфоны» местами большой миф, поскольку на плохой сети люди всё равно пользуются Opera Mini.

Fronteers всё. Спасибо, что читали трансляцию, следите за анонсами следующих включений http://t.co/2G1SzYJ2H5

[{
"text": "Мы начинаем текстовую трансляцию Fronteers 2013, двухдневной конференции в Амстердаме — http://t.co/QB5SYQ3cMx",
"id": 388196821174325250,
"created_at": "Thu Oct 10 06:58:29 +0000 2013"
},
{
"text": "Пол Айриш из Google открывает шестую конференцию Fronteers. Россия на шестом месте по количеству участников, например.",
"id": 388197504292241400,
"created_at": "Thu Oct 10 07:01:12 +0000 2013"
},
{
"text": "На сцене Стив Саудерс с докладом «Pre-browsing» http://t.co/AuqI08mSjX",
"id": 388197780134834200,
"created_at": "Thu Oct 10 07:02:17 +0000 2013"
},
{
"text": "Сетевые проблемы замедляют веб. Медленные сотовые сети и даже перегруженный WiFi. Мы часто видим белый экран без индикации загрузки.",
"id": 388198931811016700,
"created_at": "Thu Oct 10 07:06:52 +0000 2013"
},
{
"text": "Заголовок: отдавайте браузеру нужное ещё до того, как он за этим обратится.",
"id": 388198974303518700,
"created_at": "Thu Oct 10 07:07:02 +0000 2013"
},
{
"text": "Кэш не всегда спасает: он может пока не существовать (первый заход), устареть или не соответствовать нужной версии.",
"id": 388199147222102000,
"created_at": "Thu Oct 10 07:07:43 +0000 2013"
},
{
"text": "Дело разработчика: &lt;link rel="dns-prefetch… prefetch… prerender. Дело браузера: DNS pre-resolution, TCP pre-connect, prefresh, preload",
"id": 388199628124213250,
"created_at": "Thu Oct 10 07:09:38 +0000 2013"
},
{
"text": "Предсказывание действий пользователя: искал Adventure Time, вероятно кликнешь по ссылке. Зашёл на Facebook, значит откроешь новостную ленту.",
"id": 388200272528683000,
"created_at": "Thu Oct 10 07:12:12 +0000 2013"
},
{
"text": "Как это работает: &lt;link rel="dns-prefetch" href="//catroonnetwork.com”&gt;, дёшево, открывает TCP-соединения.",
"id": 388200429324353540,
"created_at": "Thu Oct 10 07:12:49 +0000 2013"
},
{
"text": "Это работает в Chrome 22+, Chrome Mobile, Firefox, Firefox Mobile.",
"id": 388200759348953100,
"created_at": "Thu Oct 10 07:14:08 +0000 2013"
},
{
"text": "Спецификация &lt;link rel="prefetch" href="//example.com/script.js"&gt; для подгрузки ресурсов не слишком подробно описана.",
"id": 388201940477542400,
"created_at": "Thu Oct 10 07:18:49 +0000 2013"
},
{
"text": "Работает в: Android 4, Chrome 31, Firefox 23, Firefox Mobile 24, Opera 15+",
"id": 388201983267835900,
"created_at": "Thu Oct 10 07:18:59 +0000 2013"
},
{
"text": "Firefox префетчит только один ресурс одновременно, Android 6, Chrome и Opera 10 (6 с одного домена).",
"id": 388202037663776800,
"created_at": "Thu Oct 10 07:19:12 +0000 2013"
},
{
"text": "Если во время префетча перейти на другую страницу, то браузер — внезапно! — отменит процедуру. Справедливо для всех браузеров. И странно.",
"id": 388202154001195000,
"created_at": "Thu Oct 10 07:19:40 +0000 2013"
},
{
"text": "Это исправляется с помощью Accept-Ranges: bytes, тогда браузер подхватит разорванную предзагрузку. Если конечно это поддерживается сервером.",
"id": 388202668256395260,
"created_at": "Thu Oct 10 07:21:43 +0000 2013"
},
{
"text": "Сделать &lt;link rel="prerender" href="//catroonnetwork.com"&gt; это как загрузить страницу в фоновом табе. Рисково, тратит ресурсы и трафик.",
"id": 388203110361202700,
"created_at": "Thu Oct 10 07:23:28 +0000 2013"
},
{
"text": "С prerender легко ошибиться, но можно вставлять &lt;link&gt; динамически, что добавляет гибкости.",
"id": 388203253215023100,
"created_at": "Thu Oct 10 07:24:02 +0000 2013"
},
{
"text": "С момента нажатия на ссылку до первых байтов ответа, браузер не делает ничего, кроме вытягивания ресурсов, а разработчик не может ничего.",
"id": 388203957501587460,
"created_at": "Thu Oct 10 07:26:50 +0000 2013"
},
{
"text": "Chrome в этот момент начинает DNS-prefetch для всех возможных ресурсов, упомянутых на новой странице. Ещё до её отрисовки.",
"id": 388204513699844100,
"created_at": "Thu Oct 10 07:29:03 +0000 2013"
},
{
"text": "Аналогичная вещь происходит в тот же момент: TCP-preconnect для избавления от сетевых задержек.",
"id": 388205485394243600,
"created_at": "Thu Oct 10 07:32:54 +0000 2013"
},
{
"text": "Кое-что новое: Prefresh™. Когда Chrome начинает предзагружать нужные ресурсы (нужную версию jQuery) сайта, который он уже видел и запомнил.",
"id": 388205704445980700,
"created_at": "Thu Oct 10 07:33:47 +0000 2013"
},
{
"text": "Это избавляет от медленных ответов 200, 304 и времени чтения/записи на диск.",
"id": 388205789749723140,
"created_at": "Thu Oct 10 07:34:07 +0000 2013"
},
{
"text": "Prefresh включается параметром для запуска Chrome --specual-resource-prefetching",
"id": 388206057367306240,
"created_at": "Thu Oct 10 07:35:11 +0000 2013"
},
{
"text": "Если использовать техники адаптивных картинок с помощью JS, то предгазгрузчик браузера не найдёт &lt;img src="…"&gt;, т.к. работает до работы с JS",
"id": 388207237279543300,
"created_at": "Thu Oct 10 07:39:52 +0000 2013"
},
{
"text": "Лучше положить картинки для вытягивания вручную через JS на другой домен, чтобы они не конфликтовали с автоматикой браузера.",
"id": 388207319378829300,
"created_at": "Thu Oct 10 07:40:12 +0000 2013"
},
{
"text": "Этим летом Chrome изменил логику подгрузки JS. Раньше он повышал приоритет JS-файлов внизу страницы, не в пользу ресурсов в начале страницы.",
"id": 388208256143069200,
"created_at": "Thu Oct 10 07:43:55 +0000 2013"
},
{
"text": "Рекомендованная книга: «High Performance Browser Networking» Ilya Grigorik http://t.co/Rd3yaR8uof",
"id": 388208376116940800,
"created_at": "Thu Oct 10 07:44:24 +0000 2013"
},
{
"text": "После каждого доклада Пол Айриш будет задавать вопросы докладчику. Задать свой вопрос можно @FronteersConf и есть шанс, что его озвучат.",
"id": 388208853151940600,
"created_at": "Thu Oct 10 07:46:17 +0000 2013"
},
{
"text": "Пол Айриш озвучил идею положить все популярные JS-библиотеки прямо в браузер, не просто в кэш. Стив сомневается в эффективности решения.",
"id": 388209777836580860,
"created_at": "Thu Oct 10 07:49:58 +0000 2013"
},
{
"text": "В: Так класть ли все скрипты в конец страницы? О: Это что-то из 2007 года, сегодня важно правильно применять атрибуты async и defer.",
"id": 388210327214903300,
"created_at": "Thu Oct 10 07:52:09 +0000 2013"
},
{
"text": "Следующий доклад «Putting Flexbox into practice» Zoe Mickley Gillenwater (мы пока думаем как написать это по-русски) http://t.co/ALXOgs5q4k",
"id": 388210479044522000,
"created_at": "Thu Oct 10 07:52:45 +0000 2013"
},
{
"text": "Зоуи признаётся, что верстала таблицами http://t.co/yJTssEDs24",
"id": 388211680431599600,
"created_at": "Thu Oct 10 07:57:31 +0000 2013"
},
{
"text": "Демо-сайт для презентации: http://t.co/qfTmsZmwRa",
"id": 388212043905794050,
"created_at": "Thu Oct 10 07:58:58 +0000 2013"
},
{
"text": "Батарея префиксов для работы Flexbox http://t.co/GKYDJ992ti",
"id": 388212396642533400,
"created_at": "Thu Oct 10 08:00:22 +0000 2013"
},
{
"text": "Чтобы справляться с префиксами, можно генерировать их на http://t.co/L58z0BYu69 или прямо в SASS https://t.co/wz0i6q6Nd7",
"id": 388212843906359300,
"created_at": "Thu Oct 10 08:02:09 +0000 2013"
},
{
"text": "Firefox всё ещё не поддерживает flex-wrap для многострочного Flexbox. Так что это значение пока использовать не стоит.",
"id": 388213673288040450,
"created_at": "Thu Oct 10 08:05:27 +0000 2013"
},
{
"text": "Также для работы flex-wrap важно иметь поддержку break-before, break-after, которые поддеживаются только в IE10 и Opera 12.x",
"id": 388213829567807500,
"created_at": "Thu Oct 10 08:06:04 +0000 2013"
},
{
"text": "Как свёрстана галерея на http://t.co/qfTmsZmwRa http://t.co/sxosKEhKWN",
"id": 388214405730947100,
"created_at": "Thu Oct 10 08:08:21 +0000 2013"
},
{
"text": "Flexbox, в отличие от привычной модели, позволяет удобно и предсказуемо смешивать различные единицы изменения: px, em и проценты.",
"id": 388216844110553100,
"created_at": "Thu Oct 10 08:18:03 +0000 2013"
},
{
"text": "Если flex-basis не равен нулю, то могут возникать неочевидные ситуации, когда ширина элемента умножается на flex:N, об этом мало говорят.",
"id": 388217816421503000,
"created_at": "Thu Oct 10 08:21:54 +0000 2013"
},
{
"text": "Свойства align-items и align-self исполнили мечту верстальщиков о вертикальном выравнивании.",
"id": 388218066162941950,
"created_at": "Thu Oct 10 08:22:54 +0000 2013"
},
{
"text": "Выравнивание с помощью Flexbox с фолбеком для старых браузеров http://t.co/dWCM1shSzx",
"id": 388218440055803900,
"created_at": "Thu Oct 10 08:24:23 +0000 2013"
},
{
"text": "Flexbox и фолбеки для старых обычно не конфликтуют, но иногда их лучше разделять с помощью Modernizr, например.",
"id": 388218651348058100,
"created_at": "Thu Oct 10 08:25:13 +0000 2013"
},
{
"text": "При использовании выравнивания с помощью justify-content, можно легко делать фолбек на инлайн-блоки, даже не разделяя код.",
"id": 388219288500588540,
"created_at": "Thu Oct 10 08:27:45 +0000 2013"
},
{
"text": "Повторимся: всё, о чём идёт речь в докладе Зоуи про Flexbox, проиллюстрировано кодом на сайте http://t.co/qfTmsZmwRa",
"id": 388219570093559800,
"created_at": "Thu Oct 10 08:28:52 +0000 2013"
},
{
"text": "@_h4_ принимаются идеи",
"id": 388219752675803140,
"created_at": "Thu Oct 10 08:29:36 +0000 2013"
},
{
"text": "Изменение порядка следования блоков с помощью order из Flexbox может дезориентировать при навигации по элементам с помощью фокуса.",
"id": 388220417208746000,
"created_at": "Thu Oct 10 08:32:14 +0000 2013"
},
{
"text": "Одна из важных возможностей Flexbox позволяет растягивать один (или несколько) блоков по высоте родителя без указанной высоты.",
"id": 388220990213591040,
"created_at": "Thu Oct 10 08:34:31 +0000 2013"
},
{
"text": "Стоит ли вообще использовать Flexbox? Да, говорит Зоуи:",
"id": 388222543733469200,
"created_at": "Thu Oct 10 08:40:41 +0000 2013"
},
{
"text": "1. Спецификация не поменяется и Flexbox станет мощным инструментом для построения раскладки и никуда не денется.",
"id": 388222566487580700,
"created_at": "Thu Oct 10 08:40:47 +0000 2013"
},
{
"text": "2. Можно начать с небольших демо-сайтов, чтобы понять как Flexbox работает. И начать использовать его для небольших косметических вещей.",
"id": 388222587404554240,
"created_at": "Thu Oct 10 08:40:52 +0000 2013"
},
{
"text": "3. Flexbox это весело! Он сильно меняет представление о возможностях раскладки.",
"id": 388222601266741250,
"created_at": "Thu Oct 10 08:40:55 +0000 2013"
},
{
"text": "Ссылки и ресуры для презентации по Flexbox: http://t.co/nToGPs98fS",
"id": 388222668987977700,
"created_at": "Thu Oct 10 08:41:11 +0000 2013"
},
{
"text": "В: Как с поддержкой Flexbox на мобильных? О: Поддержка отличная, кроме мобильного IE.",
"id": 388222896101130240,
"created_at": "Thu Oct 10 08:42:05 +0000 2013"
},
{
"text": "В: Насколько быстро работает Flexbox? О: Новая спецификация (2012) значительно быстрее старой (2009).",
"id": 388223125558927360,
"created_at": "Thu Oct 10 08:43:00 +0000 2013"
},
{
"text": "Следующий на сцене: Питер ван дер Зи с докладом «Real-time recompilation of running JavaScript» http://t.co/aoWCaxLXa6",
"id": 388230701466013700,
"created_at": "Thu Oct 10 09:13:06 +0000 2013"
},
{
"text": "Питер начал сразу с демо http://t.co/P95swx2pBI",
"id": 388231199778689000,
"created_at": "Thu Oct 10 09:15:05 +0000 2013"
},
{
"text": "В этой демке Питер меняет параметры скрипта для Canvas и изменения становятся видны сразу без перезагрузки кода. Даже не мелькает картинка.",
"id": 388231509871956000,
"created_at": "Thu Oct 10 09:16:19 +0000 2013"
},
{
"text": "Питер в Твитере @kuvos",
"id": 388231720287625200,
"created_at": "Thu Oct 10 09:17:09 +0000 2013"
},
{
"text": "Дальше идёт опасный лайв-кодинг, кстати в WebStorm на Linux.",
"id": 388232013658206200,
"created_at": "Thu Oct 10 09:18:19 +0000 2013"
},
{
"text": "Компиляция в случае JS — это подготовка кода для исполнения. И дальше исполнение динамически созданного кода.",
"id": 388232290851368960,
"created_at": "Thu Oct 10 09:19:25 +0000 2013"
},
{
"text": "Код для демо http://t.co/r0hs9CQOrt",
"id": 388232654015168500,
"created_at": "Thu Oct 10 09:20:52 +0000 2013"
},
{
"text": "Функция возвращает функцию, которая… http://t.co/dYwYm01e96",
"id": 388233190949011460,
"created_at": "Thu Oct 10 09:23:00 +0000 2013"
},
{
"text": "Таким образом, мы изменяем код без перезапуска приложения.",
"id": 388233370712686600,
"created_at": "Thu Oct 10 09:23:43 +0000 2013"
},
{
"text": "Проблемы подхода http://t.co/aDXwe4bCSP",
"id": 388233731842269200,
"created_at": "Thu Oct 10 09:25:09 +0000 2013"
},
{
"text": "Становится всё страшнее http://t.co/aHvwsfsjxB",
"id": 388235847776366600,
"created_at": "Thu Oct 10 09:33:33 +0000 2013"
},
{
"text": "Прямой и непрямой eval различаются потерей или сохранением контекста в исполняемой функции http://t.co/eHCRxfnX0s",
"id": 388239831148793860,
"created_at": "Thu Oct 10 09:49:23 +0000 2013"
},
{
"text": "Оказалось сложно транслировать текстом лайв-кодинг Питера, поэтому вот вам ссылка на все показанные демо и слайды: https://t.co/geVnxk3kYq",
"id": 388242488743710700,
"created_at": "Thu Oct 10 09:59:57 +0000 2013"
},
{
"text": "Следующий Robert Jan Verkade и «On power &amp; responsibility» http://t.co/3JKuARTqns — ни строчки кода в презентации, обещает докладчик.",
"id": 388243483787808800,
"created_at": "Thu Oct 10 10:03:54 +0000 2013"
},
{
"text": "@Anton_Diaz, старый был внедрён (и распространён) в основном в WebKit, отсюда и сравнение.",
"id": 388243708417966100,
"created_at": "Thu Oct 10 10:04:47 +0000 2013"
},
{
"text": "«Никакого нытья по профессиональным вопросам», — предлагает Роберт http://t.co/JNkCabHhBa",
"id": 388244437505425400,
"created_at": "Thu Oct 10 10:07:41 +0000 2013"
},
{
"text": "@SelenIT2, Opera 12.x и IE10",
"id": 388244765835546600,
"created_at": "Thu Oct 10 10:09:00 +0000 2013"
},
{
"text": "Дизайнеры или «веб-декораторы» категорически не понимают веб, его принципы работы и жизни.",
"id": 388244852233994240,
"created_at": "Thu Oct 10 10:09:20 +0000 2013"
},
{
"text": "Так ли открыт мир фронтенда, как это кажется? Мы, вроде бы, находим решение и тут же делимся им.",
"id": 388245173299589100,
"created_at": "Thu Oct 10 10:10:37 +0000 2013"
},
{
"text": "Делится знаниями лишь небольшая группа, так называемая, «элита» любой группы.",
"id": 388246080644997100,
"created_at": "Thu Oct 10 10:14:13 +0000 2013"
},
{
"text": "Фронтенд в большинстве — это белые мужчины 25-35 лет с техническим образованием. Нам стоит расширить рамки и пригласить людей других групп.",
"id": 388246565963718660,
"created_at": "Thu Oct 10 10:16:09 +0000 2013"
},
{
"text": "Всегда ли мы говорим с коллегами вне нашей группы на одном языке? http://t.co/arMYsstNFq",
"id": 388246930369040400,
"created_at": "Thu Oct 10 10:17:36 +0000 2013"
},
{
"text": "Иногда стоит расчехлить PowerPoint, набросать пару диаграмм и графиков и поговорить с менеджером на его языке.",
"id": 388247400294658050,
"created_at": "Thu Oct 10 10:19:28 +0000 2013"
},
{
"text": "Внешний вид не только то, как нас принимают с первого взгляда, но и отражение нашей индивидуальности http://t.co/jIPEcdeEj8",
"id": 388247913782337540,
"created_at": "Thu Oct 10 10:21:30 +0000 2013"
},
{
"text": "Роберт причисляет себя к творческому поколению Зельдмана и Мейера и противопоставляет его современной тенденции к роботизации разработки.",
"id": 388248890719600640,
"created_at": "Thu Oct 10 10:25:23 +0000 2013"
},
{
"text": "Фронтендеры, тоже дизайнеры. Вы анализируете проблему, придумываете решение и создаёте воплощение в реальности. Это сложно роботизировать.",
"id": 388250502766788600,
"created_at": "Thu Oct 10 10:31:47 +0000 2013"
},
{
"text": "Традиция визуального дизайна включает способность выслушать потребности клиента, не просто делать красиво что попало.",
"id": 388251299462254600,
"created_at": "Thu Oct 10 10:34:57 +0000 2013"
},
{
"text": "Если дизайнер не понимает веб, то может быть эта ваша вина в том, что вы не показали ему простой CSS-файл, не объяснили технологии?",
"id": 388251701998018560,
"created_at": "Thu Oct 10 10:36:33 +0000 2013"
},
{
"text": "Никто не знает, что будет через 5 лет. Но нужно не просто быть готовым к переменам, а быть готовым к неожиданным переменам.",
"id": 388252894761607200,
"created_at": "Thu Oct 10 10:41:18 +0000 2013"
},
{
"text": "Бывали ли вы на UX-конференции, слушали ли вы внимательно вашего менеджера? Нельзя быть достаточно всезнающим, всегда есть пути дальше.",
"id": 388253401051840500,
"created_at": "Thu Oct 10 10:43:18 +0000 2013"
},
{
"text": "Не просто создавайте адаптивные и отзывчивые сайты. Будьте адаптивны и отзывчивы сами!",
"id": 388253571692908540,
"created_at": "Thu Oct 10 10:43:59 +0000 2013"
},
{
"text": "«Фронтендеры, хватит ныть. У вас отличная работа, вас никто не лупит по затылку. Это важный шаг», — советует Роберт.",
"id": 388254275111247900,
"created_at": "Thu Oct 10 10:46:47 +0000 2013"
},
{
"text": "Дальше: перерыв на обед, 1 час. Поешьте.",
"id": 388254928231469060,
"created_at": "Thu Oct 10 10:49:22 +0000 2013"
},
{
"text": "Следующий на сцене Алекс МакКау «Faster JavaScript web apps» http://t.co/DhEw6UcAGF",
"id": 388271027899609100,
"created_at": "Thu Oct 10 11:53:21 +0000 2013"
},
{
"text": "Кажущаяся скорость работы приложения или сайта столь же важна, как и реальная.",
"id": 388271684769546240,
"created_at": "Thu Oct 10 11:55:58 +0000 2013"
},
{
"text": "Где-то после 1 секунды загрузки сайта пользователь переключается в режим «оно зависло» и уходит или переключается на что-то другое.",
"id": 388271977708126200,
"created_at": "Thu Oct 10 11:57:07 +0000 2013"
},
{
"text": "Каскад ресурсов позволяет понять, что скорость зависит от сети и отрисовки http://t.co/Jskfd74Yop",
"id": 388272559265153000,
"created_at": "Thu Oct 10 11:59:26 +0000 2013"
},
{
"text": "Что можно сделать для ускорения сетевой части: 1. Быстрый ответ сервера; 2. Используйте KeepAlive; 3. Не используйте редиректы; 4. CDN",
"id": 388274025174421500,
"created_at": "Thu Oct 10 12:05:16 +0000 2013"
},
{
"text": "5. Уменьшайте кол-во ресурсов; 6. Минифицируйте JS/CSS; 7. Собирайте ресурсы вместе; 8. GZip; 9. Кэш, отдельная статика;",
"id": 388274299301548000,
"created_at": "Thu Oct 10 12:06:21 +0000 2013"
},
{
"text": "10. Кэширование Ajax-запросов; 11. Удаление дублирующего кода; 12. Минификация и сжатие картинок;",
"id": 388274356532809700,
"created_at": "Thu Oct 10 12:06:35 +0000 2013"
},
{
"text": "Ускорение на стороне клиента: 1. Режим стандартов IE, переключение X-UA-Comp заголовком сервера; 2. Подключение стилей как можно выше;",
"id": 388274787547901950,
"created_at": "Thu Oct 10 12:08:17 +0000 2013"
},
{
"text": "3. Избегать блокирующего JS, async/defer; 4. Отложенная загрузка некритичного JS.",
"id": 388274921455231000,
"created_at": "Thu Oct 10 12:08:49 +0000 2013"
},
{
"text": "Модуль ngx_pagspeed для Nginx — http://t.co/x1421Tn7EH",
"id": 388275217317249000,
"created_at": "Thu Oct 10 12:10:00 +0000 2013"
},
{
"text": "Снова звучит совет динамически вставлять &lt;link rel="prefetch" href="…"&gt; в &lt;head&gt; с помощью JS.",
"id": 388275915442372600,
"created_at": "Thu Oct 10 12:12:46 +0000 2013"
},
{
"text": "Меняйте классы у элементов как можно глубже по DOM, чтобы это оказывало как можно меньшее воздействие на перерисовку.",
"id": 388276327985725440,
"created_at": "Thu Oct 10 12:14:25 +0000 2013"
},
{
"text": "Использование createDocumentFragment для хранения DOM-эл. во время динамического создания быстрее для отрисовки, чем постоянная вставка.",
"id": 388276707742212100,
"created_at": "Thu Oct 10 12:15:55 +0000 2013"
},
{
"text": "События, связ. с прокруткой можно оборачивать в буферные функции-замедлители, которые будут запускаться каждые 300мс, а не постоянно.",
"id": 388277595705712640,
"created_at": "Thu Oct 10 12:19:27 +0000 2013"
},
{
"text": "Используйте перекл. классов, а не инлайн-стили. Не делайте ресайз картинок в CSS. Группируйте изменения в DOM.",
"id": 388277694309621760,
"created_at": "Thu Oct 10 12:19:50 +0000 2013"
},
{
"text": "@sapegin, ты отдаёшь себе отчёт, что разговариваешь с трансляцией?",
"id": 388278587763486700,
"created_at": "Thu Oct 10 12:23:23 +0000 2013"
},
{
"text": "Сервис PageSpeed Insights, включая API на 25 000 запросов в день — https://t.co/00u7CCtvo7",
"id": 388279404121845760,
"created_at": "Thu Oct 10 12:26:38 +0000 2013"
},
{
"text": "Как выглядит утечка памяти в инспекторе http://t.co/OqbbNubpDe",
"id": 388279788752101400,
"created_at": "Thu Oct 10 12:28:10 +0000 2013"
},
{
"text": "Сайт Алекса http://t.co/oN5tmjyFhj и он в Твитере @maccaw. Дальше вопросы и ответы.",
"id": 388279987679551500,
"created_at": "Thu Oct 10 12:28:57 +0000 2013"
},
{
"text": "Следующий: Пол Льюис из Chrome DevRel «A developer's guide to rendering performance» http://t.co/NtUndpMJFx",
"id": 388281112872898560,
"created_at": "Thu Oct 10 12:33:25 +0000 2013"
},
{
"text": "Хотите поговорить про быстродействие? Упоминайте тег #perfmatters, тогда вас услышат и другие.",
"id": 388281426745233400,
"created_at": "Thu Oct 10 12:34:40 +0000 2013"
},
{
"text": "Все говорят про загрузку страницы, а я хочу поговорить про то, что происходит потом — как пиксели попадают на экран. То есть про отрисовку.",
"id": 388281616088707100,
"created_at": "Thu Oct 10 12:35:25 +0000 2013"
},
{
"text": "После получения ресурсов и построения дерева DOM, происходит комбинация DOM + CSS = дерево отрисовки. Потом создаётся раскладка, aka layout.",
"id": 388282456618856450,
"created_at": "Thu Oct 10 12:38:46 +0000 2013"
},
{
"text": "Все фигуры, которые рисует браузер — векторные. Их нужно растеризировать, обрезать и прочее, то есть операция «paint» в инспекторе.",
"id": 388283057364811800,
"created_at": "Thu Oct 10 12:41:09 +0000 2013"
},
{
"text": "Все картинки (JPG, GIF, etc) нужно декодировать из форматов и тоже попиксельно нарисовать.",
"id": 388283487469711360,
"created_at": "Thu Oct 10 12:42:52 +0000 2013"
},
{
"text": "Подход «инструменты вместо советов» лучше, поскольку советы устаревают, а инструменты просто считают и показывают что оптимизировать.",
"id": 388284149083430900,
"created_at": "Thu Oct 10 12:45:29 +0000 2013"
},
{
"text": "«Рифмуется — значит правда», как говорит Джейк Арчибальд (про «tools not rools»)",
"id": 388284358911885300,
"created_at": "Thu Oct 10 12:46:19 +0000 2013"
},
{
"text": "Стили, влияющие на перерисовку (и голова Пола). Почти что все http://t.co/25iHYCNlbO",
"id": 388285227636125700,
"created_at": "Thu Oct 10 12:49:46 +0000 2013"
},
{
"text": "Библиотека fastdom для ускорения работы с DOM — https://t.co/n6McJ9qtaX В примере она повысила скорость с 9 до 58 fps.",
"id": 388285746291167200,
"created_at": "Thu Oct 10 12:51:50 +0000 2013"
},
{
"text": "Если нажать клавишу «h» в инспекторе Chrome, то выбранный элемент спрячется. И можно будет увидеть, как он влиял на быстродействие.",
"id": 388286405795147800,
"created_at": "Thu Oct 10 12:54:27 +0000 2013"
},
{
"text": "Если нужно что-то двигать, то убедитесь, что это «что-то» лежит в собственном слое отрисовки. Да-да, тот самый translate3d и другие.",
"id": 388286910772572160,
"created_at": "Thu Oct 10 12:56:28 +0000 2013"
},
{
"text": "Обработка и отрисовка картинок — самое тяжёлое и проблемное для быстродействия. Вот бы нам модификатор для «отложенных» картинок, но нет.",
"id": 388288228597702660,
"created_at": "Thu Oct 10 13:01:42 +0000 2013"
},
{
"text": "jQuery.animate до сих пор работает через таймауты (неэффективно), а не requestAnimationFrame (лучше), но есть патч, который это включает.",
"id": 388288638221844500,
"created_at": "Thu Oct 10 13:03:20 +0000 2013"
},
{
"text": "Тач-обработчики: 1. Уменьшайте количество обработчиков событий; 2. Подключайте событие как можно ближе (по дереву) к целевому элементу.",
"id": 388288921224089600,
"created_at": "Thu Oct 10 13:04:27 +0000 2013"
},
{
"text": "3. Подключайте обработчики как можно позднее.",
"id": 388289023619649540,
"created_at": "Thu Oct 10 13:04:51 +0000 2013"
},
{
"text": "Прокрутка естественно вызыват перерисовку. Избегайте изменений во время прокрутки. Да, параллакс — это убийство браузера.",
"id": 388289693521281000,
"created_at": "Thu Oct 10 13:07:31 +0000 2013"
},
{
"text": "Если вы вставили анимир. GIF-спиннер, то не забудьте не просто прикрыть его загруженным, а выключить, иначе он продолжит отрисовываться.",
"id": 388290033922613250,
"created_at": "Thu Oct 10 13:08:52 +0000 2013"
},
{
"text": "Выводы: 1. Быстродействие — это фича, а не юнит-тест. 2. Вы контролируете то, что получает браузе (отключите box-shadow, у нас флэт-дизайн)",
"id": 388290982053433340,
"created_at": "Thu Oct 10 13:12:38 +0000 2013"
},
{
"text": "3. Сначала профилируйте, потом исправляйте (это нельзя предсказать). 4. Профилируйте раньше и чаще.",
"id": 388291027419037700,
"created_at": "Thu Oct 10 13:12:49 +0000 2013"
},
{
"text": "Следующий на сцене Лукас де Грут «On designing typefaces» http://t.co/I9p3d7hmwB",
"id": 388304499796090900,
"created_at": "Thu Oct 10 14:06:21 +0000 2013"
},
{
"text": "Первая мировая война шрифтов: (Adobe) PS vs. TT (Microsoft). Adobe проиграла и была вынуждена раскрыть секреты PostScript.",
"id": 388305879596285950,
"created_at": "Thu Oct 10 14:11:50 +0000 2013"
},
{
"text": "Непростой процесс хинтинга шрифтов http://t.co/fCGU1tskWJ",
"id": 388307050113277950,
"created_at": "Thu Oct 10 14:16:29 +0000 2013"
},
{
"text": "Хинтинг — это кропотливый ручной процесс искажения оригинальных кривых шрифта для каждого размера, чтобы они ложились на пиксельную сетку.",
"id": 388307876265353200,
"created_at": "Thu Oct 10 14:19:46 +0000 2013"
},
{
"text": "Хинтинг в VTT, софте от Microsoft http://t.co/8uCDVT53KA",
"id": 388308956810330100,
"created_at": "Thu Oct 10 14:24:04 +0000 2013"
},
{
"text": "Типы хинтинга: ч/б, серый, clear type и самый лучший — комбинация серого и clear type.",
"id": 388309597729341440,
"created_at": "Thu Oct 10 14:26:37 +0000 2013"
},
{
"text": "Иногда шрифты хинтуются не под целые пиксели, вроде 1 или 2, а например под 1,3 — такой шрифт Лукас сделал для дисплеев навигаторов Audi.",
"id": 388310589870989300,
"created_at": "Thu Oct 10 14:30:33 +0000 2013"
},
{
"text": "Старинная кернинговая пара http://t.co/J4sljhcrvs",
"id": 388310965533835260,
"created_at": "Thu Oct 10 14:32:03 +0000 2013"
},
{
"text": "Лукас сделал шрифты Calibri и Consolas для Microsoft.",
"id": 388311328903155700,
"created_at": "Thu Oct 10 14:33:29 +0000 2013"
},
{
"text": "Для эффективного кернинга нужны таблицы самых частых буквенных пар для каждого языка.",
"id": 388311679505014800,
"created_at": "Thu Oct 10 14:34:53 +0000 2013"
},
{
"text": "Кернинговые просветы между буквами создают своё впечатление для каждого языка. Те же буквы, но разный кернинг: сравните «dog» и «god».",
"id": 388312400652697600,
"created_at": "Thu Oct 10 14:37:45 +0000 2013"
},
{
"text": "На ретиновых экранах хинтинг не нужен.",
"id": 388312726332010500,
"created_at": "Thu Oct 10 14:39:03 +0000 2013"
},
{
"text": "В LucasFonts только над хинтингом работает целая команда, в частности, один программист и один русский.",
"id": 388313450168213500,
"created_at": "Thu Oct 10 14:41:55 +0000 2013"
},
{
"text": "Информация о поддержке и работе веб-шрифтах на сайте компании Лукаса — http://t.co/RQksYmWsJe",
"id": 388313605432963100,
"created_at": "Thu Oct 10 14:42:32 +0000 2013"
},
{
"text": "Сложнее всего локализовывать шрифты. Лукас потратил по 6 лет на греческий и кириллицу и арабский. Так что хинтинг — это ерунда, в сравнении.",
"id": 388314057973182460,
"created_at": "Thu Oct 10 14:44:20 +0000 2013"
},
{
"text": "Можно определять какое устройство запрашивает шрифт и отдавать его без хинтинга, например, для iOS и OS X.",
"id": 388314673013338100,
"created_at": "Thu Oct 10 14:46:47 +0000 2013"
},
{
"text": "Первые буквы Лукас сделал в 6 лет. В туалете. (цитата, со слов его матери)",
"id": 388315729629839360,
"created_at": "Thu Oct 10 14:50:59 +0000 2013"
},
{
"text": "Секция примеров из реальной практики: Эд Соуден рассказывает про разработку GOV.UK http://t.co/2qpSCTNq12",
"id": 388316396406714400,
"created_at": "Thu Oct 10 14:53:38 +0000 2013"
},
{
"text": "Сайт https://t.co/MukTVJpGK2 построен по принципу «сначала мобильные». Они поддерживают не браузеры, а пользователей. То есть IE6.",
"id": 388316806920044540,
"created_at": "Thu Oct 10 14:55:16 +0000 2013"
},
{
"text": "Набор инструментов (SASS и JS), созданный для разработки https://t.co/MukTVJpGK2 — https://t.co/BXaUydHG4m",
"id": 388317119689261060,
"created_at": "Thu Oct 10 14:56:30 +0000 2013"
},
{
"text": "Для IE6 сайт отдаётся как для мобильных в одну колонку, чтобы избежать возни с багами, но всё же донести информацию.",
"id": 388317657852018700,
"created_at": "Thu Oct 10 14:58:38 +0000 2013"
},
{
"text": "На сайте 7 базовых размеров шрифта, содержащихся в SASS-переменных. Эти переменные реагируют на размер вьюпорта и соотв. изменяются.",
"id": 388318389258956800,
"created_at": "Thu Oct 10 15:01:33 +0000 2013"
},
{
"text": "Всё, о чём шла речь, повторимся, на Гитхабе: https://t.co/BXaUydHG4m",
"id": 388318530833502200,
"created_at": "Thu Oct 10 15:02:07 +0000 2013"
},
{
"text": "Следующий: Антон Ванхаук рассказывает про сайт планирования транспорта http://t.co/gI2Ksw3DRa http://t.co/2qpSCTNq12",
"id": 388321295295070200,
"created_at": "Thu Oct 10 15:13:06 +0000 2013"
},
{
"text": "Его компанию попросили только «немного освежить дизайн», они переделали весь сайт до неузнаваемости.",
"id": 388321548769452000,
"created_at": "Thu Oct 10 15:14:06 +0000 2013"
},
{
"text": "Они попытались сделать из сайта не робота «доброе время суток», а попутчика «привет, куда едешь?»",
"id": 388322122160156700,
"created_at": "Thu Oct 10 15:16:23 +0000 2013"
},
{
"text": "Новые иконки, эмоциональные фотографии, идея «9292 путешествует с тобой».",
"id": 388322372019032060,
"created_at": "Thu Oct 10 15:17:22 +0000 2013"
},
{
"text": "Вместо кучи полей — умное выпадающее поле с подсказками, которое угадывает запрос http://t.co/njG8YAMG90",
"id": 388323096182390800,
"created_at": "Thu Oct 10 15:20:15 +0000 2013"
},
{
"text": "Следующая: Элани Оливьер про музей Rijksmuseum http://t.co/2qpSCTNq12",
"id": 388324430575063040,
"created_at": "Thu Oct 10 15:25:33 +0000 2013"
},
{
"text": "Сайт музея https://t.co/36UC0Qb0JV",
"id": 388326713505366000,
"created_at": "Thu Oct 10 15:34:37 +0000 2013"
},
{
"text": "Все картины музея доступны бесплатно на сайте для загрузки в высоком разрешении.",
"id": 388326861832732700,
"created_at": "Thu Oct 10 15:35:13 +0000 2013"
},
{
"text": "Терабайт картин, разбитых на тайлы http://t.co/m63L54QNcU",
"id": 388327226808479740,
"created_at": "Thu Oct 10 15:36:40 +0000 2013"
},
{
"text": "Целевая аудитория сайта музея — двое вечером на диване с Айпадом. Идея: не тащить людей в музей, а принести музей в их дом.",
"id": 388327437584826400,
"created_at": "Thu Oct 10 15:37:30 +0000 2013"
},
{
"text": "Задача была: сайт для десктопа (IE8+) и мобильных (от телефона до планшета). Всё это под большим контролем за качеством со стороны клиента.",
"id": 388328208611176450,
"created_at": "Thu Oct 10 15:40:34 +0000 2013"
},
{
"text": "С проектом торопились, поэтому не тестировали на Андроиде. О чём жалеют, но уповают на сроки.",
"id": 388328476937560060,
"created_at": "Thu Oct 10 15:41:38 +0000 2013"
},
{
"text": "Работали по Аджайлу, было проще с приоритетами http://t.co/WVLD6sGBM0",
"id": 388328868920455200,
"created_at": "Thu Oct 10 15:43:11 +0000 2013"
},
{
"text": "Разработали в процессе свой CSS-фреймворк, что значительно ускорило разработку после начального этапа.",
"id": 388329050395381760,
"created_at": "Thu Oct 10 15:43:55 +0000 2013"
},
{
"text": "Разработали даже API для работы с материалами сайта, должны выпустить скоро.",
"id": 388329551568597000,
"created_at": "Thu Oct 10 15:45:54 +0000 2013"
},
{
"text": "В: Как вам удалось выложить все картины бесплатно? О: Цель — привлечь внимание к картинам, чтобы пришли посмотреть на оригинал. Это работает",
"id": 388330141946232800,
"created_at": "Thu Oct 10 15:48:15 +0000 2013"
},
{
"text": "На сцене Oliver Reichenstein и «Responsive typography» http://t.co/pAcSBRp0sD",
"id": 388559390904963100,
"created_at": "Fri Oct 11 06:59:12 +0000 2013"
},
{
"text": "Доброе утро! Мы начинаем http://t.co/EFE0ElXvM6",
"id": 388559659671756800,
"created_at": "Fri Oct 11 07:00:16 +0000 2013"
},
{
"text": "Первая версия сайта iA http://t.co/1QtIA4X9LO",
"id": 388560031798820860,
"created_at": "Fri Oct 11 07:01:45 +0000 2013"
},
{
"text": "В вебе всегда было шумно, поэтому Оливер начал первый сайт агентства почти без CSS.",
"id": 388560200082665500,
"created_at": "Fri Oct 11 07:02:25 +0000 2013"
},
{
"text": "Всё началось со статьи «Web Design is 95% Typography» в 2006 году http://t.co/3A9gq8cYDU",
"id": 388560355267735550,
"created_at": "Fri Oct 11 07:03:02 +0000 2013"
},
{
"text": "Оливер изучал философию и совсем не дизайнер, тем более не специалист по типографике.",
"id": 388560547194867700,
"created_at": "Fri Oct 11 07:03:48 +0000 2013"
},
{
"text": "Неужели так сложно выбрать шрифт для брендинга компании? Это кажется таким простым делом.",
"id": 388560903140311040,
"created_at": "Fri Oct 11 07:05:13 +0000 2013"
},
{
"text": "Веб был полон Верданой и Ариалом. Потом появилась Джорджия! В 2005 году она выглядела чем-то новым.",
"id": 388561457048461300,
"created_at": "Fri Oct 11 07:07:25 +0000 2013"
},
{
"text": "Типографика не о том, как выбирать шрифты, а о том, как именно их использовать.",
"id": 388561774985089000,
"created_at": "Fri Oct 11 07:08:40 +0000 2013"
},
{
"text": "Как же начать разбираться? Можно прочитать несколько книг, но они довольно сложные.",
"id": 388562068389232640,
"created_at": "Fri Oct 11 07:09:50 +0000 2013"
},
{
"text": "Оливер начал с выбора размера шрифта. Шрифт в вебе слишком мелкий. Всё потому, что веб-дизайнеры скрючены над экраном и напряжены.",
"id": 388562315270172700,
"created_at": "Fri Oct 11 07:10:49 +0000 2013"
},
{
"text": "Обычные люди читают текст в вебе расслабленно, на некотором расстоянии от экрана. Им не нужно выискивать пискели.",
"id": 388562485391138800,
"created_at": "Fri Oct 11 07:11:30 +0000 2013"
},
{
"text": "Оливер взял книгу, поместил её на комфортное расстояние от глаз и сравнил с экраном. Экран обычно гораздо дальше.",
"id": 388562794213568500,
"created_at": "Fri Oct 11 07:12:43 +0000 2013"
},
{
"text": "Оптимальным размером оказались 16 пикселей Джорджией. В 2005 году это звучало полным безумием, особенно на небольших экранах тех лет.",
"id": 388563121453150200,
"created_at": "Fri Oct 11 07:14:01 +0000 2013"
},
{
"text": "«Этот человек безумен, как он может заставлять нас читать такой огромный текст?» — говорили многие.",
"id": 388563282665435140,
"created_at": "Fri Oct 11 07:14:40 +0000 2013"
},
{
"text": "Для экранов с подсветкой для того, чтобы избежать «эффекта зебры» пришлось также увеличить высоту строки.",
"id": 388563484545650700,
"created_at": "Fri Oct 11 07:15:28 +0000 2013"
},
{
"text": "Также было принято, что шрифты с засечками не работают на экране, основанное на каком-то исследовании 1992 года.",
"id": 388563845994000400,
"created_at": "Fri Oct 11 07:16:54 +0000 2013"
},
{
"text": "В исследовании сравнивали что-то вроде 10-пиксельного Таймса с Верданой на плохом экране и конечно Вердана выигрывала.",
"id": 388564030337876000,
"created_at": "Fri Oct 11 07:17:38 +0000 2013"
},
{
"text": "Ситуация усложнилась: появились телефоны, планшеты, ретина, макбуки с крошечными пикселями.",
"id": 388564567988895740,
"created_at": "Fri Oct 11 07:19:46 +0000 2013"
},
{
"text": "Вьюпорт, то есть ширина экрана, это не главное. Крайне важно расстояние до экрана. Поэтому даже формула «16 пикселей» не работает.",
"id": 388564984630104060,
"created_at": "Fri Oct 11 07:21:26 +0000 2013"
},
{
"text": "Шрифтовики не сразу поняли, зачем изменять шрифты для экрана. «Ты меняешь высоту строки, которую я установил для шрифта?».",
"id": 388565918793887740,
"created_at": "Fri Oct 11 07:25:08 +0000 2013"
},
{
"text": "Первое впечатление от ретины: мы можем просто использовать обычные шрифты, как на бумаге и не париться. Но всё не так, это по-прежнему экран",
"id": 388566134641131500,
"created_at": "Fri Oct 11 07:26:00 +0000 2013"
},
{
"text": "Приходится напрягать воображение, чтобы представлять, что справа всё ещё Джорджия http://t.co/d3LKvPtCgz",
"id": 388566735873646600,
"created_at": "Fri Oct 11 07:28:23 +0000 2013"
},
{
"text": "Оливер ссылается на статью «Font Hinting and the Future of Responsive Typography» http://t.co/Xnm1TdJM6u",
"id": 388567338783879200,
"created_at": "Fri Oct 11 07:30:47 +0000 2013"
},
{
"text": "Даже сглаживание на экране делает шрифт чуть жирнее, чем он есть на самом деле, несмотря на огромные усилия по хинтингу.",
"id": 388567589582282750,
"created_at": "Fri Oct 11 07:31:47 +0000 2013"
},
{
"text": "На ретине тонкие шрифты слишком тонкие, на обычном экране чуть толще, чем нужно.",
"id": 388567743714590700,
"created_at": "Fri Oct 11 07:32:24 +0000 2013"
},
{
"text": "Так было и раньше: для разной бумаги, разных размеров шрифта нужно было применять разные литеры.",
"id": 388568096396832800,
"created_at": "Fri Oct 11 07:33:48 +0000 2013"
},
{
"text": "Чем меньше шрифт, тем жирнее должна быть форма буквы http://t.co/qKgmyoM71X",
"id": 388568277850783740,
"created_at": "Fri Oct 11 07:34:31 +0000 2013"
},
{
"text": "Уж не говоря про ловушки для краски на острых стыках кривых.",
"id": 388568427532914700,
"created_at": "Fri Oct 11 07:35:07 +0000 2013"
},
{
"text": "Усилия по выбору правильной насыщенности стоят того, хоть и не всегда заметны с первого взгляда http://t.co/uvjX1xqw5I",
"id": 388568877527212000,
"created_at": "Fri Oct 11 07:36:54 +0000 2013"
},
{
"text": "Причём от экрана к экрану нужна разная насыщенность. Что сложно объяснить традиционным шрифтовикам.",
"id": 388569218608005100,
"created_at": "Fri Oct 11 07:38:15 +0000 2013"
},
{
"text": "Оливер решил воссоздать шрифт из старой книги и так и провалился в кроличью нору http://t.co/2fDwk4nT67",
"id": 388571139364364300,
"created_at": "Fri Oct 11 07:45:53 +0000 2013"
},
{
"text": "Одним из первых экспериментов был шрифт iABC http://t.co/YUdoZMz9uZ",
"id": 388571554403332100,
"created_at": "Fri Oct 11 07:47:32 +0000 2013"
},
{
"text": "«Ты сделал шрифт за год? Молодец, только не показывай никому», — сказали маститые шрифтовики.",
"id": 388572381209698300,
"created_at": "Fri Oct 11 07:50:49 +0000 2013"
},
{
"text": "Сайт iA с отзывчивой типографикой, хотя маститые шрифтовики всё равно видят множество проблем — http://t.co/HwPTLkOo8y",
"id": 388573149526523900,
"created_at": "Fri Oct 11 07:53:52 +0000 2013"
},
{
"text": "Оливер опасается открывать шрифтовые программы, чтобы не его снова не засосала эта пучина.",
"id": 388573475914657800,
"created_at": "Fri Oct 11 07:55:10 +0000 2013"
},
{
"text": "Следующая на сцене Garann Means «How to rewrite your JS app (at least) 10 times» http://t.co/IxcpS3vWy1",
"id": 388574147250753540,
"created_at": "Fri Oct 11 07:57:50 +0000 2013"
},
{
"text": "Гэран написала книгу про Node.js для фронтендеров http://t.co/Gs0JsRegtA",
"id": 388574350162796540,
"created_at": "Fri Oct 11 07:58:39 +0000 2013"
},
{
"text": "Писать код просто — планировать его сложно.",
"id": 388574855920353300,
"created_at": "Fri Oct 11 08:00:39 +0000 2013"
},
{
"text": "Но мы привыкли слишком приотизировать часть работы, связанную с кодом и забывать про планирование.",
"id": 388575014347628540,
"created_at": "Fri Oct 11 08:01:17 +0000 2013"
},
{
"text": "Но если ты переписываешь что-то, то возникают другие проблемы http://t.co/4cwgzWiHVe",
"id": 388575316924698600,
"created_at": "Fri Oct 11 08:02:29 +0000 2013"
},
{
"text": "Но есть много причин, чтобы переписать код: новые технологии, апгрейд инфраструктуры, рост бизнеса, рефакторинг или просто ВСЁ СЛОМАЛОСЬ.",
"id": 388575647351988200,
"created_at": "Fri Oct 11 08:03:48 +0000 2013"
},
{
"text": "Плохой вариант, когда у вас есть 20% приложения и тут вы понимаете, что всё неправильно и выбрасываете код. Лучше так не делать.",
"id": 388575947311829000,
"created_at": "Fri Oct 11 08:04:59 +0000 2013"
},
{
"text": "Плохие идеи по переписыванию чего-то:",
"id": 388576136248426500,
"created_at": "Fri Oct 11 08:05:44 +0000 2013"
},
{
"text": "1. Давайте используем новый фреймворк! Куча постов о нём, кто-то его пробовал на хакатоне, это 100% MVC — чем не причина.",
"id": 388576366360555500,
"created_at": "Fri Oct 11 08:06:39 +0000 2013"
},
{
"text": "И вы такой пишете пару строк и фреймворк делает инициализацию за вас. И модели, и данные… И тут вас всё-таки приходится писать что-то самому",
"id": 388576614348754940,
"created_at": "Fri Oct 11 08:07:38 +0000 2013"
},
{
"text": "Так и работают фреймворки: решают простые проблемы, предлагают абстракции, но не помогают организовать именно ваше приложение.",
"id": 388576827146788860,
"created_at": "Fri Oct 11 08:08:29 +0000 2013"
},
{
"text": "Выбирайте фреймворк последним. Это не должно быть причиной для написания приложения. Он должен оставаться инструментом.",
"id": 388576975117643800,
"created_at": "Fri Oct 11 08:09:04 +0000 2013"
},
{
"text": "Другой вариант: 2. Давайте напишем наш собственный фреймворк! Весь код будет знаком, специально для вашего приложения, только нужное внутри.",
"id": 388577149495808000,
"created_at": "Fri Oct 11 08:09:46 +0000 2013"
},
{
"text": "В итоге вы переписываете уже знакомые вам фреймворки, только с блекджеком и прочим. С минимальной разницей и на это уходит слишком много сил",
"id": 388577401124708350,
"created_at": "Fri Oct 11 08:10:46 +0000 2013"
},
{
"text": "Правило: пишите одновременно только одно приложение. Как бы ни круто было писать пять штук сразу.",
"id": 388577659615473660,
"created_at": "Fri Oct 11 08:11:48 +0000 2013"
},
{
"text": "Пишите API сразу и сразу сквозь всё приложение, для всех вещей.",
"id": 388578444772409340,
"created_at": "Fri Oct 11 08:14:55 +0000 2013"
},
{
"text": "Или так: 3. Так может сделаем всё не на JS, а на сервере… на PHP?",
"id": 388578674523766800,
"created_at": "Fri Oct 11 08:15:50 +0000 2013"
},
{
"text": "Когда позже что-то нужно отладить, исправить, дописать — выходит, что было проще использовать один и тот же язык для клиента и сервера.",
"id": 388579190477705200,
"created_at": "Fri Oct 11 08:17:53 +0000 2013"
},
{
"text": "Или вот: 4. Давайте перепишем всё сами, даже браузерый DOM.",
"id": 388579534532280300,
"created_at": "Fri Oct 11 08:19:15 +0000 2013"
},
{
"text": "Или загрузчик файлов: сделаем его умным, красивым, с прогресс-баром… и Flash-роликом, который всё загружает.",
"id": 388579744851447800,
"created_at": "Fri Oct 11 08:20:05 +0000 2013"
},
{
"text": "И тут в JS появляются всякие Flash-привязки. А потом фолбек на обычный загрузчик, а потом ещё и на XHR, а потом…",
"id": 388579905946275840,
"created_at": "Fri Oct 11 08:20:43 +0000 2013"
},
{
"text": "Так может сразу стоило начать с базовых вещей, которые есть в браузере и сделать их лучше поверх существующего?",
"id": 388580070170050560,
"created_at": "Fri Oct 11 08:21:22 +0000 2013"
},
{
"text": "DOM — плохое место для хранения данных. Это дорого и сложно. Данные заслуживают отдельного, настоящего хранилища.",
"id": 388581086143717400,
"created_at": "Fri Oct 11 08:25:25 +0000 2013"
},
{
"text": "Или так: есть плагин или модуль для решения нашей задачи! Кто-то его написал, кому-то он помог. Давайте его возьмём.",
"id": 388581322421440500,
"created_at": "Fri Oct 11 08:26:21 +0000 2013"
},
{
"text": "В итоге вам приходится подстраиваться под то, что плагин возвращает, чистить его от лишних классов и кода.",
"id": 388581601707581440,
"created_at": "Fri Oct 11 08:27:28 +0000 2013"
},
{
"text": "И в итоге вы его переписываете. Точнее, дописываете на основе существующего. Но это уже не плагин, это кусок чужого кода.",
"id": 388581743726694400,
"created_at": "Fri Oct 11 08:28:01 +0000 2013"
},
{
"text": "Так может стоило сразу написать самому, не делая кривые решения на основе чужих ошибок?",
"id": 388581922479554560,
"created_at": "Fri Oct 11 08:28:44 +0000 2013"
},
{
"text": "Бывает и так: раз это MVC, то не нужно никакой системы зависимостей.",
"id": 388582123864850400,
"created_at": "Fri Oct 11 08:29:32 +0000 2013"
},
{
"text": "Отсутств. модульности приводит к бардаку в коде. Полагаться на глобальные переменные опасно. Приходится следить за порядком подкл. завис-тей",
"id": 388582967083548700,
"created_at": "Fri Oct 11 08:32:53 +0000 2013"
},
{
"text": "Или даже: у вас есть ужасный движок и вы находите инструмент или фреймворк, совместимый с этим ужасным. И вы радостно его используете.",
"id": 388583252224901100,
"created_at": "Fri Oct 11 08:34:01 +0000 2013"
},
{
"text": "Переписывание внешних мелочей приведёт вас к такому же плохому коду, который у вас есть в основном коде.",
"id": 388583487680573440,
"created_at": "Fri Oct 11 08:34:57 +0000 2013"
},
{
"text": "Или так: мы нашли крутую штуку, которая всё решает. Давайте её использовать. Так, что у нас за проблема?",
"id": 388583649874305000,
"created_at": "Fri Oct 11 08:35:36 +0000 2013"
},
{
"text": "Но решает ли эта штука проблему? Нужно сначала сформулировать проблему, а потом искать решение.",
"id": 388583805260677100,
"created_at": "Fri Oct 11 08:36:13 +0000 2013"
},
{
"text": "Сложно избежать полного переписывания. И лучше конечно сделать так, чтобы переписать всё только один раз, а не делать это постоянно.",
"id": 388584518548226050,
"created_at": "Fri Oct 11 08:39:03 +0000 2013"
},
{
"text": "Не начинайте писать код до тех пор, пока у вас нет плана разработки.",
"id": 388584780344070140,
"created_at": "Fri Oct 11 08:40:05 +0000 2013"
},
{
"text": "Хорошее план спасёт вас от десятка переписываний приложения.",
"id": 388585009327915000,
"created_at": "Fri Oct 11 08:41:00 +0000 2013"
},
{
"text": "Сайт http://t.co/yQ8b19cz4b и Твитер @garannm Гэран.",
"id": 388585124172165100,
"created_at": "Fri Oct 11 08:41:27 +0000 2013"
},
{
"text": "Следующий после перерыва: «The importance of Firefox OS» Sergi Mansilla http://t.co/jjbP4YZ8vm",
"id": 388586494279290900,
"created_at": "Fri Oct 11 08:46:54 +0000 2013"
},
{
"text": "Мозилла на сцене http://t.co/bo4ER4XBEO",
"id": 388592910163529700,
"created_at": "Fri Oct 11 09:12:24 +0000 2013"
},
{
"text": "Сайт Сергия http://t.co/SFYNtl6wmr",
"id": 388593391367634940,
"created_at": "Fri Oct 11 09:14:18 +0000 2013"
},
{
"text": "Сергий работает в норвежском телекоме Telenor над Firefox OS",
"id": 388593523312050200,
"created_at": "Fri Oct 11 09:14:50 +0000 2013"
},
{
"text": "Проблема: написал один раз… запустил один раз. (На одной платформе). http://t.co/ty9DA9YYkN",
"id": 388594003236888600,
"created_at": "Fri Oct 11 09:16:44 +0000 2013"
},
{
"text": "Несовместимые API платформ, плата за разработку, различные инструменты для каждой, ограничения апсторов.",
"id": 388594215254769660,
"created_at": "Fri Oct 11 09:17:35 +0000 2013"
},
{
"text": "Пользователи страдают http://t.co/48fNBNp8fK",
"id": 388594460680286200,
"created_at": "Fri Oct 11 09:18:33 +0000 2013"
},
{
"text": "Решение — HTML5. Речь о наборе технологий, а не о модном бессмысленном словечке",
"id": 388594652309643260,
"created_at": "Fri Oct 11 09:19:19 +0000 2013"
},
{
"text": "WebRTC, IndexedDB, ASM.js, etc.",
"id": 388594753102962700,
"created_at": "Fri Oct 11 09:19:43 +0000 2013"
},
{
"text": "Среди современных устройств разве что тостеры не поддерживают HTML5.",
"id": 388594913061126140,
"created_at": "Fri Oct 11 09:20:21 +0000 2013"
},
{
"text": "Но мы снова и снова не используем общую платформу в виде HTML5 и пишем разных код для разных устройств.",
"id": 388595066367143940,
"created_at": "Fri Oct 11 09:20:58 +0000 2013"
},
{
"text": "HTML5 API одинаковы на всех устройствах, где есть браузеры, совместимые с веб-стандартами.",
"id": 388595354696175600,
"created_at": "Fri Oct 11 09:22:06 +0000 2013"
},
{
"text": "Конечно на каждой платформе есть отличия в HTML5, но веб-разработчики привыкли к такому и знают, что с этим делать.",
"id": 388595565426389000,
"created_at": "Fri Oct 11 09:22:57 +0000 2013"
},
{
"text": "Backbone, Knockout, Angular, etc. — нет никаких ограничений по использованию подходов к разработке, в отличие от нативных платформ.",
"id": 388595859669393400,
"created_at": "Fri Oct 11 09:24:07 +0000 2013"
},
{
"text": "Аргумент про быстродействие веб-приложений — ерунда. Ответ Sencha на заявление про «медленный HTML5» от Facebook http://t.co/Nwqae41IOg",
"id": 388596347630518300,
"created_at": "Fri Oct 11 09:26:03 +0000 2013"
},
{
"text": "Конечно это потребовало трюков: &lt;iframe&gt; для каждой из частей приложения, что рендерило их в отдельных процессах.",
"id": 388596657354731500,
"created_at": "Fri Oct 11 09:27:17 +0000 2013"
},
{
"text": "Unreal Engine 3 in Firefox with asm.js — http://t.co/TFDQafy1jr",
"id": 388596865090211840,
"created_at": "Fri Oct 11 09:28:07 +0000 2013"
},
{
"text": "Ещё аргумент про ужасный JS, как язык. Но JS меняется к лучшему: классы, модульность.",
"id": 388597118954663940,
"created_at": "Fri Oct 11 09:29:07 +0000 2013"
},
{
"text": "Кроме того, есть десяток языков, компилирующихся в JS: от CoffeScript до Dart, LiveScript, Objective-J.",
"id": 388597307958390800,
"created_at": "Fri Oct 11 09:29:52 +0000 2013"
},
{
"text": "Список вариантов «Web coding beyond JavaScript» http://t.co/RAxf75Geo4",
"id": 388597474908467200,
"created_at": "Fri Oct 11 09:30:32 +0000 2013"
},
{
"text": "Другой аргумент: сайты выглядят плохо, незаконченно по сравнению с приложениями. Но дело исключительно в количестве вложенных усилий.",
"id": 388597740034588700,
"created_at": "Fri Oct 11 09:31:35 +0000 2013"
},
{
"text": "Первый нормальный аргумент: API к железу устройств. То есть отсутствие доступа к ним из JS.",
"id": 388597931970166800,
"created_at": "Fri Oct 11 09:32:21 +0000 2013"
},
{
"text": "Но ситуация улучшается благодаря: Appcelerator, PhoneGap (особенно версия 2).",
"id": 388598184630816800,
"created_at": "Fri Oct 11 09:33:21 +0000 2013"
},
{
"text": "Поначалу вещи вроде PhoneGap были даже запрещены в App Store http://t.co/yQSLYjEIxo",
"id": 388598636554485760,
"created_at": "Fri Oct 11 09:35:09 +0000 2013"
},
{
"text": "Мозилла помогла разрушить монополию IE в начале нулевых. То же делает и Firefox OS, чтобы освободить разработчиков от рамок платформ.",
"id": 388598947872534500,
"created_at": "Fri Oct 11 09:36:23 +0000 2013"
},
{
"text": "Мозилла работает над стандартизацией API для железа устройств. Вы не обязаны пользоваться апстором Мозиллы, хотя он есть.",
"id": 388599146346971140,
"created_at": "Fri Oct 11 09:37:10 +0000 2013"
},
{
"text": "Начать делать приложение для Firefox OS просто http://t.co/b0Df8xfI34",
"id": 388599472521248800,
"created_at": "Fri Oct 11 09:38:28 +0000 2013"
},
{
"text": "Плюс манифест http://t.co/gizaq7rb0S",
"id": 388599561851514900,
"created_at": "Fri Oct 11 09:38:50 +0000 2013"
},
{
"text": "Главная фича Firefox OS — отладка прямо в браузере. Это удобнее, чем всё, что есть на других платформах.",
"id": 388600427866239000,
"created_at": "Fri Oct 11 09:42:16 +0000 2013"
},
{
"text": "Есть расширение App Manager для Firefox, которое упрощает разработку и тестирование https://t.co/kzU60lxzPR",
"id": 388600973247402000,
"created_at": "Fri Oct 11 09:44:26 +0000 2013"
},
{
"text": "Расширение может подключаться к телефону и получать доступ к приложениям, установленным на телефоне и отлаживать их",
"id": 388601158912446460,
"created_at": "Fri Oct 11 09:45:10 +0000 2013"
},
{
"text": "Связь отладчик — телефон двусторонняя.",
"id": 388601270866829300,
"created_at": "Fri Oct 11 09:45:37 +0000 2013"
},
{
"text": "Другое расширение: симулятор Firefox OS https://t.co/ZRu6Uf8RBw",
"id": 388601665651507200,
"created_at": "Fri Oct 11 09:47:11 +0000 2013"
},
{
"text": "Brick http://t.co/OueTaRov2I — UI-компоненты для современных веб-приложений.",
"id": 388601835969581060,
"created_at": "Fri Oct 11 09:47:52 +0000 2013"
},
{
"text": "Набор шаблонов для веб-приложений: https://t.co/Y4NODE22sN Материалы для обучения: https://t.co/xzc1w8IOcX",
"id": 388602188093997060,
"created_at": "Fri Oct 11 09:49:16 +0000 2013"
},
{
"text": "В магазине приложений для Firefox OS простой процесс одобрения, без лишних ограничений — https://t.co/Mm3oO1UiOr",
"id": 388602750868926460,
"created_at": "Fri Oct 11 09:51:30 +0000 2013"
},
{
"text": "Следующий на сцене Гарри Робертс «Rationalising designs for better quality code» http://t.co/YSQiGrQ1o5",
"id": 388605266432098300,
"created_at": "Fri Oct 11 10:01:30 +0000 2013"
},
{
"text": "Второе название доклада; Рационализация дизайна для лучшего качества CSS http://t.co/zy83bFu5Kz",
"id": 388605805643444200,
"created_at": "Fri Oct 11 10:03:38 +0000 2013"
},
{
"text": "Третье, честное, название: Почему дизайнеры ненавидят меня.",
"id": 388605914993164300,
"created_at": "Fri Oct 11 10:04:04 +0000 2013"
},
{
"text": "Если вы не согласны с идеями Гарри, пишите ваши мнения с тегом #DesignersHateHim",
"id": 388606369278210050,
"created_at": "Fri Oct 11 10:05:53 +0000 2013"
},
{
"text": "Разработчики жалуются про плохой PSD не дизайнерам, а коллегам. Много нытья и расстроенных верстальщиков.",
"id": 388606644458115100,
"created_at": "Fri Oct 11 10:06:58 +0000 2013"
},
{
"text": "Гарри работает в большой британский медиакомпании Sky http://t.co/q5nVa13Xcd",
"id": 388606910125342700,
"created_at": "Fri Oct 11 10:08:02 +0000 2013"
},
{
"text": "Как фронтенд-разрабочик, Гарри связывает программистов с дизайнерами и часто принимает решения по оптимизации дизайна для лучшего соотв.",
"id": 388607329455046660,
"created_at": "Fri Oct 11 10:09:41 +0000 2013"
},
{
"text": "Я не анти-дизайнер, как может показаться. Этот подход может не сработать в некоторых ситуациях (для крошечных и огромных сайтов).",
"id": 388607767977922560,
"created_at": "Fri Oct 11 10:11:26 +0000 2013"
},
{
"text": "Компромисс — это хорошо: для поддержания хороших отношений с дизайнерами, для совместной эффективной работы, но «нет» значит «нет».",
"id": 388608002397569000,
"created_at": "Fri Oct 11 10:12:22 +0000 2013"
},
{
"text": "В Sky до сих пор существует процесс PSD — разработка — и т.д. Но большая организация не меняется в один день.",
"id": 388608387719901200,
"created_at": "Fri Oct 11 10:13:54 +0000 2013"
},
{
"text": "PSD — это идея, а не контракт. И он обязательно изменится: сам или уже в коде.",
"id": 388608886745616400,
"created_at": "Fri Oct 11 10:15:53 +0000 2013"
},
{
"text": "Типичная фраза «Это возможно, но…» Почти всё можно сделать, но это не значит, что это нужно делать и это хорошая идея в целом.",
"id": 388609132544413700,
"created_at": "Fri Oct 11 10:16:51 +0000 2013"
},
{
"text": "Быстродействие — прежде всего. Особенно когда об этом думают даже дизайнеры. И у нас в Sky так и происходит.",
"id": 388609880984387600,
"created_at": "Fri Oct 11 10:19:50 +0000 2013"
},
{
"text": "Если можно достичь 80% дизайна используя 20% кода — это именно то, что нужно сделать.",
"id": 388610013193064450,
"created_at": "Fri Oct 11 10:20:21 +0000 2013"
},
{
"text": "Это правило называется «80:20», запомните его.",
"id": 388610161394581500,
"created_at": "Fri Oct 11 10:20:57 +0000 2013"
},
{
"text": "Интересный вопрос: «Хм, я думал ты хороший разработчик? Почему ты не можешь это реализовать?»",
"id": 388610375933251600,
"created_at": "Fri Oct 11 10:21:48 +0000 2013"
},
{
"text": "Работа фронтендера гораздо важнее, чем просто воссоздать PSD в HTML и CSS. Ответственность гораздо выше.",
"id": 388610587720433660,
"created_at": "Fri Oct 11 10:22:38 +0000 2013"
},
{
"text": "Чем лучше, ты пишешь код, тем меньше тебе хочется делать это.",
"id": 388610857573552100,
"created_at": "Fri Oct 11 10:23:43 +0000 2013"
},
{
"text": "Лучше не писать код, который можно не писать. Перерабатывайте, переиспользуйте, нормализуйте, добавляется абстракций.",
"id": 388611274487398400,
"created_at": "Fri Oct 11 10:25:22 +0000 2013"
},
{
"text": "Когда дизайнер делает отступ снизу то 20px, то 22px, то 18px — пользователь не заметит разницы. Это стоит нормализовать до 20px",
"id": 388611573788712960,
"created_at": "Fri Oct 11 10:26:33 +0000 2013"
},
{
"text": "Вместо написания селекторов через запятую и 20px для них, лучше использовать переменную $padding: 20px и препроцессор.",
"id": 388611830119424000,
"created_at": "Fri Oct 11 10:27:35 +0000 2013"
},
{
"text": "Использовали что-то 3 раза и больше? Вынесите это в абстракцию, переиспользуйте.",
"id": 388612214825173000,
"created_at": "Fri Oct 11 10:29:06 +0000 2013"
},
{
"text": "CSS это язык, основанный на правилах (rules). Но если дизан не основан на правилах, то его крайне сложно передать в правилах.",
"id": 388612463593541600,
"created_at": "Fri Oct 11 10:30:06 +0000 2013"
},
{
"text": "Стоит помочь дизайнеру начать думать правилами, что не отменяет творчества.",
"id": 388612534825402400,
"created_at": "Fri Oct 11 10:30:23 +0000 2013"
},
{
"text": "Правила — это то, что не стоит нарушать, иначе одно потянет за собой другое и от системы ничего не останется.",
"id": 388612989794144260,
"created_at": "Fri Oct 11 10:32:11 +0000 2013"
},
{
"text": "Начало обычного проекта: html { font-size:16px; line-height:24px } В итоге 24px становится ключевым размером для отступов всего проекта.",
"id": 388613594600185860,
"created_at": "Fri Oct 11 10:34:35 +0000 2013"
},
{
"text": "Случайные числа в отступах и размерах ведут к непониманию. Лучше выбирать базовую величину и считать многое от неё. Например, те же l-h:24px",
"id": 388613886385348600,
"created_at": "Fri Oct 11 10:35:45 +0000 2013"
},
{
"text": "Стоит нормализовать и рационализировать решения в дизайне: если уменьшать или увеличивать что-то, то ровно в 2 раза, например.",
"id": 388614349948190700,
"created_at": "Fri Oct 11 10:37:35 +0000 2013"
},
{
"text": "Не стоит реализовывать дизайн в лоб — картинка так картинка, можно использовать что угодно и сделать так, чтобы оно просто выглядело похоже.",
"id": 388615321734905860,
"created_at": "Fri Oct 11 10:41:27 +0000 2013"
},
{
"text": "Если вместо вставки картинки можно сделать пару рамочек, то лучше упростить её немного и реализовать проще.",
"id": 388615612970594300,
"created_at": "Fri Oct 11 10:42:36 +0000 2013"
},
{
"text": "Ищите альтернативы, меняйте дизайн, рационализируйте и нормализуйте его.",
"id": 388615747431575550,
"created_at": "Fri Oct 11 10:43:08 +0000 2013"
},
{
"text": "Наша задача не выпустить хороший дизайн, а сделать работающий продукт, который хорошо выглядит.",
"id": 388615872115638300,
"created_at": "Fri Oct 11 10:43:38 +0000 2013"
},
{
"text": "Чем сложнее код или конкретное решение, тем сложнее его понимать другим, тем оно более хрупкое.",
"id": 388616060976758800,
"created_at": "Fri Oct 11 10:44:23 +0000 2013"
},
{
"text": "Делайте удобные сайты, не статические картинки. Компромиссы для лучшего качества. Придерживайтесь правил. Будьте умнее, трюкуйте!",
"id": 388616835031375900,
"created_at": "Fri Oct 11 10:47:28 +0000 2013"
},
{
"text": "Клиент не должен знать ничего о коде. Но должен понимать, что он приобретёт от качественного кода — поддержка, стабильность, и т.д.",
"id": 388617973625528300,
"created_at": "Fri Oct 11 10:51:59 +0000 2013"
},
{
"text": "У нас часовой перерыв на обед. И вы не забудьте поесть.",
"id": 388626463492436000,
"created_at": "Fri Oct 11 11:25:43 +0000 2013"
},
{
"text": "Следующий Маркус Касэрас «Responsive images: ain't we there yet?» http://t.co/iG5K9OUUzM",
"id": 388633458035400700,
"created_at": "Fri Oct 11 11:53:31 +0000 2013"
},
{
"text": "Мы уже близко к отзывчивым картинкам? Да, мы почти уже там. По крайней мере ближе, чем когда либо.",
"id": 388634340747661300,
"created_at": "Fri Oct 11 11:57:01 +0000 2013"
},
{
"text": "Картинки занимают 60% от размера средней страницы. И процент растёт.",
"id": 388634522692382700,
"created_at": "Fri Oct 11 11:57:45 +0000 2013"
},
{
"text": "Так что такое отзывчивые картинки? Картинки, которые соответствуют ситуации и окружению.",
"id": 388634860912648200,
"created_at": "Fri Oct 11 11:59:05 +0000 2013"
},
{
"text": "Рекомендуемая статья: Responsive Images: What We Thought We Needed http://t.co/RESDaaSCWD",
"id": 388635413214404600,
"created_at": "Fri Oct 11 12:01:17 +0000 2013"
},
{
"text": "Важный документ для группы стандартизации отзывчивых картинок: Use Cases and Requirements for Standardizing http://t.co/xvc8ETKMiW",
"id": 388637573436162050,
"created_at": "Fri Oct 11 12:09:52 +0000 2013"
},
{
"text": "Картинка, которая хорошо сжата для порт. ориентации, может выглядеть плохо в ландш., т.к. становится больше http://t.co/4KbpROtJPz",
"id": 388637822414233600,
"created_at": "Fri Oct 11 12:10:52 +0000 2013"
},
{
"text": "Пока нет решения, которое покрывало бы все юзкейсы и нравилось бы всем.",
"id": 388638068099797000,
"created_at": "Fri Oct 11 12:11:50 +0000 2013"
},
{
"text": "Решение №1 &lt;picture&gt; (на манер &lt;source&gt; для &lt;video&gt;), предложенное Брюсом Лоусоном http://t.co/wmeQ1iI5WH",
"id": 388638436120612860,
"created_at": "Fri Oct 11 12:13:18 +0000 2013"
},
{
"text": "Минусы: несколько элементов; расширяет использование &lt;source&gt; в спец. контекстах (не только для &lt;video&gt;); смешивает MQ и разметку.",
"id": 388638719135473660,
"created_at": "Fri Oct 11 12:14:25 +0000 2013"
},
{
"text": "Решение номер 2, стрёмное http://t.co/glWn5cvvV2",
"id": 388639382653390850,
"created_at": "Fri Oct 11 12:17:04 +0000 2013"
},
{
"text": "Третье решение: атрибут и похожее свойство srcset, предложено в Apple.",
"id": 388639449783234560,
"created_at": "Fri Oct 11 12:17:20 +0000 2013"
},
{
"text": "Плюсы: нравится браузерам, уже внедрено в Safari. Минусы: не решает проблему с кропом, сложный синтаксис, что значит «w»?",
"id": 388639690020356100,
"created_at": "Fri Oct 11 12:18:17 +0000 2013"
},
{
"text": "Комьюнити и W3C http://t.co/e8Newav6fz",
"id": 388639779220647940,
"created_at": "Fri Oct 11 12:18:38 +0000 2013"
},
{
"text": "Что же нам на самом деле нужно: &lt;img src=“”path-to-image&gt;. И всё.",
"id": 388639901119705100,
"created_at": "Fri Oct 11 12:19:07 +0000 2013"
},
{
"text": "Четвёртое решение: использует HTTP для т.н. «client hints», то есть подсказок для клиентской части.",
"id": 388640105738801150,
"created_at": "Fri Oct 11 12:19:56 +0000 2013"
},
{
"text": "Плюсы: не нужна доп. разметка; браузер может заявить, что он поддерживает и только тогда получит что-то от сервера.",
"id": 388640344067559400,
"created_at": "Fri Oct 11 12:20:53 +0000 2013"
},
{
"text": "Минус: вы не всегда можете управлять заголовками «своего» сервера: Github pages, CDN, дешёвые хостинги.",
"id": 388640525399887900,
"created_at": "Fri Oct 11 12:21:36 +0000 2013"
},
{
"text": "Ещё минусы: прокси могут резать непонятное; может потребовать SSL для стабильной работы.",
"id": 388640838777327600,
"created_at": "Fri Oct 11 12:22:51 +0000 2013"
},
{
"text": "Набрасываем идеальное решение на лету http://t.co/KoOjYYfCaj",
"id": 388641449128230900,
"created_at": "Fri Oct 11 12:25:16 +0000 2013"
},
{
"text": "Следующий шаг http://t.co/hexapNIPLO",
"id": 388641573082525700,
"created_at": "Fri Oct 11 12:25:46 +0000 2013"
},
{
"text": "В итоге, получается вариант с &lt;img&gt; элементом и атрибутами src-1, src-2, src-n.",
"id": 388642296109232100,
"created_at": "Fri Oct 11 12:28:38 +0000 2013"
},
{
"text": "Становится страшнее http://t.co/9HmmzDPrLa",
"id": 388642696828817400,
"created_at": "Fri Oct 11 12:30:14 +0000 2013"
},
{
"text": "Ещё вариант: новый умный формат для изображений.",
"id": 388642898830721000,
"created_at": "Fri Oct 11 12:31:02 +0000 2013"
},
{
"text": "Картинка делится по частям внутри: 1-100 кб — одна, 100-300 кб другая и т.д.",
"id": 388643101289758700,
"created_at": "Fri Oct 11 12:31:50 +0000 2013"
},
{
"text": "Благодаря этом очень удобно делать кропы, выбирая только часть картинки, делая его на лету.",
"id": 388643360841682940,
"created_at": "Fri Oct 11 12:32:52 +0000 2013"
},
{
"text": "Минусы: новый формат изображений; потребует изменений в браузерах и соотв. софте; должен быть стандартизирован.",
"id": 388643623153467400,
"created_at": "Fri Oct 11 12:33:55 +0000 2013"
},
{
"text": "Так что же будет?",
"id": 388643683622744060,
"created_at": "Fri Oct 11 12:34:09 +0000 2013"
},
{
"text": "Идеально будет внедрить несколько решений прямо сейчас и в итоге прийти к новому формату изображений.",
"id": 388644018869268500,
"created_at": "Fri Oct 11 12:35:29 +0000 2013"
},
{
"text": "Один из полифилов для отзывчивых картинок — Picturefill https://t.co/CXi7O6T4QD",
"id": 388645134700912640,
"created_at": "Fri Oct 11 12:39:55 +0000 2013"
},
{
"text": "Есть идеи? Присоединяйтесь к Responsive Images Community Group http://t.co/gso88IVX9O",
"id": 388645367912624100,
"created_at": "Fri Oct 11 12:40:51 +0000 2013"
},
{
"text": "Возможные расширения для будущего волшебного формата изображений: .ric (resp img community) или .mif (magic image format).",
"id": 388645982394937340,
"created_at": "Fri Oct 11 12:43:17 +0000 2013"
},
{
"text": "Следующая на сцене Анжелина Фабро «Return of Inspector Web: Web Components a year later» http://t.co/HMbwBNPY5F",
"id": 388646325124079600,
"created_at": "Fri Oct 11 12:44:39 +0000 2013"
},
{
"text": "«Web Components» — это не просто одна технология, но группа, вроде как HTML5.",
"id": 388647030299840500,
"created_at": "Fri Oct 11 12:47:27 +0000 2013"
},
{
"text": "Shadow DOM — это способ спрятать элементы внутри другого элемента так, что родительский документ ничего не будет знать о них.",
"id": 388647284961189900,
"created_at": "Fri Oct 11 12:48:28 +0000 2013"
},
{
"text": "Отрисовка вложенного Shadow DOM заменяет заменяет родительский элемент в основном DOM. Именно отрисовку, а не элемент в дереве.",
"id": 388647943546605600,
"created_at": "Fri Oct 11 12:51:05 +0000 2013"
},
{
"text": "Демка, работает в Chrome Canary: http://t.co/gKimBDlkoF",
"id": 388648597568626700,
"created_at": "Fri Oct 11 12:53:41 +0000 2013"
},
{
"text": "Новая @-конструкция в CSS: @host, которая позволяет подняться на уровень выше из вложенного документа. @host { border:red }",
"id": 388649002591588350,
"created_at": "Fri Oct 11 12:55:17 +0000 2013"
},
{
"text": "Псевдоэлемент ::part для Shadow DOM http://t.co/f8LxrcK00J",
"id": 388649684652539900,
"created_at": "Fri Oct 11 12:58:00 +0000 2013"
},
{
"text": "Поддержка Shadow DOM: Firefox скоро, Chrome да, IE пока никаких новостей, про Safari тоже не очень понятно.",
"id": 388650096562552800,
"created_at": "Fri Oct 11 12:59:38 +0000 2013"
},
{
"text": "Содержимое нового элемента &lt;template&gt; будет обработано, но не отрисовано. Он может содержать элементы, стили и т.п.",
"id": 388650391170461700,
"created_at": "Fri Oct 11 13:00:48 +0000 2013"
},
{
"text": "&lt;template&gt; это замена &lt;script type="text/template"&gt;, которая не хак.",
"id": 388650748911054850,
"created_at": "Fri Oct 11 13:02:13 +0000 2013"
},
{
"text": "Есть уже даже такое &lt;link rel="import" href="some-page.html"&gt; Firefox: скоро; Chrome за флагами; про IE никто не знает.",
"id": 388651469383401500,
"created_at": "Fri Oct 11 13:05:05 +0000 2013"
},
{
"text": "Специальные элементы: var foo = document.register('my-widget‘); document.body.append(foo);",
"id": 388651758291263500,
"created_at": "Fri Oct 11 13:06:14 +0000 2013"
},
{
"text": "Создание нового элемента: &lt;my-widget&gt;&lt;/my-widget&gt; или &lt;div is="my-widget"&gt; — первый способ лучше.",
"id": 388652028794511360,
"created_at": "Fri Oct 11 13:07:19 +0000 2013"
},
{
"text": "my-widget { color:red } my-widget:unresolved { opacity:0 } — если элемент не зарегистрирован в документе, то он не будет виден.",
"id": 388652395968090100,
"created_at": "Fri Oct 11 13:08:46 +0000 2013"
},
{
"text": "Поддержка: Firefox и Chrome за флагами; про IE ничего не известно.",
"id": 388652546778484740,
"created_at": "Fri Oct 11 13:09:22 +0000 2013"
},
{
"text": "Элемент &lt;element&gt; пока убрали из спецификации. Но способ создавать специальные элементы пока остался.",
"id": 388652816463835140,
"created_at": "Fri Oct 11 13:10:26 +0000 2013"
},
{
"text": "Новая штука Dectorators, о ней мало информации и нет собств. спецификации.",
"id": 388653030021017600,
"created_at": "Fri Oct 11 13:11:17 +0000 2013"
},
{
"text": "&lt;decorator&gt; — это способ применения презентационной разметки через задание логики в CSS. Что-то вроде шаблонизации, управляемой через CSS.",
"id": 388653685825605600,
"created_at": "Fri Oct 11 13:13:54 +0000 2013"
},
{
"text": "Считанные люди понимают как это работает. Звучит сомнительно, но есть некоторые удачные юзкейсы. Хотя нет ни одной реализации и спеки.",
"id": 388654004626288640,
"created_at": "Fri Oct 11 13:15:10 +0000 2013"
},
{
"text": "В проектах Мозиллы X-Tags и Brick используются полифилы для реализации части расказанного в докладе.",
"id": 388654314979610600,
"created_at": "Fri Oct 11 13:16:24 +0000 2013"
},
{
"text": "Polymer Project — проект, построенный на основе веб-компонентов http://t.co/M2yhTg3aFS",
"id": 388655202456588300,
"created_at": "Fri Oct 11 13:19:55 +0000 2013"
},
{
"text": "Polymer 168 кб, Angular 81 кб, X-Tag 63 кб.",
"id": 388655624843960300,
"created_at": "Fri Oct 11 13:21:36 +0000 2013"
},
{
"text": "Пример на Polymer, он поддерживает большую часть веб-компонентов, в отл. от других http://t.co/f33kIxVWwY",
"id": 388655892780298240,
"created_at": "Fri Oct 11 13:22:40 +0000 2013"
},
{
"text": "То, что делает AngularJS крайне похоже на спецификации веб-компонентов.",
"id": 388656124389769200,
"created_at": "Fri Oct 11 13:23:35 +0000 2013"
},
{
"text": "Чем больше создаётся библиотек, чем больше пишется кода, тем ближе спецификации веб-компонентов становятся к стабилизации и внедрению.",
"id": 388656663315906560,
"created_at": "Fri Oct 11 13:25:44 +0000 2013"
},
{
"text": "Один человек с любимой фичей ничего не значит. Сообщество, которое использует фичу через трюки или полифилы — повод внедрить это в браузер.",
"id": 388657210945191940,
"created_at": "Fri Oct 11 13:27:54 +0000 2013"
},
{
"text": "Визуальный редактор для приложений, использующий веб-компоненты — http://t.co/OnEH5HN3ZX",
"id": 388657722084053000,
"created_at": "Fri Oct 11 13:29:56 +0000 2013"
},
{
"text": "Получасовой перерыв: подышим, разомнёмся.",
"id": 388658846937673700,
"created_at": "Fri Oct 11 13:34:24 +0000 2013"
},
{
"text": "Следующий Доменик Деникола «The state of JavaScript» http://t.co/FQqCIcOZIx",
"id": 388665610110251000,
"created_at": "Fri Oct 11 14:01:17 +0000 2013"
},
{
"text": "95-й ролловеры, валидация форм; 97-й ECMA-262 1, IE4, DHTML; 99-й ES3: function expressions, try/catch/finally/regexp.",
"id": 388666059441831940,
"created_at": "Fri Oct 11 14:03:04 +0000 2013"
},
{
"text": "2004: сформировалась WHATWG и сфокусировала внимание на веб-приложениях; 2005 Ajax aka XMLHttpRequest; 2006 jQuery 1.0 и JS в массы.",
"id": 388666453043740700,
"created_at": "Fri Oct 11 14:04:38 +0000 2013"
},
{
"text": "2008 V8, началась гонка за скоростью, вышла книга «JS Good Parts» Крокфорда; 2009 ES5, ServerJS, CommonJS, Node.js, PhoneGap, JSConf EU.",
"id": 388666851997519900,
"created_at": "Fri Oct 11 14:06:13 +0000 2013"
},
{
"text": "2009-й начало JS-бума; 2010 Backbone.js, RequireJS; 2012 Windows 8, Nodecopter; 2013 Nodebots, Ember, Angular, Ext. Web Manifesto; asm.js",
"id": 388667281016102900,
"created_at": "Fri Oct 11 14:07:55 +0000 2013"
},
{
"text": "2014 ES6 финал, ES7 начало, ???",
"id": 388667365313245200,
"created_at": "Fri Oct 11 14:08:15 +0000 2013"
},
{
"text": "JS на фронтенде сегодня",
"id": 388667442777841660,
"created_at": "Fri Oct 11 14:08:34 +0000 2013"
},
{
"text": "Началось всё с jQuery, потом Backbone.js, потом Angular (гл. фишка компонентная система) и Ember (гл. фишка мультистраничные приложения).",
"id": 388667818776199200,
"created_at": "Fri Oct 11 14:10:03 +0000 2013"
},
{
"text": "Почему всё веселье доступно только с библиотеками?",
"id": 388667970928783360,
"created_at": "Fri Oct 11 14:10:40 +0000 2013"
},
{
"text": "Потому, что спека Web Components (Веб-компоненты) пока не готова, но будет. Сейчас можно использовать Polymer вместо неё.",
"id": 388668180966944800,
"created_at": "Fri Oct 11 14:11:30 +0000 2013"
},
{
"text": "Идею веб-компонентов сначала подхватил Angular.",
"id": 388668272692199400,
"created_at": "Fri Oct 11 14:11:51 +0000 2013"
},
{
"text": "Дальше: http://t.co/05Bjg6Ad1s",
"id": 388668391240003600,
"created_at": "Fri Oct 11 14:12:20 +0000 2013"
},
{
"text": "Неофиц. лого лучше передаёт мощь Node.js http://t.co/Wr1e0lw4nN",
"id": 388668715853938700,
"created_at": "Fri Oct 11 14:13:37 +0000 2013"
},
{
"text": "JS с помощью Node.js можно завести на любом устройстве.",
"id": 388669650206478340,
"created_at": "Fri Oct 11 14:17:20 +0000 2013"
},
{
"text": "Windows 8 была этапом, когда крупнейшая компания предложила писать приложения для ОС на JS.",
"id": 388669828573446140,
"created_at": "Fri Oct 11 14:18:02 +0000 2013"
},
{
"text": "js-git — http://t.co/n5lwr2FrBI",
"id": 388670176784576500,
"created_at": "Fri Oct 11 14:19:25 +0000 2013"
},
{
"text": "PDF через JS (осн. движок PDF в Firefox) — https://t.co/4B4JwhYBKw",
"id": 388670326718365700,
"created_at": "Fri Oct 11 14:20:01 +0000 2013"
},
{
"text": "Но мы пошли дальше: Shumway SWF (Flash) через JS — http://t.co/y1UWe5WcrE",
"id": 388670495438417900,
"created_at": "Fri Oct 11 14:20:41 +0000 2013"
},
{
"text": "Browserify — способ заставить работать большинство пакетов из npm в браузере http://t.co/L6S16snYVr",
"id": 388670955545178100,
"created_at": "Fri Oct 11 14:22:31 +0000 2013"
},
{
"text": "http://t.co/vwQQBeuAck — что-то вроде Minecraft в браузере",
"id": 388671186097688600,
"created_at": "Fri Oct 11 14:23:26 +0000 2013"
},
{
"text": "asm.js — это крайне оптимизированное подмножество JS, работающее с нативной скоростью http://t.co/slhZstS3U8",
"id": 388671637400588300,
"created_at": "Fri Oct 11 14:25:14 +0000 2013"
},
{
"text": "Идея JS как виртуальной машины для веба. Писать можно на чём угодно, но компилировать в JS.",
"id": 388671748293787650,
"created_at": "Fri Oct 11 14:25:40 +0000 2013"
},
{
"text": ".NET, JVM, Ruby, Python, Haskel — всё это можно скомпилировать в JS и запустить в браузере.",
"id": 388671887825731600,
"created_at": "Fri Oct 11 14:26:13 +0000 2013"
},
{
"text": "CoffeScript — это конечно круто, но круче компилировать ES6 в обычный JS.",
"id": 388672217422516200,
"created_at": "Fri Oct 11 14:27:32 +0000 2013"
},
{
"text": "ES6 в JS? См. traceur https://t.co/jkQFPGLFcw и es6ify https://t.co/GH0M9eVIvw",
"id": 388672389674172400,
"created_at": "Fri Oct 11 14:28:13 +0000 2013"
},
{
"text": "Новое в ES6, синтакс: class, extends, super — синтаксический сахар, вместо JS-библиотек; Arrow functions arr.map(x =&gt; x*x);",
"id": 388672881435369500,
"created_at": "Fri Oct 11 14:30:10 +0000 2013"
},
{
"text": "Destructuring: var {x,y} = getPoint(); Rest/spread: var [first, …rest] = els; Math.max(…myArray);",
"id": 388673189754441700,
"created_at": "Fri Oct 11 14:31:24 +0000 2013"
},
{
"text": "Извините, трансляция перегрелась от ES6.",
"id": 388673540696064000,
"created_at": "Fri Oct 11 14:32:47 +0000 2013"
},
{
"text": "Изменения в ES6 проходят под лозунгом: мы не можем ничего удалить или исправить из-за совместимости, но можем добавить новое и лучшее.",
"id": 388674248409362400,
"created_at": "Fri Oct 11 14:35:36 +0000 2013"
},
{
"text": "Доминик, помимо прочего, автор спецификации промисов (promises), которая вошла в ES6.",
"id": 388674916457132000,
"created_at": "Fri Oct 11 14:38:15 +0000 2013"
},
{
"text": "И такое можно будет делать в JS '&lt;a href="${url}"&gt;${text}&lt;/a&gt;'",
"id": 388675678977425400,
"created_at": "Fri Oct 11 14:41:17 +0000 2013"
},
{
"text": "ES7 будет ещё круче.",
"id": 388675927523463200,
"created_at": "Fri Oct 11 14:42:17 +0000 2013"
},
{
"text": "Что будет в ES7: Weak references; Async/await function^() {var res = await promise }; Object.observe; Типы значений: встроенные (int) и спец",
"id": 388676400359948300,
"created_at": "Fri Oct 11 14:44:09 +0000 2013"
},
{
"text": "И ещё оператор байндинга: var method = ::obj.foo",
"id": 388676591074951200,
"created_at": "Fri Oct 11 14:44:55 +0000 2013"
},
{
"text": "Firefox (OS) обычно не прячет новые фичи из ES6 за флагами (многое уже доступно в нём), в отличие от Chrome.",
"id": 388677456133365760,
"created_at": "Fri Oct 11 14:48:21 +0000 2013"
},
{
"text": "И закрывает конференцию Брюс Лоусон «HTML.future — what the web needs next» http://t.co/NMyvryz579",
"id": 388678977394864100,
"created_at": "Fri Oct 11 14:54:24 +0000 2013"
},
{
"text": "@thebits, Firefox (OS) — это Firefox и Firefox OS",
"id": 388679487665500160,
"created_at": "Fri Oct 11 14:56:25 +0000 2013"
},
{
"text": "@fetis26, будут, обычно к ноябрю",
"id": 388680352921030660,
"created_at": "Fri Oct 11 14:59:52 +0000 2013"
},
{
"text": "IndexedDB = Index Douchebag",
"id": 388680734145531900,
"created_at": "Fri Oct 11 15:01:23 +0000 2013"
},
{
"text": "Веб по всем цифрам проигрывает приложениям (20/80%) и приложения совсем не переходная технология, какой были плагины.",
"id": 388681157501808640,
"created_at": "Fri Oct 11 15:03:03 +0000 2013"
},
{
"text": "Брюс поражает аудиторию дизайнерскими способностями http://t.co/m8jjdVqf7m",
"id": 388681504731430900,
"created_at": "Fri Oct 11 15:04:26 +0000 2013"
},
{
"text": "DRM для веба продвигают Google и Microsoft — и вряд ли для того, чтобы погубить веб.",
"id": 388681834877698050,
"created_at": "Fri Oct 11 15:05:45 +0000 2013"
},
{
"text": "Помимо главных DRM-жупелов, технологию продвигает медиа-гигант BBC, по понятным причинам.",
"id": 388682044488052740,
"created_at": "Fri Oct 11 15:06:35 +0000 2013"
},
{
"text": "Если не будет DRM, то медиаконтент будет похоронен из апсторах и исчезнет из веба.",
"id": 388682496726298600,
"created_at": "Fri Oct 11 15:08:23 +0000 2013"
},
{
"text": "Большая цель PhoneGap — стать ненужным. Чтобы фронтенд мог появиться на платформах без его помощи.",
"id": 388683025028231200,
"created_at": "Fri Oct 11 15:10:29 +0000 2013"
},
{
"text": "Blink и соотв. браузеры внедряет автоматичекую фичу Lazy Layout, которая анализирует раскладку сайта и рисует её быстрее, чем остальное.",
"id": 388685100378247200,
"created_at": "Fri Oct 11 15:18:44 +0000 2013"
},
{
"text": "Или &lt;img lazyload src=“…”&gt;, новый способ отложенной загрузки изображений.",
"id": 388685563400044540,
"created_at": "Fri Oct 11 15:20:34 +0000 2013"
},
{
"text": "Opera работала над спецификацией W3C Widgets, но спека не выжила. По многим причинам, кроме глупого названия.",
"id": 388686047087194100,
"created_at": "Fri Oct 11 15:22:29 +0000 2013"
},
{
"text": "Очень похожие творится в Chrome App Store и даже на Windows 8. Было бы хорошо объединить все хорошие идеи под одним API.",
"id": 388686511816077300,
"created_at": "Fri Oct 11 15:24:20 +0000 2013"
},
{
"text": "Та же идея для браузерных расширений: Opera предложила независимый формат для расширений NEX (на основе CRX для Chrome).",
"id": 388686885935386600,
"created_at": "Fri Oct 11 15:25:49 +0000 2013"
},
{
"text": "«Мир переходит на смартфоны» местами большой миф, поскольку на плохой сети люди всё равно пользуются Opera Mini.",
"id": 388689374608908300,
"created_at": "Fri Oct 11 15:35:43 +0000 2013"
},
{
"text": "Fronteers всё. Спасибо, что читали трансляцию, следите за анонсами следующих включений http://t.co/2G1SzYJ2H5",
"id": 388691216403300350,
"created_at": "Fri Oct 11 15:43:02 +0000 2013"
}]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment