73
BEMup в Питере, 29 ноября 2013 Написание технологий для bem-tools Татаринцев Сергей, Яндекс

Сергей Татаринцев — Написание модулей технологий для bem-tools

  • Upload
    yandex

  • View
    408

  • Download
    9

Embed Size (px)

DESCRIPTION

bem-tools — это набор инструментов для работы с файлами по БЭМ-методологии. Он позволяет создавать сущности, собирать финальный рантайм, работать с build-декларациями, собирать весь проект командой bem make или запускать сервер разработки на дереве исходников проекта (используя bem server). Один из самых популярных способов расширения возможностей bem-tools — написание модулей технологий. В докладе речь пойдет о том, зачем их писать и как убедиться в том, что все сделано правильно.

Citation preview

Page 1: Сергей Татаринцев — Написание модулей технологий для bem-tools

BEMup в Питере, 29 ноября 2013

Написание технологий для bem-tools

Татаринцев Сергей, Яндекс

Page 2: Сергей Татаринцев — Написание модулей технологий для bem-tools

bem-tools

!2

Page 3: Сергей Татаринцев — Написание модулей технологий для bem-tools

bem-tools

• сборщик BEM-проектов

!2

Page 4: Сергей Татаринцев — Написание модулей технологий для bem-tools

bem-tools

• сборщик BEM-проектов• расширяемый при помощи:

!2

Page 5: Сергей Татаринцев — Написание модулей технологий для bem-tools

bem-tools

• сборщик BEM-проектов• расширяемый при помощи:

• узлов сборки

!2

Page 6: Сергей Татаринцев — Написание модулей технологий для bem-tools

bem-tools

• сборщик BEM-проектов• расширяемый при помощи:

• узлов сборки• подкоманд (в 1.0.0)

!2

Page 7: Сергей Татаринцев — Написание модулей технологий для bem-tools

bem-tools

• сборщик BEM-проектов• расширяемый при помощи:

• узлов сборки• подкоманд (в 1.0.0)• модулей технологий

!2

Page 8: Сергей Татаринцев — Написание модулей технологий для bem-tools

Ссылки

!3

Page 9: Сергей Татаринцев — Написание модулей технологий для bem-tools

Ссылки

• документация: ru.bem.info/tools/bem

!3

Page 10: Сергей Татаринцев — Написание модулей технологий для bem-tools

Ссылки

• документация: ru.bem.info/tools/bem• принимаем пожелания: github.com/bem/bem-tools/issues

!3

Page 11: Сергей Татаринцев — Написание модулей технологий для bem-tools

Модули технологий

!4

Page 12: Сергей Татаринцев — Написание модулей технологий для bem-tools

Модули технологий

• технологии — средства описания БЭМ-сущностей

!4

Page 13: Сергей Татаринцев — Написание модулей технологий для bem-tools

Модули технологий

• технологии — средства описания БЭМ-сущностей• модуль технологии — Node.JS модуль для сборки файлов

технологий

!4

Page 14: Сергей Татаринцев — Написание модулей технологий для bem-tools

Пример

!5

Page 15: Сергей Татаринцев — Написание модулей технологий для bem-tools

Пример

• Блок описан в технологиях css, js, bemhtml /block

block.css

block.js

block.bemhtml

!5

Page 16: Сергей Татаринцев — Написание модулей технологий для bem-tools

Пример

• Блок описан в технологиях css, js, bemhtml /block

block.css

block.js

block.bemhtml

• css страницы собирается модулем технологии css

!5

Page 17: Сергей Татаринцев — Написание модулей технологий для bem-tools

bemdecl css deps.js dir docs examples ie.css js js-i level level-proto project tech-docs

Технологии в bem-tools

!6

Page 18: Сергей Татаринцев — Написание модулей технологий для bem-tools

bemhtml bemtree html vanilla.js node.js browser.js browser.js+bemhtml

Технологии в bem-core

!7

Page 19: Сергей Татаринцев — Написание модулей технологий для bem-tools

Маловато будет!8

Page 20: Сергей Татаринцев — Написание модулей технологий для bem-tools

На примере CoffeeScript

Пишем свою технологию

Page 21: Сергей Татаринцев — Написание модулей технологий для bem-tools

Назначение модулей технологий

!10

Page 22: Сергей Татаринцев — Написание модулей технологий для bem-tools

Назначение модулей технологий

• создание файлов по шаблону (bem create)

!10

Page 23: Сергей Татаринцев — Написание модулей технологий для bem-tools

Назначение модулей технологий

• создание файлов по шаблону (bem create)bem create —l common.block --block my-block —T css

!10

Page 24: Сергей Татаринцев — Написание модулей технологий для bem-tools

Назначение модулей технологий

• создание файлов по шаблону (bem create)bem create —l common.block --block my-block —T css

• сборка результатов (bem build)

!10

Page 25: Сергей Татаринцев — Написание модулей технологий для bem-tools

Назначение модулей технологий

• создание файлов по шаблону (bem create)bem create —l common.block --block my-block —T css

• сборка результатов (bem build)• исходные файлы — внутри блоков

!10

Page 26: Сергей Татаринцев — Написание модулей технологий для bem-tools

Назначение модулей технологий

• создание файлов по шаблону (bem create)bem create —l common.block --block my-block —T css

• сборка результатов (bem build)• исходные файлы — внутри блоков• блоки — внутри уровней переопределения

!10

Page 27: Сергей Татаринцев — Написание модулей технологий для bem-tools

Назначение модулей технологий

• создание файлов по шаблону (bem create)bem create —l common.block --block my-block —T css

• сборка результатов (bem build)• исходные файлы — внутри блоков• блоки — внутри уровней переопределения• результат — в бандл

!10

Page 28: Сергей Татаринцев — Написание модулей технологий для bem-tools

Результат = префикс + суффиксы + декларация + уровни

Сборка

!11

Page 29: Сергей Татаринцев — Написание модулей технологий для bem-tools

/path/to/some/file.tech.js !

Префикс и суффикс

!12

Префикс

Суффикс

Page 30: Сергей Татаринцев — Написание модулей технологий для bem-tools

Декларация

!13

Page 31: Сергей Татаринцев — Написание модулей технологий для bem-tools

Декларация

• список сущностей для сборки

!13

Page 32: Сергей Татаринцев — Написание модулей технологий для bem-tools

Декларация

• список сущностей для сборки• строится из bemjson.js бандлов и deps.js блоков

!13

Page 33: Сергей Татаринцев — Написание модулей технологий для bem-tools

Декларация - пример

!14

bemjson block1.deps.js({ block: 'page', content: [ {block: 'block1'} ] })

({ mustDeps: [ {block: 'block2'} ] })

[ {block: 'page'}, {block: 'block2'}, {block: 'block1'} ]

Декларация

Page 34: Сергей Татаринцев — Написание модулей технологий для bem-tools

Уровни переопределения

!15

Page 35: Сергей Татаринцев — Написание модулей технологий для bem-tools

Уровни переопределения

• папки, содержащие bem-сущности

!15

Page 36: Сергей Татаринцев — Написание модулей технологий для bem-tools

Уровни переопределения

• папки, содержащие bem-сущности• каждая следующая переопределяет предыдущую

!15

Page 37: Сергей Татаринцев — Написание модулей технологий для bem-tools

Уровни переопределения

• папки, содержащие bem-сущности• каждая следующая переопределяет предыдущую• примеры:

• common • desktop • touch

!15

Page 38: Сергей Татаринцев — Написание модулей технологий для bem-tools

Let’s code!

Page 39: Сергей Татаринцев — Написание модулей технологий для bem-tools

• используется вторая версия API • techMixin будет «примешан» к классу TechV2

!exports.API_VER = 2;!exports.techMixin = {! //здесь будет код!};

Заготовка

!17

Page 40: Сергей Татаринцев — Написание модулей технологий для bem-tools

{! "что": ["из чего", "из чего еще", …],! "что еще": […],! …!}

getBuildSuffixesMap

!18

Page 41: Сергей Татаринцев — Написание модулей технологий для bem-tools

Собираем js из coffee и js

exports.API_VER = 2;!exports.techMixin = {! getBuildSuffixesMap: function() {! return {"js": ["coffee", "js"]};! }!}

Наш случай

!19

Page 42: Сергей Татаринцев — Написание модулей технологий для bem-tools

getBuildResults(decl, levels, output, opts);

Процесс сборки

!20

Декларация

Уровни

Префикс результата

Опции

Page 43: Сергей Татаринцев — Написание модулей технологий для bem-tools

getBuildResults, по умолчанию

!21

Page 44: Сергей Татаринцев — Написание модулей технологий для bem-tools

getBuildResults, по умолчанию

• сканирует все уровни переопределения

!21

Page 45: Сергей Татаринцев — Написание модулей технологий для bem-tools

getBuildResults, по умолчанию

• сканирует все уровни переопределения• собирает исходные файлы для сущностей из декларации

!21

Page 46: Сергей Татаринцев — Написание модулей технологий для bem-tools

getBuildResults, по умолчанию

• сканирует все уровни переопределения• собирает исходные файлы для сущностей из декларации• проверяет, нужна ли пересборка

!21

Page 47: Сергей Татаринцев — Написание модулей технологий для bem-tools

getBuildResults, по умолчанию

• сканирует все уровни переопределения• собирает исходные файлы для сущностей из декларации• проверяет, нужна ли пересборка• вызывает getBuildResult для каждого выходного файла

!21

Page 48: Сергей Татаринцев — Написание модулей технологий для bem-tools

Пример

• уровни: common.blocks, desktop.blocks • декларация: [{block: "block1"}, {block: "block2"}] • build suffixes map: {js: ["coffee", "js"]} • файлы: common.blocks/

block1/

block1.bemhtml

block1.css

block1.coffee

block2/

block2.bemhtml

block2.js

desktop.blocks/

block1/

block1.coffee

block1.css

block2/

block2.js

!22

Page 49: Сергей Татаринцев — Написание модулей технологий для bem-tools

Пример

• уровни: common.blocks, desktop.blocks • декларация: [{block: "block1"}, {block: "block2"}] • build suffixes map: {js: ["coffee", "js"]} • файлы: common.blocks/

block1/

block1.bemhtml

block1.css

block1.coffee

block2/

block2.bemhtml

block2.js

desktop.blocks/

block1/

block1.coffee

block1.css

block2/

block2.js

!23

Page 50: Сергей Татаринцев — Написание модулей технологий для bem-tools

getBuildResult(files, suffix, output, opts);

Процесс сборки

!24

Исходные файлы

Выходной суффикс

Префикс выходного файла

Опции

Page 51: Сергей Татаринцев — Написание модулей технологий для bem-tools

getBuildResult(files, suffix, output, opts);

Процесс сборки

!25

Для каждого файла

getBuildResultChunk(relPath, path, suffix);

Page 52: Сергей Татаринцев — Написание модулей технологий для bem-tools

getBuildResultChunk(relPath, path, suffix);

Процесс сборки

!26

относительный путь

абсолютный путь

исходный суффикс

Page 53: Сергей Татаринцев — Написание модулей технологий для bem-tools

Пример

• уровни: common.blocks, desktop.blocks • декларация: [{block: "block1"}, {block: «block2"}] • выходоной префикс: desktop.bundles/example/example • build suffixes map: {js: ["coffee", "js"]} • файлы: common.blocks/

block1/

block1.bemhtml

block1.css

block1.coffee block2/

block2.bemhtml

block2.js desktop.blocks/

block1/

block1.coffee block1.css

block2/

block2.js

!27

getBuildResultChunk

getBuildResultChunk

getBuildResultChunk

getBuildResultChunk

desktop.bundles/example/example.js

Page 54: Сергей Татаринцев — Написание модулей технологий для bem-tools

Полный процесс

!28

Page 55: Сергей Татаринцев — Написание модулей технологий для bem-tools

Полный процесс

• вызывается getBuildResults(decl, levels, output, opts)

!28

Page 56: Сергей Татаринцев — Написание модулей технологий для bem-tools

Полный процесс

• вызывается getBuildResults(decl, levels, output, opts)• сканируются уровни

!28

Page 57: Сергей Татаринцев — Написание модулей технологий для bem-tools

Полный процесс

• вызывается getBuildResults(decl, levels, output, opts)• сканируются уровни• находятся все исходные файлы БЭМ-сущностей из декларации

!28

Page 58: Сергей Татаринцев — Написание модулей технологий для bem-tools

Полный процесс

• вызывается getBuildResults(decl, levels, output, opts)• сканируются уровни• находятся все исходные файлы БЭМ-сущностей из декларации

• для каждого выходного файла зовется getBuildResult(files, suffix, output, opts)

!28

Page 59: Сергей Татаринцев — Написание модулей технологий для bem-tools

Полный процесс

• вызывается getBuildResults(decl, levels, output, opts)• сканируются уровни• находятся все исходные файлы БЭМ-сущностей из декларации

• для каждого выходного файла зовется getBuildResult(files, suffix, output, opts)

• для кажого исходного файла зовется getBuildResultChunk(relPath, path, suffix)

!28

Page 60: Сергей Татаринцев — Написание модулей технологий для bem-tools

Полный процесс

• вызывается getBuildResults(decl, levels, output, opts)• сканируются уровни• находятся все исходные файлы БЭМ-сущностей из декларации

• для каждого выходного файла зовется getBuildResult(files, suffix, output, opts)

• для кажого исходного файла зовется getBuildResultChunk(relPath, path, suffix)

• результаты склеиваются и записываются на диск

!28

Page 61: Сергей Татаринцев — Написание модулей технологий для bem-tools

var fs = require('fs'),! coffee = require('coffee-script');!!exports.API_VER = 2;!exports.techMixin = {! getBuildSuffixesMap: function() {! return {'js': ['coffee', 'js']};! },!! getBuildResultChunk: function(relPath, path, suffix) {! var content = fs.readFileSync(path);! if (suffix === 'coffee') {! return coffee.compile(content);! }! return content;! }!};

Завершим код

!29

Page 62: Сергей Татаринцев — Написание модулей технологий для bem-tools

Подключение

Page 63: Сергей Татаринцев — Написание модулей технологий для bem-tools

В .bem/levels/blocks.js добавить полный путь к модулю в getTechs:

exports.getTechs = function() {! return {! …! "coffee+js": "/path/to/tech/module.js"! };!};

На уровне блоков

!31

Page 64: Сергей Татаринцев — Написание модулей технологий для bem-tools

Добавить в BundleNode#getTechs

registry.decl('BundleNode', {! getTechs: function() {! return [! ...! 'coffee+js',! ...! ];! }!});

В make.js

!32

Page 65: Сергей Татаринцев — Написание модулей технологий для bem-tools

Указать в make.js как технология должна оптимизироваться

registry.decl('BundleNode', {! ! ...!! 'create-coffee+js-optimizer-node': function() {! this['create-js-optimizer-node'].apply(this, arguments);! }!});

Минификация (в 0.6.x и 0.7.x)

!33

Page 66: Сергей Татаринцев — Написание модулей технологий для bem-tools

Минификация (в 1.0.0)

!34

Page 67: Сергей Татаринцев — Написание модулей технологий для bem-tools

Минификация (в 1.0.0)

• убедиться, что технология min.js включена в сборку

!34

Page 68: Сергей Татаринцев — Написание модулей технологий для bem-tools

Минификация (в 1.0.0)

• убедиться, что технология min.js включена в сборку– зарегистрирована на уровне бандлов

!34

Page 69: Сергей Татаринцев — Написание модулей технологий для bem-tools

Минификация (в 1.0.0)

• убедиться, что технология min.js включена в сборку– зарегистрирована на уровне бандлов– добавлена в BundleNode::getTechs

!34

Page 70: Сергей Татаринцев — Написание модулей технологий для bem-tools

Что дальше?

Page 71: Сергей Татаринцев — Написание модулей технологий для bem-tools

Не рассказано

• создание шаблонов • bem create в процессе сборки • тестирование • суммарные технологии

!36

Page 72: Сергей Татаринцев — Написание модулей технологий для bem-tools

Ссылки

• Документация — bit.ly/techmod-doc • Технологии bem-tools — bit.ly/tech-bemtools • Технологии bem-core — bit.ly/tech-bemcore

!37

Page 73: Сергей Татаринцев — Написание модулей технологий для bem-tools

Старший разработчик

[email protected]

Спасибо

Татаринцев Сергей

@SevInf