Имеются ли наработки (идеи развития) в сторону ограничений областей видимости для либ?
Например: В проекте используется либа libA с блоками A, B, C. На проекте есть блоки D, E, F
Но появляется интереcная либа libH.... С более проработанная реализация блоков E и F... Но в этой либе используются свои реализации блоков A и C.
Что в свою очередь порождает конфликт.
Хорошо было бы использовать что-то вроде namespace для блоков из либ. @vithar @veged @tadatuta @zxqfox
{ block : 'libA/chart' }// bem-xjstmodules.define('libA/chart')// ym:block(libA/chart)// post.css{ block : 'libH/chart' }// bem-xjstmodules.define('libH/chart')// ym:block(libH/chart)// post.cssили так
{ block : 'libA.chart' }// bem-xjstmodules.define('libA.chart')// ym:block(libA.chart)// post.css{ block : 'libH.chart' }// bem-xjstmodules.define('libH.chart')// ym:block(libH.chart)// post.cssКажется, что достаточно исключить «лишние» блоки из массива https://github.com/enb/enb-bem-techs/blob/master/techs/files.js (если используется enb):
Зачастую библиотеки используют под капотом другие библиотеки в качестве зависимостей + есть еще вопрос версионирования. Поэтому мы остановились на том, чтобы самые частоиспользуемые блоки называть коротко и удобно.
@Realetive ну а что, если они не лишние? )
Неймспейсы для либ сами по себе выглядят как усложнение, потому что блоки и модули сами по себе уже неймспейсы. На мой взгляд правильнее было бы уметь фильтровать при интроспекции некоторые блоки в уровнях, либо публиковать отдельные библиотеки по каждому набору блоков.
Тогда уж в результирующем таргете files, и это будет работать только для enb. Опять же, если добить историю про нейминг на файловой системе типа
lib1/button/button@desktop.jsто можно было бы фильтровать по маскам внутри уровней прямо в передавая опцию вwalk. p.s. Предвкушая вопрос почему сейчас нельзя — сейчас обход прохардкожен в walk и кастомизировать его сложновато.Сейчас стараюсь следовать этому способу. Но невозможно контролировать других разработчиков.
Подвяжу к обсуждениям ответ @vithar
согласен
Зачем изобретать велосипед, можно использовать готовые инструменты и экосистему npmjs, они уже добавили неймспейсы. Чтобы не плодить репозитории (как это делают тут http://atlaskit.atlassian.com/packages), есть инструмент https://www.npmjs.com/package/lerna используется https://github.com/bem/bem-sdk, но это не про интерфейс, но есть и про него https://github.com/primer/primer и https://github.com/fyndiq/fyndiq-ui, и наверное есть еще.
Для совместимости с текущими инструментами, надо будет только прокачать технологию
deps.js, научить ее читатьpackage.json.Поправка atlaskit тоже используют монорепозиторий https://bitbucket.org/atlassian/atlaskit-mk-2/src/master/ и видимо обходятся без lerna. Дока у них крутая, сбила с толку.
@ilyar проблема в том, что может быть 2 блока
calendar(с разной реализацией) в разных либах и они не должны ломать друг друга (в том числе черезcss)Кроме костылей (в виде префиксов) или
Центрального Реестра Блоков:) пока не понятно как добиться этого.@belozer не понятна проблема, которую ты описываешь. Вот то о чем я говорю:
@ilyar
Кажется понял, такая проблема, могла бы быть решена через общий интерфейс в PHP это реализуют виртуальные пакеты Composer, но в данном случаем сложно представить как можно было бы описать такой интерфейс.
Думаю чтобы попытаться решить появления похожих блоков (потенциально сдающих конфликты), самый простой путь
Центральный Реестр Блоков, именно так решали эту задачу в развитии jQuery плагинов, есть гайд и место размещения с начало был bower а потом перешли на npm. И внезапно, для БЭМ-библиотек он тоже есть https://github.com/bem-contrib ему только не хватает крутой морды с гадом и рейтингом. И это правильный путь конкуренции и сотрудничества. Этот путь не возможен без поддержки, хотя бы до момента зарождения самоорганизации. Полагаю именно эту задачу решает лего внутри яндекса.Путь одиночества и самобытности, сложный в начале и простота в использовании это добавить префиксов, интересная задачка, но, как по мне, есть более приоритетные.
@belozer Это реальная проблема или фантазия?
У них bolt, аналог lerna.
Про депсы из package.json мы уже местами начинаем думать локально и подбиваем клинья, преобразуя текущее Лего к монорепо, но пререквизитом является поддержка кастомных уровней в walk и преобразование схемы на fs от
{layer}.blocks/{entity}.{tech}к{entity}@{layer}.{tech}.Когда каждый блок будет лежать в своей папке — сильно проще из этих папок сделать отдельные модули и нагенерировать там же
package.jsonфайлы, за счет чего и публиковать каждый блок отдельно в NPM.package.jsonв корне блока, правда, не решает задачу целиком, потому что будут еще и зависимости от элементов, но пока не понятно насколько это болит.Но если даже каждый блок со всеми его элементами будет обладать общими зависимостями, то пока не решена проблема с честной модульностью блоков — и тогда вопрос с «неймспейсами» встаёт более остро, ведь будет возможность даже не желая того привезти один компонент двух разных версий в браузер, или не встаёт, если мы всё равно не хотим лишний код в браузере, и тогда можно будет для UI модулей просто не использовать NPM (?).
В общем, копать и копать).
p.s. А еще можно взять реакт с css-in-js ;-) и мучаться с другими проблемами, еще менее приятными).
это должен решить пакетный менеджер и семвер, если он не может решить, то
в реальности это будет означать что одна либа не очень активно обновляет свои зависимости и уверен не правильно хотеть решить это «неймспейсами»
Вот что есть про
namespaceUsing PostCSS with BEM and SUIT Methodologies by @kezzbracey