CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё...

47
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS Все гораздо проще, когда всё вокруг JavaScript Алексей Иванов, Злые Марсиане

Transcript of CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё...

Page 1: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

CSS-в-JS, HTML-в-JS,ВСЁ-в-JS

Все гораздо проще, когда всё вокруг JavaScript

Алексей Иванов, Злые Марсиане

Page 2: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Чем занимаются Марсиане

2

Page 3: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Чем занимаюсь я

3

Page 4: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

А чем вызанимаетесь?

4

Page 5: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Часть 1.

Задачи и проблемы

5

Page 6: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Было:

.block__element_modificator {...}

Стало:

.aBc {...}

Сократить CSS-классы

01.

01.

6

Page 7: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Сократить CSS-классыЗамена в CSS

1. Собрать все CSS в один файл.

2. Заменить имена классов.

3. Сохранить спиcок замен:

{ 'block__element_modificator': 'aBc' }01.

7

Page 8: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

block__element block__element_modificator

Сократить CSS-классыЗамена в HTML

Заменить все вхождения:

<div class=" ">

Включая составные имена:

"block__element" +"_modificator"

01.

01.

8

Page 9: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

block__element_modificator

block

Сократить CSS-классыЗамена в JavaScript

Найти и заменить имена всех классов:

var className = " ";

$elem.addClass(className);

Не заменить ничего лишнего:

var = ...;

01.

02.

01.

9

Page 10: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Убираем лишний CSSЛегаси, Bootstrap, Font Awesome

10

Page 11: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Убираем лишний CSSЧто нужно сделать?

1. Основная задача:

Удалить лишние правила для одиночных классов, id и тегов.

2. Задача со звездочкой:

Удалить несуществующие комбинации: .class1 .class2 {} .

11

Page 12: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Убираем лишний CSSПарсим HTML

1. Понять структуру HTML для каждой страницы с учетом

состояний (авторизован, неавторизован, акции, попапы).

2. Получить список классов, id и тегов. Лучше в виде дерева.

12

Page 13: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Убираем лишний CSSПарсим JavaScript

1. Понимаем по JS как он может менять наш HTML:

Добавление классов, добавление элементов, и т. д.

2. Дополняем наше дерево возможными состояниями.

13

Page 14: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Убираем лишний JavaScript

14

Page 15: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Убираем лишний JavaScript

1. Удалить то, что не касается DOM: переменные, функции, и т. д.

2. Удалить то, что касается DOM:

1. Найти какие функции и методы влияют на DOM.

2. Найти может ли этот DOM быть на странице.

3. Удалить ненужное.

15

Page 16: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Отдельная сборкадля лендингаИли не лендинга

16

Page 17: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Отдельная сборкадля лендинга

1. Научить наши инструменты понимать что такое страница.

2. Построить HTML-дерево страницы во всех состояниях.

3. Найти какой JavaScript может её изменять.

4. Найти CSS и JavaScript который нужен для этой страницы.

17

Page 18: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Подсвечиваемнеиспользуемыйкод в IDE

18

Page 19: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Переносим кодмежду проектами

19

Page 20: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Нытьё

Почему все этотак сложно?

20

Page 21: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

21

Page 22: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

22

Page 23: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Часть 2.

Как все можетбыть

23

Page 24: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Зависимостив JavaScriptRequireJS и Browserify

24

Page 25: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

module.exports

require('./file1');

Пример Browserifyfile1.js:

var MyModule = {};

MyModule.method = function () {...};

= MyModule;

file2.js:

var something =

something.method();

01.

02.

03.

01.

02.

25

Page 26: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Картинка: https://github.com/unindented/webpack-presentation 26

Page 27: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Dead code eliminationUglifyJS

27

Page 28: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

longName

var a = 10;

b

Пример удаления кодаДо UglifyJS:

function ( ) {

return longName;

}

После UglifyJS:

function () { return b; }

01.

02.

03.

04.

01.

28

Page 29: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

HTML-в-JSReact, Riot, Hyperscript

29

Page 30: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

<div onClick={this.onClick}>Hello!</div>;

React и .jxsvar Example = React.createClass({

onClick: function () { alert('Hello world!'); },

render: function () {

return

}

});

01.

02.

03.

04.

05.

06.

30

Page 31: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

React.createElement(

'div',

{ onClick: onClick },

"Hello!"

)

React и скомпилированный .jxsvar Example = React.createClass({

onClick: function () { alert('Hello world!') },

render: function () {return (

);}

});

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.31

Page 32: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Не только JSWebpack

32

Page 33: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

style.css

data.json

kitten.png

Webpack и requireПодгрузит в шапку, добавит в граф пути из url() и @import :

var style = require(' ');

Подгрузит как JavaScript объект:

var json = require(' ');

Положит в папку для готовых ассетов, отдаст путь:

var img = require(' ');

01.

01.

01.

33

Page 34: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

CSS-в-JSJSS и CSS Modules

34

Page 35: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

style

style.hello

style['hel'+'lo']

Подключение стилейvar = require('style.css');

var Example = React.createClass({

render: function () {

return (

<div className={ }>Hello!</div>

<div className={ }>Hello!</div>

);

}

});

01.

02.

03.

04.

05.

06.

07.

08.

09.

35

Page 36: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

hello

.hello--jss-0-0

Пример JSSСтили:

export {

fontSize: 12

}

Скомпилированные стили:

{ font-size: 12px; }

01.

02.

03.

01.

36

Page 37: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

hello

style_hello_b8bW2Vg3fwHozO

ozO

Пример CSS ModulesСтили:

. { font-size: 12px; }

Скомпилированные стили в разработке:

. { font-size: 12px; }

Полная сборка:

. { font-size: 12px; }

01.

01.

01.

37

Page 38: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Tree shakingRollup и Webpack 2

38

Page 39: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Tree shakingrequire

file1.js

module.exports = {

header: "header",

footer: "footer"

}

file2.js

var styles = require('./file1');

01.

02.

03.

04.

01.

39

Page 40: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

header

content

fooner

header footer

Tree shakingimport и export в ES6

file1.js

export const = "header";

export const = "content";

export const = "footer";

file2.js

import { , } from file1;

01.

02.

03.

01.

40

Page 41: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Оптимизация CSSCSSO

41

Page 42: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

module2-baz

module2-baz module2-qux

Настройки CSSOФильтрация селекторов:

{

"tags": ["ul", "li", ...],

"classes": [" ", ...]

}

Скоупы:

"scopes": [

[" ", " "]

]

01.

02.

03.

04.

01.

02.

03. 42

Page 43: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Чтение и правкаJavaScriptBabel.js не только для es6

43

Page 44: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Часть 3.

К чему все это?

44

Page 45: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

К чему все это?1. Нет отдельных html, css, js – все тесно взаимосвязано и влияет

друг на друга.

2. В процессе сборки все в JS – мы можем использовать кучу

автоматических оптимизаций.

3. Граф зависимостей – позволяет собирать только нужное

и ничего не терять.

4. Локальное пространство имен – нет глобальных переменных

и классов, все делает автоматика, можно не думать

о конфликтах.

45

Page 46: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Ближайшие точки дляразвития

1. Интеграция с IDE.

2. Рендеринг на сервере:

1. Шаблоны отделены от стилей и логики.

2. JS-шаблонизаторы и инструменты сборки сейчас сильно

заточены под SPA.

3. Огромная куча других инструментов для оптимизации и

анализа.

46

Page 47: CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

Вопросы?Я всегда рад поговорить с кем-ниубудь про этих штуки.

• Подходите обсуждать на afterparty.

• Пишите в:

• Twitter: @iadramelk

• Facebook: @iadramelk

47