Ruby on RailsのBEMレむアりト

はじめに


この蚘事では、鉄道プロゞェクトのBEMレむアりト手法に぀いおお話したいず思いたす。 私はただこのようなマニュアルを芋おいたせん倚分これを陀きたすが、ガむドずしおはあたり機胜しないので、埌で詳しく説明したす。この蚘事を曞くこずにしたした。 さらに、BEMずレヌルの統合を簡玠化するgemを䜜成したした。これに぀いおは埌で説明したす。

準備する


たず、実際の摩擊ずレヌルを取り付ける必芁がありたす。 私はrvmが奜きです 。 rvmのむンストヌル手順に埓い、コマンドを䜿甚しおレヌルをむンストヌルしたす。

gem install rails 


さお、Windowsをお持ちの堎合は、ここからレヌルをむンストヌルできたす。

次に、コマンドを䜿甚しお新しいプロゞェクトを䜜成したす。

 rails new some_cool_project 


次に、新しく䜜成されたプロゞェクトのルヌトにあるGemfileファむルに「bem」gemを远加したす。 たた、 high_voltageおよびslim-rails gemを远加するこずをお勧めしたす。 1぀目は、レヌルずハックに関する特別な知識がなくおも、レむアりト蚭蚈者向けの暙準ペヌゞを䜜成できたす。2぀目は、レむアりトを倧幅に高速化し、出力HTMLを瞮小できる優れたテンプレヌト゚ンゞンです。

次のコマンドを䜿甚しお、bem gemに必芁なファむルをむンストヌルしたす。

 rails g bem:install 


config / initializers / bem.rb configがむンストヌルされたす。ここでは、テクノロゞヌ元々はscssずjsず、テクノロゞヌごずのファむルを生成するためのテンプレヌトを倉曎できたすlib / bem / templates / scss.ttずlib / bem / templates / js.tt 。 プロゞェクトであたり䜿甚したくない堎合、このテクノロゞヌはscssではなくconfig / initializers / bem.rb configで蚘述する必芁がありたす

 BEM.configure do |config| config.technologies = [ { :group => 'stylesheets', :extension => '.less', :name => 'less', :css_directive => '@import', :css_prefix => "'", :css_postfix => "';" }, { :group => 'javascripts', :extension => '.js', :name => 'js' } ] end 


次のコマンドを䜿甚しお、 springの蚭定をむンストヌルするこずも匷くお勧めしたす。

 rails g bem:spring 


このラむブラリを䜿甚するず、バックグラりンドで環境をロヌドでき、ブロックをすばやく生成できたす。

springの構成をむンストヌルした堎合、次のコマンドを実行したす。

 spring stop 


このコマンドは、Springを埌で再起動するために必芁です。

これで、レむアりトを開始できたす。

レむアりト


レむアりトの䟋ずしお、 この蚘事からレむアりトを遞択したした。

ブロック、レベル、およびマニフェストは、bem createコマンドを䜿甚しお䜜成されたす。 このコマンドは、次のフラグを入力ずしお受け入れたすフラグの倀は、それらの埌にスペヌスを介しお指定する必芁がありたす。



コマンドを実行しお、フラグずその䜿甚に関する情報を読み取るこずもできたす。

 bem help create 


createコマンドは、同じファむル構造を䜜成したす こちらず同じ。

次に、ブロックずマニフェストがコマンドを介しお接続される将来のレベルを䜜成したす。

 spring bem create -l shared -a application 


ばねなしでも可胜です。

 bem create -l shared -a application 


しかし、私が蚀ったように、春は環境をバックグラりンドに保ち、埌続のコマンドの実行を高速化したす。

このコマンドを実行するず、䜿甚されおいる各テクノロゞヌに察しおレベルずマニフェストが䜜成されたずいうメッセヌゞがタヌミナルに衚瀺されたす。 この堎合、共有はブロックが配眮されるレベルであり、アプリケヌションはマニフェストです。

マニフェストファむルを芋るず、共有レベルが文字列で接続されおいるこずがわかりたす。
 @import 'shared/shared'; 

単玔なルヌルが適甚されたす-レベルはマニフェストで接続され、ブロックはレベルで接続されたす。

マニフェストアプリ/資産/application.lessを䜿甚するため、以前のマニフェストアプリ/資産/application.cssを削陀したす。

次に、同様のコマンドで必芁なブロック|芁玠|修食子を䜜成したす。

 spring bem create -l shared -b clear --no-js spring bem create -l shared -b page --no-js spring bem create -l shared -b page -e head-line --no-js spring bem create -l shared -b page -e line --no-js spring bem create -l shared -b link -m menu -v active --no-js ... 


ご芧のずおり、jsファむルはこれらのブロックには䜿甚されないため、ブロックが配眮される共有レベルず--no-jsフラグを瀺したす。

これらのコマンドを実行するず、必芁なcssクラスが既に登録されおいるテンプレヌトが䜜成され、必芁なこずは適切なプロパティを入力するだけです。

間違えお間違ったクラスを曞いたり、間違ったレベル/マニフェストにブロックを含めたりした堎合は、リバヌスコマンドを実行しお、bem destroyコマンドでブロック|芁玠|修食子|レベルを削陀するこずでい぀でもロヌルバックできたす。 --jsおよび--cssを陀くすべおの同じフラグを受け入れたす。

次に、必芁なブロック|芁玠|修食子を䜜成するず、htmlレむアりトに移動したす。 既に説明したhigh_voltage gemをむンストヌルした堎合は、フォルダヌを䜜成するだけで十分です。

 mkdir app/views/pages 


どのビュヌに必芁なビュヌが配眮されたす。 このgemのドキュメントを読むず、おそらくビュヌの接続ず衚瀺のしやすさが気に入っおいるでしょう。 たずえば、ようこそペヌゞのレむアりトが必芁です。 app / views / pages / welcome.html.slimビュヌを䜜成し、そこに必芁なhtmlを蚭定したす。 コマンドを䜿甚しおWebサヌバヌを起動した埌

 rails s 


結果はhttp// localhost3000 / pages / welcomeで確認できたす

すべおの写真をapp / asset / imagesフォルダに入れ、すべおのタグをimage_tagレヌルヘルパヌに眮き換えたす。 lessファむル内の画像のアドレスはimage-urlless-rails gemが提䟛するヘルパヌに眮き換えられたす。

残念ながら、䞊蚘の䟋ではjsを䜿甚しおいたせん。 それにもかかわらず、提䟛されおいるテンプレヌトにより、目的の関数を簡単に䜜成しお実行できたす。

 function your_function_name_initializer() { // some code } $(function() { your_function_name_initializer(); }); $(window).bind('page:load', function() { your_function_name_initializer(); }) 


なぜそう 実際には、レヌルのバヌゞョン4以降、タヌボリンクgemが䜿甚され、ペヌゞの衚瀺が倧幅に高速化されたすが、js初期化にいく぀かの機胜が远加されるため、これらの初期化を関数ずしお蚭蚈し、これらの2぀のむベントで呌び出す必芁がありたす。

転送されたレむアりトの最終バヌゞョンず鉄道プロゞェクト自䜓は、githubで衚瀺できたす。

代替案


最初に話した蚘事に぀いおのbem-on-rails gemもありたす。 私はすでにそれを䜿いたかったのですが、珟時点では倚くの䞍利な点があり、私の宝石を曞くこずを䜙儀なくされたした。 マむナス面ずしおは、レベルずマニフェスト通垞、レベルずマニフェストで2぀のマニフェストを䜜成するこずはできたせんでした、読みにくいコヌドタブずしお4぀のスペヌス、どこか2぀、および䞀般に品質が䜎いこずです。コヌド単䞀のテストではなく、アヌキテクチャがい、gemが急いで行われ、コヌドがそこに投げ蟌たれたように感じ、䞀般にバヌゞョン4.1のレヌルでは実行できたせんでした- パッチを送信する必芁がありたしたこの宝石のヘルパヌ そのような䟋単玔フッタを受信ozhet

 = b 'footer', content: [{ elem: 'el', elemMods: ['left'], content: [' «»'] }, { elem: 'el', elemMods: ['center'], content: [{ elem: 'nav-link', tag: 'a', content: [''] }, { elem: 'nav-link', tag: 'a', content: [' ']}, { elem: 'nav-link', tag: 'a', content: ['  '] }] }, { elem: 'el', elemMods: ['right'], content: ['<a href="http://ya.ru/"> </a>'.html_safe] }] 


これは明らかに読みやすさを向䞊させず、レむアりト蚭蚈者を混乱させる可胜性がありたす。

それでも、䞀般的にこれはbem-toolsをレヌルに適合させる良い詊みだず思いたす。

ハヌフパむプなど、gruntを介しおネむティブbem-toolsを䜿甚するために、レヌルにノヌドを埋め蟌むためのいく぀かの゚キゟチックなオプションがありたす。 しかし、このオプションは非垞に面倒で難しいず考えたため、真剣に考えおいたせんでした。

もちろん、別のリポゞトリでbem-tools自䜓を䜿甚するこずもできたすが、この堎合はレむアりトず転送のプロセスが非垞に耇雑になりたす。たずえば、絶えずレむアりトを远跡するなど、URLを自動的に転送および眮換するためのbashスクリプトを蚘述する必芁がありたす前埌に。 たあ、それは倧䞈倫です。 しかし、最悪の郚分は、これら2぀のリポゞトリでブランチからブランチに切り替えるこずです。転送スクリプトを開始する前に、railsを䜿甚するリポゞトリずレむアりトを䜿甚するリポゞトリで正しいブランチを䜿甚し、どのブランチが呪われおマヌゞされるかを確認しおください圌女も別のリポゞトリにいたす。 したがっお、゜リュヌションは最適ではありたせん。

おわりに


したがっお、レむアりトデザむナヌにずっおは、css | jsでビュヌずブロックをリベットするだけで、内郚で䜕が起こっおいるかを必ずしも知る必芁はありたせん。 そしお、バック゚ンド開発者が必芁なロゞックを挿入したす。 ぀たり、レむアりトプロセスが倧幅に簡玠化されたす。

私が曞いたbemラむブラリヌgemは完党にオヌプンで、最も手頃なMITラむセンスを䜿甚しおいたす。 ラむブラリを最近䜜成したしたが、フィヌドバックず提案、およびgithubのプルク゚ストを喜んで受け取りたす。

私はすべおに぀いお非垞に簡単に曞きたした。各項目に぀いお倚くの説明ず議論を曞くこずができたすので、ご質問があればコメントでお答えしたす。

参照資料


https://github.com/gkopylov/bem
https://github.com/gkopylov/bem_with_rails_and_less_example_app

PS

執筆時点では、bem gemバヌゞョン1.0.0が䜿甚されおいたした。 珟時点では、このgemのバヌゞョンは1.1.0です-ブロック|芁玠|修食子をマニフェストに盎接接続する機胜が远加されおいたす。 これは、レむアりトデザむナヌがレベルを接続するのではなく、マニフェストで盎接スタむルを接続する順序を倉曎できるようにするためです。

このオプションを䜿甚するには、生成コマンドに-iフラグを远加するだけです。 したがっお、䜜成されたスタむルは、レベルのスタむルを䜜成せずに、すぐにマニフェストに接続されたす。

importおよびrequireディレクティブの䜿甚に぀いおもう少し曞きたいず思いたした。 どちらのディレクティブにも長所ず短所がありたす。 むンポヌトの利点
-ミックスむンず倉数を接続できたす
-すべおが1぀のファむルにマヌゞされ、生成を必芁ずする倚くのファむルの代わりに、ブラりザヌにより速く䞎えられたすただし、これはマむナスでもありたす。以䞋を参照
マむナスの䞭で
-CSSのデバッグが困難-プリプロセッサ゚ラヌが発生した堎合、この゚ラヌの堎所を芋぀けるのは困難です
-ネストされたcssファむルを倉曎しおもスタむルは曎新されたせんスタむルを曎新するには、コマンドrm -rf tmp / asset / *を実行し、レヌルを再起動したす
requireのプラス
-デバッグが簡単です。それぞれの必芁に応じお開発環境で個別のファむルをコンパむルするためです。
-livereloadむンゞェクションの可胜性理論的には、これはむンポヌトよりも簡単です
マむナスの䞭で
-ミックスむンたたは倉数を䜿甚できない
-コンパむルされたスタむルファむルは、倚くの「require」ディレクティブがある堎合、ブラりザに長時間䞎えられるこずがありたす

そのため、1぀たたは別のディレクティブを䜿甚する決定は、プロゞェクトに応じお慎重に行わなければなりたせん。

デフォルトでscssを䜿甚するこずにした理由をもう少し曞きたいず思いたした。 事実、sass railコミュニティではプリプロセッサの方が人気があり、デフォルトでは、新しいアプリケヌションを䜜成するずきに、このプリプロセッサを䜿甚したgemが有効になっおいたす。 そしお、 実際のずころ、faostは 正しく認識されおおり、 http: //lesscss.org/features/#parent-selectors-featureにはあたりありたせ ん BEMにちょうど適した優れた機胜がありたす-これはアンパサンドの䜿甚です。 すでに、BEMコミュニティの倚くは、モディファむダ甚の別のファむル小さい堎合を䜜成するこずから遠ざかり、ブロックを䜿甚しおファむルにモディファむダを盎接曞き蟌みたす。このサスアンパサンドを䜿甚するず、ブロックのスタむルでそのようなこずを盎接実行できたす。

Source: https://habr.com/ru/post/J229121/


All Articles