bem/bem-tools
-
5677eccecb12dfae7d44a4f45034d89dfe950f9d
5677eccecb12dfae7d44a4f45034d89dfe950f9d
Существует несколько способов написания модулей технологии. -
c9966f6119d7eb9b313305ca87905a7d31bf6f34
c9966f6119d7eb9b313305ca87905a7d31bf6f34
Во всех описанных ниже способах из методов можно обратиться к объекту технологии через `this`,
а через `this.__base(...)` можно вызвать метод одного из базовых классов. К классу технологии
можно обратиться через `this.__class`. Всё это является следствием использование модуля
[inherit](https://github.com/dfilatov/node-inherit) для органиазации наследования. -
421e349ce7effe357b3cfe493e6688ff128862bc
421e349ce7effe357b3cfe493e6688ff128862bc
##### Очень простой способ -
3acd63d49d5d8693804c3a7a49f51f13cf459654
3acd63d49d5d8693804c3a7a49f51f13cf459654
Способ заключается в том, что вы создаёте обычный CommonJS модуль, из
которого экспортируете несколько функций, которые перекроют методы базового
класса `Tech` из модуля [lib/tech.js](https://github.com/bem/bem-tools/blob/master/lib/tech.js). -
63a096811b44516dbd165135439d4d636336e649
63a096811b44516dbd165135439d4d636336e649
```js
exports.getCreateResult = function(...) {
// ваш код
};
``` -
2178b5c1846ee5d1d676328fa0aec7f7ee95d59b
2178b5c1846ee5d1d676328fa0aec7f7ee95d59b
Вы так же можете сгруппироать все методы в объекте `techMixin`. Это рекомендованный способ. -
d16386309a94c244f6e9de2bbd37b1daed803fde
d16386309a94c244f6e9de2bbd37b1daed803fde
```js
exports.techMixin = { -
60bbeeb710dac2a19cef2be4f5c1ca8a88c013f9
60bbeeb710dac2a19cef2be4f5c1ca8a88c013f9
getCreateResult: function(...) {
// ваш код
} -
243c8b0a3eec97bc80a519d4a2a807d527ba5fbf
243c8b0a3eec97bc80a519d4a2a807d527ba5fbf
##### Простой способ -
3437f9888282b7fc65c68b4e3b311d2705683fe6
3437f9888282b7fc65c68b4e3b311d2705683fe6
В простом способе к экспортируемым функциям добавляется переменная `baseTechPath`, в которой
содержится абсолютный путь до расширяемого модуля технологии. -
0062be1cd42b0f36e7f609bafb19c1df26279a47
0062be1cd42b0f36e7f609bafb19c1df26279a47
```js
var BEM = require('bem'); -
29f307dcf1ccfbf1b8efde82684205c4a2e7c013
29f307dcf1ccfbf1b8efde82684205c4a2e7c013
exports.baseTechPath = BEM.require.resolve('./techs/css');
``` -
9bd8a3cd349786d8935f37e1356bb5a5582dd197
9bd8a3cd349786d8935f37e1356bb5a5582dd197
Так же вы можете организовать контекстное наследование, использую переменную `baseTechName`.
В этом случае базовый класс будет выбран в зависимости от уровня переопределения, на котором
будет использован модуль технологии. -
0ecd816e72362759b0575163f21fafdfd7b84cbf
0ecd816e72362759b0575163f21fafdfd7b84cbf
```js
exports.baseTechName = 'css';
``` -
34b54a396e3f96b343f56847d5ad13158484d73c
34b54a396e3f96b343f56847d5ad13158484d73c
В этом примере новая технология будет расширять технологию `css`, заданную на уровне переопределения
в файле `.bem/level.js`. -
3aa428bd0192cc8ca2b0c898054208afbcb76059
3aa428bd0192cc8ca2b0c898054208afbcb76059
##### Для продвинутых -
ae4c8e87bdf554be1cc5895f893c4ed6fbbc3647
ae4c8e87bdf554be1cc5895f893c4ed6fbbc3647
Если вам нужен полный контроль, вы можете создать модуль, экспортирующий готовый класс технологии `Tech`. -
d71301eca884b89862bfa2cf643adde981adfe46
d71301eca884b89862bfa2cf643adde981adfe46
```js
var INHERIT = require('inherit'),
BaseTech = require('bem/lib/tech').Tech; -
3dc42c7fca2e9ede61d733f7e8044d3ab58358cb
3dc42c7fca2e9ede61d733f7e8044d3ab58358cb
exports.Tech = INHERIT(BaseTech, { -
da404259dc6a895071be77ad73206dcb4f9059fe
da404259dc6a895071be77ad73206dcb4f9059fe
create: function(prefix, vars, force) {
// do some creation work
},