bem / bem-core

BEM Core Library
https://ru.bem.info/technologies/classic/i-bem/
Other
275 stars 94 forks source link

Модульная система для js #4

Closed dfilatov closed 11 years ago

dfilatov commented 11 years ago

Для решения проблем:

начинаем использовать модульную систему https://github.com/ymaps/modules.

ikokostya commented 11 years ago

Объясните, почему вы не хотите переименовать i-bem в bem, так же как, например, i-jquery в jquery?

dfilatov commented 11 years ago

\cc @veged @arikon @vithar

veged commented 11 years ago

@ikokostya потому что переименование сильнее ломает обратную совместимость с существующим кодом

mdevils commented 11 years ago

@veged Так совместимости уже совершенно не будет. Мало того, что все файлы теперь оборачиваются в модули, так еще и немало депсов меняется. В результате получается, что i-bem единственный блок с префиксом, который вообще остается. Кажется, что это не только можно, но и нужно изменять.

mdevils commented 11 years ago

@veged Кстати, а добавить еще один повод залезть в депсы и поменять их — это очень даже хорошо. Может, разработчики наконец-то синхронизируют реально используемые депсы с тем, что прописано в must/should-deps, не полагаясь на особенности работы технологии deps.js.

narqo commented 11 years ago

А в чем проблема названия i-bem? Теперь есть блок next-tick — «префикс» next- никого не смущает? ;)

ИМХО, i-bem — название не чуть не хухе jQuery, Node.js и пр.

Дальше, offtopic

@mdevils

Так совместимости уже совершенно не будет...

На всякий случай, i-bem это не только клиентский JS — там еще BEMHTML-шаблоны, а на «некоторых» проектах еще и bemtree, BEM.JSON («Блоки первичны — технологии вторичны. БЭМ, все дела...»)

Может, разработчики наконец-то синхронизируют реально используемые депсы с тем, что прописано в must/should-deps, не полагаясь на особенности работы технологии deps.js.

Опиши, как ты это представляешь? У нас 150+ блоков которым нужен базовый шаблон из i-bem__html и им в принципе пофиг откуда (с какого уровня переопределения) он придет.

ikokostya commented 11 years ago

@narqo Модуль next-tick провайдит nextTick. Модуль i-bem провайдит bem, а не iBem. Хорошее название? Что означает i-?

veged commented 11 years ago

@mdevils имя модуля это часть его "API", люди пользуются этим чтобы делать переопределения на своих уровнях -- если переименовывать блок, то людям нужно будет на пустом месте переименовывать файлы

про "Так совместимости уже совершенно не будет." я считал по другому, вроде придумали как обойтись без обёртки для большинства модулей задекларированных через BEM.decl, а депсы меняются только у базовых библиотечных блоков

veged commented 11 years ago

@mdevils про поводы залезть куда-то что-то поправить -- этак можно ваще API перекроить, чтобы разработчики заодно весь свой код на предмет багов прошерстили ;-)

mdevils commented 11 years ago

@narqo Насколько я помню, код из i-bem__html уже переехал в блок bemhtml, который поставляется с пакетом bemhtml, так что здесь проблемы я не вижу.

Опиши, как ты это представляешь? У нас 150+ блоков которым нужен базовый шаблон из i-bem__html и им в принципе пофиг откуда (с какого уровня переопределения) он придет.

Если блок использует BEM.DOM, то он должен от него зависеть. Аналогично с остальными случаями. Сейчас ситуация такова, что некоторые блоки имеют в зависимостях BEM.DOM, а другие не имеют, хоть и используют. Более того, некоторые блоки имеют в зависимостях BEM.HTML, а по факту используют BEM.DOM. То, как сейчас работает deps.js поощряет подобный хаос в зависимостях.

Более того, ситуация с зависимостями сейчас совершенно неверная. Стоит захотеть поменять алгоритм deps.js (например, для ускорения, как я это сделал в ENB), так ломаются не только проекты, но и bem-bl, lego и тп. Получается, мы жестко завязаны на том алгоритме зависимостей, который сейчас присутствует в bem-tools даже при том, что он очень медленный.

Дальше, ситуация с зависимостями сейчас приобретает и совершенно нелепые обороты. Опять же из-за особенностей deps.js. Существуют циркулярные зависимости. Например:

i-common зависит от i-counter, i-counter зависит от i-global, i-global зависит от i-common

Более того, случаются казусы вроде того, что блок logo зависит от своего модификатора logo_lang_ru по mustDeps'ам, рождая не только циклическую зависимость (которую deps.js игнорирует), но и вызывая сомнения в том, является ли это вообще БЭМ-подходом.

veged commented 11 years ago

@mdevils в отдельный пакет переедет только "компиляторная чать", базовые шаблоны останутся в i-bem__html.bemhtml, т.к. их можно переопределять на других уровнях

veged commented 11 years ago

@mdevils проблемы с зависимостями (особенно в LEGO), это отдельный разговор (причём НЕ на внешнем github) -- нужно просто все их поправить -- к переименованию i-bem это отношения не имеет

mdevils commented 11 years ago

@veged Ок. Тогда приведу сжатую мысль: у нас есть шанс поменять многое, сломав обратную совместимость и заставив людей что-то менять в своих проектах. Давайте дожмем-таки и сразу все поменяем, не оставляя костылей, вроде единственного блока с префиксом, чтобы людям не пришлось вновь потом что-то менять.

veged commented 11 years ago

@mdevils Приведу свою сжатую мысль: за несколько лет развития и выпуска новых версий я очень хорошо усвоил один урок -- "если можешь что-то не менять, не меняй" -- любые дополнительные телодвижения по апдейту версии, это дополнительные лучи (не самых хороших субстанций) от пользователей авторам. Давайте будем делать только то, что действительно функционально необходимо (систему модулей, js-синтаксис, новые блоки), а имя трогать вообще не будем, чтобы людям не пришлось что-то менять.

ikokostya commented 11 years ago

@veged Ну вы же затронули уже другие имена (например, jquery, ecma). Оставляя костыли вы только усложняете для пользователей понимание (почему этот блок называется так, а другие иначе). Вы можете ответить на мой вопрос https://github.com/bem/bem-core/issues/4#issuecomment-16289027?

veged commented 11 years ago

@ikokostya jquery и ecma это достаточно низкоуровневые внутренние блоки, их никто особо не использует напрямую (я не знаю случаев, когда их бы переопределяли), поэтому для них сделали исключение (но по хорошему и их можно было оставить со старыми именами)

отвечая на вопрос https://github.com/bem/bem-core/issues/4#issuecomment-16289027 -- прямой связи между именем блока и тем, что он провайдит в глобальный js-спейс, в данном случае, нету (да это выглядит немного неаккуратно, но это не критично)

ikokostya commented 11 years ago

@veged Мы переопределяем оба этих блока. К примеру, jquery блок будет переопределять каждый, кто хочет подключить другую версию jQuery (jquery__config) из своего единого конфига проекта. inherit тоже низкоуровневый блок? Я считаю, что нет, однако у него нет префикса i-. Я так и не получил ответа, что означает i-?

dfilatov commented 11 years ago

На всякий случай упомяну, что потеря обратной совместимости все-таки будет.

veged commented 11 years ago

@ikokostya если есть понимание, что уже сейчас на проектах есть свои определения для i-jquery и i-ecma, то их нужно переименовать обратно в префиксный вариант

@ikokostya что означает i- не так важно, т.к. за время жизни этого префикса он несколько раз менял свою семантику -- формально, последнее: i- это блоки-хелперы без собственного визуального представления

@dfilatov давай выпишем все места про потерю совместимости и ещё раз подумаем, что из них является обязательным, а что можно оставить не меняя

dfilatov commented 11 years ago

Кстати, давайте решим как все-таки правильно именовать то, что провайдят модули, я все-таки в сомнениях. Примеры того, как дело обстоит сейчас:

dfilatov commented 11 years ago

@veged, Примерный changelog того, что произошло:

ikokostya commented 11 years ago

@dfilatov Вроде хотели убрать url из core?

dfilatov commented 11 years ago

@ikokostya, да url не будет в core

veged commented 11 years ago

@dfilatov именование провайдов пока выглядит консистентным -- в чём твои сомнения?

dfilatov commented 11 years ago

конкретно в маппинге имен файлов на имена модулей: next-tick.js --> nextTick i-bem__dom.js --> i-bem.dom

veged commented 11 years ago

ну типа dash-delimited -> camelCase и __ -> .

ikokostya commented 11 years ago

@veged Вот именно, что сейчас i- не имеет смысла, т.к. у блоков больше нет префиксов. Напишите скрипт для миграции депсов. Не вижу проблемы.

dfilatov commented 11 years ago

@veged, еще появятся модули лежащие в модификаторах, какой маппинг для них будем использовать?

veged commented 11 years ago

@ikokostya префиксы никогда не были обязательными и сейчас они не стали запрещёнными — это всё опционально, может быть, а может не быть, никаких проблем

скрипт миграции: 1) не покрывает всего (есть ещё кроме deps завязки); 2) даже со скриптом нужно ещё приглядывать за правильным и полным результатом; 3) название i-bem использовалось в докладах и статьях и там скрипт миграции вовсе бессилен

ikokostya commented 11 years ago

@veged 1,2) Я этого и не отрицаю, все равно придется что-то поправить, но рутинную работу он выполнит. 3) changelog никто не отменял.

veged commented 11 years ago

по чейнджлогу:

veged commented 11 years ago

@ikokostya повторю основную мысль -- безотносительно того, что что-то прийдётся поправить, наша задача сделать так, чтобы поправлять надо было как можно меньше (плюс некоторые вещи типа записанного видео невозможно поправить, нужно отдельно прикладывать усилия по донесению новой информации)

veged commented 11 years ago

@dfilatov про именование я вдруг осознал, можно провайдить по бэм-идентификаторам:

dfilatov commented 11 years ago

по чейнджлогу:

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

dfilatov commented 11 years ago

@veged, во всех DOM-блоках будет определение выглядеть примерно так:

modules.define('i-bem__dom', function(provide, DOM) {

provide(DOM.decl('b-my-blocks', { ... }));

});

То есть происходит постоянное насыщение модуля i-bem__dom. Иначе непонятно, кто потом будет реквайрить каждый DOM-блок в отдельности.

narqo commented 11 years ago

@dfilatov а provide(BEM.blocks['b-my-block']) не будет работать?

narqo commented 11 years ago

i-common зависит от i-counter, i-counter зависит от i-global, i-global зависит от i-common

Это нормальная ситуацию, как бы странно это не звучало (и, да, мне это тоже не нравится, поскольку достаточно огребал проблем с этого): частично помогут depsByTech, как только они доберутся до продакшна.

dfilatov commented 11 years ago

@narqo, а как b-my-block окажется в BEM.blocks, если еще никто decl не звал для него?

dfilatov commented 11 years ago

@veged, у меня есть желание оставить i-bem только для DOM-части (то, для чего он оказался реально полезен), то есть -- смержить i-bem и i-bem__dom в один модуль i-bem, отвечающий за DOM-блоки.

narqo commented 11 years ago

@dfilatov, я имел ввиду, сначала в теле define-а BEM.DOM.decl(..), а потом provide(BEM.blocks[..]) — но кажется, я не правильно понял твою мысль выше :(

dfilatov commented 11 years ago

@narqo, так как ты пишешь можно писать, это ровно тоже самое, только длиннее.

narqo commented 11 years ago

@dfilatov, подумал, а DOM-блокам обязательно, что-то провайдить? Разве их нельзя просто оборачивать в

modules.require(['i-bem__dom'], function(DOM) { 

...

})

?

mdevils commented 11 years ago

@narqo В таком случае не написать

modules.require('i-bem__dom', function(DOM) {
    DOM.init();
});
mdevils commented 11 years ago

Вариант обертки bem-controls: https://github.com/ymaps/bem-controls

narqo commented 11 years ago

В таком случае не написать...

@mdevils, объясни, почему? По коду ym я не смог понять принципиальной разницы.

mdevils commented 11 years ago

@narqo Если мы выполняем DOM.init, то необходимо убедиться, что все DOM-декларации были выполнены. Если одна из деклараций зависит от чего-либо, что загружается асинхронно, то надо подождать каждую из таких деклараций. Соответственно, два пути. Либо декларировать все под i-bem__dom, либо писать modules.require(['i-bem__dom', 'input', 'button', 'checkbox', ... ], function(DOM) { DOM.init(); });

dfilatov commented 11 years ago

По итогам сегодняшнего разговора я внес следующие изменения:

Также, скрипя сердцем, я "воскресил" на одну версию и пометил как deprecated следующие методы в i-bem:

mdevils commented 11 years ago

Предлагаю в deprecated-методах писать в консоль варнинг о том, что методы deprecated.

mdevils commented 11 years ago

Не хватает events__channels в shouldDeps i-bem

veged commented 11 years ago

бранч feature/modules замёржил в dev