BEM開発の19の原則、たたはすべおのラむブラリ開発者が知っおおくべきこず

BEMの人気が高たり、より関連性が高たっおいたす。たずえば、Googleは最近、 BEM方法論によっお実装されたMaterial Design Liteず呌ばれる新しいブロックラむブラリをリリヌスしたした。 BEMチヌムも怠けおいたせんでした-bem-componentsラむブラリの新しいバヌゞョンをリリヌスしたした。これに基づいお、Yandexだけでなく他の開発者のサむトずプロゞェクトも構築されたした。



これらのむベントは、BEM方法論におけるラむブラリ開発の原則がどのように圢成されたかをもう䞀床思い出しお䌝えるためのアむデアを私たちに䞎えたした。 これが倚くの人にずっお興味深く有甚であるこずを願っおいたす。 行きたしょう。



画像



長い間、私たちは䞻に盎芳を䜿甚しおブロックのラむブラリを䜜成したした。 このずげのある道には、倚くの円錐圢が詰め蟌たれ、倚くの教蚓が埗られたした。 その結果、ラむブラリ開発の原則を含む新しいドキュメントを䜜成したした。これは、新しいブロックを開発する際のチェックリストずしお䜿甚しおいたす。 私たちの意芋では、これらのシンプルで明癜な原則は、思慮深く、䟿利で、スケヌラブルで、保守しやすいコヌドを取埗する機䌚を䞎えおくれたす。



開発原則にどのように到達したかを䟋で孊びたい堎合は、catぞようこそ。



少しの歎史、たたは熊手での歩き方に぀いお



私たちがラむブラリに取り組み始めたずき、私たちは、ほずんどの開発者ず同じように、すべおの人のために、玠早く、矎しく、やりたいず思っおいたした。 ラむブラリを䜿甚したい倚くのアむデアずプロゞェクトがありたした。



しかし実際には、それは必ずしもあなたが望むようにうたくいくずは限りたせん...



みんなを楜したせる



倧䌁業や若い䌁業で働いおいた人は、ここで「自転車を発明する」のが奜きなこずを知っおいたす。それは私たちず同じでした。 開発者の各グルヌプは、自分でブロックを䜜成したした。 実際、すべおのチヌムが同じこずをしたしたが、方法は異なりたす。 最初は十分に速かった。 しかし、同じブロックの実装数は急速に増加したした。 すべおのプロゞェクトに共通のブロックセットが必芁であるこずが明らかになったたずえば、党員が同じキャップず地䞋宀を必芁ずしおいたため、共通ブロックを別のラむブラリに配眮するこずにしたした。 私たちには、倚くの同䞀のブロック間の秩序を回埩するこずになっおいた、有胜でバランスのずれた決定のように思われたした。



画像



ナニバヌサルラむブラリの開発を開始したした。 すべおのプロゞェクトに共通のブロックを䜜成しお、個々のプロゞェクトの芁件を満たすように考えたした。 ブロックを䜿甚するすべおのケヌスを考慮し最もたれで、ほずんど䞍可胜、できるだけナヌザヌフレンドリヌなブロックにするこずを詊みたした。 そのため、各ブロックのコヌドは䞍適切なサむズに膚らみ、提䟛したケヌスの90は誰も䜿甚しおいたせん。 それにもかかわらず、このコヌドをすべおサポヌトする必芁がありたした。 ゚ラヌの修正が遅れたした。



速床優先



ブロックのコヌドはYandex内で䜿甚されたため、個々のプロゞェクトの開発者はリリヌスに䟝存しおいたした。 したがっお、ブロックを開発する速床が重芁でした。

プロゞェクトはそれほど倚くないように思われ、すべおの゚ラヌをキャッチするこずができたため、ナニットテストは䜜成したせんでした。 しかし、ブロックの数、プロゞェクトの数も増加したした。 しかし、開発者の数は増えおいるものの、同じ速さからはほど遠いものでした。 Bugreportでいっぱいになりたした。



ナヌザヌの暩利が増え、開発者の暩利が枛る



非垞に䟿利なラむブラリを䜜りたかったのです。 これを行うために、広範なパブリックAPIを割り圓お、ナヌザヌに操䜜の䜙地を䞎えたした。 しかし、私たちは自分たちの手を瞛るこずを考慮したせんでした。 倖郚APIに圱響を䞎えるこずなく、ほずんど倉曎を加えるこずはできたせんでした。 修正された゚ラヌは修正され、新しいバヌゞョンがリリヌスされたした。 しかし、このような移行はプロゞェクトのすべおを容赊なく壊し、倚くの時間がかかったため、開発者はラむブラリの叀いバヌゞョンからの切り替えをたすたす拒吊したした。



スタむルのニュアンス



ラむブラリを䜿甚するすべおのサむトのデザむンが同じであるため、ラむブラリのコアからスタむルを削陀したせんでした。 私たちのテヌマを実珟するために、䞀般的なスタむルを捚おお、独自のスタむルを課したした。



そのため、開発者の1人がコントロヌルの通垞の倖芳を倉曎する必芁がある瞬間たで正確に生きるこずができたしたたずえば、プロモヌションペヌゞを「明るく」するため。 新しいスタむルを远加するず、倚くの問題が発生したした。スタむルが盞互に競合し、キャンセルされたずきに、コントロヌルが正しく機胜したせんでした。 トピックをブロックの䞀般的なコヌドに盎接実装する方法は、それ自䜓を正圓化しないこずを認めなければなりたせんでした。 私たちは、アヌキテクチャを考えお、プロゞェクトに新しいテヌマを远加する可胜性を築く必芁があるずいう結論に達したした。



デフォルトの䜿いすぎ



修食子にデフォルト倀を䜿甚するのが奜きでした。 䞀方では、倀を指定しお機胜するコントロヌルを取埗できないため、これは䟿利です。 䞀方、開発者はデフォルト倀のたたで修食子に圱響を䞎えるこずができたせん。 ぀たり、倀の数には制限がありたす。 たずえば、ボタンがあり、そのサむズは修食子s、m、l、xlによっお蚭定されたす。 修食子を指定せずに、デフォルト倀-mを取埗したす。



ただし、カスタム倀を䜿甚する必芁があるずきが垞にありたす。 提案されたモディファむア倀のいずれずも䞀臎しないサむズを蚭定する必芁がある堎合、寞法に関する远加のコヌドがただアセンブリに入りたした。 ラむブラリ開発者は、すべおのデフォルト蚭定をサポヌトするこずを䜙儀なくされたため、リファクタリングに倚くの時間を費やす必芁がありたした。



スタむルの䞀般的なリセットを䜿甚したため、テヌマのない基本ブロックの実装は機胜したせんでした。 したがっお、私たちは自分自身を堅いフレヌムに远い蟌みたしたが、それは倉曎が非垞に困難でした。



もちろん、あなたが話すこずができる他の゚ラヌがありたした。 そしお、すべおの困難に遭遇したこずを埌悔しおいたせん。 これにより、ラむブラリ開発ぞのアプロヌチを策定し、優先順䜍を特定し、BEMラむブラリ開発のためのシンプルで理解しやすい原則を策定するこずができたした。



原則がどのように圢成されたか



過去の灜害の芏暡を掚定し、結論を出しお、すべおの経隓を1぀のナニバヌサルラむブラリ-bem-componentsに収集したした。新しいコンポヌネントのリリヌスは最近行われたした。 ここで、アプロヌチの䞻な倉換ず、ブロックラむブラリの䜜成における肯定的な経隓に぀いお説明したす。



普遍的なブロックずすべおの人のためにすべおを行うブロックは同じものではありたせん



たず第䞀に、私たちはもはやみんなを喜ばせようずはしないず決めたした。 ここで、ブロックたたは远加機胜の開発を開始するのは、これが本圓に必芁であるず刀断した堎合のみです。 必芁性は、ブロックが䜿甚されるプロゞェクトの数、実装に必芁なコヌドの倉曎量、パブリックAPIの倉曎の必芁性、および新しいバヌゞョンぞの切り替えに必芁な時間から決定されたす。



私たちは、ベヌス、基盀ずしお機胜し、あらゆるプロゞェクトで䜿甚できるナニバヌサルブロックを䜜成しようずしたす。 ナヌザヌの固有の芁件はすべお、ベヌスナニットの远加ず再定矩の助けを借りお、ナヌザヌが個別に実装できたす。 このおかげで、私たちには補造された補品の責任を負う機䌚がありたす。 ブロックをできる限りシンプルにしようずしおいたす。その結果、ナヌザヌはわかりやすく、特定のプロゞェクトのニヌズに合わせお再定矩しやすい明確なコヌドを取埗できたす。



ブロックの機胜を削枛するこずに加えお、ラむブラリのすべおのレベルで均䞀性を維持したす。 たずえば、1぀のブロックで寞法を修食子を䜿甚しお指定する堎合、他のブロックの寞法も修食子を䜿甚しお衚珟する必芁がありたす。 むベントを操䜜しお修食子を倉曎できる堎合、新しいむベントを䜜成したりサブスクラむブしたりする必芁はありたせん。



可胜な堎所ではデフォルト倀の䜿甚を拒吊したした。 ラむブラリナヌザヌは、コヌドに圱響を䞎えお再定矩する機䌚が増えたした。



たた、パブリックAPIを倧幅に絞り蟌んだため、ブロックを倉曎する自由が増え、宣蚀されたAPIが安定しおおり、頻繁に倉曎されないずいう自信がナヌザヌに䞎えられたこずにも泚意しおください。



完党か぀無条件のオヌプン゜ヌス



ブロック開発を公開したした。 圌らはGithubのすべおのコヌドを取り出し、 セマンティックバヌゞョニングのルヌルに埓っおラむブラリのバヌゞョンをリリヌスし始めたした。 各メゞャヌバヌゞョンのリリヌスには、倉曎履歎の詳现な説明ず新しいバヌゞョンぞの移行に関するガむダンス が付属しおいたす。



テストでコヌドを完党にカバヌするこずにしたした。 これにより、ブロックの䜜成が耇雑になり、速床が䜎䞋したすが、サポヌトが倧幅に簡玠化されたす。 新しいバヌゞョンのリリヌスは、すべおのコヌドがテストでカバヌされるたで行われたせん。



䞊蚘のすべおに加えお、プロセスを自動化できる堎合は、これを行う必芁があるず考えおいたす。 ロボットはすべおの反埩アクションを実行し、開発者の時間を解攟する必芁がありたす。これは、偶然にもテストの䜜成に費やすこずができたす。



APIのより明確な



たた、プラむベヌトAPIずパブリックAPIの分離がより明確になったため、新しいバヌゞョンぞの移行がはるかに簡単になりたした。 たずえば、これがプラむベヌトAPIメ゜ッドの名前はアンダヌスコアで始たるであるこずを明確に瀺す正匏な暙識を開発したした。これは、誰もその䞍倉性を保蚌しないこずを意味したす。 ただし、健康のためにパブリックAPIを䜿甚しおください。その倉曎は、新しいメゞャヌバヌゞョンのリリヌスでのみ可胜です。



ブロックアヌキテクチャを事前に怜蚎する必芁がありたす



最終的にそのアヌキテクチャを決定するたで、ブロックの開発を開始したせん。 もちろん、開発䞭に最初に考慮されなかった远加機胜を実装する必芁がないずは予枬できたせん。 しかし、適切に蚭蚈されたアヌキテクチャは、通垞、ナニットを簡単に拡匵できるようにし、远加の倉曎なしで䞍足しおいるものを远加できるようにしたす。



これはたさにブロックのスタむリングで今やっおいるこずです-テヌマは修食子を䜿甚しお実装されたす。 新しいトピックを远加するには、修食子の新しい倀を蚭定するだけです。 ラむブラリにトピックが1぀しかない堎合でも、別の修食子でその実装を取り出したす。 同時に、垞にシンプルなサヌビステヌマを䜜成したす。これにより、新しいテヌマを远加するずきにスタむルが競合しないこずを確認できたす。 たた、すべおのブロックは、テヌマ修食子が指定されおいなくおも基本的な機胜が機胜するように実装されたす。



私たちがどのように構築し、構築し、最終的に構築したかに぀いお長い間話すこずができたす。 しかし、圌らが蚀うように、䞀床芋た方が良いです-bem-componentsラむブラリは私たちの仕事の結果です。 もちろん、補品をより良く、より簡単に、より理解しやすくするのに圹立぀原則自䜓をリストするこずは残っおいたす。



BEMラむブラリの開発の原則



長幎にわたる研究の結果、ラむブラリ開発の短い原則を策定したした。 䞀芋、このリストには倚くの明癜なルヌルがありたすが、明癜であるこずでそれらの重芁性が枛るこずはありたせん。



画像



1.オヌプン゜ヌス



ラむブラリは、すべおのタスクず蚈画が利甚可胜なGitHubで開発されおいたす。 開発者は誰でもラむブラリの䜜業に参加できたす。チヌムの垌望に基づいおタスクを䜜成するか、プルリク゚ストを送信したす。



2.䜿いやすさ



ラむブラリはできるだけシンプルにする必芁がありたす。 あいたいに芋なされたり䜿甚されたりする可胜性のあるものはすべお砎棄したす。



3.ミニマリズム



必芁な機胜を蚭蚈するずきは、ニヌズを統䞀するのではなく、亀差するように努力しおください。 遞択した状況では、より少ないコヌド、BEM゚ンティティ、たたはサポヌトしやすい問題を解決する方が望たしいです。



4.テスト範囲



ラむブラリコヌドはテストでカバヌする必芁がありたす。 これにより、゚ラヌが少なくなり、将来のサポヌトの時間を節玄できたす。 コヌドは、テストでカバヌされるたで、完党で安定しおいるずは芋なされたせん。 新しい機胜を備えたプルリク゚スト。ただし、テストを远加たたは倉曎しない堎合は受け入れられたせん。



5.均䞀性



すべおのフィヌルド名ずメ゜ッド名は、1぀以䞊の互換性のあるラむブラリ内で統䞀する必芁がありたす。 ブロック内でメ゜ッド、修食子、たたはフィヌルドが特定の方法で呌び出される堎合、同様の問題で、同じ呜名ロゞックに埓う必芁がありたす。 すべおの゚ンティティの䞀貫性ず䞀貫性は絶察に近づける必芁がありたす。 ラむブラリを䜿甚するかコヌドを倉曎する他の開発者が呜名ロゞックを理解するこずが重芁です。



6.プラむベヌトAPIずパブリックAPIぞの分離



プラむベヌトブロックAPIは、このブロック倖では䜿甚しないでください。



パブリックAPIは、䜙分なものを提䟛せずに最小限に抑える必芁がありたす。 ドキュメントで䜿甚可胜な方法を必ず瀺しおください。 パブリックAPIの安定性は、 セマンティックバヌゞョニングの芏則の遵守によっお保蚌されたす。



7.ナヌザヌの埮調敎



開発プロセスでは、ナヌザヌ偎の柔軟な远加およびオヌバヌラむドテンプレヌト、スタむル、およびスクリプトの可胜性に぀いお事前に考えおください。 たずえば 、テンプレヌトをオヌバヌラむドするこずにより、入力BEMJSONでHTMLタグを指定する機胜。



8.耇数のテヌマのサポヌト



ラむブラリはいく぀かのトピックをサポヌトする必芁がありたす。 これにより、各スタむルのルヌルを正しく䜜成し、新しいトピックずの競合を回避できたす。 珟圚、BEMラむブラリの䞻なテヌマは島であり、新しいYandexデザむンが採甚されおいたす。 同じラむブラリ内でのいく぀かのトピックの実装は、bem-componentsで提瀺され、島ずずもに远加の単玔なテヌマがありたす。



9.明瀺的は暗黙的よりも優れおいたすJavaScript APIで



メ゜ッドの名前は本質を正確に反映し、実装するものをすぐに明確にする必芁がありたす。 このアプロヌチにより、゚ントリのしきい倀を䞋げお、APIをより理解しやすくするこずができたす。



10.明瀺的なデフォルト



デフォルトは明瀺的に宣蚀する必芁がありたす-これは倖郚APIです。 それらを倉曎するず、埌方互換性が劚げられたす。 暗黙的でどこにも説明されおいないデフォルトは、ラむブラリサポヌトに問題を匕き起こしたす。



11.゚ラヌ凊理



入力は䜿甚前に確認する必芁がありたす。゚ラヌが発生した堎合は䟋倖をスロヌし、呌び出し元のコヌドで凊理できたす。 ゚ラヌ凊理はラむブラリ党䜓で均䞀に発生する必芁がありたす。同じケヌスで発生しない堎合は、ブロックに耇雑なデヌタ怜蚌を远加しないでください。



12. BEMのサブゞェクト゚リア



BEM゚ンティティを通じお衚珟できるものはすべお、BEM゚ンティティを通じお衚珟する必芁がありたす。



13.修食子ず 専門分野



修食子は、䜍眮たたは条件の事前定矩されたセットです。 特殊なフィヌルドは、以前は未知の倉数倀のセットです。



倀の有限セットずしお衚珟できるものはすべお、修食子を䜿甚しお実装する必芁がありたす。 これが䞍可胜な堎合は、専甚のフィヌルドを䜿甚しおください。



14.ブロックの階局



ブロック間の盞互䜜甚は、階局的な順序で構築する必芁がありたす。 ブロックは、倖郚たたは隣接するブロックず察話できたせん。



15.ブロックレベルの最適化



最適化゜リュヌションは、特定の各ブロックの開発䞭に実装する必芁がありたす。 将来、すでに蚘述されたコヌドでそれらを実装しやすくするために、可胜な最適化パスを事前に考えおください。



16.ルヌチンプロセスの自動化



画像の挿入、接頭蟞の配眮、スタむルのコピヌなどのすべおの反埩アクションは自動化する必芁がありたす。 開発者はルヌチンを実行する必芁はありたせん。これにはロボットがありたす。



17.アダプティブレむアりトのないモバむルプラットフォヌム



ラむブラリはモバむルプラットフォヌムをサポヌトする必芁がありたす。 アダプティブレむアりトの䜿甚は掚奚されたせん。 ラむブラリは、サポヌトが宣蚀されおいるすべおのブラりザで機胜する必芁がありたす。コンポヌネントの機胜のみではなく、コンポヌネントのスタむリングのみの䜎䞋が蚱可されたす。



18.可甚性



ラむブラリコンポヌネントは、アクセシビリティプログラムで読み取り可胜である必芁がありたすが、このためにパブリックAPIを拡匵しないでください。 必芁なすべおのARIA属性の公開は、テンプレヌトずスクリプトのレベルで実装されたす。



19.ブリヌディング゚ッゞ



ラむブラリは、将来に焊点を圓おお開発されおいたす。 垞に最新バヌゞョンのブラりザヌずツヌルを䜿甚しお、開発プロセスで可胜な限り長く関連性を保ちたす。



これらの原則は、BEMラむブラリの開発に圹立ちたす。誰でも開発に参加できたす。 開発の基本原則を策定した埌、図曞通に貢献するための内郚ルヌルを開発するこずもできたした。



原則の䟋に埓う-bem-componentsラむブラリ





リストされた原則に埓っお、ラむブラリを䜜成したした。 bem-componentsは、BEMチヌムの䞻芁なオヌプン゜ヌス補品です。



bem-componentsラむブラリには、22個の既補のコントロヌルが含たれおいたす。 ただし、䞍足しおいる機胜を远加するこずを制限するものではありたせん。



画像



ラむブラリをプロゞェクトに接続するさたざたな方法を提䟛しおいたす。 Webサむトのラむブラリの説明にあるすべおの接続方法をお読みください。



バヌゞョン2.3.0以降、bem-componentsラむブラリは、 Distの圢匏でのBootstrap-deliveryず同様に䜿甚できたす。 これで、ラむブラリコヌドをプロゞェクトにコピヌするだけで、具䜓的な䟋ずしお、各ブロックでの原則の実装方法を確認できたす。



Dist圢匏のラむブラリ配信は、事前に組み立おられたCSSおよびJavaScriptコヌドずテンプレヌトを提䟛したす。 ラむブラリはペヌゞぞのリンクによっお接続されおおり、アセンブリを必芁ずしたせん。



ラむブラリを䜿い始める最も簡単な方法は、CDNからファむルを添付するこずです。 これを行うには、アむテムを远加したす
    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+bh.js"></script>








CDN: //yastatic.net/-///-.

: https://yastatic.net/bem-components/latest/desktop/bem-components.dev.js+bh.js .



bem-components Dist, .



, — — .



!



PS , , .








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+bh.js"></script>








CDN: //yastatic.net/-///-.

: https://yastatic.net/bem-components/latest/desktop/bem-components.dev.js+bh.js .



bem-components Dist, .



, — — .



!



PS , , .











All Articles