Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ビルドプロセスから考えるCSSアンチパターン

Kenji Imamula
November 25, 2018

 ビルドプロセスから考えるCSSアンチパターン

HTML5 Conference 2018の発表資料です。

Kenji Imamula

November 25, 2018
Tweet

More Decks by Kenji Imamula

Other Decks in Technology

Transcript

  1. Ϗϧυϓϩηε͔Βߟ͑Δ
    CSSΞϯνύλʔϯ
    HTML5 Conference 2018
    גࣜձࣾΧϒΫ ࠓଜݠ࢜ @kimamula

    View Slide

  2. CSSͷ࿩Λ͠·͢

    View Slide

  3. ϑϩϯτΤϯυΤϯδχΞͱCSSͱࢲ
    CSSಘҙ੎
    CSSۤख੎

    View Slide

  4. CSSಘҙ੎
    CSSۤख੎

    ϑϩϯτΤϯυΤϯδχΞͱCSSͱࢲ

    View Slide

  5. ͦΜͳࢲͰ͕͢

    View Slide

  6. ৭ʑ͋ͬͯɺ
    CSSͱਅ݋ʹ޲͖߹Θͳ͚Ε͹
    ͳΒͳ͍ͱ͖͕͖ͨ…

    View Slide

  7. ਺ϲ݄ܦա

    View Slide

  8. ؾ͕͍ͭͨ͜ͱ

    View Slide

  9. Flexbox, Grid LayoutΛ࢖͑͹
    CSS͸ͦΜͳʹͭΒ͘ͳ͍

    View Slide

  10. Flexbox, Grid LayoutΛ࢖͑͹
    CSS͸ͦΜͳʹͭΒ͘ͳ͍
    ͜ͷ࿩͸͠·ͤΜ

    View Slide

  11. Ϗϧυϓϩηε͔Βߟ͑Δͱɺ
    CSSͷઃܭ͕ߟ͑΍͍͢

    View Slide

  12. Ϗϧυϓϩηε͔Βߟ͑Δͱɺ
    CSSͷઃܭ͕ߟ͑΍͍͢
    ͜ͷ࿩Λ͠·͢

    View Slide

  13. Ϗϧυϓϩηε͔Βߟ͑Δ
    CSSΞϯνύλʔϯ

    View Slide

  14. Ξϯνύλʔϯ1

    View Slide

  15. ίϯϙʔωϯτϕʔεͳͷʹ
    CSS͸άϩʔόϧ

    View Slide

  16. ͦ΋ͦ΋CSSͱ޲͖߹͏͜ͱ
    Λܾҙͨ͠ݩڟݪҼͷҰͭ

    View Slide

  17. • ϑϩϯτΤϯυ։ൃ͸ίϯϙʔωϯτϕʔε͕
    ओྲྀ
    • ࠶ར༻
    • είʔϓ෼ׂ
    ίϯϙʔωϯτϕʔε։ൃ

    View Slide

  18. ͦΜͳதɺCSS͚ͩάϩʔόϧ
    άϩʔόϧ
    ίϯϙʔωϯτ
    ͱ͔
    ಠࣗͷCSSͱ͔

    View Slide

  19. άϩʔόϧ
    ίϯϙʔωϯτ
    ͱ͔
    ಠࣗͷCSSͱ͔
    ͦΜͳதɺCSS͚ͩάϩʔόϧ
    ͜ͷґଘ͸όϯυϥʔ
    ͔Βݟ͑ͳ͍

    View Slide

  20. όϯυϥʔʹΑΔޮ཰తͳ
    code splitting͕Ͱ͖ͳ͍
    • ଟ͔Εগͳ͔Ε࢖ΘΕ͍ͯͳ͍CSS͕όϯυϧ
    ʹࠞೖ͢Δ
    • ಛʹϖʔδॳظදࣔͰɺ࠷௿ݶඞཁͳCSS͚ͩ
    ΛHTMLʹΠϯϥΠϯͰຒΊࠐΉΑ͏ͳߴ଎Խ
    ࢪࡦͷಋೖ͕೉͘͠ͳΔ
    • ϖʔδͷද͕ࣔ஗͘ͳΔ

    View Slide

  21. άϩʔόϧωʔϜεϖʔε
    • CSSΛ࣮࣭తʹϩʔΧϧείʔϓԽ͢Δٕज़Λ
    ࢖͑ͳ͍
    • ϑϨʔϜϫʔΫඪ४
    • CSS Modules
    • ͦͷଞCSS in JS
    • ఻౷తͳCSSͷͭΒΈͱBEMͳͲͷख๏Ͱઓ
    Θͳ͚Ε͹ͳΒͳ͍

    View Slide

  22. ϙʔλϏϦςΟ͕Լ͕Δ
    • ίϯϙʔωϯτΛϓϩδΣΫτ֎Ͱ࠶ར༻͢
    Δ೉қ౓্͕͕Δ
    • ͦͷίϯϙʔωϯτ͕ґଘ͢ΔελΠϧΛ࠶
    ར༻ઌͰ༻ҙͯ͋͛͠ͳ͚Ε͹ͳΒͳ͍

    View Slide

  23. ղܾࡦ

    View Slide

  24. CSSΛίϯϙʔωϯτʹؚΊΔ
    άϩʔόϧ
    ίϯϙʔωϯτ
    X

    View Slide

  25. ϝϦοτ
    • ίϯϙʔωϯτͱCSSͷґଘؔ܎͕໌֬ʹͳ
    Γɺcode splitting͕ՄೳʹͳΔ
    • ίϯϙʔωϯτʹดͨ͡ϩʔΧϧͳωʔϜε
    ϖʔε͕࢖͑Δ
    • ϙʔλϏϦςΟ͕޲্͢Δ

    View Slide

  26. Ξϯνύλʔϯ2

    View Slide

  27. ίʔυ͸DRYɺग़ྗ͸ඇDRY

    View Slide

  28. CSS in JSΛ֮͑ͨͯͷࠒͷࢲ
    ώϟοϋʔʂJSͰclassΛ֦ுͰ͖Δʔ̇
    const basicButton = {
    textAlign: 'center',
    cursor: 'pointer',
    fontWeight: 700,
    // ...
    };
    const redButton = {
    ...basicButton,
    backgroundColor: 'red'
    };

    View Slide

  29. Ϗϧυޙͷίʔυͷ͜ͱΛ
    ߟ͍͑ͯͳ͔ͬͨ

    View Slide

  30. ग़ྗ͞ΕΔCSS
    .basic-button {
    text-align: center;
    cursor: pointer;
    font-weight: 700;
    // ...
    }
    .red-button {
    text-align: center;
    cursor: pointer;
    font-weight: 700;
    background-color: red;
    // …
    }

    View Slide

  31. ग़ྗ͞ΕΔCSS
    .basic-button {
    text-align: center;
    cursor: pointer;
    font-weight: 700;
    // ...
    }
    .red-button {
    text-align: center;
    cursor: pointer;
    font-weight: 700;
    background-color: red;
    // …
    }
    DRY͡Όͳ͍

    View Slide

  32. ͪͳΈʹstyled components
    https://www.styled-components.com/docs/basics#extending-styles

    View Slide

  33. ͪͳΈʹstyled components
    https://www.styled-components.com/docs/basics#extending-styles

    View Slide

  34. ͪͳΈʹstyled components
    https://www.styled-components.com/docs/basics#extending-styles
    ʊਓਓਓਓਓਓਓਓਓਓਓʊ
    ʼɹDRY͡Όͳ͍ʂʂɹʻ
    ʉY^Y^Y^Y^Y^Y^Y^Y^Yʉ

    View Slide

  35. ͻΐͬͱͯ͠ճආࡦ͕͋Δʁ
    styled componentsৄ͍͠ํ
    ڭ͍͑ͯͩ͘͞

    View Slide

  36. ίʔυ͕DRYͰ΋
    ग़ྗ͕DRYͰͳ͍ͱ͸ݶΒͳ͍
    ※SASSͷ@extends΍ɺCSS Modulesͷcomposes͸ग़ྗ΋DRYͰ͢

    View Slide

  37. ղܾࡦ

    View Slide

  38. ൚༻తͳελΠϧΛෳ਺ͷ
    ίϯϙʔωϯτͰ࢖͍ճ͍ͨ࣌͠
    • ͦͷελΠϧͦͷ΋ͷΛίϯϙʔωϯτʹׅ
    Γͩ͠ɺίϯϙʔωϯτ୯ҐͰ࢖͍ճ͢
    • ίϯϙʔωϯτ୯ҐͰͷ࢖͍ճ͠ͳΒɺಉ͡
    Α͏ͳclass͕ॏෳͯ͠ग़ྗ͞ΕΔ͜ͱ͸ͳ͍
    -> ΄ͱΜͲελΠϧ͚ͩͷখ͍͞ίϯϙʔωϯ
    τ͕ͨ͘͞ΜͰ͖Δ

    View Slide

  39. ෦෼తʹελΠϧΛม͍͑ͨ࣌
    • ίϯϙʔωϯτͷϓϩύςΟͰ੍ޚ͢Δ
    import { button, red } from './style.css';
    function Button(props) {
    return (
    button,
    { [red]: props.isRed }
    )}>
    {props.children}

    );
    }

    View Slide

  40. ෦෼తʹελΠϧΛม͍͑ͨ࣌
    • ίϯϙʔωϯτͷϓϩύςΟͰ੍ޚ͢Δ
    import { button, red } from './style.css';
    function Button(props) {
    return (
    button,
    { [red]: props.isRed }
    )}>
    {props.children}

    );
    }
    ͜͜ʹ΋஫໨
    w ར༻ଆ͔Βʮத਎ʯΛ౉ͤΔ
    Α͏ʹ͢Δ
    w 8FC$PNQPOFOUT 7VFKT
    ͳΒTMPU
    w "OHVMBSͳΒOHDPOUFOU

    View Slide

  41. • ίϯϙʔωϯτͷϓϩύςΟͰ੍ޚ͢Δ
    import { button, red } from './style.css';
    function Button(props) {
    return (
    button,
    { [red]: props.isRed }
    )}>
    {props.text}

    );
    }
    ͜Ε͸Α͘ͳ͍
    ෦෼తʹελΠϧΛม͍͑ͨ࣌

    View Slide

  42. ར༻ଆ͔Βݟͨ৔߹
    // ྑ͍ྫ: ॊೈ
    Click Me!
    Click Me!
    Click Me!
    // ѱ͍ྫ: ॊೈͰͳ͍
    // ଟ༷ͳཁ݅ʹରԠ͠Α͏ͱ͢Δͱɺ
    // ίϯϙʔωϯτͷ࣮૷͕ͲΜͲΜෳࡶʹ

    ͜Ε΋Ξϯνύλʔϯ
    ˞$44ࣗମͷ΋ͷͰ͸ͳ͍͕

    View Slide

  43. ͭ·Γ

    View Slide

  44. ίϯϙʔωϯτϕʔεΛపఈ͢Δ
    -> ͍͍ίʔυ͕Ϗϧυ͞ΕΔ
    • CSSΛίϯϙʔωϯτʹؚΊΔ
    • ελΠϧͷ࠶ར༻ͷ୯ҐΛίϯϙʔωϯτʹ
    ͢Δ
    • slotΛ࢖ͬͯॊೈੑΛ֬อ͢Δ

    View Slide

  45. ॳΊ͸ෆ҆ͩͬͨ
    • ओͳݒ೦఺
    • ίϯϙʔωϯτ୯ҐͰͷελΠϧͷ࢖͍ճ͠
    Ͱ͸ཻ౓͕ߥ͗ͯ͢ɺ݁ہclass୯Ґͷ࢖͍ճ
    ͠ͷັྗʹ߅͑ͳ͍ͷͰ͸ʁ
    -> ࠓͷͱ͜Ζᐜ༕

    View Slide

  46. Atomic Design?

    View Slide

  47. ͏·Έ͕Α͘෼͔͍ͬͯͳ͍
    • ͏·͍ͷ͔΋͠Εͳ͍
    • ͜ͷઌߦ͖٧·ͬͨΒऔΓೖΕΔ͔΋
    • Atoms, Molecules, Organismsͷ۠෼͚͕೉͠
    ͍ͱ͍͏࿩ΛΑ͘ฉ͘
    -> ࠓͷ΍Γํ͸ɺϏϧυ݁Ռͱ͍͏࣮རϕʔε
    ͷઃܭͰ࣮֬ʹ͏·͘ɺ͔ͭͦͷ؍఺Ͱઃܭʹ
    ໎͏͜ͱ͕ࠓͷͱ͜Ζ͋·Γͳ͍

    View Slide

  48. Thank you!

    View Slide