bem-archive / bem-tools Goto Github PK
View Code? Open in Web Editor NEWToolkit to work with files based on BEM methodology
Home Page: http://bem.info/tools/bem/
License: MIT License
Toolkit to work with files based on BEM methodology
Home Page: http://bem.info/tools/bem/
License: MIT License
name: -> block:
Remove "require BEM" in JSdoc
Ноды (LevelNode
, BundlesLevelNode
, BundleNode
) должны актуализировать состояние arch
во время своего выполнения. Сейчас эти ноды достраивают граф ровно один раз при первом выполнении.
В нодах должна быть реализована защита от частой перестройки графа (для начала, не чаще чем раз в 5 секунд).
В будущем механизм контроля будет отдан модулю, мониторящему изменения на файловой системе.
npm -g install bem
npm WARN [email protected] package.json: bugs['web'] should probably be bugs['url']
npm WARN [email protected] package.json: bugs['web'] should probably be bugs['url']
/usr/local/bin/bem -> /usr/local/lib/node_modules/bem/bin/bem
[email protected] /usr/local/lib/node_modules/bem
├── [email protected]
├── [email protected]
└── [email protected]
Результат:
HTTP error 404
.fake
):trying to access /fake/bem-bl-test/pages/example/example.html
[*] make 'bem-bl' [1]
[=] Log of make 'bem-bl' [1]
git clone --progress git://github.com/bem/bem-bl.git /fake/bem-bl-test/bem-bl
Cloning into /fake/bem-bl-test/bem-bl...
remote: Counting objects: 8834, done.
remote: Compressing objects: 100% (2650/2650), done.
remote: Total 8834 (delta 5765), reused 8785 (delta 5721)
Receiving objects: 100% (8834/8834), 1.58 MiB | 360 KiB/s, done.
Resolving deltas: 100% (5765/5765), done.
cd /fake/bem-bl-test/bem-bl && git checkout master
Already on 'master'
[*] make 'pages*' [1]
[=] Log of make 'pages*' [1]
*** HTTP error: 404, undefined
Поставить свежий bem server.
Поставить bem-bl-test.
Запустить bem server
в bem-bl-test
.
Вызвать в браузере сборку http://localhost:8080/pages/example/example.html
Сборка доходит до
[*] make 'pages/example/example.deps.js.meta.js' [6]
[=] Log of make 'pages/example/example.deps.js.meta.js' [6]
после чего виснет.
Node class to encapsulate build logic of blocks level (see BundlesLevelNode
as an example)
https://github.com/joyent/node/blob/master/lib/sys.js
Похоже, модуль sys переименовали в util - https://github.com/joyent/node/blob/master/lib/util.js
Сейчас выскакивают ворнинги при работе с bem tools.
node -v
v0.6.2
необходимо
require('sys')
заменить на
require ('util')
Добрый день, первый раз сталкиваюсь с nodejs поэтому могу что-то не правильно делать.
Поставил node.exe версии 0.6.6 на windows 7 x64, пользуюсь ryppi пакет менеджером. Тестовые проекты для nodejs работают.
Установил bem. Но при обращении к утилите - резальтатов никаких не даёт. Опытным путём (console.log) - выяснил что методы .act() не вызываются никогда.
к примеру в файле bem/lib/commands/create/level.js после строчки "module.exports = function() {" -- console.log(); выполняется, а далее по коду в методе act() -- нет. Запускал с командой bem create level blocks.
Так же не отвечают на запросы все другие команды - даже bem --help ничего не выводит.
'bem decl subtract' generates output in 'export.deps' format and 'bem decl merge' can't merge it
Для комманд bem.create.elem
и bem.create.mod
не устанавливается контекст технологии Tech.setContext(context)
. Соответственно вызов this.getContext()
из технологии возвращает undefined
;
Сейчас выводимый html файл не содержит форматирования.
Хочется иметь возможность получать "красивый" html.
Необходимо для удобного распиливая html на куски, и нормального diffa.
Нет возможности получить результат билда технологии написанной в legacy-стиле. Это бывает нужно, если новая технология содержит (доопределяет) контент старой технологии.
Симптомы:
Блок А имеет элемент А.а.
Блок А подключен к блоку Б и блоку В.
Блок Б подключен к блоку Г, который подключен к блоку В.
После сборки деклорация об элемент A.а в deps-фале отсутствует, соответственно и в сборке.
Если отсоединить блок А от блока Б или блока В и оставить только в одном из них. То декларация элемента А.а появляется в deps-файле и в сборке.
Все колдовство происходило с js фалами. Других технологий там нет.
%.html: %.bemhtml.js %.css %.js
$(call BEM_CREATE,bem-bl/blocks-desktop/i-bem/bem/techs/html.js)
bem create выдаёт ошибку "File already exists". Спасает "rm $@" в мейк-файле. Но удаление — плохая практика, т.к. новый файл может не собраться.
Хорошо бы иметь ключик --force (-f) для принудительного перезаписывания файла цели в случае успешной генерации.
Сейчас ie.css технология собирается так:
@import url(../../bem-bl/blocks-desktop/b-link/_pseudo/b-link_pseudo_yes.ie.css);
Есть мнение, что правильней собирать эту технологию в таком виде:
@import url(../../bem-bl/blocks-desktop/b-link/_pseudo/b-link_pseudo_yes.ie.css);
@import url(../../blocks/b-link/_pseudo/b-link_pseudo_yes.css);
@import url(../../blocks/b-link/_color/b-link_color_red.css);
@import url(../../blocks/b-link/_color/b-link_color_green.css);
ie.css файлы должны подключаются там, где объявлены, а не в конце документа, как это происходит сейчас
Example:
@import url(index.css);
@import url(../../blocks/i-global/i-global.ie.css);
@import url(../../blocks/i-global/_type/i-global_type_reset.ie.css);
@import url(../../blocks/i-global/_type/i-global_type_simple.ie.css);
@import url(../../blocks/b-head-tabs/b-head-tabs.ie.css);
instead of:
@import url(../../blocks/i-global/i-global.ie.css);
@import url(../../blocks/i-global/_type/i-global_type_reset.ie.css);
@import url(../../blocks/i-global/_type/i-global_type_simple.ie.css);
@import url(../../blocks/b-head-tabs/b-head-tabs.ie.css);
bem server
runs master process that will watch fs changes and restart child fork as needed. All build logic will be run in a separate (single) fork.
в файле utils.js есть функция:
exports.isPath = function(str) {
return str.indexOf(PATH.dirSep) !== -1;
};
Она определяет является ли путём строка. Так вот в windows окружении PATH.dirSep == '' , а GNUMakefile все пути заданы с косой чертой '/' и при сборке выскакивают ошибки о не найденых файлах и т.п.
Принимая в качестве разделителя косую черту nodejs нормально её интерпретирует и в винде, поэтому может имеет смысл как-то форсировать именно её при возможности - так скрипты сборки будут кроссплатформеней писаться?
ps чтобы было понятнее вопрос относится к GNUMakefile из bem-method - но детали реализации тут, поэтому и сюда запостил.
Хочется иметь возможность передавать дополнительные параметры в технологии из API (create/build
).
Например:
bem.create.block({ forceTech: [ techs ] }, { names: [ 'block-name' ], vars: { foo: 'bar' } })
nt
Если использовать WebSocket (и его аналоги для старых браузеров), то при поднятии bem serverа, можно инклудить на страницу легкий js, который будет подключаться к серверу и ждать от него сообщений о том, что файл технологии обновился и то, что следует обновить страницу или этот файл.
Тогда получится обратный процесс, когда мы меняем что-то на файловой системе, а bem server производит автоматическую сборку всего, что требуется и по окончании обновляет страницу на клиенте.
bem create block -l level block
блок не создастся если уровня level
не существует. Надо либо создавать недостающие уровни/блоки/элементы автоматом, либо ввести ключ (-p, --parents) по аналогии с mkdir -p
Read block libraries config from .bem/lib.js
, generate target for each library.
Config can be like this:
exports.getLibraries = function() {
return {
'bem-bl': {
type: 'git',
url: 'git://github.com/bem/bem-bl.git',
treeish: 'master'
}
}
};
в объявлении myPath внутри библиотеки bem-tools / lib / level.js
при объявлении переменных закаралась ошибка в виде точки с запятой вместо просто запятой
Играюсь с БЭМ, сегодня сделал в проекте make -B и что-то пошло не так.
Раньше лечилось обновлением всего связанного с БЭМ. В этот раз не полечилось.
Удалил все что было, поставил обратно. Все равно не полечилось.
После 1-й установки оно поругалось
error: TypeError: Object # has no method 'parse'
После npm update оно перестало ругаться, но результирующие файлы пустые.
Куда копать?
Ниже лог.
dmage@nibbler ~ $ sudo npm-g install bem xjst ometajs
npm WARN [email protected] package.json: bugs['web'] should probably be bugs['url']
/usr/bin/ometajs2js -> /usr/lib/node_modules/ometajs/bin/ometajs2js
/usr/bin/xjst -> /usr/lib/node_modules/xjst/bin/xjst
npm WARN [email protected] package.json: bugs['web'] should probably be bugs['url']
npm WARN [email protected] package.json: bugs['web'] should probably be bugs['url']
/usr/bin/bem -> /usr/lib/node_modules/bem/bin/bem
[email protected] /usr/lib/node_modules/ometajs
[email protected] /usr/lib/node_modules/xjst
[email protected] /usr/lib/node_modules/bem
├── [email protected]
├── [email protected]
└── [email protected]
dmage@nibbler ~ $ git clone https://github.com/bem/bem-bl-test.git
Cloning into bem-bl-test...
cd bem remote: Counting objects: 121, done.
remote: Compressing objects: 100% (79/79), done.
remote: Total 121 (delta 35), reused 106 (delta 20)
Receiving objects: 100% (121/121), 11.91 KiB, done.
Resolving deltas: 100% (35/35), done.
dmage@nibbler ~ $ cd bem-bl-test/
dmage@nibbler ~/bem-bl-test $ make
-- git git://github.com/bem/bem-bl.git bem-bl
Cloning into bem-bl...
remote: Counting objects: 3834, done.
remote: Compressing objects: 100% (1527/1527), done.
remote: Total 3834 (delta 2122), reused 3724 (delta 2012)
Receiving objects: 100% (3834/3834), 758.43 KiB | 307 KiB/s, done.
Resolving deltas: 100% (2122/2122), done.
bem create block -l pages -t bemdecl.js client
bem build -l bem-bl/blocks-common/ -l bem-bl/blocks-desktop/ -l blocks/ -l pages/client/blocks/ -d pages/client/client.bemdecl.js -t deps.js -o pages/client -n client
bem build -l bem-bl/blocks-common/ -l bem-bl/blocks-desktop/ -l blocks/ -l pages/client/blocks/ -d pages/client/client.deps.js -t bem-bl/blocks-common/i-bem/bem/techs/bemhtml.js -o pages/client -n client
error: TypeError: Object # has no method 'parse'
TypeError: Object # has no method 'parse'
at [object Object].bemBuild (/home/dmage/bem-bl-test/bem-bl/blocks-common/i-bem/bem/techs/bemhtml.js:43:29)
at [object Object].build (/usr/lib64/node_modules/bem/lib/tech.js:420:26)
at /usr/lib64/node_modules/bem/lib/commands/build.js:119:22
at Array.forEach (native)
at Cmd. (/usr/lib64/node_modules/bem/lib/commands/build.js:44:32)
at /usr/lib64/node_modules/bem/node_modules/coa/lib/cmd.js:384:22
at _fulfilled (/usr/lib64/node_modules/bem/node_modules/q/q.js:498:32)
at Promise.promiseSend (/usr/lib64/node_modules/bem/node_modules/q/q.js:242:37)
at /usr/lib64/node_modules/bem/node_modules/q/q.js:519:18
at Promise.promiseSend (/usr/lib64/node_modules/bem/node_modules/q/q.js:242:37)
make: *** [pages/client/client.bemhtml.js] Ошибка 1
rm pages/client/client.deps.js pages/client/client.bemdecl.js
dmage@nibbler ~/bem-bl-test $ sudo npm-g update
npm WARN [email protected] package.json: bugs['web'] should probably be bugs['url']
npm WARN [email protected] package.json: bugs['web'] should probably be bugs['url']
npm WARN [email protected] package.json: bugs['web'] should probably be bugs['url']
npm WARN [email protected] package.json: bugs['web'] should probably be bugs['url']
/usr/bin/xjst -> /usr/lib/node_modules/xjst/bin/xjst
[email protected] /usr/lib/node_modules/xjst
├── [email protected]
├── [email protected]
└── [email protected]
dmage@nibbler ~/bem-bl-test $ make -B
-- git git://github.com/bem/bem-bl.git bem-bl
From git://github.com/bem/bem-bl
dmage@nibbler ~/bem-bl-test $ ls -al pages/example/
итого 20
drwxr-xr-x 2 dmage dmage 4096 Ноя 20 00:55 .
drwxr-xr-x 4 dmage dmage 4096 Ноя 20 00:53 ..
-rw-r--r-- 1 dmage dmage 1259 Ноя 20 00:55 example.bemhtml.js
-rw-r--r-- 1 dmage dmage 563 Ноя 20 00:53 example.bemjson.js
-rw-r--r-- 1 dmage dmage 0 Ноя 20 00:55 example.css
-rw-r--r-- 1 dmage dmage 1 Ноя 20 00:55 example.html
-rw-r--r-- 1 dmage dmage 0 Ноя 20 00:55 example.ie.css
-rw-r--r-- 1 dmage dmage 0 Ноя 20 00:55 example.js
dmage@nibbler ~/bem-bl-test $ make pages/client/client.bemdecl.js
bem create block -l pages -t bemdecl.js client
dmage@nibbler ~/bem-bl-test $ cat pages/client/client.bemdecl.js
dmage@nibbler ~/bem-bl-test $
Sergey, could you please release new version of bem npm package with ie.css tech I have done right now. I will announce it in out Yarushka club with an example in bem-bl-test project which I have already done too.
Thank you!
We need to incapsulate all the knowledge of the build process (build rules AND dependencies) in a single node class.
It is not true for some node classes for now. For example, BundleNode
knows about deps of each builded tech bundle file.
Хочется иметь в bemjson встроенную поддержку комментирования блоков.
например
{
block: 'b-test',
info: true,
content: 'hello'
}
будет развариваться в
<!-- start b-test -->
<div class='b-test'>
hello
</div>
<!-- end b-test -->
The problem is that require()
caches loaded modules, so when we need to reload changes make.js
or something we'll get a link to the obsolete cached copy of new and not a new version from disk.
There are some places in code that need to be fixed.
В нодах проглатываются ошибки, после чего сборка не работает, а в консоли (как make, так и server стектрейсов и вообще сообщений об ошибках нет). Один из примеров: в тело конструктора BundleNode добавить xxx.yyy;
и запустить bem make pages/example/example.html
на bem-bl-test.
Результат:
[*] make 'bem-bl' [1]
[=] Log of make 'bem-bl' [1]
cd /../bem-bl-test/bem-bl && git pull --progress origin server
Already up-to-date.
From git://github.com/bem/bem-bl
* branch server -> FETCH_HEAD
cd /../bem-bl-test/bem-bl && git checkout server
Already on 'server'
[*] make 'pages*' [1]
** No rule to make target 'pages/example/example.html'
Похоже, последние коммиты bem / apw что-то крепко сломали. Поставленный начисто bem-tools/server падает.
bem server
падает по TypeError: Object #<Object> has no method 'findNode, at /../bem-tools/lib/server.js:76:23
bem make
падает по TypeError: Object #<Object> has no method 'findAndProcess, at /../bem-tools/lib/commands/make.js:56:22
{}
) runner.Хочется, находясь внутри папки блока иметь возможность создать файл-технологии
например
/project/my-level/b-my-test bem create block -T css
создаст файл /project/my-level/b-my-test/b-my-test.css
Create node class to build single block. BundleNode
could be used as a reference.
Arch should be built on the first request. The requests coming shortly after the first one should be completed using the existing arch. An invalidation timeout should be defined which sets the time during which the arch is considered being valid. Requests coming during the timout will use existing arch, every such request resets the timeout. When timeout is completed the arch becomes invalid and next server request will lead to the arch being rebuilt.
C:\usr\nodejs>bem
C:\usr\nodejs>bem create block b-my-block
C:\usr\nodejs>dir
Directory of C:\usr\nodejs
29.12.2011 13:58
.C:\usr\nodejs>bem --help
После ввода команды что-то происходит, но результата нет, как нет никаких сообщений.
Под Debian собрал, всё работает, всё ок.
Проблема в node.exe или bem-tools?
The initial build arch could then be:
- all
- build
- RootNode*
Пытаюсь создать уровень переопределения с точкой в имени: bem create level level.blocks
. Получаю
node.js:134
throw e; // process.nextTick error, or 'error' event on first tick
^
TypeError: Cannot call method 'shift' of undefined
at Cmd.parse (/usr/lib/node/.npm/bem/0.0.9/package/lib/optparse.js:163:37)
at Cmd.parse (/usr/lib/node/.npm/bem/0.0.9/package/lib/optparse.js:156:21)
at Cmd.parse (/usr/lib/node/.npm/bem/0.0.9/package/lib/optparse.js:156:21)
at Object.main (/usr/lib/node/.npm/bem/0.0.9/package/lib/bem.js:23:10)
at Object.<anonymous> (/usr/lib/node/.npm/bem/0.0.9/package/bin/bem:3:23)
at Module._compile (module.js:402:26)
at Object..js (module.js:408:10)
at Module.load (module.js:334:31)
at Function._load (module.js:293:12)
at Array.<anonymous> (module.js:421:10)
Если передать ключ -C ./
то уровень создается.
Не хватает мана для bem-tools, в котором было бы описано всё по использованию. Описание сущностей и как с ними работать.
So it would be possible to process the libraries blocks etc.
Беру тестовый проект отсюда - https://github.com/bem/bem-bl-test
Во время сборки вылетает ошибка:
/Users/vizo/Sites/test make
bem create block -l pages -T bemdecl.js client
bem build -l bem-bl/blocks-common/ -l bem-bl/blocks-desktop/ -l blocks/ -l pages/client/blocks/ -d pages/client/client.bemdecl.js -t deps.js -o pages/client -n client
bem build -l bem-bl/blocks-common/ -l bem-bl/blocks-desktop/ -l blocks/ -l pages/client/blocks/ -d pages/client/client.deps.js -t bem-bl/blocks-common/i-bem/bem/techs/bemhtml.js -o pages/client -n client
Error: Cannot find module 'bem/lib/path'
at Function._resolveFilename (module.js:317:11)
at Function._load (module.js:262:25)
at require (module.js:346:19)
at Object. (/Users/vizo/Sites/test/bem-bl/blocks-common/i-bem/bem/techs/bemhtml.js:1:76)
at Module._compile (module.js:402:26)
at Object..js (module.js:408:10)
at Module.load (module.js:334:31)
at Function._load (module.js:293:12)
at require (module.js:346:19)
at /usr/lib/node_modules/bem/lib/tech.js:13:20
make: *** [pages/client/client.bemhtml.js] Error 1
rm pages/client/client.deps.js pages/client/client.bemdecl.js
node -v v0.4.11
npm -v 1.0.104
bem -v 0.1.2
bem create level qqq
The "sys" module is now called "util". It should have a similar interface.
Please, change the code to avoid this message.
We need an ability to configure (override some points and replace whole logic when needed) and fine tune of default build rules.
Proposed solution.
We add an ability for user to specify his own rules in .bem/make.js
for the project (starting build arch) and its levels (blocks and bundles/pages) and in path/to/block-or-bundle/block-or-bundle.make.js
for the block or bundle. The result of require()
of this file then treated as a second argument to INHERIT(baseNodeClass, requiredObj)
(require('inherit')
) call. baseNodeClass
is a class describing default build rules for particular builded object.
This solution doesn't cover overriding of generic nodes like FileNode
, BemCreateNode
and BemBuildNode
.
Read config from .bem/<something>.js
(.bem/levels.js
?), look for function-getter or glob variable, generate target for each bundle level present.
Config could be like this:
// regexp?
exports.bundleLevelsRegexp = /bundles.*?/;
// glob pattern?
exports.bundleLevelsGlob = 'bundles* pages*';
// function-getter (overriding default implementation)
exports.getBundleLevels = function() {
return ['pages', 'widgets'];
};
/Users/vitaly/sites/project# bem create level -t css blocks
node.js:134
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: Cannot find module 'bem/lib/techs/default'
at Function._resolveFilename (module.js:320:11)
at Function._load (module.js:266:25)
at require (module.js:348:19)
at new (/usr/local/lib/node/.npm/bem/0.0.6/package/lib/tech.js:9:16)
at [object Object].createTech (/usr/local/lib/node/.npm/bem/0.0.6/package/lib/context.js:39:12)
at [object Object].getTech (/usr/local/lib/node/.npm/bem/0.0.6/package/lib/context.js:33:38)
at /usr/local/lib/node/.npm/bem/0.0.6/package/lib/commands/create/level.js:75:44
at Array.forEach (native)
at /usr/local/lib/node/.npm/bem/0.0.6/package/lib/commands/create/level.js:74:66
at Array.forEach (native)
/Users/vitaly/sites/project# bem -v
0.0.6
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.