В общем случае структура каталогов и файлов может выглядеть следующим образом:
app/
├── bemer_components/
| ├── modal/
| | ├── index.html
| | ├── index.js
| | ├── index.scss
| | └── ...
| ├── top_navbar/
| | ├── index.html.slim
| | ├── bemhtml.slim
| | ├── index.js
| | ├── index.scss
| | └── ...
| └── ...
└── ...
Название каталога это название компонента, которое будет использоваться в представлениях (views
) и/или хелперах (helpers
) приложения. Каталог может содержать любые файлы (технологии) которые необходимы для компонента, например такие, как js
, css
, md
и т.д.
Соглашения о файлах (технологиях):
-
Каталог обязательно должен содержать индексный файл для технологии HTML (это может быть:
index.html
,index.html.slim
,index.html.erb
и т.д.), который описывает структуру компонента, используя для этого любой шаблонизатор (ERB
,Slim
,HAML
и др.) или только HTML код. -
Если индексный файл технологии HTML для создания структуры (дерева) компонента использует хелпер
define_component
, тогда каталог может содержать индексный файл для шаблонов по умолчанию (технологияbemhtml
), он должен называтьсяbemhtml
с обязательным указанием шаблонизатора например:bemhtml.erb
,bemhtml.slim
и т.д. -
Все остальные технологии (
js
,css
,md
и т.д.) считаются дополнительными и их можно добавлять по мере необходимости, имена файлов могут быть любыми но для единообразия и удобства лучше использоватьindex
в качестве имени:В случае если используется Sprockets, тогда подключение
JS
иCSS
файлов компонента может быть таким:# Файл application.coffee #= require modal
// Файл application.js //= require modal
// Файл application.css или application.scss //= require modal
Возможно всё-таки появится поддержка индексных файлов и у SASS.
При использовании Webpacker для JavaScript также можно не указывать
index.js
:import 'modal'
Структуру каталогов можно организовывать по-разному в зависимости от вида приложений и решаемых задач.
Компоненты разделены для использования в разных частях приложения, пользовательской (user
), административной (admin
) и общие (common
) можно использовать/переопределять везде:
app/
├── bemer_components/
| ├── common/
| | ├── modal/
| | | ├── index.html.slim
| | | ├── bemhtml.slim
| | | ├── index.js
| | | ├── index.scss
| | | └── ...
| | ├── top_navbar/
| | | ├── index.html.slim
| | | ├── bemhtml.slim
| | | ├── index.js
| | | ├── index.scss
| | | └── ...
| | └── ...
| ├── admin/
| | ├── top_navbar/
| | | ├── index.html.slim
| | | ├── bemhtml.slim
| | | ├── index.js
| | | ├── index.scss
| | | └── ...
| | └── ...
| ├── user/
| | ├── top_navbar/
| | | ├── index.html.slim
| | | ├── bemhtml.slim
| | | ├── index.js
| | | ├── index.scss
| | | └── ...
| | └── ...
| └── ...
└── ...
Приложение, в котором компоненты разделены для поддержки различных устройств:
app/
├── bemer_components/
| ├── common/
| | ├── modal/
| | | ├── index.html.slim
| | | ├── bemhtml.slim
| | | ├── index.js
| | | ├── index.scss
| | | └── ...
| | ├── top_navbar/
| | | ├── index.html.slim
| | | ├── bemhtml.slim
| | | ├── index.js
| | | ├── index.scss
| | | └── ...
| | └── ...
| ├── desktop/
| | ├── top_navbar/
| | | ├── index.html.slim
| | | ├── bemhtml.slim
| | | ├── index.js
| | | ├── index.scss
| | | └── ...
| | └── ...
| ├── touch_pad/
| | ├── top_navbar/
| | | ├── index.html.slim
| | | ├── bemhtml.slim
| | | ├── index.js
| | | ├── index.scss
| | | └── ...
| | └── ...
| └── ...
└── ...
Альтернативный способ структуры каталогов и файлов для поддержки различных устройств в приложениях начиная с Rails 4.1
это использовать Variants:
app/
├── bemer_components/
| ├── modal/
| | ├── index.html.slim
| | ├── index.html+phone.slim
| | ├── index.html+tablet.slim
| | ├── bemhtml.slim
| | ├── index.js
| | ├── index.scss
| | └── ...
| ├── top_navbar/
| | ├── index.html.slim
| | ├── index.html+phone.slim
| | ├── index.html+tablet.slim
| | ├── bemhtml.slim
| | ├── index.js
| | ├── index.scss
| | └── ...
| └── ...
└── ...