69
ソシャゲでCSS Sassを構造化 gumi study #15

Gumi study#15 Sass構造化

Embed Size (px)

DESCRIPTION

2013年7月22日(月) gumi study#15 Sass構造化の事例

Citation preview

Page 1: Gumi study#15 Sass構造化

ソシャゲでCSS Sassを構造化

gumi study #15

Page 2: Gumi study#15 Sass構造化

自己紹介原口 剛 (はらぐち ごう)

株式会社gumi所属

UIエンジニア

Ghrgc

Page 3: Gumi study#15 Sass構造化

ドラゴンジェネシス

2013年4月26日リリース!!「剣と魔法」に彩られた大作王道ファンタジーRPG

URL: http://pf.gree.jp/3393

Page 4: Gumi study#15 Sass構造化

今回のモチベーション大所帯(最大70人ぐらい)での開発

すごく貴重な経験させてもらった

安心・安全なフロントエンド開発手法を共有

Page 5: Gumi study#15 Sass構造化

Sassの設計で扱う内容1.構造化する理由

2.構造化へのアプローチ

3.スタイル適応範囲の限定

4.SCSSファイルの結合

5.問題点

6.まとめ

Page 6: Gumi study#15 Sass構造化

Sass.とは拡張子は「.sass」と「.scss」 の二種類

「.scss」 はcssと文法が似ている(SCSS記法)

コンパイルを通してCSSへ出力

本件の環境は、Sass 3.2.9

本家(http://sass-lang.com/)

Page 7: Gumi study#15 Sass構造化

Sassの設計で扱う内容1.構造化する理由

2.構造化へのアプローチ

3.スタイル適応範囲の限定

4.SCSSファイルの結合

5.問題点

6.まとめ

Page 8: Gumi study#15 Sass構造化

ドラジェネ開発案件全220ページほど・・・

全ページにおいて一点物のカンプ

単純にコピペで済む話ではない

四ヶ月ぐらいかかると思ったorz

Page 9: Gumi study#15 Sass構造化

チームでフロントエンドコミットの数が激増

スタイル定義の大量生産

使いどころがちょっとわからないスタイル

どこから混入したかわからないスタイル

Page 10: Gumi study#15 Sass構造化

なんか大変そう・・・・・

Page 11: Gumi study#15 Sass構造化

これまでの実装実績、、、

Page 12: Gumi study#15 Sass構造化

いちフロントエンジニアの裁量で実装

Page 13: Gumi study#15 Sass構造化

ファイルの分割方針も曖昧

Page 14: Gumi study#15 Sass構造化

既存のスタイルがどこで使われているのか不明

Page 15: Gumi study#15 Sass構造化

他人のコードは・・・多分こんな感じに見える・・・

Page 16: Gumi study#15 Sass構造化
Page 17: Gumi study#15 Sass構造化
Page 18: Gumi study#15 Sass構造化

そんなコードに関わりたくない

Page 19: Gumi study#15 Sass構造化

もうメンテ無理・・・・・

Page 20: Gumi study#15 Sass構造化

となる前に、、

Page 21: Gumi study#15 Sass構造化

構造化しましょう!

Page 22: Gumi study#15 Sass構造化

Sassの設計で扱う内容1.構造化する理由

2.構造化へのアプローチ

3.スタイル適応範囲の限定

4.SCSSファイルの結合

5.問題点

6.まとめ

Page 23: Gumi study#15 Sass構造化

構造化とは全体を把握した上でその構成要素について明らかになっている

構成要素間の関係が分かりやすく整理されている

Page 24: Gumi study#15 Sass構造化

やってみた

Page 25: Gumi study#15 Sass構造化

用途別にSCSSファイルをわける

Page 26: Gumi study#15 Sass構造化

ActionScript 3.0 パッケージ構造を参考

Page 27: Gumi study#15 Sass構造化

ディレクトリ名 役割controls 単体で形成される部品scenes ページ固有share scenes内ファイル間で共有stage 描画領域どこでもanimations アニメーションconstants 変数utills 汎用化されたスタイル

わけました

Page 28: Gumi study#15 Sass構造化

ページ単位でもっと細分化

Page 29: Gumi study#15 Sass構造化

ページ単位でもっと細分化

HTMLの階層構造に沿う

Page 30: Gumi study#15 Sass構造化

やっちゃえ

Page 31: Gumi study#15 Sass構造化

HTMLはサブディレクトリで階層化されている

サブディレクトリの数だけSCSSファイルをscenes/に用意する

SCSSファイルの名前はHTMLサブディレクトリ名と同じ

プロジェクト環境に合わせる

Page 32: Gumi study#15 Sass構造化

card/scenes/

root/

gacha/

HTML Sass

同名

同名

同名

card.scss

root.scss

gacha.scss

Page 33: Gumi study#15 Sass構造化

Sassの設計で扱う内容1.構造化する理由

2.構造化へのアプローチ

3.スタイル適応範囲の限定

4.SCSSファイルの結合

5.問題点

6.まとめ

Page 34: Gumi study#15 Sass構造化

scenes/のSCSSファイルどのHTMLのスタイルか明確にしておく仕組み

定義したスタイルのスコープを限定する

SCSSファイル固有のidを親要素にしたネスト構造の中にスタイルを記述

Page 35: Gumi study#15 Sass構造化

ネストセレクタの親子関係を入れ子で表現できる

親セレクタの指定が一度で済む

Page 36: Gumi study#15 Sass構造化

SCSS記法のネスト

Page 37: Gumi study#15 Sass構造化

こうなる

Page 38: Gumi study#15 Sass構造化

ネスト内のスタイルはネスト外への干渉をしない

Page 39: Gumi study#15 Sass構造化

限定的なスタイル定義

scenes/_root.scss

Page 40: Gumi study#15 Sass構造化

限定的なスタイル定義

scenes/_root.scss

出力されるCSSは親セレクタに必ず#rootが含まれる

Page 41: Gumi study#15 Sass構造化

idの命名規則HTML側はルート要素にサブディレクトリ名のidを付与しておく

scenes/*.scssは必ず親要素をidでネストする

Page 42: Gumi study#15 Sass構造化

HTMLルート要素のid属性手書きは正直めんどくさい

命名規則を守ってもらえるか不安

Page 43: Gumi study#15 Sass構造化

サーバーサイドでページのルート要素にid属性を付与する

自動付与

Page 44: Gumi study#15 Sass構造化

サーバーサイドでページのルート要素にid属性を付与する

自動付与

Page 45: Gumi study#15 Sass構造化

Sassの設計で扱う内容1.構造化する理由

2.構造化へのアプローチ

3.スタイル適応範囲の限定

4.SCSSファイルの結合

5.問題点

6.まとめ

Page 46: Gumi study#15 Sass構造化

CSSを結合分けただけでは部分的なCSSがたくさんコンパイル出力されるだけです

scssscssscss csscsscss

コンパイル

Page 47: Gumi study#15 Sass構造化

SCSSを結合しましょう!

Page 48: Gumi study#15 Sass構造化

SCSSを結合しましょう!@import

Page 49: Gumi study#15 Sass構造化

@importCSSの@importはCSSから別のCSSをロード

Sass独自の@import

構造化したSCSSファイルを共有

別ファイルの@mixinや@extend、変数が使用可能になる

Page 50: Gumi study#15 Sass構造化

@importの実践結合するので結合前のSCSSからのCSSは不要

結合結果のCSSだけあればよい

CSS出力しないSCSSファイル(パーシャル)

パーシャルはファイル名が_(アンダースコア)からはじまる

Page 51: Gumi study#15 Sass構造化

target.scss

_target_1.scss

_target_2.scss

target.css

target_1.css

target_2.css

compile

CSS出力されない

Page 52: Gumi study#15 Sass構造化

結合専用のSCSSファイル構造化した結果、200個以上のSCSSファイル

@importを管理簡素化と一元化

各サブディレクトリ内のSCSSファイルをすべて結合する__init__.scssを用意する

Page 53: Gumi study#15 Sass構造化

__init__.scss

scenes/

_sub_1.scss

_sub_10.scss

~@import

production.scss@import

Page 54: Gumi study#15 Sass構造化

production.scss

Page 55: Gumi study#15 Sass構造化

結果•テンプレートサブディレクトリscene/*.scssルート要素のid属性は必ず関連していることになる

•構成要素の関係が明らかになった•scene/*.scssに書かれたスタイル

Page 56: Gumi study#15 Sass構造化

チームでフロントエンドテンプレートディレクトリ単位でのスタイルを担当

担当分のscenes/*.scssをコミット

scenes/での実装のブレは、影響範囲が狭いので寛容

Page 57: Gumi study#15 Sass構造化

チームでフロントエンドテンプレートディレクトリ単位でのスタイルを担当

担当分のscenes/*.scssをコミット

scenes/での実装のブレは、影響範囲が狭いので寛容

→コンフリクトが少い

Page 58: Gumi study#15 Sass構造化

チームでフロントエンドテンプレートディレクトリ単位でのスタイルを担当

担当分のscenes/*.scssをコミット

scenes/での実装のブレは、影響範囲が狭いので寛容

→コンフリクトが少い

→スタイルをぶち込め!!!

Page 59: Gumi study#15 Sass構造化

Sassの設計で扱う内容1.構造化する理由

2.構造化へのアプローチ

3.スタイル適応範囲の限定

4.SCSSファイルの結合

5.問題点

6.まとめ

Page 60: Gumi study#15 Sass構造化

コンパイルが遅い@extendの使用箇所の増加

CSS Spriteの自動生成の増加

Page 61: Gumi study#15 Sass構造化

どちらも必要な機能

@extendは、セレクタをグルーピングしてスタイル定義を共有する仕組みでは強力な機能ではあるが使用箇所が増えるとコンパイルに時間がかかる

css spriteを自動生成すれば、UI素材を1つにまとめられることによって画面が描画されるまでの時間の短縮に繋がる

Page 62: Gumi study#15 Sass構造化

スプライト自動生成キャッシュなしの初期コンパイルに7分以上

Page 63: Gumi study#15 Sass構造化

遅!!!!

Page 64: Gumi study#15 Sass構造化

developmentモード$ compass compile -e development

コンパイルターゲットを切り替えて CSS Spriteを自動生成をしない

ミニファイしない

config.rb

Page 65: Gumi study#15 Sass構造化

productionモード$ compass compile -e production

コンパイルターゲットを切り替えて CSS Spriteを自動生成をする

ミニファイルする

config.rb

Page 66: Gumi study#15 Sass構造化

Sassの設計で扱う内容1.構造化する理由

2.構造化へのアプローチ

3.スタイル適応範囲の限定

4.SCSSファイルの結合

5.問題点

6.まとめ

Page 67: Gumi study#15 Sass構造化

大規模開発できた!Sassの構造を保ちつつ

フロント側10人で並行して大量の画面を作成可能

4ヶ月→1ヶ月半でフロント実装を完成させた構造化しているので複雑な問題であっても規則性のある管理が出来ている

Page 68: Gumi study#15 Sass構造化

大規模開発できた!Sassの構造を保ちつつ

フロント側10人で並行して大量の画面を作成可能

4ヶ月→1ヶ月半でフロント実装を完成させた構造化しているので複雑な問題であっても規則性のある管理が出来ている

継続的なリファクタが可能

Page 69: Gumi study#15 Sass構造化

ご清聴ありがとうございました