
SASSを使用し、限られた人的資源で大きなスタイルファイルを最適化する問題を解決する人々のための投稿。
与えられた:
- 50以上のテンプレートがある大規模なサイト。
- 大きなスタイルシート。
- このサイトは常に進化しており、バグが修正され、新しい機能が作成されています。
- 1つのブランチ(SVNリポジトリ)での開発および実稼働のバージョン。
- この経済全体を維持するために1-2人。
- 夢中にならず、自分自身に手を触れないようにしたいという大きな願望!
この叙事詩の終わりに興味があるなら、猫を歓迎します
先史時代
少し前に、私は3人が私の前に書いた1つの大きなプロジェクトに参加しました。 ところで、これらの人々は、独立したブロック、プリプロセッサ、およびその他の最適化について聞いたことがない「邪悪な開発者」についての恐ろしい話から来ました。 もちろん、私はそのようなものすべてを残すことはできませんでした、そして信じられないほどの熱意で私はすべてを書き直し始めました。 書き直すために、それを教えてあげます。 すべてのスタイルは複数のファイルに収集され、そのうち最大のものは合計16k行でした。 それはちょうどこれらのオーガストのstable舎をかき集めている過程で、私は問題に遭遇しました。
適度に怠zyな人として、私は自動化に日常的な操作を与えることに慣れていて、SASSを接続し、変数、ミックスイン、拡張を1つのグローバルファイルに作成することから始めました。 いつものように、他のプロジェクトでSASSを使用して、インポートを通じてすべてのスタイルのコンパイルを1つのグローバルファイルに収集しました。 それはサイトを開発するときの最良の解決策だったからです。 しかし、結局のところ、生産用ではありません。 コンパイルスタイルファイルは、圧縮せずに2.5 MBの重量があり始めました! 個々のスタイルファイルの接続をすべてのコントローラー間で手動で切断および分散させることは私にとって選択肢ではなく、マシンが苦しむようにすべてを行う方法を考え始めました。 これはまさにあなたに紹介したい私の考えの産物です。
コンセプトは次のとおりです
- コンパイルは、すべてのコンパイルおよびコンテキストパラメータが設定されているグローバルファイルを介してのみ行われます。 これらのファイルでは、次のような値を指定する変数を渡します。
- スタイルを接続するサイトのセクションを定義するコンテキスト、
- ブラウザのバージョン
- ビルドバージョン(開発または実稼働)、
- その他の変数。
- フレームワークレベルで、グローバルファイルが生成されるテンプレートが作成されます。 コントローラまたはビューごとに1つを決定します。 これらのファイルのコンテキスト変数と名前は、コントローラー/ビューの名前です。 正常に生成された後、これらのファイルはcssファイルの形式で対応するコントローラー/ビューに自動的に接続されます。
- すべてのスタイルファイルはミックスインにラップされ、コンパイルされると、指定されたコンテキスト変数に従ってスタイルが自動的に並べ替えられます。 これらの変数が複数ある場合は、グローバルファイルで指定された変数によってファイル内で追加の並べ替えを実行できます。
- 追加のボーナスとして、このシステムを使用すると、スタイルの複数のバージョンを1か所に保存できます。 たとえば、生産と開発に対応する機能、さまざまなブラウザとそのバージョンのスタイル。
スタイルをコンパイルするためのテンプレートモデル
// $develop: false; $production: true; ... // $all: true; $ie9: false; ... // $doc: false; // $local_var: global; // // $holydat_var: 8march; // @import "includes";
すべてのスタイルをインポートするグローバルファイルモデル
// @import "includes/global_var"; // @import "fonts"; @import "header"; @import "login"; @import "news"; @import "jquery.ui.all"; @import "factory"; @import "rooms"; @import "invite"; ...
個々のコントローラーのモデルファイルモデル
// "" @include style_separator(" 1", ..." N"){ // @include sub_style_separator(" 1"){ .selector{ ... } } // @include sub_style_separator(" N"){ .selector2{ ... } } .selector3{ ... } ... }
個々のコントローラーのモデルファイルモデル
// @mixin style_separator($var: false, ... $varN: false) { @if $var == $local_var or ... $varN == $local_var { @content; } } @mixin sub_style_separator($var: false, ... $varN: false) { @if $var == $local_var or ... $varN == $local_var { @content; } }
合計
その結果、時間と準備に多大な投資を必要としないシステムが得られます。 最も簡単に使用するには、SASSの知識のみが必要です。 さらに、このアプローチにより、スタイルの整理、分離、接続に多くの時間を費やす必要がなくなります。 このシステムは、1つの大きなプロジェクトでテストされていますが、その効果はすでに実証されています。 私はどんな種類でも批判してうれしいです!
PS
詰め物コーンのヒント:
- サイレントクラスでのみ拡張を使用します。 そうしないと、「コントローラー」の各ファイルに多くの余分なコードが含まれます。
- スタイルをグローバルとローカルに分離することをお勧めします。 同時に、「コントローラー」のファイルにローカル変更を書き込みます。 グローバルをリスト、チェックボックスなどのブロックに分割します。次に、グローバルの結果セットから、フレームワークの外観を収集できます。
- BEM方法論を使用するか、上記のすべてが意味を失います。