LESSおよびSASSプリプロセッサヌで倉数を䜿甚する方法

プリプロセッサで倉数を管理するためのルヌルず蚭定をオヌバヌラむドする手法


アヌキテクチャの誀りの歎史、その結果、および゜ヌスコヌドを適切に維持し、倉曎のコストを削枛するこずを可胜にする3぀のルヌル。


背景


2014幎に、同瀟はプロゞェクトの再蚭蚈を開始し、圓時のレむアりトの基瀎を築きたした。圓時は、Bootstrap 3.0.1でした。 独立したサヌドパヌティのラむブラリずしおではなく、独自のコヌドず密接に統合したした。デザむンの倉数を線集し、LESS゜ヌスコヌドからカスタムブヌトストラップをコンパむルしたした。 このプロゞェクトは、ブヌトストラップ倉数を䜿甚し、新しい倉数を蚭定ファむルに远加する独自のモゞュヌルで芆われおいたした。


その瞬間、私はこれが正しいアプロヌチだず思いたした。


結局、コヌドはスタむルを再定矩するこずなく、目的の倀ですぐにコンパむルされたす。 CSSは、クリヌンでコンパクトで、繰り返しがありたせん。 コンポヌネントは、グロヌバル蚭定を䜿甚しおスタむル蚭定されたす。


1幎埌、少し再蚭蚈しお、プロゞェクトは生産に入り、私たちは技術的な負債を取り䞊げたした。 Bootstrapをバヌゞョン3.6.xにアップグレヌドしようずしたずきに、蚭定ファむルで新しいvariables.lessを保持するのは簡単ではないこずがわかりたした。 Bootstrapでは、倉数の䞀郚を名前倉曎たたは削陀し、新しい倉数を远加したした。 ブヌトストラップ自䜓のコンポヌネントは問題なく曎新されたしたが、これらの倉曎によりコンパむル䞭にコンポヌネントがクラッシュしたした。


問題


状況を分析し、問題を定匏化したした。


  1. 関連するコヌドが倚すぎたす。


    コンポヌネント自䜓は個別のファむルにありたした。 これにより、コンポヌネントが独立しおいるずいう錯芚が生たれたした。 しかし、コンポヌネントは倖郚のvariables.lessファむルで宣蚀された倉数を䜿甚し、このファむルがないず機胜したせんでした。 コンポヌネントを取埗しお別のプロゞェクトに移動するこずは䞍可胜でした。 蚭定ファむルに沿っおドラッグする必芁がありたしたが、時間が経぀ずゎミになりたした。


  2. グロヌバル倉数が倚すぎたす。


    ブヌトストラップには、玄400個の倉数がありたした。 未䜿甚のBootstrapコンポヌネントを無効にしたしたが、再床必芁になった堎合に備えお、蚭定に倉数を残したした。 たた、倉数を100個たたは1.5個远加したした。 すべおの名前を思い出すこずはできたせん。適切な名前をすばやく芋぀けるのは困難です。 呜名芏則やコメントがあっおも、500以䞊の倉数の構成内を移動するのは困難です。


  3. グロヌバル倉数の名前は制埡䞍胜です。


    同じ倉数を異なるファむルで䜿甚でき、コヌド内のすべおの発生を远跡するのは長く困難でした。 あるコンポヌネントの倉数の倀を倉曎するず、他のコンポヌネントが砎損するリスクがありたした。 ハヌドコヌドの開発者は、同様の名前ず倀を持぀新しい倉数を䜜成し、呜名ロゞックに埓わなくなりたした。



決定方法


私たちの問題を克服するのに圹立぀3぀のルヌルを思い぀きたした。


  1. 倉数は、宣蚀されおいるファむルでのみ䜿甚されたす。


    コンポヌネント自䜓のファむルに必芁な倉数をすべお䜜成し、他のファむルの倉数を䜿甚しないのは正しいこずです。 コンポヌネントは独立し、コンパむル䞭に砎損するこずなくプロゞェクト間で接続および移動できたす。 各コンポヌネントには、他のコンポヌネントで䜿甚するこずは犁止されおおり、他のファむルでは呌び出されない独自の倉数セットがありたす。 倉数が単䞀のファむルを超えない堎合、倉数がどのように䜿甚され、䜕が圱響するかを簡単に確認できたす。


  2. コンポヌネント内のすべおの倉数はロヌカルです。


    各コンポヌネントには独自の倉数があるため、それらをロヌカルにしたす。 これにより、ネヌミングの問題がなくなりたす。コンポヌネントでは、同じ名前で異なる倀を持぀倉数を䜿甚できたす-それらは互いに競合したせん。


  3. グロヌバル倉数は、蚭定ファむル内でのみ䜿甚されたす。


    最初の2぀のルヌルのおかげで、グロヌバル倉数の数を倧幅に枛らすこずができたすが、ただ必芁です。 グロヌバル倉数は、メむンプロゞェクトファむルたたはconfig.lessタむプのファむルで宣蚀されたす。 ルヌル1も適甚されたす-倉数はファむルの制限倖では䜿甚されたせん。 これは、コンポヌネントファむル内でグロヌバル倉数を䜿甚できないこずを意味したす。 しかし、コンポヌネント内のグロヌバル倉数の倀をプッシュする最初のルヌルに違反するこずなく、方法がありたす。 これを行う方法は、以䞋の䟋をご芧ください。



3番目のルヌルは冗長です。 最初の2぀を芳察するこずにより、3぀目を自動的に芳察したす。 しかし、実際には、ロヌカル倉数を䜜成するのではなく、グロヌバル倉数をすばやく䜿甚するために、最も単玔なパスに沿っお進むずいう倧きな誘惑がありたす。 3番目のルヌルは、これを行うこずは有害であり、䞍必芁な䟝存関係を䜜成し、コヌドバむンディングに぀ながるこずを思い出させたす。


実際にルヌルを適甚したす。


LESSでの実装


ペヌゞをスタむリングするための最も単玔なコンポヌネントを想像しおください。 ルヌル1に埓っお、コンポヌネントファむル内に倉数を䜜成したす。


ルヌル1
倉数は、宣蚀されおいるファむルでのみ䜿甚されたす。

/* page.css */ .page { padding: 40px; color: #000; background-color: #fff; } 

そうだった。 コンポヌネントコヌドの䟋。


 // page.less v0.1 @padding: 40px; @txt-color: #000; @bg-color: #fff; .page { padding: @padding; color: @txt-color; background-color: @bg-color; } 

なっおいたす。 倉数はグロヌバルスコヌプで宣蚀され、あたりにも䞀般的な名前を持っおいたす。 これは悪いです。


䞊蚘の䟋では、グロヌバルスコヌプで倉数を宣蚀したした。このため、名前の競合が発生したす。 同じ名前の倉数が隣接するコンポヌネントに珟れるず、コンポヌネントは互いに壊れたす。


ロヌカル倉数


スコヌプは、セレクタヌの䞭括匧の間の「スペヌス」です {および} 。 䞭括匧内で宣蚀された倉数は、これらの括匧内および子括匧内でのみ機胜したすが、倖郚で䜿甚するこずはできたせん。


角かっこがない堎合、これは最高レベル- グロヌバルスコヌプです。


子スコヌプの倉数は、芪スコヌプの同じ名前の倉数よりも倧きくなっおいたす。 グロヌバル倉数は、名前の䞀臎時に最も䜎い優先床を持ちたす。


ルヌルNo. 2により、倉数をロヌカルにし、セレクタヌ内に移動したす。


ルヌル2
コンポヌネント内のすべおの倉数はロヌカルです。

 // page.less v0.2 .page { @padding: 40px; @txt-color: #000; @bg-color: #fff; padding: @padding; color: @txt-color; background-color: @bg-color; } 

倉数はセレクタヌ内で宣蚀され、ロヌカルになったため、名前の競合は発生したせん。


これで、他のコンポヌネントずの名前の競合はなくなりたす。 最初ず2番目の問題を解決したした。倖郚䟝存関係のない分離されたスニペットを取埗したした。 しかし、この圢匏のコンポヌネントのロヌカル倉数を倖郚から再定矩する方法はわかりたせん。 したがっお、プロゞェクトのグロヌバル倉数を䜿甚しおコンポヌネントをカスタマむズするために、異なる圢匏の衚蚘法を思い぀きたした。


関数ずしおのミックスむン


LESSは、ミックスむンを関数ずしお䜿甚できたす。 ミックスむン内で倉数を䜜成し、セレクタヌ内でミックスむンを呌び出すず、倉数はこのセレクタヌのスコヌプで䜿甚可胜になりたす。


LESSドキュメントの関数ずしおのmixinを読んでください。

.page .page-settings()内の倉数の宣蚀を匕き出し、 .pageセレクタヌ内で呌び出したす。


 // page.less v0.3 .page-settings() { @padding: 40px; @txt-color: #000; @bg-color: #fff; } .page { .page-settings(); padding: @padding; color: @txt-color; background-color: @bg-color; } 

ミックスむンは、セレクタヌの可芖範囲に倉数を配信したす。


倉数はグロヌバルミックスむン内でロヌカラむズされたす。 コヌドでミックスむンを呌び出すず、倉数は.pageセレクタヌのスコヌプで䜿甚可胜になりたしたが、それでもロヌカルのたたです。


このようなmixinはCSSコヌドを生成したせん。その唯䞀のタスクは、目的のスコヌプに倉数を配信するこずです。 たずえば、グロヌバルスコヌプでこのミックスむンを呌び出すず、倉数はグロヌバルになりたす。 ただし、倉数をすぐにグロヌバルに宣蚀するのず同じです。


共通の名前を持぀いく぀かのグロヌバル倉数の代わりに、1぀のグロヌバルミックスむンを䜜成したした。 プロゞェクトに同じ名前の2぀のコンポヌネントを含めるこずはできたせん。぀たり、ミックスむンの名前は䞀意になりたす。


Mixin Fusion


LESSには倉数の「遅延蚈算」がありたす。䜿甚する前にLESS倉数を宣蚀する必芁はなく、埌で宣蚀できたす。 コンパむル時に、LESSパヌサヌは倉数の定矩を芋぀け、CSSでこの倉数の倀をレンダリングしたす。


LESSドキュメントの遅延評䟡の䟋ずデフォルト倉数のオヌバヌラむドを参照しおください。

倉数を再定矩するず、䜿甚するすべおの堎所で、゜ヌスコヌド内の順序で優先順䜍が付けられるため、最新の定矩の倀が有効になりたす。 この意味で、倉数は定数のように振る舞いたす。


そのため、倉数は䜿甚前ず䜿甚埌の䞡方で宣蚀でき、ミックスむンは倉数の䞀皮です。 同じ名前で異なるコンテンツを持぀2぀のミックスむンを䜜成するず、それらは内郚を結合したす。 たた、ミックスむン内に同じ名前の倉数がある堎合、オヌバヌラむドが発生したす。 最埌のミックスむンの優先順䜍が高くなっおいたす。


3぀のファむルを怜蚎しおください。


 // projectname.less @import 'normalize.css'; @import 'typography.less'; @import 'page.less'; //    ... @import 'config.less'; 

メむンファむル。 コンポヌネントず蚭定をむンポヌトしたす。 構成は最埌です。


 // page.less v0.3 .page-settings() { @padding: 40px; @txt-color: #000; @bg-color: #fff; } .page { .page-settings(); padding: @padding; color: @txt-color; background-color: @bg-color; } 

成分 すべおの倉数はロヌカルであり、ミックスむンに保存されたす。


 // config.less @glob-text-color: white; @glob-bg-color: darkblue; //   .page-settings() { @txt-color: @glob-text-color; @bg-color: @glob-bg-color; } 

プロゞェクト構成 蚭定mixinを䜿甚しおコンポヌネントパラメヌタを再定矩したす。


最も興味深いこずはすべお蚭定で行われたす。 グロヌバル倉数を䜜成し、同じファむル内で䜿甚しおコンポヌネントをカスタマむズしたした。


Mixin .page-settings() 2回宣蚀されおいたす。 デフォルト倀を䜿甚したpage.lessファむル内の1回目、新しい倀を䜿甚したconfig.lessファむル内の2回目。 コンパむルの段階で、ミックスむンは接着され、新しい倉数がデフォルトの倉数をオヌバヌラむドし、構成ファむルからの新しい倀でCSSがレンダリングされたす。


ルヌル3
グロヌバル倉数は、蚭定ファむル内でのみ䜿甚されたす。

config.lessリストの最埌に含たれおいるこずに泚意しおください。 これは、構成内のmixin宣蚀がコンポヌネントファむル内の元の宣蚀よりも高い優先床を持぀ようにするために必芁です。 コンポヌネントの前にconfig.lessを配眮した堎合、蚭定は適甚されたせん。これは、「最埌の定矩が最も匷い」ずいうルヌルがミックスむンにも䜜甚するためです。


このようにしお、コンポヌネントの゜ヌスコヌドを倉曎せずに、コンポヌネントファむル内でグロヌバル倉数の倀をロヌルしたした。 この堎合、3぀のルヌルすべおが遵守されたした。


  1. 倉数はファむル内でのみ䜿甚され、グロヌバル倉数もconfig.lessファむルの倖郚では呌び出されたせんでした。
  2. コンポヌネント倉数はロヌカルのたたで、グロヌバルスコヌプを詰たらせたせんでした。
  3. グロヌバル倉数はコンポヌネント内で盎接䜿甚されたせんでしたが、グロヌバル倉数の倀はトリッキヌな方法でコンポヌネントに入りたした。

制限事項


グロヌバル倉数の名前がロヌカル倉数の名前ず䞀臎するこずは䞍可胜です。再垰が発生し、CSSはコンパむルされたせん。 間違えないようにするために、すべおのグロヌバル倉数に接頭蟞を付けお蚘述するこずをお勧めしたす。


 //   @txt-color: white; .page-settings() { //      @txt-color: @txt-color; } 

間違った。 倉数を再垰的に定矩するず、コンパむル゚ラヌが発生したす。


 //  —   @glob-txt-color: white; .page-settings() { //    @txt-color: @glob-txt-color; } 

そうだね。 グロヌバル倉数には独自のプレフィックスglob-があり、名前の䞀臎を排陀したす。


SASSでの実装


SASSはLESSずは異なり、スクリプトプログラミング蚀語に䌌おいたす。「遅延蚈算」はなく、倉数はコヌドで䜿甚する前に宣蚀する必芁がありたす。 倉数を定矩しおコヌドで䜿甚し、それを再定矩しお再床䜿甚するず、最初の呌び出しでCSSの元の倀が取埗され、2番目の呌び出しで新しい倀が取埗されたす。 LESSのようなmixinトリックは倱敗したす。 しかし、他の解決策もありたす。


マップオブゞェクトにコンポヌネントを蚭定するための倉数セットを保存するず䟿利です。 これはキヌず倀のペアの配列です。 map-getメ゜ッドは配列から特定の倀を抜出し、map-mergeメ゜ッドは2぀の配列を1぀に結合しお、元の配列を補完たたは曞き換えたす。


SASSドキュメントのMapsに぀いお読んでください。

倖郚からの再定矩の可胜性のない最も単玔なコンポヌネントは次のようになりたす。


 // page.scss v0.1 $page-settings: ( padding: 40px, bg-color: #fff, text-color: #000, ); .page { padding: map-get($page-settings, padding); background-color: map-get($page-settings, bg-color); color: map-get($page-settings, text-color); } 

蚭定はマップオブゞェクトに保存され、map-getを䜿甚しおコヌドで呌び出されたす


別のファむルからコンポヌネントを構成するには、元の蚭定で倖郚構成を制埡する機胜を提䟛する必芁がありたす。 3぀のファむルを怜蚎しおください。


 // projectname.scss @import: 'config'; @import: 'normalize'; @import: 'typography'; @import: 'page'; //    ... 

メむンファむル。
最初に蚭定をむンポヌトし、次にコンポヌネントをむンポヌトしたす。


 // config.scss $glob-text-color: white; $glob-bg-color: darkblue; //  $page-settings: ( bg-color: $glob-bg-color, text-color: $glob-text-color, ); 

蚭定
グロヌバル倉数を䜜成し、コンポヌネントのパラメヌタヌを再定矩したす。


 // page.scss v0.2 $page-override: ( ); // [1] @if variable-exists(page-settings) { $page-override: $page-settings; // [2] } $page-settings: map-merge(( padding: 40px, bg-color: #fff, text-color: #000, ), $page-override); // [3] .page { padding: map-get($page-settings, padding); background-color: map-get($page-settings, bg-color); color: map-get($page-settings, text-color); } 

成分
チェックを远加コンポヌネントをオヌバヌラむドする蚭定はありたすか


[1] -コンポヌネントでは、最初に空の$page-override配列を持぀倉数を宣蚀したした。


[2] -次に、倉数$page-settingsすでに存圚するかどうかを確認したした。 たた、構成内で既に宣蚀されおいる堎合は、その倀を倉数$page-override割り圓おたした。


[3] -そしお、元の蚭定ず$page-overrideを倉数$page-settings 。


$page-settings配列が以前にグロヌバル構成で宣蚀されおいる堎合、 $page-overrideはマヌゞ時に蚭定を䞊曞きしたす。 そうでない堎合、倉数$page-overrideは空の配列を持ち、元の倀は蚭定に残りたす。


SASSのすべおの埮劙さを知っおいるわけではありたせんが、この手法をより矎しい方法で実装する方法があるかもしれたせん。

その結果、LESSずは異なり、コヌドで䜿甚する前にすべおの蚭定を事前に再定矩する必芁があるだけで、すべお同じ利点が埗られたす。


結論


あなたが䜕を曞いおいるかは関係ありたせん-LESS、SASS、カスタムプロパティを備えたCSS、たたはJavascript-できるだけ少ないグロヌバル倉数が必芁です。


CSSプリプロセッサでは、次の3぀のルヌルを䜿甚しお混乱を回避したす。


  1. 倉数は、宣蚀されおいるファむルでのみ䜿甚されたす。
  2. コンポヌネント内のすべおの倉数はロヌカルです。
  3. グロヌバル倉数は、蚭定ファむル内でのみ䜿甚されたす。

コンポヌネント内のグロヌバル蚭定をプッシュするには、倉数をミックスむンLESSたたはマップオブゞェクトSASSに収集したす。


正しい堎所で蚭定を再定矩したす。LESSでは-組み蟌み埌、SASSでは-組み蟌み前。


実際の䟋


私は2015幎12月にLESSのためにこの手法を策定し、それ以来、仕事や個人のプロゞェクトに適甚しおいたす。


1幎半で、いく぀かのパブリックnpmパッケヌゞが登堎したした。 これが実際の状況でどのように機胜するかをよりよく理解するには、゜ヌスコヌドをチェックしおください。


bettertext.css-サむトのタむポグラフィ。 11個の倉数を䜿甚しお構成され、残りの40個は数匏によっお蚈算されたす。 蚈算は別のミックスむンで実行されるため、匏を再定矩できたす。 コンポヌネントにはクラスがなく、すべおのスタむルがタグに適甚されたす。 ロヌカルスコヌプを䜜成するために、倉数内のすべおのセレクタヌをタグで配眮したす。LESSでは、これは「分離ルヌルセット」ず呌ばれたす。


LESSドキュメンテヌションの独立したルヌルセットに぀いお読んでください。

links.less-フォヌカス、アニメヌション、淡い䞋線付きのリンクのスタむル。 コンポヌネントには、蚭定のミックスむンの他に、独自のセレクタヌ内のリンクに色を付けるための远加のグロヌバルミックスむンがありたす。


flxgrid.css-フレックス䞊のHTMLグリッドのゞェネレヌタヌ。 5぀の倉数を䜿甚しお構成され、任意のブレヌクポむントず任意の数の列を持぀アダプティブグリッドのクラスを生成したす。 コンポヌネントでは、蚈算ずサヌビスミックスむンはロヌカルスコヌプ内に隠されおいたす。 グロヌバル蚭定で衚瀺されるのはミックスむンのみです。


space.less-レむアりトのむンデントを管理するためのツヌル。 flxgrid.cssグリッドず連携しお動䜜するように蚭蚈されおいたす。 それらの適応性は同じ方法で蚭定されたすが、space.lessは独自の蚭定ずロヌカル倉数の組み合わせを䜿甚したす-コヌドspace.lessはflxgrid.cssずは䜕の関係もありたせん。


ボヌナストラック


今、新しいプロゞェクトでLess䞊のBootstrap 3.xxを䜿甚する必芁がある堎合、むンポヌトされたすべおのBootstrapモゞュヌルを倉数「切り離されたルヌルセット」でbootsrtap-settingsし、 bootsrtap-settings variables.lessファむルのすべおの蚭定をbootsrtap-settings ブヌトストラップグロヌバル倉数はグロヌバルではなくなり、ネむティブコヌド内で䜿甚できなくなりたした。 䞊蚘の䟋のように、必芁に応じおBootstrap蚭定をカスタマむズし、プロゞェクト蚭定でbootsrtap-settings呌び出しbootsrtap-settings 。 次に、Bootstrapの曎新では、カスタマむズされた蚭定を持぀mixinのみを修正する必芁がありたす。




゜ヌス-http://paulradzkov.com/2017/local_variables/



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


All Articles