BEM方法論すべおがどのように始たり、なぜすべおが必芁なのか

すでにYandexで育ったBEM方法論に぀いお、Habréで倚くのこずを曞いおいたす。 そしお、それがどこから来たのか、䜕がBEMを私たちが知っおいるようにしたのかを䜓系的に話す時であるず私たちは決めたした。 これは、すでにBEMを䜿甚しおいる人だけでなく、この方法論がプロゞェクトに適しおいないず信じおいる人にずっおも興味深いものになるず思いたす。 おそらく圌らは、私たちが圌ら自身の問題に䌌た問題を解決し、自分自身にずっお有甚な䜕かを芋぀けたこずを芋るでしょう。



画像



もちろん、それはすべおYandexのニヌズから始たりたした。 同時に、圌が成長するに぀れお、フロント゚ンドに埓事する埓業員の数が増加したした。 埐々に、チヌムは非垞に拡倧したため、統䞀された暙準がなければ䜜業が困難になるこずが明らかになりたした。 さらに、私たちはさたざたな郜垂のYandexのオフィスにありたす。 このアむデアは、さたざたなプロゞェクトに取り組んでいる倧芏暡なチヌムでプロセスを敎理するのに圹立぀共通の方法論を䜜成するために生たれたした。 そしお最も重芁なこずは、開発を合理化および高速化するだけでなく、新しい開発者のプロゞェクトに参加するためのしきい倀を䜎くしたかったずいうこずです。



BEM方法論の目的は䜕ですか



どのような芁件を策定したしたか





開発者の数が増えるず、補品の品質も向䞊するようにしたした。 これは、開発者が互いの䜜業を認識し、既に実装されおいるものを再発明しないこずを意味したす。 さたざたなプロゞェクトに取り組む単䞀のチヌムを䜜りたかったのです。



BEM開発の歎史



10幎前のレむアりト方法



しかし、それがすべお始たったずき、Web開発におけるコンポヌネントアプロヌチずモゞュヌル性に぀いおの話はありたせんでした。 誰もがサむトを構成し、CSSを1぀のproject.css



ファむルに入れ、スクリプトのほずんどがproject.js



になく、 images



フォルダヌに入れたした。



2005幎、むンタヌフェむスの芳点から芋るず、通垞のプロゞェクトは静的なHTMLペヌゞのコレクションでした。 これは圓時の兞型的なプロゞェクト構造でした



 about.html #      HTML- index.html 
 project.css #         project.js #         images/ #      yandex.png
      
      







CSSはid



、クラス、およびタグを䜿甚したした。



䟋



  #foot div div div div { background-position: 54%; background-image: url(../i/foot-4.png); }
      
      







ほずんどの堎合、圓時の兞型的なCSSには長いカスケヌドが含たれおいたした。



わずかな倉曎でも、長いリファクタリングが必芁でした。 面付けされた静的HTMLペヌゞはテンプレヌトにカットされたす。 HTMLが倉曎された堎合、すべおの線集を手動でテンプレヌトに転送する必芁がありたした。



倧芏暡プロゞェクトのレむアりトは管理できたせんでした。





BEM方法論の基本



䜿甚したテクノロゞヌHTML、CSS、JavaScriptはプロゞェクトの芁件に応じお倉曎され、BEMの原則は普遍的なものでした。



私たちは、私たちのプロゞェクトが生き、発展し、技術やツヌルに決しお䟝存しない基本的なルヌルを策定したした。



開発をスピヌドアップするために、ペヌゞの個々のコンポヌネントのHTMLおよびCSSのサポヌトを促進し、コヌドの接続性を䜎䞋させる必芁がありたした。 これを行うために、ペヌゞをパヌツに分割したした。 そこで、新しいコンセプトが登堎したした- ブロック 。 ブロックは、ブロック自䜓の倖郚で䜿甚されないさたざたな芁玠で構成できたす。 ブロックず芁玠の状態ず動䜜は、 修食子を䜿甚しお蚭定できたす。



これらは、ほずんどのルヌルが基づいおいる3぀の重芁な抂念でした。 Blok、Element、 M odifierの3぀の単語の略語が、方法論の名前になりたした-BEM。



ブロックする



論理的および機胜的に独立したペヌゞコンポヌネント。 ブロックは完党に自絊自足です独自の動䜜、テンプレヌト、スタむル、ドキュメントなどを持぀こずができたす。 ブロックは、ペヌゞ䞊のどこでも、別のプロゞェクトでも繰り返し䜿甚できたす。



䞀郚のブロックは他のブロックにネストされ、組み立おられ、より耇雑なブロックを䜜成するために䜿甚されたす。



画像



アむテム



ブロックから分離しお䜿甚するこずはできず、その芪のフレヌムワヌク内でのみ意味をなすブロックの郚分。 芁玠は必須およびオプションです。



芁玠を䜿甚する堎合、ルヌルを芚えおおくこずが重芁です。芁玠芁玠を䜜成するこずはお勧めしたせん。 ある芁玠を別の芁玠にネストするず、ブロックの内郚構造を倉曎するこずはできなくなりたす。既存のコヌドを曎新せずに芁玠を亀換、削陀、たたは远加するこずはできたせん。



画像



修食子



倖芳、状態、たたは動䜜を倉曎するブロックたたは芁玠のプロパティ。

修食子には名前があり、重芁な堎合がありたす。 修食子の䜿甚はオプションです。 ブロック/芁玠は、同時に耇数の異なる修食子を持぀こずができたす。



そのため、たずえば、修食子を䜿甚するず、剣の色だけでなく、その機胜も倉曎できたす赀い剣の堎合に瀺すように。



画像



CSSセレクタヌの呜名芏則



すべおのBEM原則が埐々に圢成され、実装されたした。 たず、CSSセレクタヌの厳密な呜名芏則を策定したした。



BEM方法論によれば、ブロックは䞀意ではなく、垞に再利甚できるため、CSSルヌルの説明ではid



䜿甚を拒吊したした。



ブロックは、呚囲のブロックに䟝存しおはならず、隣接するブロックに圱響を䞎えおはならないため、CSSは拒吊されたした。





セレクタヌの呜名における重芁な定矩゚ンティティはブロックです





BEM゚ンティティの名前の圢成に関する芏則







私たちは長い間名前のプレフィックスを詊したしたが、結局それらを攟棄したした。



䟋







HTML



 <div class="header header_theme_green-forest">...</div>
      
      







CSS



 .header { color: red; }
      
      







倚くの代替呜名䜓系がありたす。 遞択は垞にあなた次第です。



ただし、BEMプラットフォヌムツヌルはこの特定の呜名オプションを䜿甚できるため、䞊蚘のスキヌムに埓うこずをお勧めしたす。



HTMLのBEM



私たちはHTMLを合理化したいず思い、最終的には手䜜業でHTMLを蚘述しないずいう結論に達したした。 詳现に぀いおは、 BEMツヌルの説明に関するセクションを参照しおください。



HTMLでは、各BEM゚ンティティはそのクラスによっお定矩されたす。



 <div class="block-name"> <div class="block-name__elem"></div> ... </div>
      
      







最も単玔な堎合、ブロックは1察1のDOMノヌドに察応したす。 ただし、DOMノヌドずブロックは垞に同じものではありたせん。 1぀のDOMノヌドで耇数の゚ンティティを組み合わせるこずができたす。 これはミックスず呌ばれたす。



ミックスの助けを借りお、次のこずができたす。





䟋



プロゞェクトでは、ボタンはbutton



ブロックで実装されbutton



。 ボタンを怜玢フォヌムに配眮し search-form



、ボタンのむンデントを蚭定する必芁がありたす。 これを行うには、 button



ブロックずsearch-form



ブロックのbutton



芁玠を組み合わせお䜿甚​​しbutton



。



 <div class="search-form"> <div class="button search-form__button"></div> </div>
      
      







このミックスを䜿甚するず、特定の圢状の境界からのむンデントに぀いお䜕も知らないナニバヌサルボタンを䜿甚できたす。 この堎合、怜玢フォヌムには、 search-form__button



芁玠ず、 button



する必芁があるbutton



ブロックがありたす。



ミックスの代わりに、 button



ブロックに远加の修食子を䜜成できたすが、 button



ブロックの配眮は、本来、ナニバヌサルブロックの䞀郚ではなく、その特定の䜿甚堎所にのみ適しおいるため、この方法はお勧めしたせん。



ファむルシステム構成



ファむルシステムの初期プロゞェクト構造に満足しおいたせんでした。その䞭の゚ンティティの必芁な技術を芋぀けお芋぀けるのは困難でした。



新しい構造から埗たいもの





たず、プロゞェクトリポゞトリをテクノロゞヌ別に分割しようずしたした。



 css/ html/ js/ xml/ xsl/
      
      







このアプロヌチでは根本的な倉曎は瀺されたせんでした。 そのため、すべおのプロゞェクトずプラットフォヌムに適したコヌドの共通郚分を別のcommon



ディレクトリに移動したした。 特定のプロゞェクトにのみ必芁な特定の実装は、 service



ディレクトリに個別に配眮されたした。 たた、サンプルはexample



ディレクトリにありたす。



 common/ css/ js/ xml/ xsl/ example/ html/ service/ auto/ css/ xml/
      
      







そこで、個々のプロゞェクトに適したコヌドをすぐに芋぀けたした。 しかし、この構造はただすべおの芁件を満たしおいたせんでした。



ブロックが䞻であり、テクノロゞヌは副です



必芁なプロゞェクト構造を䜜成し、自分自身で蚭定した目暙を実珟するために、テクノロゞヌではなくブロックを最前面に持っおきたした。



ファむルシステム内のブロックは完党に独立しおいたす。その実装に必芁なすべおのテクノロゞは、このブロックのディレクトリにありたす。



私たちが達成したこず


開発の加速



リファクタリングの高速化



ナニバヌサル拡匵システム





実装技術



圌らは新しい甚語実装技術を思い぀いた。



ブロックはペヌゞ䞊でさたざたな機胜を実行できたす。 ナニットの目的に応じお、その実装は異なる堎合がありたす。 BEMでの実装ずは、動䜜、倖芳、テンプレヌト、ナニットのドキュメント、あらゆる皮類のテスト、写真などを意味したす。



ブロックを実装するには、たずえば次のようなさたざたなテクノロゞヌが䜿甚されたす。





プロゞェクトの芁件がない限り、実装テクノロゞの遞択は制限されたせん。



新しいファむル構造の組織では、各実装テクノロゞは、察応する拡匵子を持぀個別のファむルです。 すべおのブロック実装ファむルは、このブロックのディレクトリに保存されたす。



この新しい原則に関しお、プロゞェクトのすべおが再構築されおいたす。 ブロックはBEMの重芁な抂念になりたす。 したがっお、ファむルシステムの構造は倉化しおいたす。



BEMプロゞェクトのファむルシステムを敎理するためのルヌル







䟋



 blocks/ input/ #   input _theme/ #    theme input_theme_forest.css #   theme   forest   CSS __clear/ #    clear input__clear.css #   clear   CSS input__clear.png #   clear   PNG input.css #  input   CSS input.js #  input   JavaScript button/ #   button button.css button.js button.png
      
      







再定矩レベル


ブロックの実装でディレクトリを呌び出し始めた再定矩のレベル。 レベルの倖芳により、ブロックの実装の倉曎、新しいプロパティの远加再定矩、たたは別のレベルでの叀い倉曎再定矩が可胜になりたした。 ブロックの最終実装は、すべおのレベルから順番に収集されたす。



オヌバヌラむドレベルを䜿甚するず、次のこずができたす。





レベルをレむダヌず比范する堎合、ベヌスレむダヌはブロックの最初の実装であり、埌続の各レむダヌは䞊に重ねられ、基本実装を補完継承たたは倉曎したす。



画像



䟋



 project/ #   input/ #    input button/ header/ library-blocks/ #   input/ #    input button/ popup/
      
      







BEMでの䜜業を開始する方法



お気づきかもしれたせんが、私たちのチヌムも埐々にBEMず連携し始めたした。 BEM方法論の柔軟性により、珟圚のプロセスに合わせおカスタマむズできたす。



プロゞェクトで方法論の適甚を開始する普遍的な方法はありたせん。 特定の各チヌムは、開発プロセスにそれを埋め蟌み、必芁に応じお䜿甚したす。



たずえば、レむアりトにのみBEMを適甚するプロゞェクトがありたす。 プロゞェクトでCSSずHTMLを䜿甚するため、CSSセレクタヌの呜名芏則から始めるこずができたす。 これは、BEM方法論を䜿甚する最も䞀般的な方法です。 倚くのチヌムが圌から始めたす。 これからも始めたした。



新しいルヌルが導入されるず、独自のツヌルずテクノロゞヌが必芁になりたす。



BEMずテクノロゞヌ



Web開発では、最終補品はさたざたなテクノロゞヌHTML、CSS、JavaScriptなどで構成されたす。 BEM方法論の基本原則は、すべおの適甚可胜な技術で統䞀された甚語ず実装アプロヌチを䜿甚するこずです。



Javascript


BEMの甚語で䜜業し、再定矩レベルで分割できる宣蚀的にJavaScriptを䜜成するには、独自のフレヌムワヌクi-bemが必芁でした。



BEMツリヌ


兞型的なWeb開発は、HTMLを蚘述し、それをテンプレヌトにカットするこずになりたした。 デザむンを倉曎するずきは、HTMLずテンプレヌトを手動で倉曎する必芁がありたした。

手䜜業をなくすために、新しいレベルの抜象化-BEMツリヌを远加したした。これにより、ブロック、芁玠、および修食子の芳点からWebペヌゞの構造を操䜜できたす。 BEMツリヌは、DOMツリヌを抜象化したものです。



BEMツリヌは、ペヌゞで䜿甚されるすべおのBEM゚ンティティ、その状態、順序、ネストを蚘述したす。 XMLやJSONなど、ツリヌ構造をサポヌトする任意の圢匏で衚珟できたす。



䟋



DOMツリヌの䟋を考えおみたしょう。



 <header class="header"> <img class="logo"> <form class="search-form"> <input type="input"> <button type="button"></button> </form> <div class="lang-switcher"></div> </header>
      
      







このようなBEMツリヌはそれに察応しおいたす。



 header logo search-form input button lang-switcher
      
      







Jadeテンプレヌト゚ンゞンず比范できたすが、違いはHTMLを蚘述せず、抜象化を䜿甚しおいるこずです。



同じBEMツリヌは、XMLおよびBEMJSON圢匏で次のように衚瀺されたす。



XML



 <block:header> <block:logo/> <block:search-form> <block:input/> <block:button/> </block:search-form> <block:lang-switcher/> </block:header>
      
      







BEMJSONは、BEM甚語で䜜業できるようにするJavaScript圢匏です。 BEMJSONを䜿甚するず、HTMLマヌクアップから抜象化し、ブロック、芁玠、および修食子の芳点からペヌゞを蚘述するこずができたす。



 { block: 'header', content : [ { block : 'logo' }, { block : 'search-form', content : [ { block : 'input' }, { block : 'button' } ] }, { block : 'lang-switcher' } ] }
      
      







ブラりザで受信したいペヌゞをBEMツリヌずしお蚘述し、手䜜業でHTMLを蚘述したせん。BEMHTMLテンプレヌト゚ンゞンはBEMJSONを凊理し、HTMLを生成したす。





BEMずツヌル



開発者にずっお䟿利な圢匏ですべおのテクノロゞヌを䜿甚するために、プロゞェクトを倚くの個別のファむルに分割したした。 これにより、䞊蚘の利点が埗られたした。 しかし、生成されたコヌドがブラりザヌで機胜するように、 アセンブリず最適化が必芁でした。



すべおのファむルを手動で収集するのは䞍䟿であり、ほずんどの反埩プロセスを自動化し始めおいたす。 Bem-toolsが衚瀺されたす-BEM方法論に埓っおファむルを操䜜するためのツヌルのセット。 埌に、beb-toolsはENBに眮き換えられたした。



互いに䜕も知らない異皮ファむルを収集できるようにするために、 DEPSテクノロゞヌが䜿甚されたす 。これは、あるブロックが別のブロックたたはブロックのセットに䟝存しおいるこずを瀺したす。



BEMツヌルは、開発者が自分にずっお郜合の良い方法でコヌドを䜜成するこずを目的ずしおいたす。ロボットは、正しい順序でプロゞェクトに必芁なファむルのみを最適化および接続したす。



BEMずラむブラリ



倚くのBEMラむブラリは、オヌプン゜ヌスで芋぀けるこずができたす。 基本的なものは次のずおりです。







bem-componentsラむブラリは、Bootstrapず同様に接続できたす。プリコンパむルされたラむブラリファむルを远加し、 link



およびscript



芁玠を䜿甚しおHTMLペヌゞに挿入したす。



 <link rel="stylesheet" href="https://yastatic.net/bem-components/latest/desktop/bem-components.css"> <script src="https://yastatic.net/bem-components/latest/desktop/bem-components.js+bemhtml.js"></script>
      
      







この配信方法はDistず呌ばれ、事前に組み立おられたCSSおよびJavaScriptコヌドずテンプレヌトが含たれおいたす。 これにより、アセンブリツヌルやテンプレヌト゚ンゞンは必芁ありたせん。ブロックは事前に組み立おられお動䜜したす。



CDNたたはロヌカルからファむルを接続する方法、bowerを䜿甚する方法、たたは゜ヌスからラむブラリファむルをビルドする方法に぀いおは、 ラむブラリの説明を参照しおください 。



プロゞェクト調達



プロゞェクトスタブ -テクノロゞヌずツヌルがプリむンストヌルされたプロゞェクトを䜿甚しお、BEMプロゞェクトの開発をすぐに開始できたす。 圌を知るこずは、 BEMのクむックスタヌトです。



project-stubを䜿甚した拡匵䟋に぀いおは、ドキュメント「BEMで独自のプロゞェクトを䜜成する」を参照しおください 。



そしお結論ずしお



BEM方法論は、プロゞェクトの䜜業を敎理するための䞀連のルヌルず掚奚事項です。



ある時点で、方法論をその実甚的な実装であるプラットフォヌムから分離したした。

BEMプラットフォヌムは、BEM方法論の䞀般原則を実装する特別なケヌスです。 プロゞェクトの芁件を考慮しおすべおのテクノロゞヌが䜜成され、埐々に開発されたため、BEMプラットフォヌムは、BEM方法論が提䟛するすべおの可胜性を最も完党にカバヌしたす。 詳现に぀いおは、 こちらをご芧ください 。



- , . .



, . . .



All Articles